labelme输出的json转coco格式

  • labelme标注好的文件夹样式如下,每张图片对应一个json标注
    -

  • 其中每个json文件打开后如下所示,其中标注了人体的17个关键点以及人体的bbox
    在coco的标注中,每个关键点表示为(x,y,v),用labelme标注时,我们用group_id来表示v。
    在这里插入图片描述

  • 转化代码如下:

import json
import glob

def build_basic_dict():
    basic_dict = {}

    info = {}
    description = 'small_person_keypoints'
    author = 'lishaohua'
    info.update({'description':description,'author':author})
    basic_dict.update({'info':info})

    categories={}
    categories.update({'supercategory':'person','id':1,'name':'person'})
    keypoints = ["nose",
                 "left_eye","right_eye",
                 "left_ear","right_ear",
                 "left_shoulder","right_shoulder",
                 "left_elbow","right_elbow",
                 "left_wrist","right_wrist",
                 "left_hip","right_hip",
                 "left_knee","right_knee",
                 "left_ankle","right_ankle"]
    skeleton = [[16,14],
                [14,12],
                [17,15],
                [15,13],
                [12,13],
                [6,12],
                [7,13],
                [6,7],
                [6,8],
                [7,9],
                [8,10],
                [9,11],
                [2,3],
                [1,2],
                [1,3],
                [2,4],
                [3,5],
                [4,6],
                [5,7]]
    categories.update({'keypoints':keypoints,'skeleton':skeleton})
    basic_dict.update({'categories':categories})
    return basic_dict

def build_images(img_lists,json_lists):
    images=[]
    for name in img_lists:
        file_name = name.split('\\')[7]
        id = int(file_name.split('.')[0])
        for j in json_lists:
            with open(j, 'r') as f:
                f = json.load(f)
                if file_name == f['imagePath']:
                    height = f['imageHeight']
                    width = f['imageWidth']
                    image={}
                    image.update({'file_name':file_name,'height':height,'width':width,'id':id})
                    images.append(image)
    return images

def build_annotations(img_lists,json_lists):
    annotations_dict = {}
    annotations_dicts =[]
    ann_id = 0
    for i in json_lists:
        with open(i, 'r') as f:
            shape = json.load(f)['shapes']
            num_person = int(len(shape) / (17 + 1))
            keypoints= []
            bbox = []
            num_joint=0
            for per_joint in shape:
                if per_joint['group_id'] == 0:
                    x,y,z = 0,0,0
                    keypoints.extend([x,y,z])
                    num_joint +=1
                if 'bbox' in per_joint['label']:
                    xmin,ymin = enumerate(per_joint['points'][0])
                    xmax,ymax = enumerate(per_joint['points'][1])
                    bbox.extend([xmin[1],ymin[1],xmax[1]-xmin[1],ymax[1]-ymin[1]])
                if per_joint['group_id'] == 1:
                    x,y = enumerate(per_joint['points'][0])
                    keypoints.extend([x[1],y[1],per_joint['group_id']])
                if per_joint['group_id'] == 2 and 'bbox' not in per_joint['label']:
                    x, y = enumerate(per_joint['points'][0])
                    keypoints.extend([x[1], y[1], per_joint['group_id']])
            num_keypoints = 17 - num_joint
            image_id = int(i.split('\\')[-1].split('.')[0])
            category_id = 1
            for j in range(num_person):
                ann_id += 1
                annotations_dict.update({'num_keypoints':num_keypoints,
                                         'area':int(bbox[2] * bbox[3]),
                                         'iscrowd': int(0),
                                         'keypoints':keypoints[16*3*j:16*3*(j+1)+3],
                                         'image_id':image_id,
                                         'bbox':bbox[0:4],
                                         'category_id':category_id,
                                         'id':int(ann_id-1)})
                a = annotations_dict.copy()
                annotations_dicts.append(a)
    return annotations_dicts

file_path = 'C:\\Users\\zstu\\Desktop\\smallperson\\images\\val2017\\'  #需要修改
json_lists = glob.glob(file_path + '\\*.json')
img_lists = glob.glob(file_path + '\\*.jpg')

for json_name in json_lists:
    with open(json_name,'r') as f:
        f = json.load(f)

    basic_dicts = build_basic_dict()
    images_dicts = build_images(img_lists,json_lists)
    annotations_dicts = build_annotations(img_lists,json_lists)
    tinyperson = {}
    tinyperson.update({'info':basic_dicts['info'],'images':images_dicts,'annotations':annotations_dicts,'categories':[basic_dicts['categories']]})
    json.dump(tinyperson,open('C:\\Users\\zstu\\Desktop\\smallperson\\annotations\\tinyperson.json','w'),indent=4) #需要修改
  • 转化后的格式如下所示,此时只拿三张图片举例。
    在这里插入图片描述

  • 除了脚本中两处路径需要修改外,labelme标注出来的格式也要和上述对应。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tomorrow;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值