json格式数据集转yolo txt格式

json格式数据集转yolo txt格式

网上相关代码大多针对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

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值