物体检测难点之多尺度问题

在物体检测的各种实际应用场景中,为满足需求,我们通常希望 检测出不同大小的物体。在多尺度的物体中,大尺度的物体由于面积大、特征丰富,通常 来讲较为容易检测。难度较大的主要是小尺度的物体。

小物体通常有如下两种定义方式:
① 绝对尺度:一般尺寸小于32×32的物体可以视为小物体。
② 相对尺度:物体宽高是原图宽高的1/10以下,可以视为小物体。

小物体由于其尺寸较小,可利用的特征有限,这使得其检测较为困难。当前的检测算法对于小物体并不友好,体现在以下4个方面:

① 过大的下采样率:假设当前小物体尺寸为15×15,一般的物体检测中卷积下采样率为16,这样在特征图上,小物体连一个点都占据不 到。

② 过大的感受野:在卷积网络中,特征图上特征点的感受野比下采样率大很多,导致在特征图上的一个点中,小物体占据的特征更少,会包含大量周围区域的特征,从而影响其检测结果。

③ 语义与空间的矛盾:当前检测算法,如Faster RCNN,其 Backbone大都是自上到下的方式,深层与浅层特征图在语义性与空间性上没有做到更好的均衡。

④ SSD缺乏特征融合:SSD虽然使用了多层特征图,但浅层的特征图语义信息不足,没有进行特征的融合,致使小物体检测的结果较差。

多尺度的检测能力实际上体现了尺度的不变性,当前的卷积网络能够检测多种尺度的物体,很大程度上是由于其本身具有超强的拟合能力。

目前有效解决多尺度问题的方法主要包括如下几种:


降低下采样率与空洞卷积可以显著提升小物体的 检测性能;设计更好的Anchor可以有效提升Proposal的质量;多尺度的训练可以近似构建出图像金字塔,增加样本的多样性;特征融合可以构建出特征金字塔,将浅层与深层特征的优势互补。这4条是较为通用的提升多尺度检测的经典方法。除此之外SNIP与TridentNet对多尺度问题的提升也很明显。

1. 降低下采样率与空洞卷积

对于小物体检测而言,降低网络的下采样率也许是最为简单的提升方式,通常的做法是直接去除掉Pooling层。

例如,将原始的 VGGNet-16作为物体检测的Backbone时,通常是将第5个Pooling层之 前的特征图作为输出的特征图,一共拥有4个Pooling层,这时下采样 率为16。为了降低下采样率,我们可以将第4个Pooling层去掉,使得下采样率变为8,减少了小物体在特征图上的信息损失。但是,如果仅仅去除掉Pooling层,则会减小后续层的感受野。如果使用预训练模型进行微调(Fine-tune),则仅去除掉Pooling层会使得后续层感受野与预训练模型对应层的感受野不同,从而导致不能很好地收敛。

因此,我们需要在去除Pooling的前提下增加后续层的感受野,空洞卷积就派上用场了。空洞卷积可以在保证不改变网络分辨率的前提下增加网络的感受野。具体做法如图所示,去掉第4个Pooling层后,将后续的一个3×3卷积变为空洞数为2的卷积,可以达到简单有效的降低下采样的目的。采用空洞卷积也不能保证修改后与修改前的感受野完全相同,但能够最大限度地使感受野在可接受的误差内。


2. Anchor设计

Anchor通常是多个不同大小与宽高的边框,这个大小与宽高是一 组超参数,需要我们手动配置。在不同的数据集与任务中,由于物体的尺度、大小会有差距,例如行人检测的数据集中,行人标签宽高比通常为0.41,与通用物体的标签会有所区别,这时就需要相应地调整 Anchor的大小与宽高。如Anchor设计的不合理,与数据集中的物体分布存在差距,则会给模型收敛带来较大的困难,影响模型的精度, 甚至不会收敛。另外,Anchor的设计对于小物体的检测也尤为重要,如果Anchor过大,即使小物体全部在Anchor内,也会因为其自身面积小导致IoU低,从而造成漏检。

通常来讲,可以从以下两个角度考虑如何设计一组好的Anchor。

① 统计实验

