目录
二、IoU (Intersection over Union)
一、Precision和Recall
- Precision是查准率、精确率的意思。预测为正的结果中,有多少真正是正样本。
- Recall是查全率、召回率的意思。对所有正样本有多少预测出来了。
数学定义如下,
例如,对于癌症预测,
二、IoU (Intersection over Union)
IoU测量两个区域之间的重叠程度,在目标检测中衡量预测结果和标签(真实的目标边界)之间的重叠程度。
python的实现代码如下:
def calculateIoU(candidateBound, groundTruthBound):
cx1 = candidateBound[0]
cy1 = candidateBound[1]
cx2 = candidateBound[2]
cy2 = candidateBound[3]
gx1 = groundTruthBound[0]
gy1 = groundTruthBound[1]
gx2 = groundTruthBound[2]
gy2 = groundTruthBound[3]
carea = (cx2 - cx1) * (cy2 - cy1) #C的面积
garea = (gx2 - gx1) * (gy2 - gy1) #G的面积
x1 = max(cx1, gx1)
y1 = max(cy1, gy1)
x2 = min(cx2, gx2)
y2 = min(cy2, gy2)
w = max(0, x2 - x1)
h = max(0, y2 - y1)
area = w * h #C∩G的面积
iou = area / (carea + garea - area)
return iou
三、top5、top1
top-1正确率,就是你预测的label取最后概率向量里面最大的那一个作为预测结果,如过你的预测结果中概率最大的那个分类正确,则预测正确,否则预测错误。top5就是最后概率向量最大的前五名中,只要出现了正确概率即为预测正确。否则预测错误。
四、Average Precision
下面创建一个简单的示例来演示平均精度(AP)的计算。在数据集中共有5个苹果。收集了模型对苹果的所有预测,并根据预测的置信水平(从最高的置信水平到最低的置信水平)对其进行排序。第二列表示预测是否正确。如果它匹配ground truth且IoU≥0.5,则是正确的。
Rank代表第几次预测,计算第3行的精度和收回值。精度是TP = 2/(2 + 1) = 2/3 = 0.67的比例。召回率是TP在可能的阳性结果中所占的比例2/(2 + 3)= 2/5 = 0.4。当包含更多的预测时,召回率会增加,但精确度会上下波动。用召回的精确度来绘制图表:
AP的概念可以看作是在精确回忆图(橙色图)下找到区域,但通过平滑之字形来近似计算。召回率 ȓ 取值 0, 0.1, 0.2, …, 0.9 and 1.0 ,对任意大于ȓ的召回率用最大精度替换精度。
实际上,在图中把它形象化要容易得多。在召回值(0、0.1、0.2、……、0.9和1.0)找到最高精度值。AP(平均精度)计算为以下11个召回级别的最高精度平均值:
这接近于求出橙色曲线下的总面积并除以11。下面是更精确的定义。
pinterp(0.7)在下面的黄色框中找到最大值:
在这个例子中,AP =(5×1.0 + 4×0.57 + 2×0.5)/11
mAP只是所有类的平均值。在许多数据集中,它通常被称为AP。
- PASCAL VOC中的AP
PASCAL VOC是一种流行的对象检测数据集。对于PASCAL VOC竞赛,IoU > 0.5的预测为正。但是,如果检测到同一物体的多次检测,则将第一次检测为阳性,其余为阴性。PASCAL VOC中的mAP与上文讨论的AP相同。
最新的研究论文倾向于只给出COCO数据集的结果。对于COCO, AP是多个IoU的平均值(考虑正匹配的最小IoU)。AP@ [5:。95]对应IoU从0.5到0.95的平均AP,步长为0.05。在COCO竞赛中,AP是80个类别中超过10个IoU级别的平均值。:从0.5到0.95,步长为0.05)。
注意:另一种看法是有11个值APr(0),APr(1)…APr(10),图表中有11个bar。bar的总面积是多少?AP区域是一个“概念理解”。但精确的数学方程很复杂。一旦你意识到APr(0)不是1,用它来计算平均值也是有意义的。
五、COCO数据集的评价指标
1、Average Precision (AP)
AP % AP at IoU=0.50:0.05:0.95 (primary challenge metric)
APIoU=.50 % AP at IoU=0.50 (PASCAL VOC metric)
APIoU=.75 % AP at IoU=0.75 (strict metric)
AP Across Scales:
APsmall % AP for small objects: area < 322
APmedium % AP for medium objects: 322 < area < 962
APlarge % AP for large objects: area > 962
Average Recall (AR):
ARmax=1 % AR given 1 detection per image
ARmax=10 % AR given 10 detections per image
ARmax=100 % AR given 100 detections per image
AR Across Scales:
ARsmall % AR for small objects: area < 322
ARmedium % AR for medium objects: 322 < area < 962
ARlarge % AR for large objects: area > 962
- 除非另有说明,否则AP和AR在多个交汇点(IoU)值上取平均值。具体来说,我们使用10个IoU阈值0.50:0.05:0.95。这是对传统的一个突破,其中AP是在一个单一的0.50的IoU上计算的(这对应于我们的度量APIoU=.50 )。超过均值的IoUs能让探测器更好定位(Averaging over IoUs rewards detectors with better localization.)。
- AP是所有类别的平均值。传统上,这被称为“平均准确度”(mAP,mean average precision)。我们没有区分AP和mAP(同样是AR和mAR),并假定从上下文中可以清楚地看出差异。
- AP(所有10个IoU阈值和所有80个类别的平均值)将决定赢家。在考虑COCO性能时,这应该被认为是最重要的一个指标。
- 在COCO中,比大物体相比有更多的小物体。具体地说,大约41%的物体很小(面积<),34%是中等(< area < )),24%大(area > 962)。测量的面积(area)是分割掩码(segmentation mask)中的像素数量。
- AR是在每个图像中检测到固定数量的最大召回(recall),在类别和IoU上平均。AR与提案评估(proposal evaluation)中使用的同名度量相关,但是按类别计算。
- 所有度量标准允许每个图像(在所有类别中)最多100个最高得分检测进行计算。
- 除了IoU计算(分别在框(box)或掩码(mask)上执行)之外,用边界框和分割掩码检测的评估度量在所有方面是相同的。
2、Evaluation Code
评估代码可在COCO github上找到。 具体来说,分别参见Matlab或Python代码中的CocoEval.m或cocoeval.py。另请参阅Matlab或Python代码(demo)中的evalDemo。在运行评估代码之前,请按结果格式页面上描述的格式准备结果(查看具体的结果格式MS COCO数据集比赛参与(participate)(来自官网))。
评估参数如下(括号中的默认值,一般不需要改变):
params{
"imgIds" : [all]N img ids to use for evaluation
"catIds " : [all] K cat ids to use for evaluation cat=category
"iouThrs" : [0.5:0.05:0.95] T=10 IoU thresholds for evaluation
"recThrs" : [0:0.01:1] R=101 recall thresholds for evaluation
"areaRng" : [all,small,medium,large] A=4 area ranges for evaluation
"maxDets" : [1 10 100] M=3 thresholds on max detections per image
"useSegm" : [1] if true evaluate against ground-truth segments
"useCats" : [1] if true use category labels for evaluation
}
运行评估代码通过调用evaluate()和accumulate()产生两个数据结构来衡量检测质量。这两个结构分别是evalImgs和eval,它们分别衡量每个图像的质量并聚合到整个数据集中。evalImgs结构体具有KxA条目,每个评估设置一个,而eval结构体将这些信息组合成 precision 和 recall 数组。这两个结构的细节如下(另请参阅CocoEval.m或cocoeval.py):
evalImgs[{
"dtIds" : [1xD] id for each of the D detections (dt)
"gtIds" : [1xG] id for each of the G ground truths (gt)
"dtImgIds" : [1xD] image id for each dt
"gtImgIds" : [1xG] image id for each gt
"dtMatches" : [TxD] matching gt id at each IoU or 0
"gtMatches" : [TxG] matching dt id at each IoU or 0
"dtScores" : [1xD] confidence of each dt
"dtIgnore" : [TxD] ignore flag for each dt at each IoU
"gtIgnore" : [1xG] ignore flag for each gt
}]
eval{
"params" : parameters used for evaluation
"date" : date evaluation was performed
"counts" : [T,R,K,A,M] parameter dimensions (see above)
"precision" : [TxRxKxAxM] precision for every evaluation setting
"recall" : [TxKxAxM] max recall for every evaluation setting
}
最后,summary()根据eval结构计算前面定义的12个检测指标。
3、Analysis Code
除了评估代码外,我们还提供一个函数analyze()来执行误报的详细分类。这受到了Derek Hoiem等人在诊断物体检测器中的错误(Diagnosing Error in Object Detectors)的启发,但在实现和细节方面却有很大不同。代码生成这样的图像:
这两幅图显示了来自2015年检测挑战赛获胜者Kaiming He等人的ResNet(bbox)检测器的分析结果。左图显示了ResNet的人员类别错误;右图是ResNet对所有类别平均值的整体分析。每个绘图是一系列精确召回(precision recall)曲线,其中每个PR曲线被保证严格地高于之前的评估设置变得更宽容。曲线如下:
1)C75:在IoU = 0.75(严格的IoU的AP)的PR(precision),对应于APIoU=.75度量曲线下的面积(area under curve )。
2)C50:IoU = 0.50处的PR(PASCAL IoU处的AP),对应于APIoU=.50度量曲线下面积。
3)Loc:在IoU =0 .10的PR(定位误差(localization errors ignored)被忽略,但不重复检测)。 所有其余的设置使用IoU = 0.1。
4)Sim:超类别误报(fps,supercategory false positives)被移除后的PR值。具体而言,与具有不同类标签但属于同一个超类别的对象的任何匹配都不会被视为fp(或tp)。通过设置同一超类别中的所有对象与所讨论的类具有相同的类标签并将它们的忽略标志设置为1来计算Sim。注意,该人是单例超类别,因此其Sim结果与Loc完全相同。
5)Oth:所有类型混乱被移除后的PR值。与Sim类似,除了现在如果检测与任何其他对象匹配,则不再是fp(或tp)。计算Oth的方法是将所有其他对象设置为与所讨论的类具有相同的类标签,并将忽略标志设置为1。
6)BG:所有背景误报(和类混乱(class confusion))被移除后的PR。 对于单个类别,BG是一个阶跃函数,直到达到最大召回后才降为0(跨类别平均后曲线更平滑)。
7)FN:在所有剩余错误都被删除后(平均AP = 1)的PR。
每条曲线下面的区域显示在图例的括号中。在ResNet检测器的情况下,IoU = 0.75的整体AP为0.399,完美定位将使AP增加到0.682。有趣的是,消除所有类别混乱(超范畴内和超范畴内)只会将AP略微提升至0.713。除去背景fp会将性能提高到0.870 AP,而其余的错误则缺少检测(尽管假设更多的检测被添加,这也会增加大量的fps)。总之,ResNet的错误来自不完美的定位和背景混淆。
对于一个给定的探测器(detector),代码总共产生了372个块(plots)!共有80个类别(category),12个超类别(supercategory),1个总体结果,总共93个不同的设置,分析是在4个尺度(scale)(全部,小,中,大,所以93 * 4 = 372个块)进行。 文件命名为[supercategory] - [category] - [size] .pdf(对于80 * 4每个分类结果),overall- [supercategory] - [size] .pdf(对于12 * 4每个超类别结果)全部[[size] .pdf为1 * 4的整体结果。在所有图中,通常总体和超类别的结果是最感兴趣的。
注意:analyze()可能需要很长时间才能运行,请耐心等待。因此,我们通常不会在评估服务器上运行此代码;您必须使用验证集在本地运行代码。最后,目前analyze()只是Matlab API的一部分; Python代码即将推出。