ThunderNet 论文笔记
前言
关于实时目标检测,作者提出two-stage和one-stage中存在的问题:
- two-stage检测器倾向于使用特别复杂的detection head来达到更好的精度,这对于移动设备来说是可望不可及的。Light-Head R-CNN虽然采用了轻量级的detection head以实现实时检测,但它在head上的计算依然比在backbone上的计算要高出不少,这会造成巨大的计算冗余,并且会使网络过拟合。
- one-stage的检测器在detection上虽然计算很少,但它由于没有实现RoI-wise的特征提取,导致提取的特征比较粗糙,因此检测精度不是很高。而这个问题在轻量级的检测器上更为严重:先前的轻量级one-stage检测器没有实现速度和精度之间的trade-off,它们的检测精度与two-stage相比相差太多,也不能在移动设备上实现实时检测。
由此作者提出,two-stage能否比one-stage更能胜任实时检测这一工作呢?
答案是肯定的。本文提出的ThunderNet就是一个轻量级的two-stage通用目标检测器。它的backbone是SNet,是基于ShuffleNetV2设计的。在detection部分中,参照了Light-Head R-CNN中的detection head的设计,并且对RPN和R-CNN子网进行压缩;同时为了消除压缩带来的small backbone和small feature maps导致的性能上的损失,设计了CEM(Context Enhancement Module)和SAM(Spatial Attention Module),CEM结合了不同尺度的特征图以利用语义和上下文信息,SAM引入RPN中的信息来优化特征的分布。ThunderNet的整体结构如下图所示:
backbone part
1. 输入图像的像素
two-stage检测器的输入像素通常都很大,虽然有优点,比如检测精度高,但也会造成庞大的计算量。为了提高inference时的速度,ThunderNet将输入像素统一为320×320。同时作者发现,输入像素的大小必须与backbone的能力相匹配。下表说明了小的图像输入到大的backbone里,或者大的图像输入到小的backbone里,都不能达到最优的检测结果。输入像素和backbone之间是有一个trade-off的:
- 输入像素过低会导致特征图的像素也很低,会引入特征上的一些误差;
- backbone过小是不能处理较大的输入图像的信息的。
为了使网络的表示能力和特征图的像素之间达到平衡,必须使backbone与输入像素相匹配。
2. backbone
backbone用于提取图像中的特征,提供了输入图像最基础的特征表示。基于CNN的检测器通常使用在ImageNet上经过预训练的分类网络作为backbone,但分类与检测从backbone中需要的属性是不同的,因此简单的在分类网络上训练检测网络并不能达到最优的效果。对于检测任务来说,backbone对检测结果的影响因素主要有以下几个方面:
- 感受野。CNN只能获取在感受野之内的信息,因此一个较大的感受野可以利用更多的上下文信息,这对于定位任务是非常重要的,尤其是较大目标的定位。
- early-stage和late-stage的特征。在backbone中,early-stage的特征图更大,包含更多空间信息,对定位更重要;late-stage的特征图更小,但辨识性更好,包含更多语义信息,对分类更重要。在较大的backbone中,定位比分类更难,这说明early-stage的特征更重要;在特别小的backbone中,由于网络低下的表示能力,同时对分类和定位的精度造成影响,这说明early-stage和late-stage的特征同等重要。
先前的轻量级backbone有以下几个缺点:
- ShuffleNetV1/V2的感受野都不是很大(121像素/320像素);
- ShuffleNetV2缺少early-stage的特征;
- Xception在计算预算很低的情况下缺少深层特征。
基于以上这些内容,作者对ShuffleNetV2进行修改,建立了一个新的轻量级backbone,称为SNet。本文提出3种不同的SNet backbone: SNet49用于更快的inference,SNet535的检测精度更高,SNet146可以达到速度与精度之间更好的trade-off。
在修改时,首先用3×3的depthwise卷积层替换ShuffleNetV2所有的5×5的depthwise卷积层,将感受野从121像素扩大到193像素。然后根据3种不同的SNet backbone,修改的方法各有不同:
- SNet146和SNet535,移除它们的conv5,在网络早期阶段中增加更多通道。这可以在不增加额外计算的情况下生成更多浅层特征图;
- SNet49,将conv5的通道数从1024压缩到512,并且在网络早期阶段中增加更多通道,以达到浅层特征图和深层特征图之间的平衡。如果移除conv5,backbone无法获取充足的信息,会导致信息的损失;如果仍保留1024维的conv5,backbone会受到有限的浅层特征的影响。
下表展示了backbone的整体结构:
detection part
1. 压缩RPN和detection head
two-stage检测器的RPN规模很大,并且detection head也很复杂,因此作者在Light-Head R-CNN的基础上对RPN进行压缩,具体来说就是,用5×5 depthwise + 256通道 1×1卷积代替原来的256通道 3×3卷积,用5种尺度{}和5种长宽比{}来生成anchor,其它超参数的设置和Light-Head R-CNN中的相同。
原本的Light-Head R-CNN在detection head中会生成通道数为的特征图,其中是池化大小,,然后再对特征图进行RoI warping操作。但是由于ThunderNet中的backbone和输入图像都更小一点,因此用PSRoI align进行RoI warping,将输出特征图的通道数减小到5。在经过PSRoI align之后的RoI feature只有245维,因此在R-CNN子网中添加一个1024维的全连接层。
2. CEM
为了融合多尺度特征,本文提出了CEM,其实就和FPN差不多,但作者认为FPN中有许多额外的卷积和detection分支,会增大计算量,因此CEM和FPN还是有些不同的,CEM的设计使得计算量更少一些。下图是CEM的结构:
CEM融合了,和这三个尺度的特征图,其中和分别是Stage3和Stage4输出的特征图,是全局上下文的特征向量,是通过在上应用全局平均池化得到的。
- 尺度一:在上应用1×1的卷积将通道数减小为;
- 尺度二:在上应用1×1的卷积将通道数减小为245,然后进行2倍的上采样;
- 尺度三:在上应用1×1的卷积将通道数减小为245,然后进行Broadcast
这样三个特征图的空间维度就相等了,然后把它们融合起来。通过利用局部和全局信息,CEM有效扩大了感受野,并优化了特征图的表示能力。同时由于CEM只采用1×1的卷积和全连接层,因此与FPN相比计算量更少。
3. SAM
在RoI warping中,最好的情况是背景区域的特征很弱,而前景区域的特征很强。但ThunderNet使用了轻量级的backbone,输入的图像也很小,因此对它来说学习特征的分布是很难的。因此本文提出SAM,在RoI warping之前re-weight特征图。SAM的结构如下图:
SAM的中心思想来自于RPN,RPN在gt的监督下被训练为可以识别前景区域,因此RPN中的中间特征可以用来区分前景区域和背景区域。SAM接受来自RPN和CEM的输入,其输出为:
其中是一个维度转换,使两个特征图的通道数能够匹配。sigmoid函数用来将值约束在[0,1]内。最终通过生成的特征图,来re-weight CEM,从而得到更好的特征分布。为了计算的效率,只将1×1的卷积应用于,从而CEM的计算可忽略不计。
SAM有两个作用:
- 通过加强的前景特征和弱化的背景特征,来优化特征分布;
- 稳固RPN的训练。因为SAM允许从RPN到R-CNN子网的额外的梯度流,如下式所示。也就是说,RPN接受了R-CNN子网额外的监督,从而帮助RPN的训练。