首先回顾一下Faster RCNN是如何处理Anchor的:在RPN阶段,所有Anchor会与真实标签进行匹配,根据匹配的IoU值得到正样本与负样本,正样本的IoU阈值为0.7。在这个过程中,Anchor与真实标签越接近,正样本的IoU会更高,RPN阶段对于真实标签的召回率会越高,正样本也会更丰富,模型效果会更好。因此,我们可以抛开物体检测的算法,仅仅利用训练集的标签与设计的Anchor进行匹配试验,试验的指标是所有训练标签的召回率,以及正样本的平均IoU值。当然,也可以增加每个标签的正样本数、标签的最大IoU等作为辅助指标。为了方便地匹配,在此不考虑Anchor与标签的位置偏移,而是把两者的中心点放在一起,仅仅利用其宽高信息进行匹配。这种统计实验实际是通过手工设计的方式,寻找与标签宽高分布最为一致的一组 Anchor。

② 边框聚类

相比起手工寻找标签的宽高分布,我们也可以利用聚类的思想, 在训练集的标签上直接聚类出一组合适的Anchor。由于一组Anchor会出现在特征图的每一个位置上,因此没有位置区别,可以只关注标签里的物体宽高,而没必要关心物体出现的位置。边框聚类时通常使用K-Means算法,这也是YOLO采用的Anchor聚类方法。作为最简单的聚类算法之一,K-Means算法的计算过程如图所示,输入超参数K,即最终想要获得的边框数量,首先随机选取K个中心点,然后遍历所有的数据,并将所有的边框划分到最近的中心点中。


在每个边框都落到不同的聚类后,计算每一个聚类的平均值,并将此平均值作为新的中心点。重复上述过程,直到算法收敛。在聚类过程中,Anchor的数量K是一个较为重要的超参,数量越多,精度越高,但与此同时会带来计算量的增加。对于使用Anchor的物体检测算法而言,设计一组好的Anchor是基础,这对于多尺度、拥挤等问题都有较大的帮助。

3. 多尺度训练

当前的多尺度训练(Multi Scale Training,MST)通常是指设置几种不同的图片输入尺度,训练时从多个尺度中随机选取一种尺度,将输入图片缩放到该尺度并送入网络中,是一种简单又有效的提升多尺度物体检测的方法。虽然一次迭代时都是单一尺度的,但每次都各不相同,增加了网络的鲁棒性,又不至于增加过多的计算量。而在测试时,为了得到更为精准的检测结果,也可以将测试图片的尺度放大,例如放大4倍,这样可以避免过多的小物体。

4. 特征融合

传统的卷积网络通常是自上而下的模式,随着网络层数的增加,感受野会增大,语义信息也更为丰富。这种自上而下的结构本身对于多尺度的物体检测就存在弊端,尤其是小物体,其特征可能会随着深度的增加而渐渐丢失,从而导致检测性能的降低。既然深浅层的特征各有优势,一个自然的想法就是将深层的语义信息添加到浅层的特征图中,融合两者的特征,优势互补,从而提升对于小物体的检测性能。其中特征融合的方法有如下:

① FPN:将深层信息上采样,与浅层信息逐元素地相加,从而构 建了尺寸不同的特征金字塔结构,性能优越,现已成为物体检测算法 的一个标准组件。

② DetNet:专为物体检测而生的Backbone,利用空洞卷积与残差结构,使得多个融合后的特征图尺寸相同,从而也避免了上采样操作。

③ Faster RCNN系列中,HyperNet将第1、3、5个卷积组后得到的 特征图进行融合,浅层的特征进行池化、深层的特征进行反卷积,最终采用通道拼接的方式进行融合,优势互补。

④ SSD系列中,DSSD在SSD的基础上,对深层特征图进行反卷积,与浅层的特征相乘,得到了更优的多层特征图,这对于小物体的检测十分有利。

⑤ RefineDet将SSD的多层特征图结构作…为了Faster RCNN的RPN网络,结合了两者的优点。特征图处理上与FPN类似,利用反卷积与逐元素相加,将深层特征图与浅层的特征图进行结合,实现了一个十分精巧的检测网络。

⑥ YOLO系列中,YOLO v3也使用了特征融合的思想,通过上采样与通道拼接的方式,最终输出了3种尺寸的特征图。

5. 尺度归一化:SNIP

2018年CVPR的SNIP(Scale Normalization for Image Pyramid)相比起其他改进方法,SNIP更为深入地指出了当前多尺度检测问题的原因,使用简单的方法就得到了 较高的检测精度提升。

