YOLO V2 的mAP数据测试

  • 我看到很多博客已经有了更加简单的方法。大家可以去看一下,直接使用fastrcnn的map脚本,本片博客是项目中用于评测网络的,并不是故意那么绕的,因为原版map计算和我们yolo采集的数据集有些不兼容,而且我们为了更加准确的判断,会在计算map的时候修改其iou数值,confidence数据,以及面积过滤,坐标过滤等,大家如果只是想求解map,建议转其他博客。博主看到一个教程比较简单,但是没有试过,原理是一样的。https://blog.csdn.net/LeeWanzhi/article/details/79690275 虽然态度不好,可能看起来比较简单吧。

正文

在yolo的官方上上显示,yolo v2具有76.8%的mAP,与SSD 500持平,单在fps上冥想的以碾压的优势胜出。除此之外,tiny-yolo也有着57.1%的mAP。之前博主一直在作yolov2和tinu-yolo的移植和改进,训练了接近3000张数据。但是经过实际的测试发现,tiny-yolo网络的实际效果并没有官网宣称的那么好,即使将迭代次数改为60000,也无济于事。但是yolov2网络的效果却是不容小觑的,基本博主的大部分检测物体都能够很好的识别。于是博主准备实际测量yolov2和tiny-yolo的实际的mAP值。
YOLO V2 的mAP数据测试_第1张图片
首先解释一下什么是mAP,目标检测中衡量识别精度的指标是mAP(mean average precision)。多个类别物体检测中,每一个类别都可以根据recall和precision绘制一条曲线,AP就是该曲线下的面积,mAP是多个类别AP的平均值。以上介绍来自于知乎论坛。具体的信息可以去百度或者google搜索。
因为是使用的voc规范的数据集,所以应该有训练图片的源文件,xml文件。但是这些文件并不能被yolo网络直接检测,需要转为描述文件,即每张图片对应的描述文件txt,里面记载每张图片出现检测物体的类别,位置,大小。但是对于fast-rcnn里面的mAP计算程序来说,他需要的确实另外一种格式,博主在进行格式转换的时候出了很多bug,所以现在将训练个voc格式和识别的格式统一起来,方便于mAP值的测定。
要测量训练出的网络的效果首先要有一定数量的测试数据集。测试数据集需要有图片和每张图片对应的xml描述文件,而不需要有txt的描述语言,所以相对来说还少了一步转换。使用
./darknet detector valid cfg/voc.data cfg/lucky-voc.cfg backup/lucky-slippers-color_30000.weights -out 123 -thresh 0.5
以上代码是使用的yolo网络自带的valid函数接口来测试大量的图片,然后保存在123.txt文件里,也可以是其他的文件,名字,位置自己决定。
首先cfg/voc.data里面是一些路径的描述,具体内容为
classes= 1
train = /home/lucky/open/tuoxie_VOC/train.txt
valid = /home/lucky/open/tuoxie_VOC/valid.txt
names = data/voc.names
backup = backup

因为我的识别物体只有一个,所以class为1,train是指的训练的数据地址描述文件,valid是值测试的地址描述文件。后面的name是类别描述文件,backup一般是训练的时候存储的路径。我们需要修改的只有valid这一项,指向需要测试的文件名。
cfg/lucky-voc.cfg是指的配置文件,和训练,检测时一样。
backup/lucky-slippers-color_30000.weights是指你使用的权重。
-out 是参数,输出到后面紧跟着的文件名。
-thresh是输出阀值参数,然而在实际测试的时候并没有什么作用,因为源代码中并没有被设定。这里我设为0.5.
运行完这一句话,之后darknet开始加载权重文件,然后根据你提供的测试文件的目录开始逐个识别检测。最后运行完之后,图片如下
YOLO V2 的mAP数据测试_第2张图片
(we use gpu!!!忽略不看,这是博主之前在测试gpu和cpu速度的时候输出)
接着就可以在文件./results/看到刚才的输出文件123tuoxie.txt,yolo会把识别到的东西分类,然后在自定的名字之后加上类别名,就像这里的123tuxie一样。。。
里面的内容也是有些奇怪,貌似并没有什么逻辑,不是是不是博主的操作不对,还是博主在之前优化的时候不小心改了yolo的源码。(从数据上看,设定的阀值确实没有用。源码中也可以看到。)
YOLO V2 的mAP数据测试_第3张图片
先不管那么多,下面开始mAP的计算。mAP的计算是使用的fast-rcnn里的voc_eval函数。博主修改了一下,可以更直接的得到我们想要的数据。首先确定的是所有的测试图片都和其对应的xml文件在一起,不然寻找匹配的描述文件的时候会出错。请注意,所有分类的图片都要放在同一个目录!!!就像下图一样
YOLO V2 的mAP数据测试_第4张图片
其次将计算的源码下载到本地,很小的文件voc-eval-github

git clone git@github.com:lucky-ing/voc_eval.git

里面只有一个文件123.py,使用

python 123.py /home/lucky/yolo/darknet/results/123tuoxie.txt /home/lucky/open/tuoxie_VOC/valid.txt tuoxie

/home/lucky/yolo/darknet/results/123tuoxie.txt是指刚才测试后的数据地址。/home/lucky/open/tuoxie_VOC/valid.txt,是测试的图片地址描述文件,和上面的voc.data是同一个文件。第四个参数tuoxie,是我们要计算mAP的类别名。然后,回车,运行,

不同的class有不同的valid文件,所以不同的分类需要一个一个测试。

最新更新:

这个用来测试mAP的文件因为麻烦,收到很多质问,博主在这一并回复。

  • 为什么计算mAP的时候还需要xml文件?

  • 答:因为yolo网络valid出来的是多个文件夹,每个文件夹代表一个分类检测出来的所有的情况,但是这些情况的信息使用使用像素位置来表示的。即,如果在480×480的图片中,里面检测出来的物体框图都是使用像素的位置,例如
    20171015_210945 0.006307 292.750244 123.649994 354.466797 264.518311
    代表着在20171015_210945图片中,检测出一个置信度为0.006307的物体,位置在292.750244 123.649994 354.466797 264.518311,这表示的是方框的对角的像素坐标。但是我们训练时候的标注文件(.txt)里面使用却是相对比例信息,例如
    0.4 0.5 0.2 0.1
    这个是指在图片比例0.4,0.5点有一个宽0.2,高0.1的物体。这就导致了求解mAP的时候信息格式是不对等的,所以只能从源xml文件找标注的信息。

  • 为什么voc_eval文件计算的时候会保存一个txt文件?

  • 答:因为xml的文件的原因,他需要统一路径,所以保存了文件,然后再读取,现在博主已经更新了,不会再保存文件了。

  • 为什么读取valid文件错误?

  • 因为博主设定的图片格式只有.jpg,现在已经支持.jpg .JPEG .png .PNG图像格式了。

  • 为什么在使用voc_eval文件计算mAP的时候会显示目录错误。

  • 请注意,是否将所有的测试图片都放在了同一个文件夹,请注意,一定要将所有的测试图片放在同一个文件夹内!!

  • 为什么有时候会有split之类的错误?

  • 博主遇到了这个问题,后来分析是因为测试集的名字有空格,所以导致在提取信息的时候会产生问题。如果真的是这个问题,那就需要修改yolo源码了,使yolo输出的文件用:或者其他符号来表示,然后提取的时候就不会出现这种问题。

新添加的功能

  • 支持了查全率和查准率的图像的调取,保存在了目录下的123.jpg

contact

欢迎读者一起讨论,或者联系博主邮件:[email protected]

你可能感兴趣的:(物体检测,神经网络,YOLO)