文章链接:: /pdf/2103.09136.pdf
code: /ChenhongyiYang/QueryDet-PyTorch
QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection
一、引言二、实现细节三、实验一、引言
虽然基于深度学习的一般目标检测在过去几年中取得了巨大的成功,但小目标检测的性能和效率却远远不能令人满意。促进小物体检测最常见和有效的方法是使用高分辨率图像或特征图。然而,这两种方法都会导致昂贵的计算成本,因为计算成本会随着图像和特征大小的增加而增加。为了达到两者的最佳效果,本文提出了QueryDet,它使用一种新颖的查询机制来加快基于特征金字塔的对象检测器的推理速度。该方法由两个步骤组成:首先预测小物体在低分辨率特征上的粗位置,然后利用这些粗位置稀疏引导的高分辨率特征计算出准确的检测结果。这样,既可以收获高分辨率特征图的好处,又可以避免对背景区域进行无用的计算。在COCO数据集上,该方法将检测mAP提高了1.0,mAPsmall提高了2.0,高分辨率推理速度平均提高到3.0×。
造成小目标检测困难的主要原因有三:
1)卷积神经网络(Convolutional Neural Networks, CNN)主干中的下采样操作导致小目标的特征消失;因此,小物体的特征经常被背景噪声污染;
2)低分辨率特征上的感受野可能与小物体大小不匹配;
3)定位小目标比定位大目标更困难,因为边界框的小扰动可能会导致(IoU)度量的显著扰动。
在本文中,提出了一种简单有效的QueryDet方法,在提高小目标性能的同时,节省了检测头的计算量。动机来自两个关键的观察:
1)低层次特征的计算是高度冗余的。在大多数情况下,小物体的空间分布非常稀疏:它们只占据高分辨率特征图的一小部分;因此浪费了大量的计算。
2)特征金字塔是高度结构化的。在低分辨率的特征图中,虽然不能准确地检测到小物体,但仍然可以高可信度地推断出它们的存在和大致位置。
利用这两种观测的一个自然想法是,只能将检测头应用于小物体的空间位置。该策略需要在所需的特征图上以低成本和稀疏计算来定位小物体的大致位置。在这项工作中,提出了基于一种新型查询机制级联稀疏查询(CSQ)的QueryDet,如下图所示。递归地预测小对象(查询)在低分辨率特征图上的粗略位置,并使用它们来指导高分辨率特征图中的计算。借助稀疏卷积,在保持小目标检测精度的同时,显著降低了低层次特征检测头的计算成本。本文方法旨在节省计算空间,因此它与其他加速方法兼容,如轻量级主干,模型剪枝,模型量化和知识蒸馏。
二、实现细节
在现代基于FPN的探测器设计中,小物体倾向于从高分辨率的低层次特征图中检测。然而,由于小物体通常在空间中稀疏分布,高分辨率特征图上的密集计算范式效率非常低。受到这一观察结果的启发,本文提出了一种从粗到细的方法来降低低层次金字塔的计算成本:首先在粗特征图上预测小物体的粗略位置,然后在细特征图上密集计算相应的位置。
这个过程可以看作是一个查询过程:粗略的位置是查询键,用于检测小物体的高分辨率特征是查询值;因此将此方法称为QueryDet。整个流程如下图所示。
为了预测小目标的粗略位置,添加了一个与分类和回归头并行的查询头。查询头接收步幅为 2 l 2^l 2l的特征图 P l P_l Pl作为输入,输出一个热力图 V l ∈ R H ′ × W ′ V_l∈R^{H' ×W'} Vl∈RH′×W′,热图 V l i , j V^{i,j}_l Vli,j表示网格(i, j)包含小对象的概率。在训练过程中,将每一层上的小物体定义为比预定义阈值 s l s_l sl小的对象。这里,为了简单起见,将 s l s_l sl设置为 P l P_l Pl上的最小锚标,对于无锚框检测器,它设置为 P l P_l Pl上的最小回归范围。对于小目标o,通过计算其中心位置 ( x o , y o ) (x_o, y_o) (xo,yo)与特征图上每个位置之间的距离来编码查询头的目标映射,并设置其位置距离小于 s l s_l sl为1,否则为0。然后使用FocalLoss训练查询头。在推理过程中,选择预测得分大于阈值σ的位置作为查询。然后 q o l q_o^l qol将被映射到 P l − 1 P_{l−1} Pl−1上它最近的四个邻居,作为键值的位置 k l − 1 o {k^o_{l−1}} kl−1o:
收集 P l − 1 P_{l−1} Pl−1上的所有 k l − 1 o {k^o_{l−1}} kl−1o,形成键位集 k l − 1 {k_{l−1}} kl−1。然后,三个头部只会处理这些位置来检测对象并计算下一层的查询。
具体地说,从 P l − 1 P_{l−1} Pl−1中提取特征,使用 k l − 1 {k_{l−1}} kl−1作为指标来构造稀疏张量 p l − 1 v p^v_{l−1} pl−1v,称之为值特征。然后使用4维卷积的权重构建稀疏卷积(spconv)内核,计算层l−1上的结果
为了最大限度地提高推理速度,以级联方式应用查询。 P l − 2 P_{l−2} Pl−2的查询只能从 k l − 1 {k_{l−1}} kl−1生成。将此范例命名为级联稀疏查询(Cascade Sparse Query, CSQ),如下图所示。
CSQ的好处是可以避免从单个 P l P_l Pl生成查询 q l {q_l} ql,这会导致在查询映射期间,随着l的减小,相应键位置 k l k_l kl的大小呈指数级增加。
保持分类头和回归头的训练与原网络相同。对于查询头,使用FocalLoss和生成的二进制目标映射进行训练:设 P l P_l Pl上一个小对象o的ground-truth包围框为 b l o = ( x l o , y l o , w l o , h l o ) b^o_l = (x^o_l, y^o_l, w^o_l, h^o_l) blo=(xlo,ylo,wlo,hlo)。首先计算 P l P_l Pl上每个特征位置(x, y)与所有小真值中心 ( x l o , y l o ) {(x^o_l, y^o_l)} (xlo,ylo)之间的最小距离映射:
则地面真相查询映射 V l ∗ V^*_l Vl∗定义为
对于每一级 P l P_l Pl,损失函数定义如下:
其中 U l 、 R l 、 V l U_l、R_l、V_l Ul、Rl、Vl分别为分类输出、回归函数输出和查询得分输出, U l ∗ 、 R l ∗ 、 V l ∗ U^*_l、R^*_l、V^*_l Ul∗、Rl∗、Vl∗分别为它们对应的真实值映射; L F L L_{FL} LFL为 focal loss, L r L_r Lr为边界框回归损失,即原RetinaNet中的平滑l1损失。总的损失是:
这里用 β l β_l βl重新平衡每一层的损失。原因是,当添加像 P 2 P_2 P2这样的高分辨率特征时,训练样本的分布发生了显著的变化。 P 2 P_2 P2上的训练样本总数甚至大于 P 3 P_3 P3到 P 7 P_7 P7之间的训练样本总数。如果不减轻它的重量,训练就会以小物体为主。因此,需要重新平衡不同层的损失,使模型同时从所有层学习。
三、实验
在上表中,基线运行在13.6 FPS,总体AP 37.46,小物体AP 22.64,略高于原论文的结果。在高分辨率特征的帮助下,本文方法达到了38.53 AP和24.64 APS, AP和APS分别提高了1.1和2.0。
结果揭示了在检测小物体时使用高分辨率特征的重要性。然而,结合这样一个高分辨率的特征图,推理速度显著降低到4.85 FPS。当采用级联稀疏查询(CSQ)时,推理速度增强到14.88 FPS,甚至比不使用更高分辨率P2的基线模型还要快,而性能损失可以忽略不计。
与具有更高分辨率P2的RetinaNet相比,P3和P2占总FLOPs的74%,CSQ成功地将这些成本降低到1%左右。原因是在QueryDetall中,高分辨率P3和P2的计算是在稀疏分布的小物体周围的位置上进行的。这些结果充分证明了本文方法的有效性。上表还显示了3×训练计划的结果。更强的基线会带来更显著的加速。这要归功于更强大的Query Head,因为小对象估计变得更准确。
在VisDrone中,如上表所示,在这个面向对象的小型数据集上,将总体AP提高了2.1,AP50提高了3.2。推理速度从1.16 FPS提高到2.75 FPS。
如上图,当加入高分辨率P2时,AP下降了1.34。这个问题是由于加入P2后训练样本的分布发生了变化。然后重新平衡这些层的损失。结果改进到38.11,主要解决了这个问题。当采用原始基线时,重新平衡策略只带来了轻微的AP增强(0.2),这表明损失重新平衡在高分辨率场景中更为关键。
然后将Query Head加入到网络中,进一步获得0.42 AP和1.58 APS的性能增益,使AP和APS的总值分别达到38.53和24.64,验证了额外客观监督的有效性。最后,使用CSQ,检测速度从4.85 FPS大幅提高到14.88 FPS,检测AP时0.17的损失可以忽略不计。
查询阈值的影响,研究了级联稀疏查询中的准确性-速度权衡。在不同的查询阈值σ下测量检测精度(AP)和检测速度(FPS),其作用是判断输入图像中的网格(低分辨率特征位置)是否包含小物体。直观地说,增加这个阈值会减少小物体的召回率,但会加速推理,因为考虑的位置更少。上图给出了不同输入尺寸下的精度-速度权衡。对一条曲线中相邻的数据标记依次增加0.05,最左边的标记表示不应用CSQ时的性能。观察到,即使一个非常低的阈值(0.05)也能带来巨大的速度改进。这一观察结果验证了本方法的有效性。
另一个观察是关于不同输入分辨率的AP上界和下界之间的差距。对于大尺寸的图像,这个差距很小,但对于小尺寸的图像,这个差距很大,这表明对于高分辨率的输入,即使查询阈值设置得很高,CSQ也可以保证一个好的AP下限。
从哪一层开始查询?
在级联稀疏查询中,需要确定起始层,在该层之上运行常规卷积以获得大对象的检测结果。没有从最低分辨率层开始CSQ的原因有两个方面:
1)对于低分辨率的特征,正常的卷积运算非常快,因此CSQ节省的时间无法弥补构建稀疏特征图所需的时间;
2)在分辨率非常低的特征图上,很难区分小物体。
发现获得最高推理速度的层是P4,这验证了从非常高级的层(如P5和P6)查询会导致速度损失。随着起始层变高,AP损失逐渐增加,这表明网络在非常低分辨率的层中发现小物体的难度。
使用查询的最佳方式是什么?
本文展示了级联稀疏查询的高效率。两个可供比较的查询操作。第一次裁剪查询(CQ),其中从高分辨率特征中裁剪查询所指示的相应区域,以便后续计算。注意,这种类型的查询类似于AutoFocus方法。另一个是完全卷积查询(CCQ),使用正则卷积来计算每一层的完整特征映射,但只从查询位置提取结果进行后处理。对于CQ,从特征图中裁剪一个11 × 11的patch,选择它来拟合检测头中5个3 × 3连续卷积的感受野。我们将结果显示在下表中。一般来说,这三种方法都可以在AP损失可以忽略不计的情况下成功地加速推理。其中,CSQ可以达到最快的推理速度。
我们需要多少上下文?
要应用CSQ,需要构造一个稀疏特征图,其中只有小对象的位置被激活。还需要激活小对象周围的上下文区域,以避免降低精度。然而,在实践中,发现过多的上下文并不能提高检测AP,只会降低检测速度;另一方面,太少的上下文会严重降低AP的检测。在本节中,将探讨需要多少上下文来平衡速度和精度之间的平衡。在这里,上下文定义为查询位置周围大小不同的补丁,稀疏检测头也会处理补丁内的特征。结果如下表所示。5x5补丁可以提供足够的上下文来检测小对象。
尽管更多的上下文带来了一个小的AP改进,但CSQ的加速效果会受到负面影响,而更少的上下文不能保证高检测AP