darknet yolov3训练Voc数据集

1.配置好ubuntu16.04 nvidia-driver-394 cuda8.0 cudnn6.0 opencv3.4.1环境
2.下载 darknet-master
git clone https://github.com/pjreddie/darknet
cd darknet
gedit Makefile
GPU=1
CUDNN=1
OPENCV=1
make -j8
下载yolov3权重文件
wget https://pjreddie.com/media/files/yolov3.weights
3.运行demo,查看运行是否成功
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

4.准备VOC数据集,如下格式:(后期关于数据集的标注及生成会出新的博客~~,忘了记得提醒我)
Annotations
ImageSets
–Main
–test.txt
–train.txt
–trainval.txt
–val.txt
JPEGImages

放到VOCdevkit/VOC2007 或VOCdevkit/VOC2012文件夹下
使用/darknet/scripts/voc_label.py进行修改:
sets= 进行相应的修改
classes= 进行相应的修改

在VOCdevkit/的上级目录下运行python voc_label.py

5.修改配置文件
修改cfg/voc.data

classes= 3 //修改为训练分类的个数 
train = /home/ws/darknet/scripts/2007_train.txt //修改为数据阶段生成的2007_train.txt文件路径
 valid = /home/ws/darknet/scripts/2007_val.txt //修改为数据阶段生成的2007_val.txt文件路径 
 names = data/voc.names 
 backup = backup

修改data/voc.names:
将类别修改为自己类别名称

改cfg/yolo-voc.cfg:

# Testing
#batch=1 //训练的时候这里要注释掉,不然训练的时候都是nan
#subdivisions=1 //训练的时候test的要注释掉
# Training
#batch=64                //每次迭代要进行训练的图片数量 ,在一定范围内,一般来说Batch_Size越大,其确定的下降方向越准,引起的训练震荡越小。 (这一条如果自己的电脑GPU性能一般,可以将这个注释掉,或则相应的改小,下面的subdivisions的参数同理)
#subdivisions=8          //源码中的图片数量int imgs = net.batch * net.subdivisions * ngpus,按subdivisions大小分批进行训练 
height=416              //输入图片高度,YOLO官网显示最高的为608
width=416               //输入图片宽度
channels=3              //输入图片通道数
momentum=0.9            //冲量
decay=0.0005            //权值衰减
angle=0                 //图片角度变化,单位为度,假如angle=5,就是生成新图片的时候随机旋转-5~5度    
saturation = 1.5        //饱和度变化大小
exposure = 1.5          //曝光变化大小
hue=.1                  //色调变化范围,tiny-yolo-voc.cfg中-0.1~0.1 
learning_rate=0.001     //学习率
burn_in=1000
max_batches = 120200    //训练次数
policy=steps            //调整学习率的策略
steps=40000,80000       //根据batch_num调整学习率,若steps=100,25000,35000,则在迭代100次,25000次,35000次时学习率发生变化,该参数与policy中的steps对应
scales=.1,.1             //相对于当前学习率的变化比率,累计相乘,与steps中的参数个数保持一致;

有3处需要修改:可以手动搜索linear 找到这三处

最后一层卷积层中filters,计算公式为:filter=3*(classes+5)//要注意v2的filters是5*(classes+5),而v3是3*(classes+5)
有三处需要修改,搜索classes 找到相应的位置改为你的数据集的类别数
classes=  这里要修改

6.训练
格式:
./darknet -i detector train
单GPU训练:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
更换GPU训练:
./darknet detector -i 2 train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
多GPU训练:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3
接着训练原来的backup模型文件:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3.backup -gpus 0,1,2,3

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg model/darknet53.conv.74 >> log.txt #这里将训练的输出文件全部生成到log.txt文件中,方便后期的调优操作.

7.训练的一些输出说明
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:正样本数目

8.测试
修改yolov3-voc.cfg文件,关闭train 打开test
./darknet detect cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/dog.jpg
./darknet detect [训练cfg文件路径] [权重文件路径] [检测图片的路径]

你可能感兴趣的:(C++,tools)