本文只介绍如何利用YOLOv3训练好的model来计算VOC数据集的mAP。
举一反三,很容易理解如何利用自己训练的model来计算自己的数据集的mAP。
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/VOC/yolov3-voc_final.weights -out "" -gpu 0 -thresh .5
注意:-out “” 双引号其实可以加内容的,但建议初次使用时不要加自定义内容,网上很多教程都加了,其实一点用都没有。之后可以再慢慢探索。
运行速度很快,大概90秒
运行结束后,在results文件夹下生成20个.txt文件,为什么是20个,因为VOC数据集就是20类呀。
https://github.com/rbgirshick/py-faster-rcnn/tree/master/lib/datasets
写入
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。
运行完成后,其实会在当前路径下生成一个annots.pkl。这个文件很重要,如果你换了数据集,对新的类别来计算mAP,则需要将之前生成的annots.pkl删掉,才能正常计算。
其实上述代码是对person类计算mAP,输出的结果如下所示:
输出的最后一项内容,才是person类的mAP,即为0.852959。
同理,将compute_mAP.py中的person改成aeroplane,即可以计算aeroplane的mAP。
上述内容,其实是网上千篇一律的内容。
我在想,为什么不直接写一个.py,直接计算出所有单类别的mAP和总的mAP!
这就搞起来!
写入如下内容:
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。
最终结果如下图所示:
YOLOv3对VOC进行测试,其mAP为82.29。
注:不知道上述计算方式规不规范,因为此时的mAP还挺高的。
YOLOv3使用笔记——计算mAP、recall
darknet yolo 计算mAP,recall