使用labeme进行矩形框标注,
在这里插入图片描述
标注完的json文件中的矩形框转换为yolo,由于yolo所需的txt格式是 x y w h,所以针对之前的那篇博客进行改进
转换代码如下
注意要修改的地方有三个,
在这里插入图片描述
json文件夹,txt要保存到的文件夹,和class类别文件
注意这里的class类别用逗号隔开,中间没有空格,
注意类别名称的顺序要和yaml文件的顺序对应上,如果对应不上,训练出来类别名会错误

在这里插入图片描述

# -*- coding: utf-8 -*-
import json
import os
import argparse
from tqdm import tqdm
import glob
import cv2
import numpy as np


def convert_label_json(json_dir, save_dir, classes):
    json_paths = os.listdir(json_dir)
    classes = classes.split(',')

    for json_path in tqdm(json_paths):
        path = os.path.join(json_dir, json_path)

        with open(path, 'r', encoding='utf-8') as load_f:
            json_dict = json.load(load_f)

        h, w = json_dict['imageHeight'], json_dict['imageWidth']

        # save txt path
        txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
        with open(txt_path, 'w') as txt_file:

            for shape_dict in json_dict['shapes']:
                label = shape_dict['label']
                label_index = classes.index(label)
                points = shape_dict['points']

                # Assuming points contain two points: top-left and bottom-right
                x1, y1 = points[0]
                x2, y2 = points[1]

                # Calculate center x, center y, width, height
                x_center = (x1 + x2) / 2 / w
                y_center = (y1 + y2) / 2 / h
                width = (x2 - x1) / w
                height = (y2 - y1) / h

                # Format the output string
                label_str = f"{label_index} {x_center} {y_center} {width} {height}\n"
                txt_file.write(label_str)

# def convert_label_json(json_dir, save_dir, classes):
#     json_paths = os.listdir(json_dir)
#     classes = classes.split(',')
#
#     for json_path in tqdm(json_paths):
#         # for json_path in json_paths:
#         path = os.path.join(json_dir, json_path)
#         # print(path)
#         # with open(path, 'r') as load_f:
#         with open(path, 'r', encoding='utf-8') as load_f:
#             print(load_f)
#             json_dict = json.load(load_f, )
#         h, w = json_dict['imageHeight'], json_dict['imageWidth']
#
#         # save txt path
#         txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
#         txt_file = open(txt_path, 'w')
#
#         for shape_dict in json_dict['shapes']:
#             label = shape_dict['label']
#             label_index = classes.index(label)
#             points = shape_dict['points']
#
#             points_nor_list = []
#
#             for point in points:
#                 points_nor_list.append(point[0] / w)
#                 points_nor_list.append(point[1] / h)
#
#             points_nor_list = list(map(lambda x: str(x), points_nor_list))
#             points_nor_str = ' '.join(points_nor_list)
#
#             label_str = str(label_index) + ' ' + points_nor_str + '\n'
#             txt_file.writelines(label_str)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='json convert to txt params')
    # parser.add_argument('--json-dir', type=str, default=r'D:\dyh\only_tuqi_tongyiweizhi\labels_json', help='json path dir')
    # parser.add_argument('--save-dir', type=str, default=r'D:\dyh\only_tuqi_tongyiweizhi\labels_txt', help='txt save dir')

    parser.add_argument('--json-dir', type=str, default=r"G:\1010",
                        help='json path dir')
    parser.add_argument('--save-dir', type=str, default=r'G:\1010',
                        help='txt save dir')
    # parser.add_argument('--classes', type=str, default='FlangeA', help='classes')
    # parser.add_argument('--classes', type=str, default='biaomiankeng,huahen,saobian,biaoji_jiantou,biaoji_shugang,wenlucanliu,dakeng,kepeng,biaoji_yuandian,xiu,yuanhushang,yaliaodou,heipi,bianyuan_geda', help='classes')
    parser.add_argument('--classes', type=str, default='tuqi,aoxian', help='classes')
    args = parser.parse_args()
    json_dir = args.json_dir
    save_dir = args.save_dir
    classes = args.classes
    convert_label_json(json_dir, save_dir, classes)






Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