【问题标题】:How to speed up slow (.6s) mask assignment in Python?如何加快 Python 中的慢速(.6s)掩码分配?
【发布时间】:2019-07-16 14:53:47
【问题描述】:

我试图通过在图像上覆盖蒙版像素来可视化 python 中图像的二进制蒙版。图像尺寸为 360 x 640 像素。我的可视化运行速度非常慢(每个蒙版 0.6 秒),我对代码进行计时并将瓶颈固定为将二进制蒙版转换为可以添加到图像中的颜色蒙版。我尝试了几种方法。

首先我尝试了一个列表理解:

color_mask = [[[50,50,50] if val == 1 else [0,0,0] for val in mask_row] for mask_row in mask]

它在大约 0.6 秒内运行

然后我尝试在一个 numpy 数组上使用掩码分配,它运行了大约 1.2 秒(出奇的慢)

color_mask = np.zeros(shape=(image.shape))
color_mask[output_dict["detection_masks"][0]] = [50,50,50]

生成颜色蒙版后,我将其添加到原始图像中以可视化图像上的蒙版。我希望能够使用多达 20 个蒙版实时运行此可视化。

为什么掩码分配和列表理解这么慢?我怎样才能加快其中之一的速度?

您可以像这样构建一个用于测试的掩码:

mask = np.zeros(shape=(563,750,1))
mask[50:200,50:200,:] = 1

【问题讨论】:

  • 您可以发布您的mask 的可测试片段吗?
  • mask = np.zeros(shape=(563,750,1)) mask[50:200,50:200,:] = 1 您可以将其用作测试掩码。我使用的掩码是来自 tensorflow 的 mask-rcnn,所以要在新机器上运行部分代码并不容易。

标签: python performance numpy computer-vision


【解决方案1】:

我发现使用 numpy 来执行此操作更高效

在没有看到您正在使用的数据的情况下,我生成了一个随机二进制图像

import numpy as np
mask = np.random.randint(0, 2, size=(360, 640, 1))
color_mask = np.array([50,50,50]) * mask + np.array([0,0,0]) * (1 - mask) # you do not need the second half of this statement if you're setting to all zeros

使用列表理解,时间平均为 0.280 秒

使用 numpy 的时间平均为 0.015 秒

删除语句的后半部分会产生大约 0.004 秒的时间

【讨论】:

  • 这样更快,谢谢!你知道为什么做掩码分配这么慢吗?或者为什么列表理解要慢得多?
  • @AlexMussell 使用列表推导需要在迭代所有值时创建一个动态列表,这可能很慢。 NumPy 正在跨静态矩阵进行矩阵运算,这是非常优化的。
猜你喜欢
  • 2011-08-06
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2012-03-07
  • 2014-05-15
  • 2010-11-12
  • 2016-09-30
  • 1970-01-01
相关资源
最近更新 更多