

PythonでCoco Styleのjsonファイルを作りたいです。

プログラミング初心者です。  
初めて質問させていただきます。

<http://www.immersivelimit.com/tutorials/create-coco-annotations-from-
scratch/#coco-dataset-format>

上記のサイトを参考にしながらアノテーションファイルを作ろうとしています。  
以下上記サイトのコードの画像を変えただけのもの

[code]

    from PIL import Image # (pip install Pillow)
    import numpy as np
    from skimage import measure
    from shapely.geometry import Polygon, MultiPolygon
    
    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 pixel != (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
    
    def create_sub_mask_annotation(sub_mask, image_id, category_id, annotation_id, is_crowd):
    contours = measure.find_contours(sub_mask, 0.5, positive_orientation='low')
    
        segmentations = []
        polygons = []
        for contour in contours:
            for i in range(len(contour)):
                row, col = contour[i]
            contour[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()
            segmentations.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 annotation
    
    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
    
    annotation_id = 1
    image_id = 1
    
    annotations = []
    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]
            annotation = create_sub_mask_annotation(sub_mask, image_id, category_id, annotation_id, is_crowd)
            annotations.append(annotation)
            annotation_id += 1
        image_id += 1
    
[/code]

これを実行したところ、

* * *

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 annotation = create_sub_mask_annotation(sub_mask, image_id, category_id,
annotation_id, is_crowd)  
32 annotations.append(annotation)

KeyError: '(0, 1, 5)'

この様なエラーが返ってきました。  
画像は以下の物です。

mask_10.jpg  
[![画像の説明をここに入力](https://i.stack.imgur.com/njkw4.jpg)](https://i.stack.imgur.com/njkw4.jpg)  
mask_398.jpg  
[![画像の説明をここに入力](https://i.stack.imgur.com/8aHS7.jpg)](https://i.stack.imgur.com/8aHS7.jpg)  
mask_0.jpg  
[![画像の説明をここに入力](https://i.stack.imgur.com/cYFTx.jpg)](https://i.stack.imgur.com/cYFTx.jpg)

create_sub_masksがどのように動いているかよく分からず、特にここの意味がよく分からないです。

[code]

    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)
    
[/code]

勉強不足なので少しでも知恵をお借りしたいです。


CC BY-SA 4.0
2019-02-02T17:16:09.457
52506
2019-02-03T10:31:55.577
2019-02-02T17:27:25.210
32022
32022
question
python json annotations
PythonでCoco Styleのjsonファイルを作りたい


自己解決しました。

jpgでなくpngにしたら動きました。


CC BY-SA 4.0
2019-02-03T10:31:55.577
52515
2019-02-03T10:31:55.577
32022
52506
answer