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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值