yolov5训练ExDark数据集(附全过程代码,超详细教程,无坑!)

1.数据集获取

ExDark:免费下载地址
数据内容展示:共12个类别7363张
在这里插入图片描述在这里插入图片描述

2.ExDark转yolo格式

ExDark的label文件内容
在这里插入图片描述
yolo的label文件内容
在这里插入图片描述
转换前准备如下
在这里插入图片描述
其中:
anndir等于ExDark数据集中的Annotations文件夹,用于存放标签数据;
imgdir等于ExDark数据集中的images文件夹,用于存放图像数据;
T用于存放转换后的文件;
recipy.py参考了github
其实大可不必改名称,我用这个名称是因为试了别的博主的帖子,虽然最后他的方法不好使,但是都建好了就懒得改回去了!
代码:需要在参数配置处改地址

import os
from PIL import Image
import argparse
import shutil

labels = ['Bicycle', 'Boat', 'Bottle', 'Bus', 'Car', 'Cat', 'Chair', 'Cup', 'Dog', 'Motorbike', 'People', 'Table']


def ExDark2Yolo(txts_dir: str, imgs_dir: str, ratio: str, version: int, output_dir: str):
    ratios = ratio.split(':')
    ratio_train, ratio_test, ratio_val = int(ratios[0]), int(ratios[1]), int(ratios[2])
    ratio_sum = ratio_train + ratio_test + ratio_val
    dataset_perc = {
    
    'train': ratio_train / ratio_sum, 'test': ratio_test / ratio_sum, 'val': ratio_val / ratio_sum}

    for t in dataset_perc:
        os.makedirs('/'.join([output_dir, 'images', t]))
        os.makedirs('/'.join([output_dir, 'labels', t]))

    for label in labels:
        print('Processing {}...'.format(label))
        filenames = os.listdir('/'.join([txts_dir, label]))
        cur_idx = 0
        files_num = len(filenames)

        for filename in filenames:
            cur_idx += 1
            filename_no_ext = '.'.join(filename.split('.')[:-2])
            if cur_idx < dataset_perc.get('train') * files_num:
                set_type = 'train'
            elif cur_idx < (dataset_perc.get('train') + dataset_perc.get('test')) * files_num:
                set_type = 'test'
            else:
                set_type = 'val'
            output_label_path = '/'.join([output_dir, 'labels', set_type, filename_no_ext + '.txt'])
            yolo_output_file = open(output_label_path, 'a')

            name_split = filename.split('.')
            img_path = '/'.join([imgs_dir, label, '.'.join(filename.split('.')[:-1])])
            try:
                img = Image.open(img_path)
            except FileNotFoundError:
                img_path = '/'.join([imgs_dir, label, ''.join(name_split[:-2]) + '.' + name_split[-2].upper()])
                img = Image.open(img_path)

            output_img_path = '/'.join([output_dir, 'images', set_type])
            shutil.copy(img_path, output_img_path)

            width, height = img.size
            txt = open('/'.join([txts_dir, label, filename]), 'r')
            txt.readline()  # ignore first line
            line = txt.readline()

            while line != '':
                datas = line.strip().split()
                class_idx = labels.index(datas[0])
                x0, y0, w0, h0 = int(datas[1]), int(datas[2]), int(datas[3]), int(datas[4])
                if version == 5:
                    x = (x0 + w0/2) / width
                    y = (y0 + h0/2) / height
                elif version == 3:
                    x = x0 / width
                    y = y0 / height
                else:
                    print("Version of YOLO error.")
                    return
                w = w0 / width
                h = h0 / height

                yolo_output_file.write(' '.join([str(class_idx),
                                                 format(x, '.6f'),
                                                 format(y, '.6f'),
                                                 format(w, '.6f'),
                                                 format(h, '.6f'),
                                                 ]) + '\n')
                line = txt.readline()

            yolo_output_file.close()


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--annotations-dir', type=str, default='anndir', help="ExDark annotations directory.")#ExDark的标注目录
    parser.add_argument('--images-dir', type=str, default='imgdir', help="ExDark images directory.")#ExDark的图像目录
    parser.add_argument('--ratio', type=str, default='8:1:1', help="Ratio between train/test/val, default 8:1:1.")#train/test/val之间的比例,默认为8:1:1
    parser.add_argument('--version', type=int, choices=[3, 5], default='5', help="Version of YOLO(3 or 5), default 5.")#YOLO版本(3或5)
    parser.add_argument('--output-dir', type=str, default="T", help="Images and converted YOLO annotations output directory.")#图像和转换后的yolo标注的输出目录
    args = parser.parse_args()
    ExDark2Yolo(args.annotations_dir, args.images_dir, args.ratio, args.version, args.output_dir)

最后的转换列表
在这里插入图片描述
将images和labels文件放置yolov5文件中为训练做准备
在这里插入图片描述

3.yolo使用ExDark数据集训练

3.1.修改两个.yaml文件

1.在data文件夹下新建一个yaml文件,随便起名,他的作用和coco128.yaml一个道理。说人话就是没有他训练就找不到数据集位置,也就是说他是一个存放输入数据的入口地址的文件。
在这里插入图片描述
ExDark.py内容

path: datasets/ExDark   #路径改成自己的
train: images/train   #路径改成自己的
val: images/val   #路径改成自己的
test: images/test   #路径改成自己的

# Classes
names:
  0: Bicycle
  1: Boat
  2: Bottle
  3: Bus
  4: Car
  5: Cat
  6: Chair
  7: Cup
  8: Dog
  9: Motorbike
  10: People
  11: Table

2.在model文件夹下修改yolov5s.yaml文件(大家用哪个yaml就改哪个,这里以s.yaml为例)
这里就把类别数改了就可以,其余的不要动。
在这里插入图片描述

nc: 12  # 类别数

3.2.修改train.py文件

parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default='data/ExDark.yaml', help='dataset.yaml path')

3.3.执行train.py

1.右击执行
在这里插入图片描述

2.打开Terminal执行代码:

python train.py

在这里插入图片描述

注意代码里文件的路径是否正确
注意命令里文件的路径是否正确
注意文件的名称是否与代码和命令中的对应,例data不是date,datesets不是datasets!!!
注意不该改的代码不要动,坏了咱赔不起!!!
注意不要随便乱删空格,尤其的包含路径的空格!!!

到此ExDark.txt格式转yolo.txt格式以及yolov5在Pytorch下实现训练圆满结束!
欢迎小伙伴们在评论区对我进行错误更正,你要是对,我必改并称你为大哥!

猜你喜欢

转载自blog.csdn.net/LZL2020LZL/article/details/132856914