当前的物体检测算法通常使用微调的方法,即先在ImageNet数据集上训练分类任务,然后再迁移到物体检测的数据集上,如COCO来训练检测任务。我们可以将ImageNet的分类任务看做224×224的尺度,而COCO中的物体尺度大部分在几十像素的范围内,并且包含大量小物体,物体尺度差距更大,因此两者的样本差距太大,会导致映射迁移(Domain Shift)的误差。

为了克服多尺度检测的问题,有以下两种经典的方法:

① 图像金字塔:将输入图像做成多尺度,或者随机取一个尺度。

② 特征金字塔:对深层特征上采样,融合多层的特征,将语义性与空间性进行优势互补。

但SNIP对这两种方法提出了质疑,即能否避开上采样的方法, 在训练时使用所有尺度的样本进行训练呢?基于此,SNIP的作者做 了一个非常关键的实验,分析了多种方法在COCO数据集上小物体上的表现。通过该实验结果,我们可以得出即使充分增强了数据的多样性,由于卷积 网络本身不具备尺度不变性,依靠模型去学习多尺度的物体仍然存在很大难度。当前卷积网络对于多个尺度都还能检测出的原因在于卷积网络强大的拟合能力,搜索空间足够大来学习不同的尺度,这也浪费了网络的拟合能力。基于此实验结论,SNIP让模型更专注于物体本身的检测,剥离 了多尺度的学习难题。在网络搭建时,SNIP也使用了类似于MST的 多尺度训练方法,构建了3个尺度的图像金字塔,但在训练时,只对 指定范围内的Proposal进行反向传播,而忽略掉过大或者过小的 Proposal。

具体的实现细节如下:

  • 3个尺度分别拥有各自的RPN模块,并且各自预测指定范围内的物体。
  • 对于大尺度的特征图,其RPN只负责预测被放大的小物体,对于小尺度的特征图,其RPN只负责预测被缩小的大物体,这样真实的物体尺度分布在较小的区间内,避免了极大或者极小的物体。
  • 在RPN阶段,如果真实物体不在该RPN预测范围内,会被判定为无效,并且与该无效物体的IoU大于0.3的Anchor也被判定为无效的 Anchor。
  • 在训练时,只对有效的Proposal进行反向传播。在测试阶段,对有效的预测Boxes先缩放到原图尺度,利用Soft NMS将不同分辨率的预测结果合并。
  • 实现时SNIP采用了可变形卷积的卷积方式,并且为了降低对于 GPU的占用,将原图随机裁剪为1000×1000大小的图像。

6. TridentNet

传统的解决多尺度检测的算法,大都依赖于图像金字塔与特征金字塔,这在前面也有详细的阐述。与上述算法不同,图森组对感受野这一因素进行了深入的分析,并利用了空洞卷积这一利器,构建了简单的三分支网络TridentNet,对于多尺度物体的检测有了明显的精度提升。

采用ResNet作为基础 Backbone,前三个stage沿用原始的结构,在第四个stage,使用了三 个感受野不同的并行网络。


对于该结构,有以下3个细节:

  • 3个不同的分支使用了空洞数不同的空洞卷积,感受野由小到大,可以更好地覆盖多尺度的物体分布。
  • 由于3个分支要检测的内容是相同的、要学习的特征也是相同的,只不过是形成了不同的感受野来检测不同尺度的物体,因此,3 个分支共享权重,这样既充分利用了样本信息,学习到更本质的物体检测信息,也减少了参数量与过拟合的风险。
  • 借鉴了SNIP的思想,在每一个分支内只训练一定范围内的样 本,避免了过大与过小的样本对于网络参数的影响。在训练时,TridentNet网络的三个分支会接入三个不同的head网络进行后续损失计算。在测试时,由于没有先验的标签来选择不同的 分支,因此只保留了一个分支进行前向计算,这种前向方法只有少量的精度损失。TridentNet网络的作者对该网络的性能做了详尽的分析,对于当前的基础Backbone等方法均有明显的精度提升。简而言之,TridentNet思路清晰、方法简单有效,对于多尺度物体的检测提供了很好的研究视角。

版权声明:本文为博主(蜡笔小新灬)原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_42013574/article/details/105876675

最新文章