基于Darknet中的YOLO-v3训练自己的数据

目录

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下:

基于Darknet中的YOLO-v3训练自己的数据_第1张图片

 (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.

8、YOLO-v3原理简单介绍


备注:yolov3-voc.cfg的参数介绍

基于Darknet中的YOLO-v3训练自己的数据_第2张图片

 基于Darknet中的YOLO-v3训练自己的数据_第3张图片基于Darknet中的YOLO-v3训练自己的数据_第4张图片基于Darknet中的YOLO-v3训练自己的数据_第5张图片基于Darknet中的YOLO-v3训练自己的数据_第6张图片基于Darknet中的YOLO-v3训练自己的数据_第7张图片基于Darknet中的YOLO-v3训练自己的数据_第8张图片基于Darknet中的YOLO-v3训练自己的数据_第9张图片基于Darknet中的YOLO-v3训练自己的数据_第10张图片

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

你可能感兴趣的:(目标检测)