Yolov7训练自己的数据集(主要是coco2yolo代码,和分割数据集)

1. 下载安装Yolov7参考一下博文

(52条消息) YOLOv7保姆级教程(个人踩坑无数)----训练自己的数据集_AmbitionToFree的博客-CSDN博客

2. Yolov7支持的数据集格式为yolo格式,我的格式是json,所以需要自己转一下

注意:我这里面json格式中是两个角点(包络框左上角和右下角),不同的格式对应不同的代码,因为发现其他格式网上都有,就只有这一种没找到

代码如下:

 

import os
import json
import numpy as np
import cv2

#dir_json = 'D:\projects\json/50zhang\ceshijson/'  # json存储的文件目录
dir_json = r'E:\projects\json\temp\objectDetection/'
dir_txt = r'E:\projects\json\temp\objectDetection/'  # txt存储目录
list_json = os.listdir(dir_json)

def json2txt(path_json, path_txt):  # 可修改生成格式
    with open(path_json, 'r',encoding='utf-8') as path_json:
        jsonx = json.load(path_json)
        with open(path_txt, 'w+') as ftxt:
            shapes = jsonx['shapes']
                # path = dir_json+shape['image']
                # img = cv2.imread(path)
                # size =img.shape
            width=jsonx['imageWidth']
            height=jsonx['imageHeight']
            for shape in shapes:
                   # label = str(annotation['label']) + ' '
                x1 = shape['points'][0][0]
                y1 = shape['points'][0][1]
                x2 = shape['points'][1][0]
                y2 = shape['points'][1][1]
                if shape['label']=='trunk':
                    cat=0
                else:
                    cat=1

                dw = 1. / width
                dh = 1. / height
                x=dw *(x1+x2)/2
                y=dh *(y1+y2)/2
                w=dw *abs(x2-x1)
                h = dh * abs(y2 - y1)
                yolo = f"{cat} {x} {y} {w} {h} \n"
                ftxt.writelines(yolo)

for cnt, json_name in enumerate(list_json):
    if os.path.splitext(json_name)[-1] == ".json":
        path_json = dir_json + json_name
        path_txt = dir_txt + json_name.replace('.json', '.txt')
        json2txt(path_json, path_txt)

3. 图片进行分割出训练集、验证集、测试集代码

# insanena
 
import shutil
import random
import os
 
# 原始路径
image_original_path = "/home/nvidia/ghy/yolov7/data/Grape_tree_data/images/"
label_original_path = "/home/nvidia/ghy/yolov7/data/Grape_tree_data/labels/"
 
cur_path = os.getcwd()
 
# 训练集路径
train_image_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/images/train/")
train_label_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/labels/train/")
 
# 验证集路径
val_image_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/images/val/")
val_label_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/labels/val/")
 
# 测试集路径
test_image_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/images/test/")
test_label_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/labels/test/")
 
# 训练集目录
list_train = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/train.txt")
list_val = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/val.txt")
list_test = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/test.txt")
 
train_percent = 0.8
val_percent = 0.1
test_percent = 0.1
 
 
def del_file(path):
    for i in os.listdir(path):
        file_data = path + "\\" + i
        os.remove(file_data)
 
 
def mkdir():
    if not os.path.exists(train_image_path):
        os.makedirs(train_image_path)
    else:
        del_file(train_image_path)
    if not os.path.exists(train_label_path):
        os.makedirs(train_label_path)
    else:
        del_file(train_label_path)
 
    if not os.path.exists(val_image_path):
        os.makedirs(val_image_path)
    else:
        del_file(val_image_path)
    if not os.path.exists(val_label_path):
        os.makedirs(val_label_path)
    else:
        del_file(val_label_path)
 
    if not os.path.exists(test_image_path):
        os.makedirs(test_image_path)
    else:
        del_file(test_image_path)
    if not os.path.exists(test_label_path):
        os.makedirs(test_label_path)
    else:
        del_file(test_label_path)
 
 
def clearfile():
    if os.path.exists(list_train):
        os.remove(list_train)
    if os.path.exists(list_val):
        os.remove(list_val)
    if os.path.exists(list_test):
        os.remove(list_test)
 
 
def main():
    mkdir()
    clearfile()
 
    file_train = open(list_train, 'w')
    file_val = open(list_val, 'w')
    file_test = open(list_test, 'w')
 
    total_txt = os.listdir(label_original_path)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)
 
    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 = [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)
 
    print("TrainNum:{}, ValNum:{}, TestNum:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]
 
        srcImage = image_original_path + name + '.jpg'
        srcLabel = label_original_path + name + ".txt"
 
        if i in train:
            dst_train_Image = train_image_path + name + '.jpg'
            dst_train_Label = train_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
            file_train.write(dst_train_Image + '\n')
        elif i in val:
            dst_val_Image = val_image_path + name + '.jpg'
            dst_val_Label = val_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
            file_val.write(dst_val_Image + '\n')
        else:
            dst_test_Image = test_image_path + name + '.jpg'
            dst_test_Label = test_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)
            file_test.write(dst_test_Image + '\n')
 
    file_train.close()
    file_val.close()
    file_test.close()
 
 
if __name__ == "__main__":
    main()

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于训练自己的分割数据集,您可以按照以下步骤进行: 1. 数据集准备:收集并标注您的分割数据集。您可以使用图像标注工具,如LabelImg或VGG Image Annotator (VIA),为每个图像标注分割目标的区域。确保每个图像都有正确的标注,并将它们保存为特定的格式,如PASCAL VOC或COCO格式。 2. 数据集划分:将数据集划分为训练集和验证集。通常,您可以将数据集的大部分用于训练,然后保留一小部分用于验证模型的性能。 3. 模型选择:选择适合您任务的分割模型。在这种情况下,您可以选择使用YOLOv3或YOLOv4作为基础模型。这些模型具有良好的性能和速度。 4. 模型配置:根据您的数据集和任务需求,配置模型的超参数,如学习率、批量大小、迭代次数等。可以使用开源实现的预训练权重,如Darknet或YOLO官方发布的权重。 5. 训练模型:使用准备好的数据集和配置好的模型,进行模型训练。您可以使用训练框架,如Darknet或TensorFlow来训练模型。在训练过程中,监控模型的损失和性能,并根据需要进行调整。 6. 模型评估:使用验证集评估训练好的模型的性能。计算指标,如精度、召回率、IoU等,来评估模型的准确性和泛化能力。 7. 模型优化:根据评估结果进行模型优化。您可以尝试调整超参数、增加数据增强、更改模型结构等,以提高模型的性能。 8. 模型应用:使用训练好的模型对新的图像进行分割预测。可以使用模型在测试集或实际应用中进行推断,并检查模型在不同场景下的表现。 希望以上步骤能对您训练自己的分割数据集有所帮助!如果您有任何进一步的问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值