Labelme:json文件
Roboflow:YoloV5格式txt文件
import json
import os
from glob import glob
from tqdm import tqdm
from PIL import Image
import cv2
def Json2Txt(json_path, txt_path):
label_json = json.load(open(json_path, 'r'))
img_size = (label_json['imageWidth'], label_json['imageHeight'])
msg_annotation = label_json['shapes']
with open(txt_path, 'w') as f:
for i in msg_annotation:
# (x1,y1),(x2,y2) 左上角,右下角
x1 = float(i['points'][0][0])
y1 = float(i['points'][0][1])
x2 = float(i['points'][1][0])
y2 = float(i['points'][1][1])
# 转换并归一化
center_x = (x1 + x2) * 0.5 / img_size[0]
center_y = (y1 + y2) * 0.5 / img_size[1]
w = abs((x2 - x1)) * 1.0 / img_size[0]
h = abs((y2 - y1)) * 1.0 / img_size[1]
bbox = (center_x, center_y, w, h) # 仅适用矩形框标注
cls_id = names.index(i['label']) # 位于定义类别索引位置
f.write(str(cls_id) + ' ' +" ".join([str(a) for a in bbox])+"n") # 生成格式0 cx,cy,w,h
names = ['1', '2', '3', '4', '5', '6', '7']
json_dir = glob('error-detection-v3-yolov5pytorch/train/images/*.json')
for i in tqdm(json_dir):
json_path = i
txt_path = i.replace('.json', '.txt')
Json2Txt(json_path, txt_path)



