问题
I annotated images using PixelAnnotationTool provided here: https://github.com/abreheret/PixelAnnotationTool and using the provided dictionary:
{
"labels": {
"unlabeled": {
"categorie": "void",
"color": [
0,
0,
0
],
"id": 0,
"id_categorie": 0,
"name": "unlabeled"
},
"bicycle_motorcycle": {
"categorie": "bicycle_motorcycle",
"color": [
119,
11,
32
],
"id": 1,
"id_categorie": 1,
"name": "bicycle_motorcycle"
},
"bus": {
"categorie": "bus",
"color": [
102,
51,
0
],
"id": 2,
"id_categorie": 2,
"name": "bus"
},
.... }
I want to convert these RGB masks into json polygon format so that I can use them in Mask R-CNN. How to do this?
回答1:
Here's a python function that will take in a mask Image object and return a dictionary of sub-masks, keyed by RGB color.
from PIL import Image # (pip install Pillow)
def create_sub_masks(mask_image):
width, height = mask_image.size
# Initialize a dictionary of sub-masks indexed by RGB colors
sub_masks = {}
for x in range(width):
for y in range(height):
# Get the RGB values of the pixel
pixel = mask_image.getpixel((x,y))[:3]
# If the pixel is not black...
if pixel != (0, 0, 0):
# Check to see if we've created a sub-mask...
pixel_str = str(pixel)
sub_mask = sub_masks.get(pixel_str)
if sub_mask is None:
# Create a sub-mask (one bit per pixel) and add to the dictionary
# Note: we add 1 pixel of padding in each direction
# because the contours module doesn't handle cases
# where pixels bleed to the edge of the image
sub_masks[pixel_str] = Image.new('1', (width+2, height+2))
# Set the pixel value to 1 (default is 0), accounting for padding
sub_masks[pixel_str].putpixel((x+1, y+1), 1)
return sub_masks
Once you have the masks you can use imantics to convert it to COCO
来源:https://stackoverflow.com/questions/54802089/convert-an-rgb-mask-image-to-coco-json-polygon-format