网上相关代码大多针对COCO数据集的,但是有些非公共数据集没有coco相关的文件,只有每张图片对应的json文件,故本文代码针对每张图片的json文件转换为yolo需要的txt文件。
json文件格式
{
"shape": [
{
"label": "class1",
"boxes": [
367,
209,
537,
339
],
"points": null
},
{
"label": "class1",
"boxes": [
73,
597,
230,
807
],
"points": null
},
{
"label": "class1",
"boxes": [
410,
680,
634,
888
],
"points": null
},
{
"label": "class1",
"boxes": [
705,
389,
835,
753
],
"points": null
},
{
"label": "class1",
"boxes": [
1073,
639,
1329,
959
],
"points": null
},
{
"label": "class1",
"boxes": [
1464,
499,
1616,
801
],
"points": null
},
{
"label": "class1",
"boxes": [
1535,
385,
1742,
513
],
"points": null
},
{
"label": "class1",
"boxes": [
1321,
48,
1573,
178
],
"points": null
},
{
"label": "class1",
"boxes": [
1618,
120,
1757,
247
],
"points": null
},
{
"label": "class1",
"boxes": [
1745,
159,
1877,
386
],
"points": null
},
{
"label": "class1",
"boxes": [
1810,
685,
1962,
793
],
"points": null
},
{
"label": "class1",
"boxes": [
1838,
770,
1972,
918
],
"points": null
},
{
"label": "class1",
"boxes": [
1113,
950,
1391,
1175
],
"points": null
},
{
"label": "class1",
"boxes": [
83,
943,
192,
1156
],
"points": null
},
{
"label": "class1",
"boxes": [
110,
1132,
167,
1307
],
"points": null
},
{
"label": "class1",
"boxes": [
129,
1102,
216,
1302
],
"points": null
},
{
"label": "class1",
"boxes": [
164,
1143,
253,
1350
],
"points": null
},
{
"label": "class1",
"boxes": [
218,
1137,
316,
1372
],
"points": null
},
{
"label": "class1",
"boxes": [
286,
1142,
383,
1369
],
"points": null
},
{
"label": "class1",
"boxes": [
323,
1170,
445,
1426
],
"points": null
},
{
"label": "class1",
"boxes": [
359,
1172,
556,
1437
],
"points": null
},
{
"label": "class1",
"boxes": [
530,
1189,
648,
1447
],
"points": null
},
{
"label": "class1",
"boxes": [
592,
1180,
811,
1458
],
"points": null
},
{
"label": "class1",
"boxes": [
651,
1097,
980,
1243
],
"points": null
},
{
"label": "class1",
"boxes": [
848,
1021,
1115,
1283
],
"points": null
},
{
"label": "class1",
"boxes": [
1007,
1101,
1284,
1404
],
"points": null
},
{
"label": "class1",
"boxes": [
1042,
1204,
1278,
1474
],
"points": null
},
{
"label": "class1",
"boxes": [
243,
974,
435,
1117
],
"points": null
}
],
"imagePath": "1.jpg"
}
代码
import json
import cv2
import os
all_classes={'class1':0,'class2':1} ##类别列表,与训练配置文件中的顺序保持一致
savepath="./labels/" #txt文件存放位置
jsonpath="./train_json/" #json文件位置
imgpath="./train_img/" #图片位置,因为我的json文件中没有图片size,故需要读取图片得到size
json_files=os.listdir(jsonpath)
for i in json_files:
infile=jsonpath+i
with open(infile,'r') as load_f:
load_dict = json.load(load_f) #打开每个json文件
outfile=open(savepath+load_dict["imagePath"][:-4]+'.txt','w')
img_path=imgpath+load_dict["imagePath"]
img=cv2.imread(img_path)
size=img.shape
h_img,w_img=size[0],size[1] #得到图片size
for item in load_dict["shape"]:
print(item)
label_int=all_classes[item['label']]
print(infile)
if not item['boxes']:
continue
x1,y1,x2,y2=item['boxes']
print(label_int)
print(x1,y1,x2,y2)
x_center=(x1+x2)/2/w_img
y_center=(y1+y2)/2/h_img
w=(x2-x1)/w_img
h=(y2-y1)/h_img
outfile.write(str(label_int)+" "+str(x_center)+" "+str(y_center)+" "+str(w)+" "+str(h)+'\n')
outfile.close()
txt文件
0 0.220703125 0.17838541666666666 0.0830078125 0.08463541666666667
0 0.073974609375 0.45703125 0.07666015625 0.13671875
0 0.2548828125 0.5104166666666666 0.109375 0.13541666666666666
0 0.3759765625 0.3717447916666667 0.0634765625 0.23697916666666666
0 0.58642578125 0.5201822916666666 0.125 0.20833333333333334
0 0.751953125 0.4231770833333333 0.07421875 0.19661458333333334
0 0.800048828125 0.2923177083333333 0.10107421875 0.08333333333333333
0 0.70654296875 0.07356770833333333 0.123046875 0.08463541666666667
0 0.823974609375 0.11946614583333333 0.06787109375 0.08268229166666667
0 0.88427734375 0.17740885416666666 0.064453125 0.14778645833333334
0 0.9208984375 0.4811197916666667 0.07421875 0.0703125
0 0.93017578125 0.5494791666666666 0.0654296875 0.09635416666666667
0 0.611328125 0.6917317708333334 0.1357421875 0.146484375
0 0.067138671875 0.6832682291666666 0.05322265625 0.138671875
0 0.067626953125 0.7939453125 0.02783203125 0.11393229166666667
0 0.084228515625 0.7825520833333334 0.04248046875 0.13020833333333334
0 0.101806640625 0.8115234375 0.04345703125 0.134765625
0 0.13037109375 0.8167317708333334 0.0478515625 0.15299479166666666
0 0.163330078125 0.8173828125 0.04736328125 0.14778645833333334
0 0.1875 0.8450520833333334 0.0595703125 0.16666666666666666
0 0.223388671875 0.8492838541666666 0.09619140625 0.17252604166666666
0 0.28759765625 0.8580729166666666 0.0576171875 0.16796875
0 0.342529296875 0.8587239583333334 0.10693359375 0.18098958333333334
0 0.398193359375 0.76171875 0.16064453125 0.09505208333333333
0 0.479248046875 0.75 0.13037109375 0.17057291666666666
0 0.559326171875 0.8154296875 0.13525390625 0.197265625
0 0.56640625 0.8717447916666666 0.115234375 0.17578125
0 0.16552734375 0.6806640625 0.09375 0.09309895833333333