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