实践四:使用yolo-v3训练自己的数据集

darknet安装

官网安装:https://pjreddie.com/darknet/install/
Darknet安装相对caffe来说非常简单。
Opencv和cuda作为选装的部分,可以不安装。推荐安装这两个,只有安装的cuda才能使用gpu。只有安装了opencv才能调用摄像头进行实时检测。
Opencv和cuda的安装方法参考安装caffe时的安装方法:
http://blog.csdn.net/vvyuervv/article/details/60755653
Darknet的安装简单来说就三个步骤:下载安装包,修改Makefile文件,编译
下载安装包:
使用命令行下载的命令:

git clone https://github.com/pjreddie/darknet.git

当然也可以直接输入网址进行下载:
https://github.com/pjreddie/darknet.git
下载之后打开文件夹里的Makefile文件,如果你安装的opencv和cuda,则将Makefile文件中的GPU和OPENCV修改成1 。 即:

GPU=1
OPENCV=1 
CUDNN=1  
...  
NVCC=/usr/local/cuda-8.0/bin/nvcc 

如果没有安装opencv和cuda就不需要进行修改

git clone https://github.com/pjreddie/darknet
cd darknet
make

这样就可以了,没有安装opencv和cuda的情况下编译很快,安装了的编译时要等一会,时间也不是很长。
测试已训练好的权重
接着下载了yolo v3的weight:

wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

得到了网络架构和识别结果
这里写图片描述
当前目录多出一张识别结果图片,打开图片!
当然我们也可以这样来跑一段Video

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

darknet训练中遇到的问题

1、 在.data文件中,每行的后面不能有空格。程序在运行时会有字符串的拼接,查找地址,如果有空格,会出现找不到文件的错误。
2、进行finetuning时,不能直接只用已训练好的权重,需要经过

./darknet partial cfg/darknet19_448.cfg darknet19_448.weights darknet19_448.conv.23 23 

命令的转换,使用darknet19_448.conv.23进行微调
3、 测试召回率recall的命令

./darknet detector recall data/our.data cfg/yolo.cfg backup/yolo_final.weights 

需要在data文件夹内建立一个coco_val_5k.list文件,里面存放需要测试的图片的路径和名称。
4、 测试时是每张图片都会显示信息

833 204 282 RPs/Img:760.41 IOU: 57.22% Recall:72.34%

ID 833 预测正确的框的个数204 总共282个框
5、 将测试的所有数据放入TXT文档中
./darknet detector recall data/oil_data/960x480/our.data data/oil_data/960x480/tiny-yolo.cfg data/oil_data/960x480/backup/tiny-yolo_final.weights 2>> iou.txt
只有NAN在平均数十次迭代中发生平均损失时,训练才会出错。
Nan为什么会出现:https://github.com/AlexeyAB/darknet/issues/636#issuecomment-381400954

darknet 运行已有数据

Darknet 官网给出了使用已经训练好的网络结构yolo去进行实时的检测的教程
链接:https://pjreddie.com/darknet/yolo/
。。。。。。。
第二步:生成TXT文件
标记完后会生成每张图片对应的xml文件,也就是每张图片的label文件,我们需要提取其中的一些boundingbox的信息。
在darknet的scripts文件夹下有一个voc_label.py的文件,这个是针对voc图片集的xml生成对应图片TXT文件的脚本,根据自己的情况进行修改,生成自己的图像数据的TXT文件数据。TXT文件的内容每行都是 这种形式,且坐标和长宽都应该是归一化后的数值。
在运行voc_label.py 脚本时还会生成一个train.txt文件,改文件里存放的是每张图片的绝对路径。Train.txt是训练时需要的文件。
生成txt文件后,记得将原图像和txt文件放到同一个文件夹下。
利用scripts/kitti_label.py生成scripts/train.txt和scripts/train.all.txt文件
第三步:在data文件夹里面创建一个kitti.names文件
文件命名任意,文件里存放的是类型的名称,每一类另起一行。

Pedestrian
Car

第四步:修改kitti.data文件
之后我们修改darknet下cfg文件中的voc.data文件,当然我们也可以自己创建一个kitti.data文件。

classes= 20                            #训练数据的类别数目,我这里只有一类,所以这里是20
train  = <path-to-voc>/train.txt       #上面1.2步骤生成的train文件路径
valid  = <path-to-voc>test.txt         #上面1.2步骤生成的val文件路径
names = data/voc.names                 #上面2.1步骤创建的names文件路径
backup = backup                        #这是训练得到的model的存放目录,建议自己修改。

根据我们实际的文件路径和类别等相关信息,对kitti.data文件进行修改。cfg/kitti.data

classes= 2
train  = /home/whsyxt/Desktop/zhuzhao/yolo/darknet/scripts/train.txt
valid  =/home/whsyxt/Desktop/zhuzhao/yolo/darknet/scripts/kitti_list_file/test.txt
names = data/kitti.names
backup = /home/whsyxt/Desktop/zhuzhao/yolo/darknet/backup

同时设置data/kitti.names

Pedestrian
Car

第五步:修改.cfg文件[???????]
复制yolo3.cfg文件改名为yolov3-kitti.cfg文件cfg/yolov3-kitti.cfg
假设我们使用yolo_voc.cfg网络来进行训练,我们需要到darknet/cfg/文件夹下找到yolo_voc.cfg文件进行修改。当然,使用不同的网络,要修改对应的.cfg文件。
这里写图片描述
A.filters数目是怎么计算的:3x(classes数目+5),和聚类数目分布有关,论文中有说明;
B.如果想修改默认anchors数值,使用k-means即可;
C.如果显存很小,将random设置为0,关闭多尺度训练;
D.其他参数如何调整,有空再补;
E.前100次迭代loss较大,后面会很快收敛;
其它

learning_rate=0.001  ### 学习率                                           
burn_in=1000         ### 学习率控制的参数
max_batches = 50200  ### 迭代次数                                          
policy=steps         ### 学习率策略                                       
steps=40000,45000    ### 学习率变动步长                                    
scales=.1,.1         ### 学习率变动因子     

训练

下载权重:wget https://pjreddie.com/media/files/darknet53.conv.74
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg darknet53.conv.74
# 多个gpu
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg darknet53.conv.74 -gpus 0,1,2,3
# If you want to stop and restart training from a checkpoint:
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg backup/yolov3.backup -gpus 0,1,2,3

输出得到:
(3)bounding box正确,标签错乱,这里提供两种方案供选择。
A.不改源码,不用重新编译
修改coco.names中内容,为自己的检测目标类别
B.改源码,需要重新编译[ 先 make clean ,然后再 make]
原因是作者在代码中设置了默认,所以修改 examples/darknet.c文件,将箭头指示的文件替换成自己的。然后重新编译即可。
这里写图片描述
优点:速度快,精度提升,小目标检测有改善;
不足:中大目标有一定程度的削弱,遮挡漏检,速度稍慢于V2。

猜你喜欢

转载自blog.csdn.net/qq_27163197/article/details/81514899
今日推荐