YOLO(v1)用自己的数据集训练模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_30071459/article/details/53100791

说明:

(1)本文用到的darknet代码下载时间为2016-11-09

(2)由于之前博文做的数据集是参考VOC2007格式,并且YOLO可以将VOC2007和VOC2012数据集转换成YOLO所需要的格式,所以这里我们也是一样,将参考VOC2007做的数据集转换成YOLO所需的训练格式。做VOC2007数据集过程参考:http://blog.csdn.net/sinat_30071459/article/details/50723212

(3)本文主要参考YOLO官网:http://pjreddie.com/darknet/yolo/


1、配置Darknet

darknet v1代码下载地址:Darknet v1

主要参考darknet的官网,上面写得很详细,网址:Installing Darknet

在配置Darknet过程中,主要是在nvcc处出错,所以修改Makefile的NVCC为绝对路径,一般为:

NVCC=/usr/local/cuda-7.5/bin/nvcc
(按自己的系统路径修改,本人是Ubuntu14.04,CUDA为7.5).

其他需要注意的地方参考官网就行。

如果make没有出错,那么可以下载作者训练的模型测试一下:

(1)下载yolo.weights:

wget http://pjreddie.com/media/files/yolo.weights

(2)执行:

./darknet yolo test cfg/yolo.cfg yolo.weights data/dog.jpg


2.将VOC数据集转成YOLO格式

由于前面的文章有写到做VOC2007格式的数据集,所以,我们和作者一样,将VOC数据集转成YOLO训练所需格式,转换过程很简单,因为作者提供了转换的python代码:
darknet\scripts\voc_label.py

(1)将数据集拷贝到darknet\scripts下
(2)我们打开voc_label.py并修改该代码:
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
classes = ["head","top","bag","down","shoes"]

classes根据你的数据集类别改。还有需要注意的是,代码里写的文件夹是VOCdevkit,我们的可能是VOCdevkit2007,修改成VOCdevkit即可。
然后,终端进入darknet\scripts,执行:
python voc_label.py

此后可以看到,VOCdevkit\VOC2007里多了一个labels文件夹(如下),里面有每张图片的标注文件(文件内容形如0 0.488888888889 0.289256198347 0.977777777778 0.429752066116;其中前面的0表示head,1表示top,即前面你写的classes的顺序,以此类推。后面为包围框信息,作了转换)。


darknet\scripts下多了2007_train.txt、2007_val.txt和2007_test.txt三个文件(如下),这三个文件是数据集中图片的路径。由于yolo训练只需要一个txt文件,文件中包含所有你想要训练的图片的路径,因此,我们可以用2007_train.txt、2007_val.txt和2007_test.txt包含的图片均用来训练,因此执行:
cat 2007_* > train.txt
现在,我们已经将数据集中的训练集和验证集全都放在一个txt文件中,这些图片用来作为YOLO的训练图片。

3.修改代码

(1)修改darknet\src\yolo.c
char *voc_names[] = {"head","top","bag","down","shoes"}
改成你的数据集类别;

char *train_images = "/home/luj/darknet/scripts/train.txt";
char *backup_directory = "/home//luj/darknet/backup/";
train_images应该指向我们刚得到的train.txt;backup_directory指向的路径是训练过程中生成的weights文件保存的路径(可以在darknet下新建文件夹backup然后指向它)。这两个路径按自己系统修改即可。

draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, alphabet, 5);
else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 5, frame_skip, prefix);
类别数改为你的数据集类别数(例如我的有5类)。

(2)修改darknet\src\yolo_kernels.cu
draw_detections(det, l.side*l.side*l.n, demo_thresh, boxes, probs, voc_names, voc_labels, 5);
最后的参数改为你的数据集类别数(同上)。


(3)修改darknet\cfg\tiny-yolo.cfg
本文以训练tiny模型为例,因此修改的是tiny-yolo.cfg文件,其他模型修改类似。

output= 735  // 该值为side*side*(num*5+类别数)
activation=linear

[detection]
classes= 5 //数据集类别
coords=4
rescore=1
side=7 /////
num=2
softmax=0
sqrt=1
jitter=.2
主要修改两个地方。也可以修改side和num,side表示网格数,可修改成9*9等;num也可修改;output=side*side*(num*5+classes)
其他的一些参数可以按自己需求修改,比如学习率、max_batches等。

4.下载预训练模型:

(在该模型参数的基础上微调)
该文件放在darknet下即可。

PS:经过以上的修改,记得重新make一下darknet!!!

5.训练

在dartnet下执行:
./darknet yolo train cfg/tiny-yolo.cfg darknet.conv.weights

一切正常的话,就开始训练了。

6.测试和结果

执行:
./darknet yolo test cfg/tiny-yolo.cfg backup/tiny-yolo_final.weights
然后输入一张测试图片。
结果:

猜你喜欢

转载自blog.csdn.net/sinat_30071459/article/details/53100791