您的位置:首页 > 其它

利用yolo进行目标检测

2018-01-08 20:38 716 查看
利用坦克数据(2217张)训练生成darknet权重,加载权重进行坦克检测,计算平均精度AP进行评估。

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 darknet

make

修改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测试).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: