利用yolo进行目标检测
2018-01-08 20:38
716 查看
利用坦克数据(2217张)训练生成darknet权重,加载权重进行坦克检测,计算平均精度AP进行评估。
使用工具:labelImg
数据格式:*.xml
形如
参考网址https://pjreddie.com/darknet/yolo/
1. 标注数据
对训练图像中的坦克进行标注。使用工具:labelImg
数据格式:*.xml
2. 将数据排列成pascal voc2007的格式。
其中JPEGImages中存放所有图像(*.jpg), Annotations中存放所有标注文件(*.xml),ImageSets中有一个Main文件夹,包含文件test.txt、val.txt和train.txt,分别存放测试数据的名称,验证数据的名称和训练数据的名称(不带后缀,用matlab读取文件夹中的文件来获取文件名或者用Linux的命令行获得文件名ls+…)。形如
3. 将*.xml格式的标注转成*.txt
下载darknet,参考网址https://pjreddie.com/darknet/yolo/
git clone https://github.com/pjreddie/darknet[/code]cd darknetmake
修改scripts/voc_label.py运行python voc_label.py
生成labels文件夹,其中存放标注文件*.txt,如图所示。
生成train.txt,存放图像的绝对路径4. 修改cfg文件中的内容
4.1修改yolo-voc.cfg(训练时使用)
修改yolo-voc.cfg,启用训练模式,因为只检测坦克,所以classes=1。
修改max_batches=1500。(这个是用于训练坦克,训练过程中发现训练损失随着max_batches 的增大而减小,但是max_batches过大也会导致训练损失增大)。
【region】层中 classes 改成1。
【region】层上方第一个【convolution】层,其中的filters值要进行修改,改成(classes + cords + 1)* (NUM),我的情况中:(1+4+1)* 5=30,我把filters 的值改成了30。
参考博客:
http://lib.csdn.net/article/deeplearning/57863?knId=1726
https://groups.google.com/forum/#!topic/darknet/B4rSpOo84yg
4.2修改voc.data
将classes改为1。
4.3修改yolo-voc-test.cfg(检测时使用)
修改yolo-voc-test.cfg,启用测试模式。5. 下载预训练的模型
wget https://pjreddie.com/media/files/darknet19_448.conv.23[/code]6.开始训练
darknet默认是在cpu下编译生成的,如果使用GPU来进行加速,需要修改Makefile并重新编译。
make –j8./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23[/code]
可以考虑在已经训练的模型的基础上增添新的数据继续训练./darknet detector train cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc.weights
7.得到模型(权重系数)
训练得到的权重每100次迭代保存一次,超过1000就不再保存,可以修改. darknet/samples/detector.c中
并重新编译。8.检测
8.1 对单张坦克图像进行检测./darknet detector test cfg/voc.data cfg/yolo-voc-test.cfg backup/yolo-voc_final.weights data/***.jpg[/code]
在控制台输出目标的置信度得分,
检测结果在darknet当前目录下生成图像predictions.jpg.
如果安装opencv的话可以直接显示结果。
可以修改src中的文件image.c(大约255行).来修改显示的label,原始代码只显示类别(tank),修改后可显示类别和置信度(tank 0.99)。-thresh 0
可以修改阈值来控制显示检测到的目标框,默认阈值为0.25.
8.2 对视频数据进行检测./darknet detector demo cfg/voc.data cfg/yolo-voc-test.cfg backup/yolo-voc_final.weights <video file>[/code]
命令行后面加-prefix <result_path>可以将检测结果输出到特定文件夹。
其中result_path是保存到的文件夹路径。9.评估
按照pascal voc的评估方法进行评估。下载代码
网址:https://github.com/lucky-ing/voc_eval。
参考博客:http://blog.csdn.net/zhangjunbob/article/details/52769381。
目标检测中衡量识别精度的指标是mAP(meanaverage precision)。多个类别物体检测中,每一个类别都可以根据recall和precision绘制一条曲线,AP就是该曲线下的面积,mAP是多个类别AP的平均值。
首先进行测试,要测量训练出的网络的效果首先要有一定数量的测试数据集。测试数据集需要有图片和每张图片对应的xml描述文件,而不需要有txt的描述语言,所以相对来说还少了一步转换。使用
./darknet detector valid cfg/voc.data cfg/ yolo-voc-test.cfgbackup/yolo-voc_final.weights -out 123
以上代码是使用的yolo网络自带的valid函数接口来测试大量的图片,然后保存在123tank.txt文件里,也可以是其他的文件,名字,位置自己决定。
首先cfg/voc.data里面是一些路径的描述,具体内容为
classes= 1
train = …/ImageSets/Main/train.txt
valid = …/ImageSets/Main /valid.txt
names = data/voc.names
backup = backup
其次将计算的源码下载到本地,很小的文件voc-eval-github
python 123.py …/darknet/results/123tank.txt
…/ImageSets/Main /valid.txttank
…/darknet/results/123tank.txt是指刚才测试后的数据地址。…/ImageSets/Main/valid.txt是标注*.xml描述文件的路径,和上面的voc.data是同一个文件。第四个参数tuoxie,是我们要计算mAP的类别名。然后,回车,运行。
最终计算得到AP的值(0~1)。不同的class有不同的valid文件,所以不同的分类需要一个一个测试。
第一次训练后模型检测平均精度为0.75(使用00080.avi测试),把测试数据00080加入训练集,在已有模型的基础上继续训练,max_batches=1800,learning_rate=(0.01->0.001->0.0001)
最终检测速度可达42fps,平均精度达到0.98 (使用00080.avi测试).
相关文章推荐
- 利用OpenCV的Haar特征目标检测方法进行人脸识别的尝试(一)
- 间谍卫星的基础?YOLT——利用卷积神经网络对卫星影像进行多尺度目标检测(Part I)
- 使用QT和opencv3.3进行目标检测(YOLO)
- 在opencv3中利用SVM进行图像目标检测和分类
- 利用KDE进行运动目标视觉检测
- 利用SVM进行图像目标检测和分类
- 利用SSD和自己训练好的模型进行目标检测
- 利用光流法进行运动目标检测
- YOLT——利用卷积神经网络对卫星影像进行多尺度目标检测
- 在opencv3中利用SVM进行图像目标检测和分类
- 利用Hog特征和SVM分类器进行行人检测
- CNN目标检测(二):YOLO
- 使用OpenCV自带的级联分类器进行目标检测
- 使用Faster-Rcnn进行目标检测(实践篇)
- 利用HOG特征进行人体检测
- 【目标检测大集合】R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记
- 嵌入式目标检测--Fast YOLO: A Fast You Only Look Once System for Real-time Embedded Object Detection
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程
- 利用Android Studio、MAT对Android进行内存泄漏检测
- 使用Faster-Rcnn进行目标检测的原理