《小目标目标检测的解决方法及方式》

《小目标目标检测的解决方法及方式》

最近在做小目标相关的项目,参考了一些博客、论文及书籍,在这里对小目标的方法和方式做了些总结。如果有哪些问题理解错误或补充欢迎讨论。

1.什么是小目标检测

在物体检测的各种实际应用场景中,为满足需求,我们通常希望检测出不同大小的物体。多尺度也是物体检测与图像分类两个任务的一大区别。分类问题通常针对同一种尺度,如ImageNet中的224*224大小;而物体检测中,模型需要对不同尺度的物体都能检测出来,这要求模型对于尺度要具有鲁棒性。在多尺度的物体中,大尺度的物体由于面积大、特征丰富,通常来讲较为容易检测。难度较大的主要是小尺度的物体,而这部分小物体在实际工程中却占据了较大的比例。小物体通常有如下两种定义方式:
1.绝对尺度:一般尺寸小于32×32的物体可以视为小物体。
2.相对尺度:物体宽高是原图宽高的1/10以下,可以视为小物体。

2.小目标难以检测的原因

分辨率低,图像模糊,携带的信息少。由此所导致特征表达能力弱,也就是在提取特征的过程中,能提取到的特征非常少,这不利于我们对小目标的检测。小物体由于其尺寸较小,可利用的特征有限,这使得其检测较为困难。当前的检测算法对于小物体并不友好。体现在以下几个方面:

1.过大的下采样率

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

2.过大的感受野

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

3.语义与空间的矛盾

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

4.SSD缺乏特征融合

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

3.小目标检测解决方案

多尺度的检测能力实际上体现了尺度的不变性,当前的卷积网络能够检测多种尺度的物体,很大程度上是由于其本身具有超强的拟合能力。总体来讲,目前有效解决多尺度问题的方法在此总结了如下几种:

1.Data Augmentation

深度学习的效果在某种意义上是靠大量数据喂出来的,小目标检测的性能同样也可以通过增加训练集中小目标样本的种类和数量来提升。在《Augmentation for small object detection》中提出两种简单粗暴的解决方法。
方法一:针对COCO数据集中包含小目标的图片数量少的问题,使用过采样OverSampling策略。
方法二:针对同一张图片里面包含小目标数量少的问题,在图片内用分割的Mask抠出小目标图片再使用复制粘贴的方法(当然,也加上了一些旋转和缩放,另外要注意不要遮挡到别的目标)。
在这里插入图片描述

2.传统的图像金字塔和多尺度滑动窗口检测

最开始在深度学习方法流行之前,对于不同尺度的目标,大家普遍使用将原图build出不同分辨率的图像金字塔,再对每层金字塔用固定输入分辨率的分类器在该层滑动来检测目标,以求在金字塔底部检测出小目标;或者只用一个原图,在原图上,用不同分辨率的分类器来检测目标,以求在比较小的窗口分类器中检测到小目标。著名的人脸检测器[MTCNN](Joint Face Detect ion and Alignment using Multi-task Cascaded Convolutional Networks)中,就使用了图像金字塔的方法来检测不同分辨率的人脸目标。
在这里插入图片描述

这种方式虽然一定程度上可以提升检测精度,但由于多个尺度完全并行,耗时巨大。当前的多尺度训练(Multi Scale Training,MST)通常是指设置几种不同的图片输入尺度,训练时从多个尺度中随机选取一种尺度,将输入图片缩放到该尺度并送入网络中,是一种简单又有效的提升多尺度物体检测的方法。虽然一次迭代时都是单一尺度的,但每次都各不相同,增加了网络的鲁棒性,又不至于增加过多的计算量。而在测试时,为了得到更为精准的检测结果,也可以将测试图片的尺度放大,例如放大4倍,这样可以避免过多的小物体。多尺度训练是一种十分有效的trick方法,放大了小物体的尺度,同时增加了多尺度物体的多样性,在多个检测算法中都可以直接嵌入,在不要求速度的场合或者各大物体检测竞赛中尤为常见。

3.特征融合

