I would like to create a Coco Style json file in Python.
I'm a beginner in programming.
This is my first time asking a question.
http://www.immersivelimit.com/tutorials/create-coco-annotations-from-scratch/ #coco-dataset-format
I am trying to create an annotation file by referring to the above site.
The following is just an image of the code on the above site
from PIL import Image# (pipe install Pillow)
import numpy as np
from image import measure
from shapely.geometry import Polygon, MultiPolygon
def create_sub_masks(mask_image):
width, height=mask_image.size
# Initialize 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]
ifpixel!=(0,0,0):
pixel_str=str(pixel)
sub_mask=sub_masks.get(pixel_str)
if sub_mask is None:
sub_masks [pixel_str] = Image.new('1', (width+2, height+2))
sub_masks [pixel_str].putpixel((x+1,y+1),1)
return sub_masks
create_sub_mask_announcement(sub_mask, image_id, category_id, announcement_id, is_crowd):
contents=measure.find_contours(sub_mask, 0.5, positive_orientation='low')
segments = [ ]
polygons = [ ]
for tour in contents:
for i in range (len(contour)) :
row,col=contour[i]
tour[i] = (col-1, row-1)
poly=Polygon(contour)
poly=poly.simplify (1.0, preserve_topology=False)
polygons.append(poly)
segmentation=np.array(poly.exterior.coords).ravel().tolist()
segments.append(segmentation)
multi_poly=MultiPolygon(polygons)
x,y,max_x,max_y = multi_poly.bounds
width = max_x -x
height = max_y -y
bbox=(x,y,width,height)
area=multi_poly.area
annotation = {
'segmentation':segmentations,
'iscrowd': is_crowd,
'image_id': image_id,
'category_id':category_id,
'id' —Annotation_id,
'bbox': bbox,
'area': area
}
return announcement
class1_image=PIL.Image.open('./mask/class1/mask_10.jpg')
class2_image=PIL.Image.open('./mask/class2/mask_398.jpg')
class3_image=PIL.Image.open('./mask/class3/mask_0.jpg')
mask_images=[class1_image, class2_image, class3_image]
category_ids = {1:{'(255,0,0)':class1_id,},
2:{'(0,255,0)':class2_id,},
3: {'(0,0,255)':class3_id,}}
is_crowd = 0
announcement_id = 1
image_id = 1
announcements = [ ]
for mask_image in mask_images:
sub_masks=create_sub_masks(mask_image)
# print(sub_masks.keys())
for color, sub_mask in sub_masks.items():
# print(image_id, color)
category_id = category_ids [ image_id ] [ color ]
announcement=create_sub_mask_announcement(sub_mask, image_id, category_id, announcement_id, is_crowd)
announcements.append(announcement)
announcement_id+=1
image_id+=1
Now that I've done this,
KeyError Traceback (most recent call last)
in
28 for color, sub_mask in sub_masks.items():
29# print(image_id,color)
--- >30 category_id = category_ids [image_id] [color]
31 notation=create_sub_mask_notation(sub_mask, image_id, category_id, announcement_id, is_crowd)
32 notations.append (announcement)
KeyError: '(0,1,5)'
I received an error like this.
The image is as follows.
mask_10.jpg
mask_398.jpg
mask_0.jpg
I'm not sure how create_sub_masks works, especially I don't understand the meaning of this place.
if sub_mask is None:
sub_masks [pixel_str] = Image.new('1', (width+2, height+2))
sub_masks [pixel_str].putpixel((x+1,y+1),1)
I don't have enough study, so I'd like to ask for some wisdom.
python json annotations
Self-resolved.
I chose png instead of jpg, and it worked.
© 2024 OneMinuteCode. All rights reserved.