目标检测模型通过 pycocotools 在验证集上会得到 COCO 的评价列表,具体参数的含义是什么呢?
在 MS COCO 数据集出来之前,目标检测基本上用的是 PASCAL VOC 数据集,现在 MS COCO 非常流行。这两个数据集均有自己的评判标准。
COCO 数据集是一个可用于图像检测(Image Detection),语义分割(Semantic Segmentation)和图像标题生成(Image Captioning)的大规模数据集。它有超过 330K 张图像(其中 220K 张是有标注的图像),包含
MS COCO官网:https://cocodataset.org/#home
目标检测(object detection):使用 bounding box 或者 object segmentation (也称为instance segmentation)将不同的目标进行标定。
Densepose(密集姿势估计):DensePose 任务涉及同时检测人、分割他们的身体并将属于人体的所有图像像素映射到身体的3D表面。用于不可控条件下的密集人体姿态 估计。
Key-points detection(关键点检测):在任意姿态下对人物的关键点进行定位,该任务包含检测行人及定位到行人的关键点。
Stuff Segmentation(材料细分):语义分割中针对 stuff class 类的分割(草,墙壁,天空等)
Panoptic Segmentation(全景分割):其目的是生成丰富且完整的连贯场景分割,这是实现自主驾驶或增强现实等真实世界视觉系统的重要一步。
image captioning(图像标题生成):根据图像生成一段文字。
编号 | 英文名称 | 中文名称 | 编号 | 英文名称 | 中文名称 | 编号 | 英文名称 | 中文名称 |
---|---|---|---|---|---|---|---|---|
1 | person | 人 | 28 | boat | 船 | 55 | cup | 杯子 |
2 | bicycle | 自行车 | 29 | traffic light | 交通灯 | 56 | fork | 叉子 |
3 | car | 汽车 | 30 | fire hydrant | 消防栓 | 57 | knife | 刀 |
4 | motorcycle | 摩托车 | 31 | stop sign | 停车标志 | 58 | spoon | 勺子 |
5 | airplane | 飞机 | 32 | parking meter | 停车计时器 | 59 | bowl | 碗 |
6 | bus | 公共汽车 | 33 | bench | 长凳 | 60 | banana | 香蕉 |
7 | train | 火车 | 34 | bird | 鸟 | 61 | apple | 苹果 |
8 | truck | 卡车 | 35 | cat | 猫 | 62 | sandwich | 三明治 |
9 | boat | 船 | 36 | dog | 狗 | 63 | orange | 橙子 |
10 | traffic light | 交通灯 | 37 | horse | 马 | 64 | broccoli | 西兰花 |
11 | fire hydrant | 消防栓 | 38 | sheep | 羊 | 65 | carrot | 胡萝卜 |
12 | stop sign | 停车标志 | 39 | cow | 牛 | 66 | hot dog | 热狗 |
13 | parking meter | 停车计时器 | 40 | elephant | 大象 | 67 | pizza | 披萨 |
14 | bench | 长凳 | 41 | bear | 熊 | 68 | donut | 甜甜圈 |
15 | bird | 鸟 | 42 | zebra | 斑马 | 69 | cake | 蛋糕 |
16 | cat | 猫 | 43 | giraffe | 长颈鹿 | 70 | chair | 椅子 |
17 | dog | 狗 | 44 | backpack | 背包 | 71 | couch | 沙发 |
18 | horse | 马 | 45 | umbrella | 雨伞 | 72 | potted plant | 盆栽 |
19 | sheep | 羊 | 46 | handbag | 手提包 | 73 | bed | 床 |
20 | cow | 牛 | 47 | tie | 领带 | 74 | dining table | 餐桌 |
21 | elephant | 大象 | 48 | suitcase | 行李箱 | 75 | toilet | 厕所 |
22 | bear | 熊 | 49 | frisbee | 飞盘 | 76 | tv monitor | 电视监视器 |
23 | zebra | 斑马 | 50 | skis | 滑雪板 | 77 | laptop | 笔记本电脑 |
24 | giraffe | 长颈鹿 | 51 | snowboard | 单板滑雪 | 78 | mouse | 鼠标 |
25 | backpack | 背包 | 52 | sports ball | 运动球 | 79 | remote | 遥控器 |
26 | umbrella | 雨伞 | 53 | kite | 风筝 | 80 | keyboard | 键盘 |
27 | tie | 领带 | 54 | baseball bat | 棒球棍 |
对于这样一张图片,怎样才能算检测正确呢?其中,绿色为 GT,红色为预测框。
以上三点都是我们需要考虑的。
- 阈值根据任务进行调整,一般选择 0.5
- FP 就是“假阳性”,就是模型误认为是 TP
举个例子理解 TP、FP、FN:
对于张图片来说,绿色 为 GT,红色 为模型预测框,IoU 阈值设置为 0.5。
P r e c i s i o n = T P T P + F P \mathrm{Precision = \frac{TP}{TP + FP}} Precision=TP+FPTP
解释:模型预测的所有目标(Object)中,预测正确的比例 -> 查准率
模型认为正确的目标 中 确实预测对了多少
那么仅仅通过 Precision 这个指标能不能全面衡量模型的检测能力呢?举个例子进行说明:
同样的,绿色的为 Ground Truth,红色的为 预测框。
上面这张图片有 5 个目标,但是网络只针对猫 ① 给出了预测框(红色的),剩下的猫都没有检测出来。这里的 TP=1,FP=0。所以此时的 Precision 为:
P r e c i s i o n = T P T P + F P = 1 1 + 0 = 1 = 100 % \begin{aligned} \mathrm{Precision} & = \mathrm{\frac{TP}{TP+FP}} \\ & = \frac{1}{1 + 0} \\ & = 1\\ & = 100\% \end{aligned} Precision=TP+FPTP=1+01=1=100%
很明显对于这张图片网络漏检了 4 个目标,但 Precision 又显示结果是非常好的。因此我们就可以知道了,仅仅通过 Precision 无法评判检测网络的性能。为了解决这个问题,我们引入了另外一个指标 —— Recall。
R e c a l l = T P T P + F N \mathrm{Recall = \frac{TP}{TP + FN}} Recall=TP+FNTP
解释:所有真实目标中,模型预测正确的比例 -> 查全率
本应该检测对的,模型检测对了多少
那么我们只使用 Recall 这个指标来判定模型的好坏吗?举个例子说明:
这张图片和上一张图片类似,网络总共预测出了 50 个预测框(即 50 个目标)。这 50 个预测框中包括了所有要检测的目标,那么该网络针对这张图片的 Recall 为:
R e c a l l = T P T P + F N = 1 1 + 0 = 1 = 100 % \begin{aligned} \mathrm{Recall} & = \mathrm{\frac{TP}{TP+FN}} \\ & = \frac{1}{1 + 0} \\ & = 1\\ & = 100\% \end{aligned} Recall=TP+FNTP=1+01=1=100%
很明显,单单使用 Recall 无法评判模型的好坏。所以我们需要同时使用 Precision 和 Recall 这两个指标来进行网络性能的评判,即引入 —— AP。
AP 就是P-R曲线下方的面积,而 P-R 分别为 Precision 和 Recall。
假设模型已经训练完毕,验证集为下面 3 张图片:
首先判断该图片中有几个目标(GT)?很明显绿色的框有两个,所以有两个 GT,即
n u m o b j = 0 + 2 = 2 。 \mathrm{num_{obj}} = 0 + 2 = 2。 numobj=0+2=2。
接下来同一个列表统计网络所检测到的目标信息:
GT id | Confidence | OB (IoU=0.5) |
---|---|---|
1 | 0.98 | True |
1 | 0.61 | False |
Note:
这张图片中目标的个数(绿色的框)有 1 个,所以累积目标个数:
n u m o b j = 2 + 1 = 3 。 \mathrm{num_{obj}} = 2 + 1 = 3。 numobj=2+1=3。
表也需更新:
GT id | Confidence | OB (IoU=0.5) |
---|---|---|
1 | 0.98 | True |
3 | 0.89 | True |
3 | 0.66 | False |
1 | 0.61 | False |
累积目标个数:
n u m o b j = 3 + 4 = 7 。 \mathrm{num_{obj}} = 3 + 4 = 7。 numobj=3+4=7。
更新表:
GT id | Confidence | OB(IoU=0.5) |
---|---|---|
1 | 0.98 | True |
3 | 0.89 | True |
6 | 0.88 | True |
7 | 0.78 | True |
3 | 0.66 | False |
1 | 0.61 | False |
4 | 0.52 | True |
得到表以后,我们计算针对不同 Confidence(即取不同 Confidence 阈值)得到的 Precision 和 Recall 的信息)。
GT id | Confidence | OB (IoU=0.5) |
---|---|---|
1 | 0.98 | True |
3 | 0.89 | True |
6 | 0.88 | True |
7 | 0.78 | True |
3 | 0.66 | False |
1 | 0.61 | False |
4 | 0.52 | True |
首先将 Confidence 的阈值设置为 0.98(Confidence ≥ 0.98 的目标才算匹配正确),只有一个预测框符合条件(表中的第一行)。
在 Confidence≥0.98 的条件下,TP=1 没什么问题;FP=0 是因为阈值的存在;FN=6 是因为累积目标个数 num_ob=7,所以 F N = n u m _ o b − T P = 7 − 1 = 6 \mathrm{FN=num\_ob - TP} = 7 - 1 = 6 FN=num_ob−TP=7−1=6。因此我们可以得到 P r e c i s i o n = T P T P + F P = 1 1 + 0 = 1 \mathrm{Precision = \frac{TP}{TP + FP} = \frac{1}{1+0}=1} Precision=TP+FPTP=1+01=1和 R e c a l l = T P T P + F N = 1 1 + 6 = 0.14 \mathrm{Recall = \frac{TP}{TP + FN} = \frac{1}{1+6}=0.14} Recall=TP+FNTP=1+61=0.14
Note:这个TP; FP; FN是看那个表,就不区分什么第几张图片了,看表就可以。
将 Confidence 阈值设置为 0.89
…
将 Confidence 阈值设置为 0.66
…
全部计算完毕后,结果如下表所示。
Rank | Precision | Recall |
---|---|---|
1 | 1.0 | 0.14 |
2 | 1.0 | 0.28 |
3 | 1.0 | 0.42 |
4 | 1.0 | 0.57 |
5 | 0.80 | 0.57 |
6 | 0.66 | 0.57 |
7 | 0.71 | 0.71 |
我们可以根据求得的一系列的 Precision 和 Recall 绘制 P-R 曲线。以 Recall 为横坐标,Precision 为纵坐标得到 P-R 曲线,如下图所示。
在绘制 P-R 曲线时需注意:对于 Recall(横坐标)需要滤除一些重复数据(图中用框框住的即为参与计算的点,有两个点没有被框,它俩不参与 AP 的计算)。根据表中的数据可知,Recall=0.57 有 3 个值,此时需保留 Precision 最大的值,即:
Rank | Precision | Recall |
---|---|---|
1 | 1.0 | 0.14 |
2 | 1.0 | 0.28 |
3 | 1.0 | 0.42 |
4 | 1.0 | 0.57 |
7 | 0.71 | 0.71 |
图中阴影部分的面积就是 AP,计算如下(重复的 Recall 已经滤除):
Rank | Precision | Recall |
---|---|---|
1 | 1.0 | 0.14 |
2 | 1.0 | 0.28 |
3 | 1.0 | 0.42 |
4 | 1.0 | 0.57 |
6 | 0.71 | 0.71 |
R e c a l l = ∑ i = 1 R a n k ( R e c a l l i − R e c a l l i − 1 ) × max ( P r e c i s i o n i , . . . , R a n k ) R e c a l l = ∑ i = 本行 R a n k ( R e c a l l 本行 − R e c a l l 上一行 ) × 本行及以下最大的 P r e c i s i o n \begin{aligned} \mathrm{Recall} & = \sum_{i=1}^{\mathrm{Rank}} (\mathrm{Recall}_i -\mathrm{Recall}_{i-1}) \times \max(\mathrm{Precision}_{ i, ..., \mathrm{Rank}}) \\ \mathrm{Recall} & = \sum_{i=本行}^{\mathrm{Rank}} (\mathrm{Recall}_{本行} -\mathrm{Recall}_{上一行}) \times 本行及以下最大的\mathrm{Precision} \end{aligned} RecallRecall=i=1∑Rank(Recalli−Recalli−1)×max(Precisioni,...,Rank)=i=本行∑Rank(Recall本行−Recall上一行)×本行及以下最大的Precision
根据公式可以求得阴影的面积,即 AP 为:
R e c a l l = ( 0.14 − 0 ) × 1.0 + ( 0.28 − 0.14 ) × 1.0 + ( 0.42 − 0.28 ) × 1.0 + ( 0.57 − 0.42 ) × 1.0 + ( 0.71 − 0.57 ) × 0.71 = 0.6694 \begin{aligned} \mathrm{Recall} & = (0.14 - 0) \times 1.0 + (0.28 - 0.14) \times 1.0 + (0.42 - 0.28) \times 1.0 + (0.57 - 0.42) \times 1.0 + (0.71 - 0.57) \times 0.71 \\ & = 0.6694 \end{aligned} Recall=(0.14−0)×1.0+(0.28−0.14)×1.0+(0.42−0.28)×1.0+(0.57−0.42)×1.0+(0.71−0.57)×0.71=0.6694
了解完 AP 后我们就可以进一步得到一个新的指标 —— mAP。
mAP 就是各类别 AP 的平均值,计算公式如下:
m A P = 1 n c ∑ i = 1 n c A P i \mathrm{mAP = \frac{1}{nc}\sum^{nc}_{i=1}AP_i} mAP=nc1i=1∑ncAPi
其中 nc 为类别数。
以上的 TP、FP、FN 都是经过 NMS 处理后得到的预测框。
MS COCO 官网说明:https://cocodataset.org/#detection-eval
Note:图片中虽然写的是 AP,但实际上表示的是 mAP。
IoU = range(0.5, 1.00, 0.05)
共 10 个 IoU 的 mAP 的均值,计算公式如下:通过这三个指标可以看出该目标检测网络对于不同尺度目标的检测效果。如果我们的任务需要检测的目标都是较小的,我们应该更加关注与 A P s m a l l \mathrm{AP^{small}} APsmall 参数而不是 A P l a r g e \mathrm{AP^{large}} APlarge。
对于目标检测网络,在代码部分会限制每张图片最终预测框的数量,这里的 max 就是这个数量。如 max=100,即每张图片最终预测 100 个预测框。而这里的 A R m a x = 100 \mathrm{AR^{max}=100} ARmax=100 就表示在每张图片预测框阈值为 100 的情况下,平均的查全率(Recall)是多少。
从上图可以看到, A R m a x = 100 = 64 % \mathrm{AR^{max}=100}=64\% ARmax=100=64%, A R m a x = 10 = 63.3 % \mathrm{AR^{max}=10}=63.3\% ARmax=10=63.3%, A R m a x = 1 = 45.2 % \mathrm{AR^{max}=1}=45.2\% ARmax=1=45.2%。这说明 max 取 100 和取 10 相差不大,进一步说明了,模型训练时使用的数据集每张图片中目标(GT)的数目并不是很多,基本上在 10 左右;而当预测框数量限制在 1 时,它的 AR 仅为 45.2%,说明每张图片的目标个数一般是 >1 的。
与 AP、AP across scales 类似,AR across scales 表示对应不同目标尺度的 AR。
不同的任务需要使用不同的指标。
主要关注下面两个指标:
如果它俩 AR(平均查全率)相差很小的话, 可以减少网络预测框的个数,从而提高目标检测的效率。