目录
1、安装darknet
2、整理数据集
3、修改配置文件
4、训练自己的数据集
5、测试训练出的网络模型
6、性能统计——计算mAP、画出PR曲线
7、先验框聚类与修改
8、YOLO-v3原理简单介绍
备注:yolov3-voc.cfg的参数介绍
1、安装darknet
官网: https://pjreddie.com/darknet/yolo/
# 1、克隆darknet
git clone https://github.com/pjreddie/darknet
# 2、编译项目
cd darknet
make
# 3、下载预训练权重文件(download the pre-trained weight file)
wget https://pjreddie.com/media/files/yolov3.weights
# 4、测试
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
## 测试结果为:在目录darknet下的predictions.jpg是产生的预测结果图像文件
## (但是此时使用的是CPU版本,所以处理速度有点慢)
# 5、安装GPU版本
## (1)修改darknet的Makefile文件,GPU/CUDNN/OPENCV=1;
## (2)然后执行make clean和make命令,重新进行编译
## (3)测试方法同4一样
2、整理数据集
(1)用labelImg进行标注,文件的存放格式如下所示,类似于VOC格式,图片存放在JPEGImage下,xml文件存放在Annotations下:

(2)生成训练和测试的txt文件
python gen_files.py
在VOCdevkit / VOC2007目录下可以看到生成了文件夹labels ,同时在darknet下生成了两个文件2007_train.txt和2007_test.txt。2007_train.txt和2007_test.txt分别给出了训练图片文件和测试图片文件的列表,含有每个图片的路径和文件名。另外,在VOCdevkit / VOC2007/ImageSets/Main目录下生成了两个文件test.txt和train.txt,分别给出了训练图片文件和测试图片文件的列表,但只含有每个图片的文件名(不含路径和扩展名)。 labels下的文件是JPEGImages文件夹下每一个图像的yolo格式的标注文件,这是由Annotations的xml标注文件转换来的。 最终训练只需要:2007_train.txt,2007_test.txt,labels下的标注文件和 VOCdevkit /VOC2007/JPEGImages下的图像文件
3、修改配置文件
1)新建data/voc.names文件 可以复制data/voc.names再根据自己情况的修改为自己的类别;可以重新命名如:data/voc-ball.names 2)新建 cfg/voc.data文件 可以复制cfg/voc.data再根据自己情况的修改(类别数、2007_train.txt,2007_test.txt的路径);可以重新命名如:cfg/voc-ball.data 3)新建cfg/yolov3-voc.cfg 可以复制cfg/yolov3-voc.cfg再根据自己情况的修改(迭代周期等参数);可以重新命名cfg/yolov3-voc-ball.cfg: 在cfg/yolov3-voc.cfg文件中,三个yolo层和各自前面的conv层的参数需要修改: 三个yolo层都要改:yolo层中的class为类别数,每一个yolo层前的conv层中的filters =(类别+5)* 3
4、训练自己的数据集
1)在 darknet 目录下载权重文件:
wget https://pjreddie.com/media/files/darknet53.conv.74
这里的训练使用迁移学习,所以下载的yolo预训练的权重文件(不含全连接层) 2)训练
./darknet detector train cfg/voc-ball.data cfg/yolov3-voc-ball.cfg darknet53.conv.74
如需要存储训练日志,执行
./darknet detector train cfg/voc-ball.data cfg/yolov3-voc-ball.cfg darknet53.conv.74 | tee visualization/train_yolov3_ball.log
执行前应建立visualization目录。可通过将visualization.zip解压到darknet项目目录下。 训练时的输出信息: Region 106 Avg IOU: 0.794182, Class: 0.999382, Obj: 0.966953, No Obj:0.000240, .5R: 1.000000, .75R: 0.750000, count: 4
- Region 106 :网络层的索引为106
- Region Avg IOU: 0.794182: 表示在当前l.batch(batch /= subdivs )内的图片的平均IOU
- Class: 0.0.999382: 标注目标分类的正确率,期望该值趋近于1。
- Obj: 0.966953: 检测目标的平均目标置信度,越接近1越好。
- No Obj: 0.000793: 检测目标的平均目标性得分。
- .5R: 1.0:模型检测出的正样本(iou>0.5)与实际的正样本的比值。
- .75R: 0.75 模型检测出的正样本(iou>0.75)与实际的正样本的比值。
- count: 4:count后的值是当前l.batch(batch /= subdivs )内图片中包含正样本的图片的数量。
上述输出信息是从yolo_layer.c中的函数void forward_yolo_layer(const layer l, network net)打印输出的:
printf("Region %d Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, .5R: %f, .75R:
%f, count: %d\n", net.index, avg_iou/count, avg_cat/class_count, avg_obj/count,
avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, recall75/count, count);
3) 训练log文件分析 在visualization文件夹下,执行:
cd visualization
python extract_log.py
得到两个文件: train_log_loss.txt, train_log_iou.txt 改变其中的lines的值 然后,执行:
python train_loss_visualization.py
python train_iou_visualization.py
得到avg_loss.png和Region Avg IOU.png 4) 训练建议
- batch=64
- subdivisions=16 (显存大时可用8)
- 把max_batches设置为 (classes*2000);但最少为4000。例如如果训练3个目标类别,max_batches=6000
- 把steps改为max_batches的80% and 90%;例如steps=4800, 5400
- 为增加网络分辨率可增大height和width的值,但必须是32的倍数 .cfg-file (height=608,width=608 or any value multiple of 32) 。这有助于提高检测精度
5、测试训练出的网络模型
训练好后可以在backup看到权重文件。test前要修改cfg文件,切换到test模式。可以重新建立一个测试cfg文件, 如yolov3-voc-ball-test.cfg 测试图片:
./darknet detector test cfg/voc-ball.data cfg/yolov3-voc-ball-test.cfg backup/yolov3-voc-ball_final.weights testfiles/img1.jpg
测试视频:
./darknet detector demo cfg/voc-ball.data cfg/yolov3-voc-ball-test.cfg backup/yolov3-voc-ball_final.weights testfiles/messi.mp4
6、性能统计——计算mAP、画出PR曲线
首先执行
./darknet detector valid cfg/voc-ball.data cfg/yolov3-voc-ball-test.cfg backup/yolov3-voc-ball_final.weights
生成results/comp4_det_test_ball.txt文件 然后执行
python reval_voc.py --voc_dir /home/bai/darknet/VOCdevkit --year 2007 --image_set test --classes /home/bai/darknet/data/voc-ball.names testBall
生成testBall/ball_pr.pkl文件
然后画出pr曲线,执行
python draw_pr.py
7、先验框聚类与修改
1) 使用k-means聚类获得自己数据集的先验框大小 修改gen_anchors.py文件(网络的输入为多大舅改为多大) 执行
python gen_anchors.py
得到的anchor大小,最终得到的anchor的w和h再乘上32,再对应修改配置文件里的anchor参数 2) 修改cfg文件中的先验框大小 3) 重新训练和测试 width_in_cfg_file = 608. height_in_cfg_file = 608.
备注:yolov3-voc.cfg的参数介绍

       
注:文章内容摘自白勇老师的YOLO系列,如有侵权,请联系删帖 |