最近在学习ppyoloe,标签文件的格式是coco的json格式,需要把yolov5的txt文件转为json,以下代码即可实现
import os
import json
import cv2
import random
import time
from PIL import Image
coco_format_save_path='/Users/json/'
yolo_format_classes_path='/Users/billiards_classes.txt'
yolo_format_annotation_path='/Users/labels/labels_val/'
img_pathDir='/Users/images/images_val/'
with open(yolo_format_classes_path,'r') as fr:
lines1=fr.readlines()
categories=[]
for j,label in enumerate(lines1):
label=label.strip()
categories.append({'id':j+1,'name':label,'supercategory':'None'})
write_json_context=dict()
write_json_context['info']= {'description': '', 'url': '', 'version': '', 'year': 2022, 'contributor': 'aa', 'date_created': '2022-10-8'}
write_json_context['licenses']=[{'id':1,'name':None,'url':None}]
write_json_context['categories']=categories
write_json_context['images']=[]
write_json_context['annotations']=[]
imageFileList=os.listdir(img_pathDir)
for i,imageFile in enumerate(imageFileList):
imagePath = os.path.join(img_pathDir,imageFile)
image = Image.open(imagePath)
W, H = image.size
img_context={}
img_context['file_name']=imageFile
img_context['height']=H
img_context['width']=W
img_context['date_captured']='2022-10-17'
img_context['id']=i
img_context['license']=1
img_context['color_url']=''
img_context['flickr_url']=''
write_json_context['images'].append(img_context)
txtFile=imageFile[:-4]+'.txt'
with open(os.path.join(yolo_format_annotation_path,txtFile),'r') as fr:
lines=fr.readlines()
for j,line in enumerate(lines):
bbox_dict = {}
class_id,x,y,w,h=line.strip().split(' ')
class_id,x, y, w, h = int(class_id), float(x), float(y), float(w), float(h)
xmin=(x-w/2)*W
ymin=(y-h/2)*H
xmax=(x+w/2)*W
ymax=(y+h/2)*H
w=w*W
h=h*H
bbox_dict['id']=i*10000+j
bbox_dict['image_id']=i
bbox_dict['category_id']=class_id+1
bbox_dict['iscrowd']=0
height,width=abs(ymax-ymin),abs(xmax-xmin)
bbox_dict['area']=height*width
bbox_dict['bbox']=[xmin,ymin,w,h]
bbox_dict['segmentation']=[[xmin,ymin,xmax,ymin,xmax,ymax,xmin,ymax]]
write_json_context['annotations'].append(bbox_dict)
name = os.path.join(coco_format_save_path,"val"+ '.json')
with open(name,'w') as fw:
json.dump(write_json_context,fw,indent=2)