I am trying to get a binary image from the instance segmentation output performed using Detectron2. According to the official documentation the mask’s output format is the following:
“pred_masks”: a Tensor of shape (N, H, W), masks for each detected instance.
So i tried converting it to numpy:
mask = outputs["instances"].get("pred_masks").numpy()
The output was the following:
[[[False False False ... False False False] [False False False ... False False False] [False False False ... False False False] [False False False ... False False False] [False False False ... False False False] [False False False ... False False False]] [[False False False ... False False False] [False False False ... False False False] [False False False ... False False False] ... [False False False ... False False False] [False False False ... False False False] [False False False ... False False False]] [[False False False ... False False False] [False False False ... False False False] [False False False ... False False False] ... [False False False ... False False False] [False False False ... False False False] [False False False ... False False False]] ... [[False False False ... False False False] [False False False ... False False False] [False False False ... False False False] ... [False False False ... False False False] [False False False ... False False False] [False False False ... False False False]] [[False False False ... False False False] [False False False ... False False False] [False False False ... False False False] ... [False False False ... False False False] [False False False ... False False False] [False False False ... False False False]] [[False False False ... False False False] [False False False ... False False False] [False False False ... False False False] ... [False False False ... False False False] [False False False ... False False False] [False False False ... False False False]]]
However the data type was boolean so i added the following line to get closer to the opencv format:
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]]]
And that is as far as I went to.
I would like to be able to visualize each mask individually as an opencv image:
cv2.imshow("Mask", mask)
, without having to save the image.
Thank you in advance.
Advertisement
Answer
I hope this will give a solution for what you expecting
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