YOLO-V3计算单类ap、mAP、recall

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34806812/article/details/81747494

1 批处理测试图输出检测结果文本

./darknet detector valid cfg/voc_birds.data cfg/yolov3-voc-birds.cfg backup/yolov3-voc-birds.backup -out ""

以上代码是使用的yolo网络自带的valid函数接口来测试大量的图片,把检测结果保存在txt文件里, -out 后面的“”会自动生成 “类名.txt” 在darknet / result 目录下。

具体函数是detector.c下的validate_detector函数:

2 使用py-faster-rcnn下的voc_eval.py计算mAP

2.1 将py-faster-rcnn/lib/datasets/voc_eval.py拷贝到darknet根目录

voc_eval.py下载:https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/datasets/voc_eval.py

py-faster-rcnn中的voc_eval.py解读

2.2 新建compute_mAP.py 

from voc_eval import voc_eval

print(voc_eval('/home/peidashun/projects/darknet/results/{}.txt', '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/Annotations/{}.xml', '/home/peidashun/projects/darknet/voc/2018_val.txt', 'egret', '.'))

lines 3 参数第一个为上一步的txt路径,第二个为验证集对应的xml标签路径,第三个为验证集txt文本路径,第四个为待验证的类别名,第五个为pkl文件保存的路径

注意:验证机txt内容必须是无路径无后缀的图片名。

voc_eval.py中的定义:

2.3 用python 2 执行 compute_mAP.py

重复执行,检测其他类别需要删除 ./darknet/annots.pkl ,或者改变compute_mAP.py中pkl文件保存的路径

voc_eval.py中返回的最后一个值即AP,检测单类就是mAP

结果:

输出两个array(),分别是rec和prec,最后一个为单类mAP,我偷懒没有做验证集,用了训练集去valid,因此ap很高。

3 计算recall

修改detector.c下的validate_detector_recall函数

替换list *plist = get_paths("data/coco_val_5k.list");为list *plist=get_paths("voc/train.txt");自己的训练集文本

./darknet detector recall cfg/voc_birds.data cfg/yolov3-voc-birds.cfg backup/yolov3-voc-birds.backup 

结果:最后一列为recall值。 

4 直接计算出所有单类别的mAP和总的mAP

新建computer_all_mAP.py

写入如下内容:

from voc_eval import voc_eval

import os

current_path = os.getcwd()
results_path = current_path+"/results"
sub_files = os.listdir(results_path)

mAP = []
for i in range(len(sub_files)):
    class_name = sub_files[i].split(".txt")[0]    rec, prec, ap = voc_eval('/home/peidashun/projects/darknet/results/{}.txt', '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/Annotations/{}.xml', '/home/peidashun/projects/darknet/voc/2018_test.txt', class_name, '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/mAP')
    print("{} :\t {} ".format(class_name, ap))
    mAP.append(ap)

mAP = tuple(mAP)

print("***************************")
print("mAP :\t {}".format( float( sum(mAP)/len(mAP)) ))

注意: results文件夹只能有 '类名.txt'文件,2018_test.txt文件包含所有results中txt文件的图片名(保证是共同的验证集),保证最后的输出路径下无pkl文件。

上述代码中的ap就是针对输入单一类别计算出的AP。

结果:

 

5 出现的问题

5.1 recall出现问题:Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
Couldn't open file: data/coco_val_5k.list

解决:改动了darknet源码,要重新编译。在darknet目录下:

make clean
make -j8

5.2运行conpute_map.py 出现问题:IOError: [Errno 2] No such file or directory: 'xxx.jpg.xml'

解决方式一:修改txt文件中内容为不带路径不带后缀的图片名(推荐)

解决方式二:修改voc_eval.py,通过用splitext和basename,去掉路径和后缀,修改图如下,再运行通过该error:

5.3 recall时出现问题: IOU: inf%    iou最大为1,怎么会爆炸的大?

尝试解决:

raw:

修改:

重编译,运行失败,出现IOU和recall都很小的情况。此问题待解决。

 

参考:

https://blog.csdn.net/qq_42141945/article/details/80285971

https://blog.csdn.net/lucky__ing/article/details/78310510?utm_source=debugrun&utm_medium=referral

https://blog.csdn.net/cgt19910923/article/details/80524173

https://blog.csdn.net/amusi1994/article/details/81564504

猜你喜欢

转载自blog.csdn.net/qq_34806812/article/details/81747494