环境设置
darknet版本: 2018年6月 yolov3
系统配置:
1 | ubuntu 16.04 |
数据集:ILSVRC2015 (ILSVRC2015转VOC数据格式详见:http://mapstec.com/2018/04/05/ILSVRC2015%E6%95%B0%E6%8D%AE%E9%9B%86%E8%BD%ACVOC2007%E6%95%B0%E6%8D%AE%E9%9B%86%E6%A0%BC%E5%BC%8F/)
darknet配置
下载工程:
1 | git clone https://github.com/pjreddie/darknet |
修改Makefile,参考我的makefile文件:
1 | GPU=1 |
编译darknet:
1 | make |
配置完以后可以下载作者的预训练模型测试一下:
1 | wget https://pjreddie.com/media/files/yolov3.weights |
下载之后用图片进行测试:
1 | ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg |
制作自己的数据集
本教授使用Imagenet数据集作为训练数据集,详细制作过程参考:http://mapstec.com/2018/04/05/ILSVRC2015%E6%95%B0%E6%8D%AE%E9%9B%86%E8%BD%ACVOC2007%E6%95%B0%E6%8D%AE%E9%9B%86%E6%A0%BC%E5%BC%8F/
数据处理
按darknet的说明编译好后,接下来在darknet-master/scripts文件夹中新建文件夹VOCdevkit,然后将整个VOC2007文件夹都拷到VOCdevkit文件夹下。
然后,需要利用scripts文件夹中的voc_label.py文件生成一系列训练文件和label,具体操作如下:
首先需要修改voc_label.py中的代码,这里主要修改数据集名,以及类别信息,我的是VOC2007,并且所有样本用来训练,没有val或test,有1000类目标,因此按如下设置:
1 | import xml.etree.ElementTree as ET |
修改好后在该目录下运行命令:python voc_label.py,之后则在文件夹scripts\VOCdevkit\VOC2007下生成了文件夹lable。这里包含了类别和对应归一化后的位置(i guess,如有错请指正)。同时在scripts\下应该也生成了train_2007.txt这个文件,里面包含了所有训练样本的绝对路径。
修改.data文件,以cfg/voc.data为例:
1 | 1 classes= 20 |
使用自己的路径替换
1 | classes= 1000 |
修改.names文件,即训练的label:
1 | tench |
配置文件修改
做好了上述准备,就可以根据不同的网络设置(cfg文件)来训练了。在文件夹cfg中有很多cfg文件,应该跟caffe中的prototxt文件是一个意思。这里以yolo-voc.cfg为例,主要修改参数如下:
1 | [net] |
开始训练
下载预训练模型(权重):
1 | wget https://pjreddie.com/media/files/darknet53.conv.74 |
训练:
1 | ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 |
训练过程参数详解
Region xx: cfg文件中yolo-layer的索引;
Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;
Class: 标注物体的分类准确率,越大越好,期望数值为1;
obj: 越大越好,期望数值为1;
No obj: 越小越好;
.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
0.75R: 以IOU=0.75为阈值时候的recall;
count:正样本数目。