最近一段时间把yolov3里面的voc2007-2012样本重新训练了一次,中间遇到不少坑,此篇希望能帮到后来者。
我用的电脑配置并不高(gtx780)
训练前提:电脑装好linux16.04,opencv3.4,cuda9.0,cudnn7.0(这些在网上教程比较多,也许版本不一样,但是安装整体过程都是一样的。)
下面直接进入主题:重新训练yolov3
1.下载darknet:
git clone https://github.com/pjreddie/darknet.git
2.进入darknet修改Makefile配置:
因为用到了gpu,cudnn,opencv。因此0改为1,gtx780的计算能力是35,因此设置为35(计算能力可以自行进nvida官网查询:https://developer.nvidia.com/cuda-gpus)只需改第10行的数字,另外几行可以不需要改动。再把另外三处路径对应着自己的cuda路径。到这就完成对Makefile修改了。
GPU=1
CUDNN=1
OPENCV=1
........................................................
ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_35,code=[sm_35,compute_35]
.........................................................
NVCC=/usr/local/cuda-9.0/bin/nvcc #第23行
.........................................................
COMMON+= -DGPU -I/usr/local/cuda-9.0/include/ #第49行
..........................................................
LDFLAGS+= -L/usr/local/cuda-9.0/lib64 -lcuda -lcudart -lcublas -lcurand #第51行
3.安装darknet:
cd darknet
make
4.下载原作者的权重文件
wget https://pjreddie.com/media/files/yolov3.weights #下载权重文件
5.测试图片
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg #使用下载的权重文件进行图片检测
测试结果:
至此前期工作全部完成,我们可以开始进行训练voc样本的训练了;
1.下载voc数据并解压:(这部下载会很慢,可以在window上用迅雷下载然后复制过来,会快很多)
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
2.现在已经有数据集,每张照片的名字也改好了,接下来就是把每张图片的信息以.txt形式保存下来,进入darknet/scripts。里面会有一个voc_label.py,将此脚本复制到主目录下(这样做主要是可以省去一些代码)
python voc_label.py
cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt
3.对配置文件进行修改,进入darknet/cfg/voc.data
,因为是重新训练voc数据,所以第1,4,5行可以不需要修改,只需修改第2,3行,改为自己对应的路径(在主目录下通过属性找到对应的路径)
1 classes= 20
2 train = /train.txt
3 valid = /2007_test.txt
4 names = data/voc.names
5 backup = backup
4.进入darknet/cfg/yolov3-voc.cfg(!!!这一步非常,非常,非常重要)将测试模式改为训练模式。即将Testing下的batch=1,subdivisions=1加上#注释;同时将Training下的batch=64,subdivisions=16的#注释去掉;要是觉得显存比较小,在同一目录下,同时将random从1改为0即是关闭多尺度训练,共有三处。
[net]
# Testing ................测试模式
#batch=1
#subdivisions=1
# Training ................训练模式
batch=64
subdivisions=16
................................................
random=0 #关闭多尺度训练分别在第616,700,784行;
5.下载寻先训练权重:
wget https://pjreddie.com/media/files/darknet53.conv.74
6.开始重新训练权重:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
gtx780经历一周之后,终于出了结果,权重都保存在darknet/backup内(训练半天时间就能出最终结果的一定是有问题的)将训练得到的最终yolov3-voc_final.weights文件拷贝到darknet文件夹内。
7.测试训练到的权重
先将第4步的训练模式改为测试模式。然后进入darknet/examples/darknet.c在第440行将coco.data改为voc.data
test_detector("cfg/voc.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen);
然后重新编译环境。
cd darknet
make clean
make
至此所有配置修改完成,可以进行图片测试了
./darknet detect cfg/yolov3-voc.cfg yolov3-voc_final.weights data/dog.jpg
结果如下: