前言
一般来说,multi-stage目标检测器的AP较好,而检测效率较低,而single-stage目标检测器虽然检测效率较高,但AP不如multi-stage检测器。本文就是希望在保持检测效率的同时,提高single-stage检测器的AP,尤其是定位精度。论文证明了single-stage检测器中分类分数和定位精度之间的低相关性,导致了模型的性能尤其是定位精度较低。而过低的相关性主要是因为分类子网和定位子网是相互独立的,它们并不了解对方的信息。在提取anchor之后,分类子网会在不了解IoU(anchor与gt box)的情况下为每个anchor预测分类分数,造成分类与定位间的mismatch问题,比如说,一些检测结果的分类分数很高但IoU较低,而另一些检测结果则相反。在推理时,缺失IoU会带来两个严重的问题:
- 在NMS中,所有的检测结果基于分类分数进行排序,如果有一些检测结果的分类分数很高但IoU较低,它肯定排在前面,从而导致那些高IoU但分类分数较低的检测结果被过滤;
- 在计算AP时,所有的检测结果依然按照分类分数进行排序,如果高分类分数低IoU的检测结果排在低分类分数高IoU的检测结果前面,那么高IoU阈值的AP会降低。
为了解决这个问题,本文提出了基于RetinaNet的IoU-aware single-stage目标检测器,在回归分支中平行于regression head添加了一个预测IoU的head,来为每个选中的anchor预测IoU。
- 在训练时,IoU head与另外两个分支一起训练;
- 在inference时,通过将分类分数与预测的IoU相乘,得到最终的检测分数,并用于最后的NMS和AP计算。
由于最终的检测分数与IoU之间更具有相关性,因此前面提出的问题得以被解决,同时模型的定位精度也得到了提升。
本文的贡献如下:
- 提出IoU-aware single-stage目标检测器来解决single-stage检测器中分类分数与定位精度之间的mismatch问题,在不牺牲检测效率的情况下,模型的定位精度得以提升;
- 分析了IoU-aware single-stage检测器为什么有用,性能的上限,以及预测的IoU和gt IoU之间的差别。
模型设计
IoU-aware single-stage检测器对RetinaNet进行修改,backbone和FPN都是一样的,只是在回归分支中添加了一个IoU prediction head,这个head和regression head的结构是平行的,分类分支依然保持不变,如上图所示。
为了保持模型的效率,IoU prediction head仅包含一个 3 × 3 3 \times 3 3×3的卷积层,后跟一个sigmoid激活层,用于将预测的IoU控制在[0,1]之间。本文也考虑过其它方法来设计这个IoU head,比如设计一个平行于分类分支和回归分支的IoU预测分支,但这样做会降低模型的效率。本文的设计方法带来的计算开销基本可忽略不计,并能提升模型的性能。
Training & Inference
training
与RetinaNet相同,采用focal loss作为分类损失,L1 loss作为回归损失,如下式(1)(2)所示。而对于IoU prediction损失,采用的是二值交叉熵损失,并且只计算正样本的损失,如下式(3)所示。其中 I o U i IoU_i IoUi表示为每个detected box预测的IoU, I o U i ^ \hat{IoU_i}