最近做人体姿态识别,通过COCO Annotator制作好数据集之后,要将器转化为yolo格式.这里附上转换代码.
import os
import json
# 打开json文件并读取数据
with open('pose-4.json') as f:
data = json.load(f)
# 输出读取的数据
images=data.get('images')
annotations=data.get("annotations")
print(images)
print(annotations)
#创建输出文件夹
# 文件夹名称
folder_name = 'output'
# 新建文件夹
if not os.path.exists(folder_name): # 判断文件夹是否存在
os.mkdir(folder_name) # 如果不存在则创建文件夹
print(f'成功创建文件夹 {folder_name}!')
else:
print(f'文件夹 {folder_name} 已存在!')
# 写入文件
imageslist=[]
for i in range(len(images)):
file_name=images[i].get('file_name')[:-4]
width=images[i].get('width')
height=images[i].get('height')
imageslist.append([file_name+'.txt',width,height])
keyp=[]
for i in range(len(annotations)):
id=annotations[i].get('image_id')-1
file_name=imageslist[id][0]
width=imageslist[id][1]
height=imageslist[id][2]
content='0'
flag1=0
flag2=0
bbox=annotations[i].get('bbox')
x=bbox[0]+bbox[2]/2
y=bbox[1]+bbox[3]/2
w=bbox[2]
h=bbox[3]
for j in annotations[i].get('bbox'):
if flag1==0:
num=x/width
num=format(num,'.6f')
content+=" "+str(num)
if flag1 == 1:
num = y/ height
num = format(num, '.6f')
content += " " + str(num)
if flag1 == 2:
num = w/ width
num = format(num, '.6f')
content += " " + str(num)
if flag1 == 3:
num = h / height
num = format(num, '.6f')
content += " " + str(num)
flag1+=1
keyp.append([ annotations[i].get('keypoints'), annotations[i].get('image_id')])
for k in annotations[i].get('keypoints'):
if flag2 % 3 == 0:
num = k / width
num = format(num, '.6f')
content += " " + str(num)
elif flag2 % 3 == 1:
num = k / height
num = format(num, '.6f')
content += " " + str(num)
elif flag2 % 3 == 2:
num = k
num = format(num, '.6f')
content += " " + str(num)
flag2+=1
with open(f'output/{file_name}','a') as f:
f.write(f'{content}\n')
print(imageslist)
print(keyp)
转换后的效果如图: