文章目录
-
- 0. 前言
- 1. TP/FP/TN/FN 与 accuracy/precision/recall
-
- 1.1. TP/FP/TN/FN
- 1.2. accuracy/precision/recall
- 2. IOU
- 3. mAP
-
- 3.1. 基本思路
- 3.2. 实例
- 3.2. TODO:源码分析
0. 前言
- 引入
- 在目标检测中,mAP是常用的性能指标,但一直没有完全搞清楚。
- 好像对于不同的数据集/任务,使用的mAP也有不同,比如Pascal VOC和COCO的就有所不同。
- 在计算mAP的过程中会用到IOU,而IOU的计算又与TP/FP/TN/FN有关联。
- 之前一直对 accuracy, recall, precision 没有完全透彻的搞明白。
- 这些概念应该属于机器学习入门知识,现在才完全搞明白,这就体现出我的基础到底有多烂。
- 参考资料:
- 知乎讨论:精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?
- 混淆矩阵中的四个分量,对应下面图片。
- True Positive, TP;False Positive, FP;True Negative, TN;False Negative, FN
- Positive/Negative用来表示预测的结果,预测是1则就是Positive,预测是0则表示Negative。
- True/False 用来表示预测结果是否正确,正确则为True,错误则为False。
-
文章图片
- 机器学习常用的几个性能指标。
- accuracy,准确率,是预测正确的样本数除以所有样本数,即a c c u r a c y = T P + T N T P + F P + T N + F N accuracy = \frac{TP+TN}{TP + FP + TN + FN} accuracy=TP+FP+TN+FNTP+TN?
- recall:
- 召回率,在所有正样本中,预测为正的样本概率,即r e c a l l = T P T P + F N recall = \frac{TP}{TP+FN} recall=TP+FNTP?
- 理解:recall越高,
所有真实正样本中被预测为正样本的概率
越高,即“宁可错杀一万不可放过一个”。 - 场景:如果正样本没有被预测出来则会导致很坏结果,如判断病人有没有生病,导弹预测。
- 召回 两字的理解:在所有正样本中,召回(预测)了多少正样本。
- precision:
- 即精确率,所有预测为为正的杨根本中,真正属于正样本的概率,即p r e c i s i o n = T P T P + F P precision = \frac{TP}{TP + FP} precision=TP+FPTP?
- precision越高,则
所有预测为正的样本中的确为正样本的概率
越高, - 场景:如果预测为正的样本中存在负样本会导致很坏的结果,如嫌犯定罪。
- 下面图片帮助理解:
-
文章图片
-
- recall/precision 属于鱼和熊掌,不可兼得。
- 参考资料:目标检测番外篇(1)_IoU
- 基本理解:上面的参考文献中给出了配图
-
文章图片
-
- 实现思路:
- 一般输入是两个bbox的信息,即两组
xmin, ymin, xmax, ymax
。 - IOU实现的重点就是两个bbox
交
的面积- 计算IOU就是要计算两个bbox的
交
与并
的面积。 - bbox
并
的面积,其实就是两个bbox的面积减去bbox交
的面积。 - 所以,难点就是计算两个bbox的
交
。
- 计算IOU就是要计算两个bbox的
- 需要考虑的情况有很多:
- 两个bbox没有相交部分。
- 一个bbox在另一个bbox中。
- 其他普通情况
- 一般输入是两个bbox的信息,即两组
- 下面代码来自上面的参考文献,很清楚了,就不多说了。
def get_IoU(pred_bbox, gt_bbox):
"""
return iou score between pred / gt bboxes
:param pred_bbox: predict bbox coordinate
:param gt_bbox: ground truth bbox coordinate
:return: iou score
"""# bbox should be valid, actually we should add more judgements, just ignore here...
assert ((abs(pred_bbox[2] - pred_bbox[0]) > 0) and
(abs(pred_bbox[3] - pred_bbox[1]) > 0))
assert ((abs(gt_bbox[2] - gt_bbox[0]) > 0) and
(abs(gt_bbox[3] - gt_bbox[1]) > 0))# 计算 交 的面积
ixmin = max(pred_bbox[0], gt_bbox[0])
iymin = max(pred_bbox[1], gt_bbox[1])
ixmax = min(pred_bbox[2], gt_bbox[2])
iymax = min(pred_bbox[3], gt_bbox[3])
iw = np.maximum(ixmax - ixmin + 1., 0.)
ih = np.maximum(iymax - iymin + 1., 0.)
inters = iw * ih# 计算 并 的面积,即 S1 + S2 - inters
uni = ((pred_bbox[2] - pred_bbox[0] + 1.) * (pred_bbox[3] - pred_bbox[1] + 1.) +
(gt_bbox[2] - gt_bbox[0] + 1.) * (gt_bbox[3] - gt_bbox[1] + 1.) -
inters)# 获得iou
overlaps = inters / unireturn overlaps
3. mAP
- 参考资料:
- 知乎讨论:目标检测中的mAP是什么含义?
- 白话mAP
- 目标检测番外篇(2)_mAP
- Github: dmlc/gluon-cv - voc_detection.py 源码
- Github: rafaelpadilla/Object-Detection-Metrics
- mAP的计算会用到precision/recall以及IOU。
- 计算precision/recall:
- 检测结束后,每张图获取若干最终结果pred bboxes。
- 每张图片本身有gt bboxes。
- 依次计算每张图片、每类物体的 pred bboxes 与 gt bboxes 之间的IOU。
- IOU大于一定阈值(如0.5)且对应gt bbox未与其他pred bbox对应的记作TP。
- IOU小于阈值,或IOU大于阈值但gt bbox与其他pred bbox关联,对应则记为FP。
- 没有对应pred bbox 的 gt bbox 被看过只FN。
- 统计数据集中所有图片的TP/FP/FN,,就可以计算 precision 和 recall。
- 另外,检测结果(即 pred bboxes)的确认,是通过置信度大小来设置的,即可以通过置信度来控制预测bbox的Positive/Negative。
- mAP,其实就是 mean AP,即对每一类物体计算AP,然后再求所有类的平均。
- AP,就是 average precision,就是在若干固定recall的情况下计算precision,然后求precision的平均数。
- 总结一下相关概念:
- mAP:mean average precision
- AP: average precision,PR曲线下的面积
- Presicion = TP / (TP + FP)
- Recall = TP/ (TP + FN)
- TP: IOU 大于阈值的bbox数量(每个gt bbox只有一个对应的 pred bbox)
- FP: IOU 小于阈值或同一gt bbox多余的bbox的数量。
- FN:没有检测到的gt bbox数量。
- 下面的例子来自 这里,不了解原始出处。
- 对于一次物体检测任务,得到以下结果:
- 绿色的是gt bboxes,红色的是pred bboxes。
-
文章图片
- 对于所有pred bboxes,根据置信度排序(confidences)得到以下表格
- Confidences 表示置信度,TP 表示该 pred bbox 是否与某个gt bbox对应,即IOU是否大于阈值。
- Acc TP 表示累计 TP数量,Acc FP表示累计FP数量。
- Precision与Recall分别代表当前点的累计准确率与召回率,可以看做是置信度阈值为X(即对应行Confidences的取值)时的recall与precision。
-
文章图片
- 根据上面的表格,可以获得以下PR曲线:
- 注意,从上面的表格从上到下,置信度(confidences)逐渐减小,recall肯定是增加的(因为肯定会有越来越多的TP被包含其中)。
- 从表格上看,当新增一个TP时,PR曲线会向右上方移动。当新增一个FP时,PR曲线会向正下方移动。
-
文章图片
- Pascal VOC 2008:
- Interpolated AP,即进行差值计算AP。
- 具体方法:对每一个Precision值,使用其右边最大的Precision值替代。
- 如下图,就是利用红色虚线取代蓝色曲线。
-
文章图片
- 实际计算方法如下图,就是对平滑后的Precision曲线进行均匀采样出11个点(每个点间隔0.1),然后计算这11个点的平均Precision。
-
文章图片
- Pascal VOC 2012
- Area under curve AUC。
- Pascal VOC 2007 的方法由于插值点数量太少,很容易导致结果不准确。
- 示意图如下,可以理解为算了无数个点的面积平均,所以结果要准确一些。
-
文章图片
- COCO
- 使用101个点的内插mAP(Interpolated AP)。
- 使用了不同IOU阈值,不同尺度下的AP平均来作为评测结果,比如AP @ [.5 : .95]对应于IoU的平均AP,从0.5到0.95,步长为0.05。