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