目标检测评估—Mean Average Precision(mAP)(上)

802 阅读8分钟

前言

今天计算机视觉的中的一个主要任务就是目标检测目标检测任务广泛应用各个领域,例如例如人脸识别、商品识别和自动驾驶等应用场景。

那么在做目标检测任务中,模型不但会输出给出目标类别而且还会给出预测目标的位置,其实要比分类任务要复杂的多。同时在评估方面相对于图像分类要复杂多,今天我们就来聊一聊如何评估目标,最近工作是与 Coco 相关的,所以需要

在目标检测中主要有 coco 数据集和 pascal voc 这两个数据集,每一个数据集都有自己一套评估标注。

图像分类中,只要我们统计出预测正确数量再去除以总样本数就可以得到准确率,这样比较直观,容易理解,不过在目标检测多了位置方面验证,这样增加难点

那么想要了解目标检测评估标准,我们首先来自己思考一下,

屏幕快照 2022-07-23 下午2.50.58.png

其实也不难看出,除了预测目标要准确,而且给出预测框也要给我们目标边界框越越接近越好

在这样图中,蓝色边界框表示标注出来目标位置边界框,而橙色的边界框是模型给出预测编辑框

在开始之前我们需要简单回顾一下一些概念

  • GT(Ground Truth) 也就是标注的
  • IoU
  • TP(True Positive) 也就是预测正确编辑框的数量,这个结果是 IoU 相关的,对于同一个 GT 标注的边界框
  • FP(False Positive) IoU0.5IoU \le 0.5 的检测框,检测到同一个 GT 的多余检测框的数量,也就是
  • FN(False Negative) 表示漏检测的 GT 数量
  • Precision: TP/(TP + FP) 模型预测的所有目标中,预测正确的比例
  • Recall: TP/(TP + FN) 所有真实目标中,模型预测正确的目标比例
  • AP: 是在 P-R 曲线下的面积
  • P-R 曲线: Precision-Recall 曲线

mAP

还有就是今天的主角 mAP,其全称为 mean Average Precision,对每一个类别都可以求一个 AP 值,然后 mAP 就是对所有类别求平均值

仅考虑准确率(Precision)情况

mAP_P_R.PNG

  • 在这张图中,我们不难看出有 5 个目标,模型只给出一个检测框,如果仅考虑 Precision(精确率) 这时 FP=0 所以 TP/(TP + FP) 就是 100%

仅考虑召回率(Recall)情况

mAP_Recall.PNG

  • 如果只考虑召回率情况,

分享将学到什么

我们先抓重点,就是 mAP 数值与模型检测能力关系是什么,其实就是 mAP 值越高说明模型检测能力越强。其实如果全篇阅读下来,只要知道这一点就住够了,其他部分都是为解释 mAP 如何有效评估一个模型,以 mAP 代码实现。

  • 什么是 IoU
  • 召回率和精准率在语义分割和目标识别中是如何计算的
  • 会附有 IoU 和 mAP 的代码实现

有的时候,许多概念是似曾相识,不过真要其实起来,好像又解释不清楚。

在开始正式解释 AP 和 mAP 我们先来介绍两个会用到的知识点,他们分别是

IoU(Intersection over Uion)

这个算法很直观也很好理解,就用两个边界框的交集除以两个边界框的并集,用于表示两个边界框的重合程度。

屏幕快照 2022-07-23 下午1.38.06.png

混淆矩阵

混淆矩阵这张表,相比大家在学习分类时候都已经接触过了。

屏幕快照 2022-07-23 下午1.51.02.png

关于这个混淆矩阵,感觉用一张表要比用文字来解释要直观得多,也更容易理解。为简单说明一下,在表中,列表示预测为正例样本或者负例样本。而行表示真实样本是正例样本还是负例样本。那么行和列交交叉处含义又是什么呢?例如 True Positive(TP) 表示将正例样本预测为正例样本,所以这里 True 表示预测为正确,而后面 Positive 表示预测给出结果。再来看一个 False Negative 这是将正例样本预测为负例样本,那么 False 表示预测错误,而后面 Negative 表示预测给出答案。

有了这个混淆矩阵表,我们可以基于这张表来进一步计算一些评估指标,例如精准率(precision) 和召回率(recall)

关于 precision 有些文章翻译为精准率,也有翻译为精确率的,其实都是 precision。通常 accuracy 都翻译为准确率

precision=TPTP+FPprecision = \frac{TP}{TP + FP}

精准率表示也就是模型预测为正例样本中真正为正例样本所占的比例

recall=TPTP+FNrecall = \frac{TP}{TP + FN}

表示在真实为正例样本中模型预测出为正例样本所占的比例

上面是在分类中如何计算精准率和召回率,那么在语义分割和目标检测中又应该如何计算精准率。

