YOLOv3计算mAP教程(简单有效)

mAP指标回顾

YOLOv3计算mAP指标,分为两步:

一、对测试集生成检测结果文件:

./darknet detector valid cfg/voc.data cfg/yolov3.cfg results/yolov3.weights -out [文件名] -thresh .5

此命令输出的 .txt 文件会按照类别名称存放在results 下,比如:以三类别为例(airplane,ship,car),命令中的“文件名”输入的是Results_,则在 darknet 环境下的results文件夹下会生成三个文件,分别是 Results_airplane.txt、Results_ship.txt 和Results_car.txt,每个.txt 文件中存放的是在所有测试集图片中检测到的该类别的目标的信息,信息包含:其所在图片、在对应图片中的位置信息以及置信度。

特别注意,修改输出.txt文件的名称为类别名称,即将 Results_airplane.txt 改为 airplane.txt,这是因为第二步用到的脚本需要类别名作为参数调用检测结果.txt文件 。

二、编写python脚本文件计算AP:

将voc_eval.py 复制到 darknet 目录下:

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

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

新建一个 compute_mAP.py 文件,用来调用 voc_eval.py 文件和检测结果文件,从而计算mAP:

from voc_eval import voc_eval
 
rec,prec,ap=voc_eval('/home/QHN/darknet/results/{}.txt', '/home/QHN/darknet/data/TEST/xml/{}.xml', '/home/QHN/darknet/data/TEST/TestImage.txt', 'airplane', '.')

print('rec',rec)
print('prec',prec)
print('ap',ap)

(1)参数解释:
第 1 项:存放检测结果文件的文件夹的路径(每个类别一个单独的文件,文件名可在valid命令时指定)+ { }.txt ;
第 2 项:存放xml标签文件的文件夹的路径 + { }.xml ;
第 3 项:测试集图片名称列表.txt文件的路径 ;
第 4 项:某类别对应的结果文件的名字(每次计算不同类别的AP,只需要更改此参数后重新运行脚本即可);

(2)原理解释:

首先通过第一项+第四项,选择本次要计算AP的类别对应的valid检测结果文件。通过第三项的测试集图片名称列表遍历测试集中的每一张图片:对每一张图片而言,第一项+第四项+第三项可以匹配到属于本张图片的检测到的第四项所指类别物体的结果。第二项+第三项可以匹配到当前图片的xml标签文件,进而在此xml文件中通过第四项匹配到对应类别的groundtruth。最后eval.py通过对本图片中该类的GT标签和该类结果文件中属于本图片的检测结果的比对,完成对一张图片中某一类别的AP的计算,进而遍历完所有图片则完成对测试集的某一类别的AP计算。

(3)特别注意!!!

①运行一次compute.py,就会在当前路径下生成一个annots.pkl文件,当更换数据集(包括同一数据集图片不变但xml文件改变)时,运行compute.py前,需要将之前生成的annots.pkl删掉,否则程序会沿用上一版的数据集(xml)进行计算,结果不准确。

②务必保证,"Valid结果文件中的图片种类"和“xml的个数”和"图片名称列表中条目数"一一对应。

③txt2xml.py中的输入图片size参数如何设置影响最终mAP值。

④valid命令最后的-thresh命令对测试结果无影响。

(4)输出:最终会输出某一类别在此测试集上的Recall、Precision和Average Precision。

三、根据公式计算mAP:

以三类别检测为例:

mAP(airplane,ship,car)= [AP(airplane)+AP(ship)+AP(car)] / 3

更多类别以此类推。

发布了51 篇原创文章 · 获赞 207 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/Gentleman_Qin/article/details/84800188