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下实现训练圆满结束!
欢迎小伙伴们在评论区对我进行错误更正,你要是对,我必改并称你为大哥!