YOLOV5模型训练之JSON格式的数据集制作,一个py程序搞,搞不定邮件联系,我帮你!!!!

# -*- coding: utf-8 -*-
"""
数据集转换脚本,包含以下内容
1、json文件转txt文件
2、对数据集进行划分,并存放至相应目录
注意:
1、将此程序放置yolov5工程目录下的data文件夹下
2、图像和标签文件夹的名字和我的文件名称改为一致
"""
import json
import os
import cv2
import shutil
import random


# !!!!这里是重点,需要查看自己的数据集名称对不对,不对的话,把自己的文件夹重命名一下
json_file_path = './Annotations/'                  # 检查和自己的json文件夹名称是否一致
img_folder_path = './SourceImages/'        # 检查和自己的图像文件夹名称是否一致

# 将自己数据集的类别对应写一下,几类就写几个,一定要从0开始
label_mapping = {
    "nicaishenmeyisi":0,
    "jiushiwaner": 1,
}


# 数据集划分比例,训练集70%,验证集20%, 测试集10%
train_percent = 0.7
val_percent = 0.2
test_percent = 0.1

if not os.path.exists('./temp_labels/'):      # 临时标签文件夹位置,这不要改动,之后会删掉的
    os.makedirs('./temp_labels/')
txt_folder_path = './temp_labels/'


def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = abs(box[1] - box[0])
    h = abs(box[3] - box[2])
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h

          
#保存为绝对坐标形式 :label x1 y1 x2 y2
def absolute_coordinate_txt(img_name,json_d,img_path):
    src_img=cv2.imread(img_path)
    h,w = src_img.shape[:2]
    txt_name = img_name.split(".")[0]+".txt"
    txt_path = os.path.join(txt_folder_path,txt_name)
    # print("txt_path:\t",txt_path)
    with open(txt_path,'w') as f:
        for item in json_d["shapes"]:
            point=item['points']
            x1 = point[0][0]
            y1 = point[0][1]
            x2 = point[1][0]
            y2 = point[1][1]
            b = (float(x1), float(x2), float(y1), float(y2))
            bb = convert((w, h), b)
            f.write(str(label_mapping[item['label']]) + " " + " ".join([str(a) for a in bb]) + '\n')


# 如果json标签有问题,print输出一下,可以查看哪个json文件有问题
for jsonfile in os.listdir(json_file_path):
    temp_path=os.path.join(json_file_path,jsonfile)
    # print("json_path:\t",temp_path) 
    jsonfile_path=temp_path
    with open(jsonfile_path, "r", encoding='utf-8') as f:
        json_d = json.load(f)    
        img_name =  jsonfile[:-4]+"jpg"
        img_path=os.path.join(img_folder_path,img_name)
        # print("img_path:\t",img_path)
        absolute_coordinate_txt(img_name,json_d,img_path)
# *********************************************** #
#  parent folder
#  ----images
#       ----train
#       ----val
#       ----test
#  ----labels
#       ----train
#       ----val
#       ----test
def create_dir():
    if not os.path.exists('./images/'):
        os.makedirs('./images/')
    if not os.path.exists('./labels/'):
        os.makedirs('./labels/')

    if not os.path.exists('./images/train/'):
        os.makedirs('./images/train')
    if not os.path.exists('./images/val/'):
        os.makedirs('./images/val/')
    if not os.path.exists('./images/test/'):
        os.makedirs('./images/test/')

    if not os.path.exists('./labels/train/'):
        os.makedirs('./labels/train/')
    if not os.path.exists('./labels/val/'):
        os.makedirs('./labels/val/')
    if not os.path.exists('./labels/test/'):
        os.makedirs('./labels/test/')
    return


# *********************************************** #
print("************************************************************************")
# 读取所有的txt文件
create_dir()
total_txt = os.listdir(txt_folder_path)
num_txt = len(total_txt)
list_all_txt = range(num_txt)  # 范围 range(0, num)

num_train = int(num_txt * train_percent)
num_val = int(num_txt * val_percent)
num_test = num_txt - num_train - num_val

train = random.sample(list_all_txt, num_train)
# train从list_all_txt取出num_train个元素
# 所以list_all_txt列表只剩下了这些元素:val_test
val_test = [i for i in list_all_txt if not i in train]
# 再从val_test取出num_val个元素,val_test剩下的元素就是test
val = random.sample(val_test, num_val)
# 检查两个列表元素是否有重合的元素
# set_c = set(val_test) & set(val)
# list_c = list(set_c)
# print(list_c)
# print(len(list_c))

print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
for i in list_all_txt:
    name = total_txt[i][:-4]

    srcImage = img_folder_path + name + '.jpg'
    srcLabel = txt_folder_path + name + '.txt'

    if i in train:
        dst_train_Image = './images/train/' + name + '.jpg'
        dst_train_Label = './labels/train/' + name + '.txt'
        shutil.copyfile(srcImage, dst_train_Image)
        shutil.copyfile(srcLabel, dst_train_Label)
    elif i in val:
        dst_val_Image = './images/val/' + name + '.jpg'
        dst_val_Label = './labels/val/' + name + '.txt'
        shutil.copyfile(srcImage, dst_val_Image)
        shutil.copyfile(srcLabel, dst_val_Label)
    else:
        dst_test_Image = './images/test/' + name + '.jpg'
        dst_test_Label = './labels/test/' + name + '.txt'
        shutil.copyfile(srcImage, dst_test_Image)
        shutil.copyfile(srcLabel, dst_test_Label)
shutil.rmtree(txt_folder_path)
  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
要使用YOLOv8训练json格式数据集,你需要按照以下步骤进行操作: 1. 首先,将json格式数据集转换为YOLO格式的标签文件。这可以通过解析json文件中的内容,并将其转换为YOLO的标签格式来完成。你可以使用Python的json库来读取json文件并解析其中的内容,然后将其转换为YOLO的标签格式。 2. YOLOv8要求标签文件格式为每一行一个目标,每个目标由其类别和边界框的位置信息组成。因此,你需要将每个目标的类别和边界框的位置信息提取出来,并按照YOLO格式的要求进行组织。 3. 一旦你将json文件转换为YOLO格式的标签文件,你可以使用YOLOv8进行模型训练YOLOv8是一个目标检测算法,它可以用于训练和检测目标。你可以使用开源的YOLOv8实现,例如Darknet或YOLOv5。 4. 在训练之前,你需要准备好YOLOv8的配置文件、权重文件训练图像。配置文件包含了YOLOv8的模型参数和训练的一些设置,权重文件包含了预训练模型权重,而训练图像是用于模型训练数据集。 5. 使用YOLOv8进行训练时,你可以使用命令行工具或编写Python脚本进行操作。你需要指定配置文件、权重文件训练图像和标签文件的路径,并设置一些训练参数,例如学习率、批大小和训练周期数。 6. 训练过程中,YOLOv8会根据标签文件中的目标信息和图像特征进行模型参数的更新,以提高目标检测的准确性。训练完成后,你可以使用训练得到的模型进行目标检测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鹏要高飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值