python批量数据处理脚本——yolo标签的darknet格式转json格式

上一节讲到了json格式转darknet格式,这一节讲讲darknet格式转json格式,这也同样重要。

比如训练了一个模型出来要在数据集中找找原因,想要看下训练集的标定是否出现了问题,而训练集的标签文件的darknet格式只有一行行枯燥的数字,而且还不仅不是直接的bounding box的坐标,竟然是坐标的一些列转化!转化公式如下:

x1 = float(a[2])
y1 = float(a[3])
w = float(a[4]) - float(a[2])
h = float(a[5]) - float(a[3])

if w <= 15 and h <= 15: continue

center_x = float(a[2]) + w / 2
center_y = float(a[3]) + h / 2
x1 = str(center_x / img_w)
y1 = str(center_y / img_h)
x2 = str(w / img_w)
y2 = str(h / img_h)

原本如果只能有txt文件一行行枯燥的数字的话,所希望看到的是这样的:
python批量数据处理脚本——yolo标签的darknet格式转json格式_第1张图片
如果一行行的数字是坐标的直接形式的话,那还是可以接受的。
但darknet格式却是这样的:
python批量数据处理脚本——yolo标签的darknet格式转json格式_第2张图片
这种格式哪个口算大师能直接看得出这个框大概在图中的哪个位置啊?
但是不慌,我们可以让它从darknet格式转为json格式,然后用标注工具打开,就一目了然了,代码如下:

# -*- coding: utf-8 -*-
import json
import cv2
from glob import glob
import os


txt_path = 'darknet标签目录地址/'   # darknet格式
saved_path = '保存json的目录地址/'
img_path = '对应图片的目录地址/'


files = glob(txt_path + "*.txt")               # 找出所有的txt文件
# files = os.listdir(txt_path)
# print(files)
files = [i.split('/')[-1].split('.txt')[0] for i in files]
print(files)

for file in files:
    print(file)
    txt_file = txt_path + file + '.txt'
    img_file = img_path + file + '.jpg'
    print(img_file)
    img = cv2.imread(img_file)
    # print(img)
    imgw = img.shape[1]
    imgh = img.shape[0]
    xi = []
    yi = []
    xa = []
    ya = []
    Label = []

    with open(txt_file, 'r') as f:             # 读取txt文件将所有标签名存入数组
        for line in f.readlines():
            line = line.strip('\n')            
            a = line.split(' ')  
            label = 'other'
            if a[0] == '0':
                label = 'head'   #'head'
            elif a[0] == '1':
                label = 'hat'   #'hat'
            # 这里是自己命名的类别及对应的数字
            
            Label.append(label)
            print(Label)

            centerx=float(a[1])*imgw
            centery=float(a[2])*imgh
            w=float(a[3])*imgw
            h=float(a[4])*imgh
            xmin = centerx - w/2
            xmax= centerx + w/2
            ymin= centery - h/2
            ymax = centery + h/2

            xi.append(xmin)
            yi.append(ymin)
            xa.append(xmax)
            ya.append(ymax)

    # for j in range(0, len(files)):
    labelme_formate = {
        "version": "4.2.9",
        "flags": {},
        "lineColor": [0, 255, 0, 128],
        "fillColor": [255, 0, 0, 128],
        "imagePath": file + ".jpg",
        "imageHeight": imgh,
        "imageWidth": imgw
    }
    labelme_formate['imageData'] = None
    shapes = []
    for i in range(0, len(xi)):
        s = {"label": Label[i], "line_color": None, "fill_color": None, "shape_type": "rectangle"}
        points = [
            [xi[i], yi[i]],
            [xa[i], ya[i]]
        ]
        s['points'] = points
        shapes.append(s)

    labelme_formate['shapes'] = shapes
    json.dump(labelme_formate, open(saved_path + file + ".json", 'w'), ensure_ascii=False, indent=2)
    print(saved_path + file + ".json")

然后我们将刚才的标签转化一下,用labelme(还有一款labelImg也还不错)标注工具打开,是这样的:
python批量数据处理脚本——yolo标签的darknet格式转json格式_第3张图片
就可以很直观的看到这个标注框的位置对不对了。这里只是选取了一个比较简单的例子进行举例,如果一张很复杂的图里面有十几二十个目标框,通过转为json打开直接看的形式就能很快的发现是哪个的标定出现问题了。

你可能感兴趣的:(python,json)