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 shutillabels = ['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_valdataset_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 = 0files_num = len(filenames)for filename in filenames:cur_idx += 1filename_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.sizetxt = open('/'.join([txts_dir, label, filename]), 'r')txt.readline() # ignore first lineline = 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) / widthy = (y0 + h0/2) / heightelif version == 3:x = x0 / widthy = y0 / heightelse:print("Version of YOLO error.")returnw = w0 / widthh = h0 / heightyolo_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:1parser.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: Bicycle1: Boat2: Bottle3: Bus4: Car5: Cat6: Chair7: Cup8: Dog9: Motorbike10: People11: 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下实现训练圆满结束!
欢迎小伙伴们在评论区对我进行错误更正,你要是对,我必改并称你为大哥!