YOLO数据集制作(二)|json文件转txt验证

 以下教程用于验证转成YOLO使用的txt格式,适用场景:矩形框,配合json格式文件转成YOLO使用的txt格式脚本使用。

https://blog.csdn.net/StopAndGoyyy/article/details/138681454

使用方式:将img_path和label_path分别填入对应的图片(文件夹)及标签(文件夹)路径,运行。show_num参数控制最大展示数量,按空格切换。

import os
import numpy as np
import cv2

img_format = ['.jpg', '.png', '.jpeg']
colors = [(0, 0, 0), (128, 0, 0), (0, 128, 0), (128, 128, 0), (0, 0, 128), (128, 0, 128), (0, 128, 128),
          (128, 128, 128), (64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0), (64, 0, 128), (192, 0, 128),
          (64, 128, 128), (192, 128, 128), (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128),
          (128, 64, 12)]


def get_files(img_path, label_path):
    img_list = []
    label_list = []
    datast_img_format = None
    assert os.path.exists(img_path) and os.path.exists(label_path), print("⭐⭐文件夹不存在⭐⭐")
    if os.path.isdir(img_path):
        for i in os.listdir(img_path):
            if os.path.splitext(i)[-1] in img_format:
                # i = i.replace(os.path.splitext(i)[-1], '')
                img_list.append(i)
        datast_img_format=img_list[-1].split('.')[-1]
        if os.path.isdir(label_path):
            for i in os.listdir(label_path):
                if os.path.splitext(i)[-1] == '.txt':
                    i = i.replace(os.path.splitext(i)[-1], '')
                    label_list.append(i)

        print("路径下无jpg,png,jpeg格式的图片,当前图像路径:" + str(img_path) if len(
            img_list) == 0 else "图像总数为:" + str(len(img_list)))
        print("路径下无标签文件,当前标签路径" + str(label_path) if len(label_list) == 0 else "标签总数为:" + str(
            len(label_list)))

        img_without_label = []
        for i in img_list:
            if i.replace(os.path.splitext(i)[-1], '') not in label_list:
                img_without_label.append(i)
        if len(img_without_label) != 0:
            print("标签丢失的图像有:" + str(img_without_label))
        ok_img = list(set(img_list) - set(img_without_label))
        return [i.replace('.jpg', '') for i in ok_img], '.'+datast_img_format


# 坐标转换
def xywh2xyxy(x, w1, h1, img):
    label, x, y, w, h = x
    x_t = x * w1
    y_t = y * h1
    w_t = w * w1
    h_t = h * h1
    top_left_x = x_t - w_t / 2
    top_left_y = y_t - h_t / 2
    bottom_right_x = x_t + w_t / 2
    bottom_right_y = y_t + h_t / 2

    cv2.rectangle(img, (int(top_left_x), int(top_left_y)), (int(bottom_right_x), int(bottom_right_y)),
                  colors[int(label)] if int(label) < len(colors) else colors[0], 2)
    cv2.putText(img, text=str(int(label)), org=(int(top_left_x), int(top_left_y)), fontFace=cv2.FONT_HERSHEY_COMPLEX,
                fontScale=1, color=colors[int(label)] if int(label) < len(colors) else colors[0], thickness=3)

    return img


if __name__ == '__main__':

    # 修改输入图片文件夹
    img_path = r"O:\DeepLearningTool\01_handle_dataset\dataset\object\image"
    # img_path = r"O:\DeepLearningTool\dataset\image"
    # 修改输入标签文件夹
    label_path = r"O:\DeepLearningTool\01_handle_dataset\dataset\object\label"
    # label_path = r"O:\DeepLearningTool\dataset\label"
    # 输出文件夹
    outfile = './'

    # 是否展示绘制的图片
    if_show = True
    # 最大展示图片的数量(按空格切换)
    show_num = 3
    # 是否保存绘制的图片
    if_save = False

    if os.path.isdir(img_path):
        ok_img, datast_img_format = get_files(img_path, label_path)
        haveShow = 0
        for i in ok_img:
            assert os.path.exists(str(img_path) + '\\' + i + datast_img_format)
            img = cv2.imread(str(img_path) + '\\' + i + datast_img_format)
            h, w = img.shape[:2]
            with open(label_path + '\\' + i + '.txt', 'r') as f:
                lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32)
            for x in lb:
                img = xywh2xyxy(x, w, h, img)
            if if_show:
                cv2.namedWindow('Image with label', 0)
                cv2.resizeWindow('Image with label', 600, 500)
                cv2.imshow('Image with label', img)
                cv2.waitKey(0)
            if if_save:
                outfile = outfile if len(outfile) > 0 else './output/'
                if not os.path.exists('./output/'):
                    os.mkdir('./output/')
                    print(outfile + i)
                    cv2.imwrite(outfile+i+datast_img_format, img)

            haveShow += 1
            if haveShow == show_num:
                break
    else:
        img = cv2.imread(str(img_path))
        h, w = img.shape[:2]
        assert os.path.isfile(label_path), '标签路径错误'
        with open(label_path) as f:
            lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32)
        for x in lb:
            img = xywh2xyxy(x, w, h, img)
        if if_show:
            cv2.namedWindow('Image with label', 0)
            cv2.resizeWindow('Image with label', 600, 500)
            cv2.imshow('Image with label', img)
            cv2.waitKey(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值