YOLOv3 mAP计算教程

前言

本文只介绍如何利用YOLOv3训练好的model来计算VOC数据集的mAP。

举一反三,很容易理解如何利用自己训练的model来计算自己的数据集的mAP。

1 运行detector valid命令,进行测试

./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/VOC/yolov3-voc_final.weights -out "" -gpu 0 -thresh .5

注意:-out “” 双引号其实可以加内容的,但建议初次使用时不要加自定义内容,网上很多教程都加了,其实一点用都没有。之后可以再慢慢探索。

运行速度很快,大概90秒

yolo_detector_valid.png

运行结束后,在results文件夹下生成20个.txt文件,为什么是20个,因为VOC数据集就是20类呀。

yolo_voc_valid.png

2 下载voc_eval.py

https://github.com/rbgirshick/py-faster-rcnn/tree/master/lib/datasets

3 新建compute_mAP.py

写入

from voc_eval import voc_eval

print voc_eval('/home/cxx/Amusi/Object_Detection/YOLO/darknet/results/{}.txt', '/home/cxx/Amusi/Object_Detection/YOLO/darknet/datasets/pjreddie-VOC/VOCdevkit/VOC2007/Annotations/{}.xml', '/home/cxx/Amusi/Object_Detection/YOLO/darknet/datasets/pjreddie-VOC/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'person', '.')

注意要修改上述内容的路径

要在python2的环境下运行compute_mAP.py。

扫描二维码关注公众号,回复: 2863477 查看本文章

运行完成后,其实会在当前路径下生成一个annots.pkl。这个文件很重要,如果你换了数据集,对新的类别来计算mAP,则需要将之前生成的annots.pkl删掉,才能正常计算。

其实上述代码是对person类计算mAP,输出的结果如下所示:

yolo_voc_valid_person.png

输出的最后一项内容,才是person类的mAP,即为0.852959。

同理,将compute_mAP.py中的person改成aeroplane,即可以计算aeroplane的mAP。

上述内容,其实是网上千篇一律的内容。

我在想,为什么不直接写一个.py,直接计算出所有单类别的mAP和总的mAP!

这就搞起来!

4 新建computer_Single_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/cxx/Amusi/Object_Detection/YOLO/darknet/results/{}.txt', '/home/cxx/Amusi/Object_Detection/YOLO/darknet/datasets/pjreddie-VOC/VOCdevkit/VOC2007/Annotations/{}.xml', '/home/cxx/Amusi/Object_Detection/YOLO/darknet/datasets/pjreddie-VOC/VOCdevkit/VOC2007/ImageSets/Main/test.txt', class_name, '.')
    print("{} :\t {} ".format(class_name, ap))
    mAP.append(ap)

mAP = tuple(mAP)

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

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

最终结果如下图所示:

yolo_voc_valid_map.png

YOLOv3对VOC进行测试,其mAP为82.29。

注:不知道上述计算方式规不规范,因为此时的mAP还挺高的。

参考

YOLOv3使用笔记——计算mAP、recall

darknet yolo 计算mAP,recall

猜你喜欢

转载自blog.csdn.net/amusi1994/article/details/81564504