【问题标题】:Converting Detectron2 instance segmentation to opencv Mat array将Detectron2实例分割转换为opencv Mat数组
【发布时间】:2021-03-12 12:25:43
【问题描述】:

我正在尝试从使用 Detectron2 执行的实例分割输出中获取二进制图像。 根据the official documentation,掩码的输出格式如下:

“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) ,而无需保存图像。

What I would like to achieve

提前谢谢你。

【问题讨论】:

    标签: python numpy opencv data-conversion detectron


    【解决方案1】:
    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, 0, -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, 255, img)
        array_img = np.asarray(img)
        img_mask[np.where((array_img==[255,255,255]).all(axis=2))]=color
        
    img_mask = np.asarray(img_mask)
    output = cv2.addWeighted(im, 0.7, img_mask, 0.3, 0)
    

    【讨论】:

    • 个人口罩怎么取?
    【解决方案2】:

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

    mask_array = outputs['instances'].pred_masks.numpy()
    num_instances = mask_array.shape[0]
    mask_array = np.moveaxis(mask_array, 0, -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
    

    【讨论】:

    • 这正是我想要实现的目标。谢谢!
    猜你喜欢
    • 2021-07-06
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多