背景:
我正在使用 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 进行比较太慢了。
我的问题
最好的解决方案是什么?所以要么:
或者...
有什么更好/更快的方法来比较两个 numpy 数组?
您在我的方法中看到我应该更改的任何其他低效代码?
来自答案:从存储在 NumPy ndarrays 中的图像中查找特定 (R,G,B) 颜色值的 (x,y) 索引
您的问题的解决方案是:
cords = list(zip(*np.where(np.all(np_pixels == torso, axis=-1))))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句