微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 Detectron2 实例分割转换为 opencv Mat 数组

如何解决将 Detectron2 实例分割转换为 opencv Mat 数组

我正在尝试从使用 Detectron2 执行的实例分割输出获取二值图像。 根据{{​​3}},掩码的输出格式如下:

“pred_masks”:形状为 (N,H,W) 的张量,每个检测到的实例的掩码。

所以我尝试将其转换为 numpy: mask = outputs["instances"].get("pred_masks").numpy() 输出如下:

[[[False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]]

 [[False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  ...
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]]

 [[False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  ...
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]]

 ...

 [[False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  ...
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]]

 [[False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  ...
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]]

 [[False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  ...
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]]]

但是数据类型是布尔值,所以我添加了以下行以更接近 opencv 格式: array = (mask > 126) * 255

[[[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 ...

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]]

这就是我去过的地方。 我希望能够将每个掩码单独可视化为 opencv 图像: cv2.imshow("Mask",mask) ,无需保存图像。

the official documentation

提前致谢。

解决方法

我希望这将为您的期望提供解决方案

mask_array = outputs['instances'].pred_masks.numpy()
num_instances = mask_array.shape[0]
mask_array = np.moveaxis(mask_array,-1)
mask_array_instance = []
output = np.zeros_like(im) #black
#print('output',output)
for i in range(num_instances):
    mask_array_instance.append(mask_array[:,:,i:(i+1)])
    output = np.where(mask_array_instance[i] == True,255,output)
cv2.imwrite(mask_path+'/'+item+'.jpg',output)#mask
,
mask_array = outputs['instances'].pred_masks.to("cpu").numpy()
num_instances = mask_array.shape[0]
scores = outputs['instances'].scores.to("cpu").numpy()
labels = outputs['instances'].pred_classes .to("cpu").numpy()
bbox   = outputs['instances'].pred_boxes.to("cpu").tensor.numpy()

mask_array = np.moveaxis(mask_array,-1)

mask_array_instance = []
#img = np.zeros_like(im) #black
h = im.shape[0]
w = im.shape[1]
img_mask = np.zeros([h,w,3],np.uint8)
color = (200,100,255)
for i in range(num_instances):
    img = np.zeros_like(im)
    mask_array_instance.append(mask_array[:,i:(i+1)])
    img = np.where(mask_array_instance[i] == True,img)
    array_img = np.asarray(img)
    img_mask[np.where((array_img==[255,255]).all(axis=2))]=color
    
img_mask = np.asarray(img_mask)
output = cv2.addWeighted(im,0.7,img_mask,0.3,0)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。