不同阶段的特征图对应的感受野不同,它们表达的信息抽象程度也不一样。浅层的特征图感受野小,比较适合检测小目标(要检测大目标,则其只“看”到了大目标的一部分,有效信息不够);深层的特征图感受野大,适合检测大目标(要检测小目标,则其”看“到了太多的背景噪音,冗余噪音太多)。传统的卷积网络通常是自上而下的模式,随着网络层数的增加,感受野会增大,语义信息也更为丰富。这种自上而下的结构本身对于多尺度的物体检测就存在弊端,尤其是小物体,其特征可能会随着深度的增加而渐渐丢失,从而导致检测性能的降低。既然深浅层的特征各有优势,一个自然的想法就是将深层的语义信息添加到浅层的特征图中,融合两者的特征,优势互补,从而提升对于小物体的检测性能。在近些年的物体检测研究中,诞生了众多从特征融合角度提升多尺度检测的方法,目前的检测模型中基本都包括了该技巧。
在这里插入图片描述

1.FPN:将深层信息上采样,与浅层信息逐元素地相加,从而构建了尺寸不同的特征金字塔结构,性能优越,现已成为物体检测算法的一个标准组件。
2.DetNet:专为物体检测而生的Backbone,利用空洞卷积与残差结构,使得多个融合后的特征图尺寸相同,从而也避免了上采样操作。
3.Faster RCNN系列中,HyperNet将第1、3、5个卷积组后得到的特征图进行融合,浅层的特征进行池化、深层的特征进行反卷积,最终采用通道拼接的方式进行融合,优势互补。
4.SSD系列中,DSSD在SSD的基础上,对深层特征图进行反卷积,与浅层的特征相乘,得到了更优的多层特征图,这对于小物体的检测十分有利。
5.RefineDet将SSD的多层特征图结构作为了Faster RCNN的RPN网络,结合了两者的优点。特征图处理上与FPN类似,利用反卷积与逐元素相加,将深层特征图与浅层的特征图进行结合,实现了一个十分精巧的检测网络。
6.YOLO系列中,YOLO v3也使用了特征融合的思想,通过上采样与通道拼接的方式,最终输出了3种尺寸的特征图。
可以看出,特征融合有多种方式,增大特征图尺寸可以使用上采样、反卷积等,融合方法有逐元素相加、相乘和通道拼接等,具体哪种效果更好,还要看实际的检测任务及使用的检测算法。特征融合的普遍缺点是通常会带来一定计算量的增加。
另外一个思路:既然可以在不同分辨率特征图做融合来提升特征的丰富度和信息含量来检测不同大小的目标,那么自然也有人会进一步地猜想,如果只用高分辨率的特征图(浅层特征)去检测小脸;用中间分辨率的特征图(中层特征)去检测大脸;最后用地分辨率的特征图(深层特征)去检测小脸。比如人脸检测中的SSH。

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

对于小物体检测而言,降低网络的下采样率也许是最为简单的提升方式,通常的做法是直接去除掉Pooling层。例如,将原始的VGGNet-16作为物体检测的Backbone时,通常是将第5个Pooling层之前的特征图作为输出的特征图,一共拥有4个Pooling层,这时下采样率为16。为了降低下采样率,我们可以将第4个Pooling层去掉,使得下采样率变为8,减少了小物体在特征图上的信息损失。但是,如果仅仅去除掉Pooling层,则会减小后续层的感受野。如果使用预训练模型进行微调(Fine-tune),则仅去除掉Pooling层会使得后续层感受野与预训练模型对应层的感受野不同,从而导致不能很好地收敛。因此,我们需要在去除Pooling的前提下增加后续层的感受野,可以利用空洞卷积。空洞卷积可以在保证不改变网络分辨率的前提下增加网络的感受野。需要注意的是,采用空洞卷积也不能保证修改后与修改前的感受野完全相同,但能够最大限度地使感受野在可接受的误差内。
在这里插入图片描述

5.Anchor设计

