在numpy中比较数组的最有效方法?

路易斯克鲁兹

背景:

我正在使用 Google 的 Python 身体分割 API。由于它最初是为 js (tensorflow.js) 编写的库,因此python 等效项似乎非常有限。因此,获得身体分割的唯一方法似乎是将生成的蒙版的 RGB 颜色与该颜色应代表的身体部位进行比较。IE:

身体分割颜色

躯干应该是绿色的,所以我知道:

torso = np.array([175, 240, 91]) 

头部的右侧部分应该是紫色的,所以它是 [110, 64, 170],依此类推...

我的做法:

# get prediction result
img = "front_pic"
img_filename = img + ".png"
image = tf.keras.preprocessing.image.load_img(img_filename)
image_array = tf.keras.preprocessing.image.img_to_array(image)
result = bodypix_model.predict_single(image_array)

# simple mask
mask = result.get_mask(threshold=0.75)

# colored mask (separate colour for each body part)
colored_mask = result.get_colored_part_mask(mask)
tf.keras.preprocessing.image.save_img(img+'_cmask'+'.jpg',
    colored_mask
)

# color codes
right_head = np.array([110, 64, 170])
left_head = np.array([143, 61, 178])
torso = np.array([175, 240, 91])
left_feet = np.array([84, 101, 214])
right_feet = np.array([99, 81, 195])
left_arm_shoulder = np.array([210, 62, 167])
right_arm_shoulder = np.array([255, 78, 125])

# (x,y) coordinates
coordinate_x = 0
coordinate_y = 0
for vertical_pixels in colored_mask:
    coordinate_y = coordinate_y + 1
    #if coordinate_y > height:
    #    coordinate_y = 0
    for pixels in vertical_pixels:
        coordinate_x = coordinate_x + 1
        if coordinate_x > width:
            coordinate_x = 1
        # Current Pixel
        np_pixels = np.array(pixels)
        current_coordinate = np.array([[coordinate_x,coordinate_y]])
        #print(current_coordinate)
        if np.array_equal(np_pixels,right_head) or np.array_equal(np_pixels,left_head): # right head or left head
            pixels_head = pixels_head + 1
            head_coordinates = np.concatenate((head_coordinates,current_coordinate),axis=0) # Save coordinates
        if np.array_equal(np_pixels,torso): # Torso
            torso_pixels = torso_pixels + 1
            torso_coordinates = np.concatenate((torso_coordinates,current_coordinate),axis=0) # Save coordinates
        if np.array_equal(np_pixels,left_feet) or np.array_equal(np_pixels,right_feet): # feet_pixels
            feet_pixels = feet_pixels + 1
            feet_coordinates = np.concatenate((feet_coordinates,current_coordinate),axis=0) # Save coordinates
        if np.array_equal(np_pixels,left_arm_shoulder): # left_arm_shoulder
            left_arm_shoulder_pixels = left_arm_shoulder_pixels + 1
            left_arm_shoulder_coordinates = np.concatenate((left_arm_shoulder_coordinates,current_coordinate),axis=0) # Save coordinates
        if np.array_equal(np_pixels,right_arm_shoulder): # right_arm_shoulder
            right_arm_shoulder_pixels = right_arm_shoulder_pixels + 1
            right_arm_shoulder_coordinates = np.concatenate((right_arm_shoulder_coordinates,current_coordinate),axis=0) # Save coordinates

问题:

我的方法的问题是它超级慢!例如,这些代码行:

if np.array_equal(np_pixels,torso): # Torso

花费大量的执行时间。将每个像素与其对应的 RGB 进行比较太慢了。

我的问题

最好的解决方案是什么?所以要么:

  1. 在 python-tf-bodypix 库/API 中有更好的方法来获取分段的身体部位的像素坐标。(有人知道bodypix库中是否存在这种方法吗?)

或者...

  1. 有什么更好/更快的方法来比较两个 numpy 数组?

  2. 您在我的方法中看到我应该更改的任何其他低效代码?

埃里克乙

来自答案:从存储在 NumPy ndarrays 中的图像中查找特定 (R,G,B) 颜色值的 (x,y) 索引

您的问题的解决方案是:

cords = list(zip(*np.where(np.all(np_pixels == torso, axis=-1))))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在numpy数组中向前填充NaN值的最有效方法

检查NumPy数组中是否存在值的最有效方法是什么?

在numpy数组中查找模式的最有效方法

对numpy数组进行哈希处理的最有效属性

对numpy数组进行哈希处理的最有效属性

反转numpy数组的最有效方法

从数组删除的最有效方法?

为多数组实现numpy.in1d的最有效方法

在二维numpy数组中计算False值的最有效(和pythonic)方法?

比较python中多个文件的最有效方法

将numpy数组转换为Shapely点的最有效方法是什么?

在Numpy数组中匹配模板的最有效方法是什么?

从Scipy CSR矩阵索引到numpy数组的最有效方法?

在Python NumPy中拉伸图像的最有效方法

基于两个numpy数组获取排序索引的最有效方法

计算二维Numpy数组中数字对频率的最有效方法

比较PHP中对象的两个数组的最有效方法

React useEffect():比较两个对象数组是否相等的最有效方法

替换NumPy数组的某些给定索引的最有效方法是什么?

比较长字符串数组的最有效方法

比较Ruby中数组的最有效方法

在Redshift中比较时间的有效方法

比较2个Numpy矩阵的每个值的最有效方法是什么?

在 numpy 中更新特定列的最有效方法

将 2D numpy 数组中的每个元素与其 8 个邻居进行比较的最有效方法

比较数据的最有效方法

Numpy:在过滤数组中检索原始列的最有效方法

处理 NumPy 数组上的循环的最有效方法是什么?

在打字稿中比较对象数组的最有效方法?