语义分割

屏幕快照 2022-07-23 下午2.14.06.png

在语义分割中结合上图,给大家解释在语义分割中是如何定义 TP、TP 和 FN 区域的。其中橘黄色区域表示模型预测出为正例的区域,蓝色区域表示 ground truth 判断为正例(也就是目标)的区域。那么预测区域和 ground truth 的区域的交集就是 TP,也就是将正例预测为正例区域大小,那么模型预测为正例,但是不在 ground truth 区域范围内会记做 FP。好有了 TP、FP 和 FN 的定义,这样就可以计算精准率(precision)和召回率(recall)。

目标检测中 TP、FN 和 FP 的定义

其实目标检测和语义分割似乎有些类似,都是在做类似事情,那么我们是不是可以用上面语义分割评估方法来套用到目标检测中。

那么接下来我们就看一看将语义分割的评估指标套用到目标检测上是否合适

屏幕快照 2022-07-23 下午2.50.58.png

从上图上来看,显然是存在问题的,虽然预测香蕉的边界框和香蕉的 ground truth 面积有一定重合,不过实际这个预测框框住香蕉面积并不多,可能这张图还不算清楚,那么下面这张图可能就更能说明问题了。

屏幕快照 2022-07-23 下午2.57.36.png

现在我们看上面橘黄色预测边界框是预测苹果,还是香蕉,你可能会不加思索回答苹果。不过如果按照语义分割按面积计算,这个橘黄色边界框可能与香蕉的 ground truth 边界框相交的面积更大。由此可见像语义分割这样通过计算面积做作为衡量模型指标是不太合适的,

既然不能拿语义分割中关于 FP、TP 和 FN 的定义来套用到目标检测上,那么实际上,在目标检测中,关于 FP、TP 和 FN 又是如何定义的呢,接下来就一一给出他们在目标检测中的定义。

TP

模型预测边界框和 groun truth 边界框的 IoU 是否大于某一个指定的阈值,通常会指定为 0.5

FN

groun truth 没有个被任何 TP 预测的边界框所覆盖,注意这里是指 TP 预测边界框

FP
  • 预测边界框没有覆盖到任何 ground truth 边界框上面
  • 虽然与某一个 ground truth 相交,但是这个预测边界框 IoU 值是小于阈值
  • 一个目标给多个预测边界框所框住,在这些预测边界框中,除了置信度值最高的预测边界框以外其他预测边界框也被记做 FP

到现在为止大家可能会问这里已经有了 TP、FN 和 FP 好像还少了 TN,其实在目标检测任务中,对模型评估通常不会包括 TN,因为随便在背景框出一个边界框就是 TN,所以在目标检测或者语义分割评估中,通常不会考虑 TN。

接下来这里精心挑选一些例子帮助大家理解。

屏幕快照 2022-07-23 下午4.22.52.png

看上面这张图,左边图为酒瓶和红酒杯的 ground truth,右边图为模型预测结果

bottle
  • 1 TP: IoU 大于 0.5
  • 1 FP: IoU 小于 0.5,也就是说明这个预测边界框预测为 bottle ,但是因为小于 0.5 满足上面 FP 的与 ground truth 相交但是 IoU 值小于阈值(0.5)的条件
wine glass
  • 1 TP: IoU 大于 0.5
  • 1 FP: IoU 虽然大于 0.5 但是其置信度并不是最高的预测编辑框,也是满足了上面 FP 的条件

我们在看一个列子

屏幕快照 2022-07-23 下午4.21.10.png

在图中,左边为 ground truth 而右边为预测的结果

cake:
  • 1 FP 由于预测边界框与 ground truth 的阈值小于 0.5 所以记做 1 个 FP
  • 1 FN 没有一个真正边界框检测到该目标,是因为

fork:

  • 1 FN 没有一个目标检测到该目标

屏幕快照 2022-07-23 下午7.01.42.png

在上面图中,是将火车(train)误识别为(bus)实例

train:
  • FN 表示没有检测框检测到 train
bus:
  • FP: 这里没有 bus,识别出了一个 bus 所以属于 FP

如何计算精准率和召回率

屏幕快照 2022-07-23 下午4.22.52.png

以 bottle 为例

percision=TPTP+FP=11+1=1/2percision = \frac{TP}{TP + FP} = \frac{1}{1 + 1} = 1/2
recall=TPTP+FN=11+0=1recall = \frac{TP}{TP + FN} = \frac{1}{1 +0} =1

调整置信度的阈值会改变有效 bbox 的数量,从而改变精准率和召回率。类似于 ROC 的敏感性(sensitivity)/特异性(specificity),可以使用由所有可能的置信度阈值产生的精准率/召回流对来绘制出精确率-召回曲线(PRC)。

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