现今较为成熟的检测算法大都采用Anchor作为先验框,如Faster RCNN和SSD等,因为Anchor可以提供很好的先验信息。模型在Anchor的基础上只需要去预测其与真实物体边框的偏移即可,可以说是物体检测算法发展中的一个相当经典的设计。Anchor通常是多个不同大小与宽高的边框,这个大小与宽高是一组超参数,需要我们手动配置。在不同的数据集与任务中,由于物体的尺度、大小会有差距。Anchor的设计对于小物体的检测也尤为重要,如果Anchor过大,即使小物体全部在Anchor内,也会因为其自身面积小导致IoU低,从而造成漏检。通常来讲,可以从以下几个角度考虑如何设计一组好的Anchor。
1.统计实验
首先回顾一下Faster RCNN是如何处理Anchor的:在RPN阶段,所有Anchor会与真实标签进行匹配,根据匹配的IoU值得到正样本与负样本,正样本的IoU阈值为0.7。在这个过程中,Anchor与真实标签越接近,正样本的IoU会更高,RPN阶段对于真实标签的召回率会越高,正样本也会更丰富,模型效果会更好。因此,我们可以抛开物体检测的算法,仅仅利用训练集的标签与设计的Anchor进行匹配试验,试验的指标是所有训练标签的召回率,以及正样本的平均IoU值。当然,也可以增加每个标签的正样本数、标签的最大IoU等作为辅助指标。为了方便地匹配,在此不考虑Anchor与标签的位置偏移,而是把两者的中心点放在一起,仅仅利用其宽高信息进行匹配。这种统计实验实际是通过手工设计的方式,寻找与标签宽高分布最为一致的一组Anchor。
2.边框聚类
相比起手工寻找标签的宽高分布,我们也可以利用聚类的思想,在训练集的标签上直接聚类出一组合适的Anchor。由于一组Anchor会出现在特征图的每一个位置上,因此没有位置区别,可以只关注标签里的物体宽高,而没必要关心物体出现的位置。边框聚类时通常使用K-Means算法,这也是YOLO采用的Anchor聚类方法。
3.其他方法
更稠密的Anchor采样和匹配策略S3FD,FaceBoxes等。我们也可以增加负责小目标的Anchor的设置策略来让训练时对小目标的学习更加充分。例如人脸检测中的[FaceBoxes],其中一个Contribution就是Anchor densification strategy,Inception3的anchors有三个scales(32,64,128),而32 scales是稀疏的,所以需要密集化4倍,而64 scales则需要密集化2倍。在[S3FD]人脸检测方法中,则用了Equal-proportion interval principle来保证不同大小的Anchor在图中的密度大致相等,这样大脸和小脸匹配到的Anchor的数量也大致相等了。另外,对小目标的Anchor使用比较宽松的匹配策略(比如IoU > 0.4)也是一个比较常用的手段。
在这里插入图片描述

6.合适的训练方法

机器学习里面有个重要的观点,模型预训练的分布要尽可能地接近测试输入的分布。所以,在大分辨率(比如常见的224 x 224)下训练出来的模型,不适合检测本身是小分辨率再经放大送入模型的图片。如果是小分辨率的图片做输入,应该在小分辨率的图片上训练模型;再不行,应该用大分辨率的图片训练的模型上用小分辨率的图片来微调fine-tune;最差的就是直接用大分辨率的图片来预测小分辨率的图(通过上采样放大)。但是这是在理想的情况下的(训练样本数量、丰富程度都一样的前提下,但实际上,很多数据集都是小样本严重缺乏的),所以放大输入图像+使用高分率图像预训练再在小图上微调,在实践中要优于专门针对小目标训练一个分类器。
在这里插入图片描述

SNIP:当前的物体检测算法通常使用微调的方法,即先在ImageNet数据集上训练分类任务,然后再迁移到物体检测的数据集上,如COCO来训练检测任务。我们可以将ImageNet的分类任务看做224×224的尺度,而COCO中的物体尺度大部分在几十像素的范围内,并且包含大量小物体,物体尺度差距更大,因此两者的样本差距太大,会导致映射迁移(Domain Shift)的误差。为了克服多尺度检测的问题,有以下两种经典的方法,在上面的方法中也提到了。
图像金字塔:将输入图像做成多尺度,或者随机取一个尺度。
特征金字塔:对深层特征上采样,融合多层的特征,将语义性与空间性进行优势互补。
但SNIP对这两种方法提出了质疑,即能否避开上采样的方法,在训练时使用所有尺度的样本进行训练呢?基于此,SNIP的作者做了一个非常关键的实验,分析了多种方法在COCO数据集上小物体(尺度小于32×32)上的表现,测试图像尺度统一为1400×2000像素,
通过该实验结果,我们可以对比分析出以下3点:

