COCO格式json切分为labelme可识别json
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
coco数据格式相关内容参考之前博客
切分的关键在于将coco_json中的annotation信息转化为labelme中shape的坐标信息
labelme中shape需要的是多边形的点坐标,存储格式为[[x1,y1], [x2,y2]......]
import os
import json
import pycocotools.mask as mask_utils
from pycocotools.coco import COCO
import cv2
json_path = ''
# 读取json(这里重复读取了,懒得改)
with open(json_path, 'r') as f:
coco_data = json.load(f)
coco = COCO(json_path)
output_json = ''
os.makdirs(output_json, exist_ok=True)
for image_data in coco_data['images']:
image_id = image_data['id']
image_file_name = image_data['file_name']
# 创建labelme的json数据结构,这里也可以读一个labelme的json直接替换
labelme_data = {
'version': '4.5.7',
'flags':{},
'shapes':[],
'imagePath':image_file_name,
'imageData':None,
'imageHeight':image_data['height'],
'imageWidth':image_data['width']
}
# 查找当前图像的标签数据
for annotation in coco_data['annotations']:
if annotation['image_id'] == image_id:
category_id = annotation['category_id']
# 构建labelme多边形点
rle = coco.annToRLE(annotation)
mask = mask_utils.decode(rle)
mask[mask == 1] = 255
# mask轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
if len(contour) < 3:
continue
seg_xy = [[int(x), int(y)] for x,y in contour.reshape(-1, 2)]
# 创建labelme的shape结构
shape = {
'label': str(category_id),
'points': seg_xy,
'group_id': None,
'shape_type': 'polygon',
'flags': {}
}
# 将shape添加到labelme结构中
labelme_data['shapes'].append(shape)
# 将labelme结构写入json文件中
labelme_json_file = os.path.join(output_json, os.path.splitext(image_file_name)[0]+'.json')
with open(labelme_json_file, 'w') as labelme_f:
json.dump(labelme_data, labelme_f, indent=2)
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e
4 个月前
8c391e04
6 个月前
更多推荐
已为社区贡献8条内容
所有评论(0)