检测模型评估指标mAP计算指南(附代码)在这里!

更新时间:2023-07-27 02:35:35 阅读: 评论:0

检测模型评估指标mAP计算指南(附代码)在这⾥!
精度precision的计算是⽤ 检测正确的数据个数/总的检测到个数。
召回率recall的计算是⽤ 检测正确的数据个数/ground truth之中所有正数据个数。
前⾔
对于使⽤机器学习解决的⼤多数常见问题,通常有多种可⽤的模型。每个模型都有⾃⼰的独特之处,并随因素变化⽽表现不同每个模型
在“验证/测试”数据集上来评估性能,性能衡量使⽤各种统计量如准确度(accuracy),精度(precision),召回率(recall)等。选择的统计量通常针对特定应⽤场景和⽤例。 对于每个应⽤场景,选择⼀个能够客观⽐较模型的度量指标⾮常重要。
这篇⽂章将介绍⽬标检测(Object Detection)问题中的最常⽤评估指标-Mean Average Precision,即mAP。
⼤多数时候,这些指标很容易理解和计算。例如,在⼆元分类中,精确度和召回率是⼀个⼀个简单直观的统计量。然⽽,⽬标检测是⼀个⾮常不同且有趣的问题。即使你的⽬标检测器在图⽚中检测到猫,但
如果你⽆法定位,它也没有⽤处。由于你要预测的是图像中各个物体是否出现及其位置,如何计算mAP将⾮常有趣。
在讲解mAP之前,我们先定义⽬标检测问题。
⽬标检测问题
在⽬标检测问题中,给定⼀个图像,找到它所包含的物体,找到它们的位置并对它们进⾏分类。⽬标检测模型通常是在⼀组特定的类集合上进⾏训练的,所以模型只会定位和分类图像中的那些类。另外,对象的位置通常采⽤矩形边界框表⽰。因此,⽬标检测涉及图像中物体的定位和分类。
image
下⾯所述的Mean Average Precision特别适⽤于同时预测物体位置及类别的算法。 因此,从图1可以看出,它对评估定位模型、⽬标检测模型和分割模型⾮常有⽤。
评估⽬标检测模型
1. 为什么是mAP?
⽬标检测问题中的每个图⽚都可能包含⼀些不同类别的物体。如前所述,需要评估模型的物体分类和定位性能。因此,⽤于图像分类问题的标准指标precision不能直接应⽤于此。 这就是为什么需要mAP。 我希望读完这篇⽂章后,你将能够理解它的含义。
高级商务英语2. 关于Ground Truth
对于任何算法,评估指标需要知道ground truth(真实标签)数据。 我们只知道训练、验证和测试数据集的ground truth。对于⽬标检测问题,ground truth包括图像中物体的类别以及该图像中每个物体的真实边界框。
image
这⾥给出了⼀个实际图⽚(jpg、png等格式),以及相应的⽂本注释(边界框坐标(x, y, w, h)和类别),如图中红⾊框以及⽂本标签所⽰。
对于这个特殊例⼦,模型在训练时需要原始的图⽚:
image
以及ground truth的3个坐标及类别(这⾥假定图⽚⼤⼩是1000x800px,所有的坐标值都是以像素为单位的近似值):
image
下⾯让我们动⼀下⼿,去看如何计算mAP。这⾥我们不谈论不同的⽬标检测算法,假定我们已经有了⼀个训练好的模型,现在只需要在验证集上评估其性能。蛇的传说
03
mAP含义及计算
前⾯展⽰了原始图像和以及对应的ground truth。训练集和验证集中所有图像都以此⽅式标注。
训练好的⽬标检测模型会给出⼤量的预测结果,但是其中⼤多数的预测值都会有⾮常低的置信度(confidence score),因此我们只考虑那些置信度⾼于某个阈值的预测结果。
将原始图⽚送⼊训练好的模型,在经过置信度阈值筛选之后,⽬标检测算法给出带有边界框的预测结果:
image
现在,由于我们⼈类是⽬标检测专家,我们可以知道这些检测结果⼤致正确。但我们如何量化呢?我
们⾸先需要判断每个检测的正确性。这⾥采⽤IoU(Interction over Union),它可以作为评价边界框正确性的度量指标。 这是⼀个⾮常简单的指标。从名称看,有些⼈会发现这个名字是⾃解释的,但我们需要更好的解释。这⾥会以简短的⽅式解释IoU,如果想深⼊理解,可以参考Adrian Robrock的这篇⽂章(Interction over Union (IoU) for object detection)。
1. IoU
IoU是预测框与ground truth的交集和并集的⽐值。这个量也被称为Jaccard指数,并于20世纪初由Paul Jaccard⾸次提出。为了得到交集和并集,我们⾸先将预测框与ground truth放在⼀起,如图所⽰。
image
对于每个类,预测框和ground truth重叠的区域是交集,⽽横跨的总区域就是并集。其中hor类的交集和并集如下图所⽰(这个例⼦交集⽐较⼤):
image
其中蓝绿⾊部分是交集,⽽并集还包括橘⾊的部分。那么,IoU可以如下计算:
image
2. 鉴别正确的检测结果并计算precision和recall
为了计算precision和recall,与所有机器学习问题⼀样,我们必须鉴别出True Positives(真正例)、Fal Positives(假正例)、True Negatives(真负例)和 Fal Negatives(假负例)。
为了获得True Positives and Fal Positives,我们需要使⽤IoU。计算IoU,我们从⽽确定⼀个检测结果(Positive)是正确的(True)还是错误的(Fal)。最常⽤的阈值是0.5,即如果IoU> 0.5,则认为它是True Positive,否则认为是Fal Positive。⽽COCO数据集的评估指标建议对不同的IoU阈值进⾏计算,但为简单起见,我们这⾥仅讨论⼀个阈值0.5,这是PASCAL VOC数据集所⽤的指标。
为了计算Recall,我们需要Negatives的数量。由于图⽚中我们没有预测到物体的每个部分都被视为Negative,因此计算True Negatives ⽐较难办。但是我们可以只计算Fal Negatives,即我们模型所漏检的物体。
另外⼀个需要考虑的因素是模型所给出的各个检测结果的置信度。通过改变置信度阈值,我们可以改变⼀个预测框是Positive还是Negative,即改变预测值的正负性。基本上,阈值以上的所有预测(Box + Class)都被认为是Positives,并且低于该值的都是Negatives。
对于每⼀个图⽚,ground truth数据会给出该图⽚中各个类别的实际物体数量。我们可以计算每个Posi
tive预测框与ground truth的IoU 值,并取最⼤的IoU值,认为该预测框检测到了那个IoU最⼤的ground truth。然后根据IoU阈值,我们可以计算出⼀张图⽚中各个类别的正确检测值(True Positives, TP)数量以及错误检测值数量(Fal Positives, FP)。据此,可以计算出各个类别的precision:
image
既然我们已经得到了正确的预测值数量(True Positives),也很容易计算出漏检的物体数(Fal Negatives, FN)。据此可以计算出Recall(其实分母可以⽤ground truth总数):
image
3. 计算mAP
mAP这个术语有不同的定义。此度量指标通常⽤于信息检索和⽬标检测领域。然⽽这两个领域计算mAP的⽅式却不相同。这⾥我们只谈论⽬标检测中的mAP计算⽅法。
在⽬标检测中,mAP的定义⾸先出现在PASCAL Visual Objects Class(VOC)竞赛中,这个⼤赛包含许多图像处理任务,详情可以参考这个(⾥⾯包含各个⽐赛的介绍以及评估等)。
前⾯我们已经讲述了如何计算Precision和Recall,但是,正如前⾯所述,⾄少有两个变量会影响Preci
sion和Recall,即IoU和置信度阈值。IoU是⼀个简单的⼏何度量,可以很容易标准化,⽐如在PASCAL VOC竞赛中采⽤的IoU阈值为0.5,⽽COCO竞赛中在计算mAP较复杂,其计算了⼀系列IoU阈值(0.05⾄0.95)下的mAP。但是置信度却在不同模型会差异较⼤,可能在我的模型中置信度采⽤0.5却等价于在其它模型中采⽤0.8置信度,这会导致precision-recall曲线变化。为此,PASCAL VOC组织者想到了⼀种⽅法来解决这个问题,即要采⽤⼀种可以⽤于任何模型的评估指标。在paper中,他们推荐使⽤如下⽅式计算Average Precision(AP):
For a given task and class, the precision/recall curve is computed from a method’s ranked output. Recall is defined as the proportion of all positive examples ranked above a given rank. Precision is the proportion of all examples above that rank which are from the positive class. The AP summaris the shape of the precision/recall curve, and is defined as the mean precision at a t of eleven equally spaced recall levels [0,0.1,…,1]:
可以看到,为了得到precision-recall曲线,⾸先要对模型预测结果进⾏排序(ranked output,按照各个预测值置信度降序排列)。那么给定⼀个rank,Recall和Precision仅在⾼于该rank值的预测结果中计算,改变rank值会改变recall值。这⾥共选择11个不同的recall([0, 0.1, ..., 0.9, 1.0]),可以认为是选择了11个rank,由于按照置信度排序,所以实际上等于选择了11个不同的置信度阈值。那么,AP就定义为在这11个recall下precision的平均值,其可以表征整个precision-recall曲线(曲线下⾯积)。
image
杀生丸壁纸
另外,在计算precision时采⽤⼀种插值⽅法(interpolate):
The precision at each recall level r is interpolated by taking the maximum precision measured for a method for which the corresponding recall exceeds r:The intention in interpolating the precision/recall curve in this way is to reduce the impact of the “wiggles” in the precision/recall curve, caud by small variations in the ranking of examples.
及对于某个recall值r,precision值取所有recall>r中的最⼤值(这样保证了p-r曲线是单调递减的,避免曲线出现摇摆):
image
不过这⾥VOC数据集在2007年提出的mAP计算⽅法,⽽在2010之后却使⽤了所有数据点,⽽不是仅使⽤11个recall值来计算AP(详细参考这篇):
Up until 2009 interpolated average precision (Salton and Mcgill 1986) was ud to evaluate both classification and detection. However, from 2010 onwards the method of computing AP changed to u all data points rather than TREC-style sampling (which only sampled the monotonically decreasi
ng curve at a fixed t of uniformly-spaced recall values 0, 0.1, 0.2,…, 1). The intention in interpolating the precision–recall curve was to reduce the impact of the ‘wiggles’ in the precision–recall curve, caud by small variations in the ranking of examples. However, the
downside of this interpolation was that the evaluation was too crude to discriminate between the methods at low AP.
对于各个类别,分别按照上述⽅式计算AP,取所有类别的AP平均值就是mAP。这就是在⽬标检测问题中mAP的计算⽅法。可能有时会发⽣些许变化,如COCO数据集采⽤的计算⽅式更严格,其计算了不同IoU阈值和物体⼤⼩下的AP(详情参考)。
当⽐较mAP值,记住以下要点:
mAP通常是在⼀个数据集上计算得到的。
虽然解释模型输出的绝对量化并不容易,但mAP作为⼀个相对较好的度量指标可以帮助我们。 当我们在流⾏的公共数据集上计算这个度量时,该度量可以很容易地⽤来⽐较⽬标检测问题的新旧⽅法。
根据训练数据中各个类的分布情况,mAP值可能在某些类(具有良好的训练数据)⾮常⾼,⽽其他类(具有较少/不良数据)却⽐较低。所以你的mAP可能是中等的,但是你的模型可能对某些类⾮常好,
对某些类⾮常不好。因此,建议在分析模型结果时查看各个类的AP值。这些值也许暗⽰你需要添加更多的训练样本。
04
代码实现
Facebook开源的Detectron包含VOC数据集的mAP计算(),这⾥贴出其核⼼实现,以对mAP的计算有更深⼊的理解。⾸先是precision和recall的计算:
# 按照置信度降序排序sorted_ind = np.argsort(-confidence)
BB = BB[sorted_ind, :]  # 预测框坐标image_ids = [image_ids[x] for x in sorted_ind] # 各个预测框的对应图⽚id# 便利预测框,并统计TPs和FPsnd = len(image_ids) tp = np.zeros(nd)
fp = np.zeros(nd)for d in range(nd):
R = class_recs[image_ids[d]]
bb = BB[d, :].astype(float)
ovmax = -np.inf
BBGT = R['bbox'].astype(float)  # ground truth
if BBGT.size > 0:        # 计算IoU
# interction
ixmin = np.maximum(BBGT[:, 0], bb[0])
iymin = np.maximum(BBGT[:, 1], bb[1])
超轻粘土画ixmax = np.minimum(BBGT[:, 2], bb[2])
蚂蝗iymax = np.minimum(BBGT[:, 3], bb[3])
iw = np.maximum(ixmax - ixmin + 1., 0.)
ih = np.maximum(iymax - iymin + 1., 0.)
inters = iw * ih        # union
uni = ((bb[2] - bb[0] + 1.) * (bb[3] - bb[1] + 1.) +
(BBGT[:, 2] - BBGT[:, 0] + 1.) *
(BBGT[:, 3] - BBGT[:, 1] + 1.) - inters)
overlaps = inters / uni
ovmax = np.max(overlaps)
jmax = np.argmax(overlaps)    # 取最⼤的IoU小布什演讲
if ovmax > ovthresh:  # 是否⼤于阈值
if not R['difficult'][jmax]:  # ⾮difficult物体
唐吉诃德if not R['det'][jmax]:    # 未被检测
tp[d] = 1.
R['det'][jmax] = 1    # 标记已被检测
中考黑板报el:
fp[d] = 1.
el:
fp[d] = 1.# 计算precision recallfp = np.cumsum(fp)
tp = np.cumsum(tp)
rec = tp / float(npos)# avoid divide by zero in ca the first detection matches a difficult# ground truthprec = tp / np.maximum(tp + fp, np.finfo(np.float64).eps)
这⾥最终得到⼀系列的precision和recall值,并且这些值是按照置信度降低排列统计的,可以认为是取不同的置信度阈值(或者rank值)
得到的。然后据此可以计算AP:

本文发布于:2023-07-27 02:35:35,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1119209.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:检测   计算   模型   物体   指标   评估   数据   置信度
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图