1.既然多尺度物体难以训练,那么在检测小物体时,能否将大物体样本去掉以提升小物体检测性能呢?1400 <80px 与1400 all 两者的结果表明是否定的,去掉了大量的大物体会导致物体多样性的损失。

2.如果使用更大的尺寸进行训练,小物体的检测应该会有明显的提升,但1400all相比于800all仅仅提升了0.3%。

3.MST将图片缩放到了多个尺度上,增加了样本的多样性,理应有较好的检测效果,但实验结果表明并没带来明显的提升。从上述结果可以得知,即使充分增强了数据的多样性,由于卷积网络本身不具备尺度不变性,依靠模型去学习多尺度的物体仍然存在很大难度。当前卷积网络对于多个尺度都还能检测出的原因在于卷积网络强大的拟合能力,搜索空间足够大来学习不同的尺度,这也浪费了网络的拟合能力。基于此实验结论,SNIP让模型更专注于物体本身的检测,剥离了多尺度的学习难题。在网络搭建时,SNIP也使用了类似于MST的多尺度训练方法,构建了3个尺度的图像金字塔,但在训练时,只对指定范围内的Proposal进行反向传播,而忽略掉过大或者过小的Proposal。具体的实现细节如下:

1.3个尺度分别拥有各自的RPN模块,并且各自预测指定范围内的物体。
2.对于大尺度的特征图,其RPN只负责预测被放大的小物体,对于小尺度的特征图,其RPN只负责预测被缩小的大物体,这样真实的物体尺度分布在较小的区间内,避免了极大或者极小的物体。
3.在RPN阶段,如果真实物体不在该RPN预测范围内,会被判定为无效,并且与该无效物体的IoU大于0.3的Anchor也被判定为无效的Anchor。
4.在训练时,只对有效的Proposal进行反向传播。在测试阶段,对有效的预测Boxes先缩放到原图尺度,利用Soft NMS将不同分辨率的预测结果合并。
5.实现时SNIP采用了可变形卷积的卷积方式,并且为了降低对于GPU的占用,将原图随机裁剪为1000×1000大小的图像。SNIP方法虽然实现简单,但其背后却蕴藏深意,更深入地分析了当前检测算法在多尺度检测上的问题所在,在训练时只选择在一定尺度范围内的物体进行学习,在COCO数据集上有3%的检测精度提升,可谓是大道至简。
在这里插入图片描述

7.先生成放大特征再检测的GAN

[Perceptual GAN]使用了GAN对小目标生成一个和大目标很相似的Super-resolved Feature(如下图所示),然后把这个Super-resolved Feature叠加在原来的小目标的特征图(如下下图所示)上,以此增强对小目标特征表达来提升小目标(在论文中是指交通灯)的检测性能。

在这里插入图片描述

8.利用Context信息的Relation Network和PyramidBox

小目标,特别是像人脸这样的目标,不会单独地出现在图片中(想想单独一个脸出现在图片中,而没有头、肩膀和身体也是很恐怖的)。像[PyramidBox](PyramidBox: A Context-assisted Single Shot Face Detector)方法,加上一些头、肩膀这样的上下文Context信息,那么目标就相当于变大了一些,上下文信息加上检测也就更容易了。

参考资料:

1.Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
2.《深度学习中不平衡样本的处理》
3.Augmentation for small object detection
4.Feature Pyramid Networks for Object Detection
5.RetinaFace: Single-stage Dense Face Localisation in the Wild
6.SSH: Single Stage Headless Face Detector
7.An Analysis of Scale Invariance in Object Detection - SNIP
8.R-FCN: Object Detection via Region-based Fully Convolutional Networks
9.SNIPER: Efficient Multi-Scale Training
10.SAN: Learning Relationship between Convolutional Features for Multi-Scale Object Detection
11.ScratchDet: Training Single-Shot Object Detectors from Scratch
12.FaceBoxes: A CPU Real-time Face Detector with High Accuracy
13.S3FD: Single Shot Scale-Invariant Face Detector
14.Perceptual Generative Adversarial Networks for Small Object Detection
15.PyramidBox: A Context-assisted Single Shot Face Detector Relation Networks for Object Detection
16.《PYTORCH深度学习-目标检测》
17.博客:https://zhuanlan.zhihu.com/p/83220498

  • 35
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值