メモです

メモです

COCO FormatからPascal VOC Formatに変換する

import cv2
import re
from PIL import Image
import io
import json
import os
import numpy as np
from tqdm import tqdm
import requests

#画像データのディレクトリ
IMG_DIR = "./img/"
#ラベル画像のディレクトリ
LBL_DIR = "./lbl/"

with open('input_coco_format.json') as f:
     jsn = json.load(f)

#私の環境だと、file_nameにファイル名入りのURLが入っていたので正規表現を使っている
pattern = '[a-zA-Z0-9]+\.[a-zA-Z]+$'
repatter = re.compile(pattern)

for t in tqdm(jsn["annotations"]):
    sg = t["segmentation"]
    category = t["category_id"]
    #リストをforループで回すと遅いのでsetとかで書き直した方がいい
    for j in jsn["images"]:
        if j["id"] == t["image_id"]:
            width = j['width']
            height = j['height']
            m = repatter.search(j['file_name'])
            img = Image.open(io.BytesIO(requests.get(j['coco_url']).content))

            img.save(IMG_DIR + m.group())

    # working file
 # cv2だとy,x,cの順なので注意
    mask = np.zeros((int(height), int(width), 3))  # (y, x, c)

    # segmentation data
    sg = np.asarray(sg[0])
    poly_number = int(len(sg) / 2)
    poly = np.zeros((poly_number, 2))
    for i in range(poly_number):
        poly[i][0] = sg[(i * 2) + 0]  # x
        poly[i][1] = sg[(i * 2) + 1]  # y

 #category_idをそのまま使っている
    mask = cv2.fillConvexPoly(mask, np.array(
        poly, 'int32'), color=(category, category, category))

    # generate src_img and mask_image
    cv2.imwrite(LBL_DIR + m.group(), mask)


大変参考にさせていただいた
Pythonでポリゴン(多角形)の領域を抽出する方法 - Qiita