锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

目标检测 | 解决小目标检测!多尺度方法汇总

时间:2022-08-14 15:00:00 abs轮速传感器各自的优缺点

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

传统的图像金字塔

在深度学习方法流行之前,对于不同尺度的目标,我们通常使用原始图像构建不同分辨率的图像金字塔,然后用固定输入分辨率的分类器滑动每层金字塔,以检测金字塔底部的小目标;或者只使用一张原始图片,在原始图片上,用不同分辨率的分类器检测目标,以便在较小的窗口分类器中检测到小目标。经典的基于简单矩形特征(Haar) 级联Adaboost与Hog特征 SVM的DPM目标识别框架采用图像金字塔处理多尺度目标,早期的CNN这种方法也用于目标识别框架,但图像金字塔中的每一层都是分开的CNN提取特性、耗时和内存消耗都不能满足需求。毫无疑问,这种方法仍然是最好的。值得一提的是,事实上,当大多数深度学习算法提交结果进行排名时,它们大多使用多尺度测试。同时类似于SNIP图像金字塔的多尺度处理采用多尺度训练。

SNIP/SNIPER多尺度处理

  • SNIP:尺度归一化

论文地址

https://arxiv.org/abs/1711.08189

代码地址

https://github.com/mahyarnajibi/SNIPER

目前的物体检测算法通常采用微调法,即首先ImageNet训练分类任务在数据集上,然后迁移到物体检测的数据集上,如COCO训练测试任务。我们可以将ImageNet分类任务视为224×224的尺度,而COCO大部分物体尺度在几十个像素范围内,包含大量的小物体,物体尺度差距较大,样本差距过大,会导致映射迁移(Domain Shift)的误差。

SNIP多尺度训练(Multi-Scale Training)改进版。MST思想是利用随机采样的多分辨率图像使检测器具有不变的尺度特性。然而,作者通过实验发现,在MST中,大目标和小目标的检测效果不好,但是MST还有一些优点,比如一张图片会有几个不同的分辨率,每个目标在训练中都会有几个不同的尺寸,所以总有一个尺寸在指定的尺寸范围内。

SNIP的做法是只对size目标回传损失在指定范围内,实际上是训练过程只针对某些特定目标,这样可以减少domain-shift影响。

SNIP如下图所示:

b0f0474ca6cf48b5d6e6c6d90b6324d1.png

细节的具体实现

(1)3个尺度分别拥有各自的RPN模块,并在指定范围内预测物体。

(2)对于大尺度特征图,其RPN只负责预测放大的小物体,对于小尺度特征图,其RPN只负责预测缩小的大物体,这种真实的物体尺度分布在较小的范围内,避免了极大或极小的物体。

(3)在RPN如果真实物体不在这个阶段,RPN在预测范围内,将被判定为无效,并与无效物体一起IoU大于0.3的Anchor也被判定为无效Anchor。

(4)训练时,只对有效的Proposal反向传播。在测试阶段,有效预测Boxes先缩放到原图尺度,利用Soft NMS合并不同分辨率的预测结果。

(5)实现时SNIP采用了卷积方可变形卷积类型,为了减少GPU占用,原图随机切割成1万×大小1000的图像。使用Deformable-RFCN检测器提取单分辨率候选人。Deformable-RFCN选择主干网络ResNet-101,训练分辨率为800x1200。在RPN选择5个锚尺寸。分类时,没有选择Deformable Position Sensitive RoIPooling主干网为ResNet-50的Deformable-RFCN。使用双线性插值Position Sensitive RoIPooling, 因为它将最后一层的卷积核数量减少了3倍。NMS的阈值为0.3.不是端到端训练。使用ResNet-50以及消除deformable PSRoI filters它可以减少3倍的时间,节省3倍的时间GPU内存。

  • 当训练和测试分辨率不一致时,性能会下降;

  • 虽然大分辨率输入图像可以提高小目标的检测性能,但同时大目标太大,难以分类,最终精度提高不明显;

  • 多尺度训练(Mutil-Scale training),采样到的图像分辨率很高(1400x2000),大目标大,图像分辨率过小(4800)x640),导致小目标较小,这些都产生了非最佳结果;

  • SNIP不同的分辨率选择不同的分辨率proposal梯度传播,然后将其他设置为0。即对每个图像金字塔的每个尺度进行正则化表示;

总体来说,SNIP让模型更注重物体本身的检测,剥离了多尺度的学习难题。在网络搭建时,SNIP也使用类似的MST多尺度训练方法构建了三个尺度的图像金字塔,但在训练过程中,只在指定范围内Proposal反向传播,忽略过大或过小Proposal。

SNIP虽然该方法很简单,但它背后有深刻的含义,并对当前检测算法的多尺度检测问题进行了更深入的分析。在训练过程中,只选择在一定范围内学习物体COCO数据集中检测精度提高了3%,可谓大道至简。

  • SNIPER:SNIP方法的改进

论文地址:

https://arxiv.org/abs/1805.09300
代码地址:

https://github.com/MahyarNajibi/SNIPER

SNIPER关键是减少SNIP的计算量。SNIP借鉴了multi-scale training训练思想,multi-scale training图像金字塔被用作模型的输入。虽然这种方法可以提高模型效果,但由于模型需要处理每个模型,计算量的增加也非常明显scale图像的每一个像素,而SNIPER(Scale Normalization for Image Pyramids with Efficient Resampling)算法以适当的比例处理ground truth(称为chips)上下文区域周围,在训练期间产生每个图像chips根据场景的复杂性,数量会自适应变化,由于SNIPER采样后低分辨率chips因此,它可以在训练期间受益Batch Normalization,而不需要在GPU统计信息采用同步批量标准化。实验证明,BN有助于提高最终性能。

这些chips主要分为两类:

一种是postivice chips,这些chips包含ground truth;

另一种是从RPN网络输出的ROI抽样得到的negative chips,这些chips相当于难以分类的背景,那些容易分类的背景就没必要进行多尺度训练了。

所以模型结束了只处理这些cips,而不是处理整张图像,这样就达到提升效果的同时提升速度。相比于SNIP,基于Faster RCNN(ResNet101作为Backbone)的实验结果显示SNIPER的mAP值比SNIP算法提升了4.6百分点,所以效果也还是非常不错的。在单卡V100上,每秒可以处理5张图像,这个速度在two-stage的算法中来看并不快,但是效果是非常好。

SNIPER的思路:

把图片丢到网络中时,就会产生不同尺度的feature map。作者的想法就是在特征图上的ground truth box周围去crop一些图片,这些图片称为chips。

1、如何选择positive chips : 就是在图像金字塔的每一层中,都设定一个范围,在该大小范围内的目标就可以标出来作为ground truth box,然后对图片中ground truth box所在的地方进行crop,crop出来的图片就是chips。选择positive chips的一个要求就是,每一个pos chip都至少应该覆盖一个groud-truth box,当然一个groud-truth box可以被多个pos chips包含。

2、如何选择negative chips : 如果只基于前面的positive chip,那么因为大量的背景区域没有参与训练,所以容易误检(比较高的false positive rate),传统的multi scale训练方式因为有大量的背景区域参与计算,所以误检率没那么高,但因为大部分背景区域都是非常容易分类的,所以这部分计算量是可以避免的,于是就有了negative chip seleciton。选择negative chips的目的在于要让网络更容易去判断出哪些是背景,而不必花费太多的时间在上面。在Faster-RCNN中的RPN的其中一步就是,将anchor和ground truth box交并比小于0.3视为背景,全部去掉(去掉易分样本)。然后剩下的再去掉完全覆盖groun truth box的proposal(去掉易分样本),大部分proposal都是具有假阳性的,也就是和ground truth 都有一部分的交集,但是比较小,我们的negative chips都从这里来。(negative chips就是难分样本)。这样可以用来减少假阳率。

3、标注label:每一张chip上大概产生300个proposal,但是对这300个proposals不做限制(比如faster-rcnn会滤除掉背景部分,我们不这样),而是对里面的一些proposal抽出来做positive proposal。

4、模型训练:应该是先生成chips,然后再用chips去训练一个端到端的网络,所以其实是分开进行的。

如下图是作者的选择positive chips的一个示意图:

positive chips

左侧中,绿色框起来的就是ground truth的所在,其他颜色是生成的chips,这张图就生成了4个chips,右侧中绿色线条就是valid box,红色的线就是invalid box。可以看出,合适尺度内的ground truth box就是valid box(蓝色和红色框内绿线),否则就是invalid box(黄色和紫色图中的红线就是invalid)(clip的尺寸要比原图小很多,不然就起不到减少计算量的目的,对于高分辨率的图,clip可以比它小十倍不止)

下图是作者选择negative chips的一个示意图:

negative chips

上面一行就是ground truth boxes,下面一行就是作者选择的negative chips,比如最后两个,negative chips都和ground truth box有一定的交集。这就是我们所需要的negative chips。第二行图像中的红色小圆点表示没有被positive chips(Cipos)包含的negative proposals,因为proposals较多,用框画出来的话比较繁杂,所以用红色小圆点表示。橘色框表示基于这些negative proposals生成的negative chips,也就是Cineg。每个negative chip是这么得到的:对于尺度i而言,首先移除包含在Cipos的region proposal,然后在Ri范围内,每个chip都至少选择M个proposal。在训练模型时,每一张图像的每个epoch都处理固定数量的negative chip,这些固定数量的negative chip就是从所有scale的negative chip中抽样得到的。 

优点:

1、确实可以减少计算量;(一张图片可以Crop出5个512x512的chips,而且进行3个尺度的训练,但是它的计算量只比一张800x1333的图片进行单尺度训练多出30%,要是800x1333也进行多尺度训练时,训练量可比这种方法大多了)

2、用固定大小的chips去进行训练时,数据很容易被打包,更利于GPU的使用。(把数据丢到GPU中去训练,这30%的差距算个毛线,GPU计算速度那么大呢)

3、更为重要的是,可以进行多尺度训练,设置更大的batch_size和batch normalization,而且再也不用担心这些操作会拉低我们的速度了!

实验细节:用图像金字塔生成chips的时候,在不同scale的层上使用的ground truth box范围在[0,80²]、[32²,150²]、[120², inf]。训练RPN是为了获取negative chips。每一张图上产生的chips是不同的,如果这张图包含的目标多,产生的chips就会增多,相反则减少。

大熊猫的总结:在SNIP的基础上加了一个「positive/negative chip selection」,从实验结果来看是非常SOTA的,可以说碾压了Mosaic反应出来的结果。另外基于ResNet101的Faster RCNN架构结合SNIPER,精度超过了YOLOV4接近4个点,效果是非常好的。感兴趣的朋友可以尝试。

SSD中的多尺度处理

SSD以不同stride的feature map作为检测层分别检测不同尺度的目标,用户可以根据自己的任务的目标尺度制定方案。该方式尺度处理简单有效,但存在一些缺陷:

  • 一般使用低层检测小目标,但低层感受野小,上下文信息缺乏,容易引入误检

  • 使用简单的单一检测层多尺度信息略显缺乏,很多任务目标尺度变化范围十分明显;

  • 高层虽然感受野较大,但毕竟经过了很多次降采样,大目标的语义信息是否已经丢失

  • 多层特征结构,是非连续的尺度表达,是非最优的结果;

空洞卷积处理多尺度

空洞卷积本身可以控制不同大小的感受野,也即可以处理多尺度;一般空洞率设计得越大,感受野越大(但一般空洞率不能无限扩大,网格效应问题会加剧)。

TridentNet:三叉戟网络

论文地址:

https://arxiv.org/abs/1901.01892

代码地址:https://github.com/TuSimple/simpledet/tree/master/models/tridentnet

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

  • 控制实验证明了感受野大小与目标尺度呈现正相关;

  • 设计三个并行分支获取不同大小的感受野,以分别处理不同尺度的目标,感受野使用空洞卷积表征;每个分支采用Trident block构建,取代ResNet-res4中的多个原始的Block;

  • 训练类似于SNIP,三个分支分别采用不同尺度的目标训练。

TridentNet网络的作者将3种不同的感受野网络并行化,提出了如下图所示的检测框架。采用ResNet作为基础Backbone,前三个stage沿用原始的结构,在第四个stage,使用了三个感受野不同的并行网络。

具体实现细节

(1)3个不同的分支使用了空洞数不同的空洞卷积,感受野由小到大,可以更好地覆盖多尺度的物体分布。

(2)由于3个分支要检测的内容是相同的、要学习的特征也是相同的,只不过是形成了不同的感受野来检测不同尺度的物体,因此,3个分支共享权重,这样既充分利用了样本信息,学习到更本质的目标检测信息,也减少了参数量与过拟合的风险。

(3)借鉴了SNIP的思想,在每一个分支内只训练一定范围内的样本,避免了过大与过小的样本对于网络参数的影响。

在训练时,TridentNet网络的三个分支会接入三个不同的head网络进行后续损失计算。在测试时,由于没有先验的标签来选择不同的分支,因此只保留了一个分支进行前向计算,这种前向方法只有少量的精度损失。

FPN中的多尺度处理及其改进

自从2016年FPN网络出来后,目前各大视觉任务的baseline基本都是以backbone-FPN。FPN以更为轻量的最近邻插值结合侧向连接实现了将高层的语义信息逐渐传播到低层的功能,使得尺度更为平滑,同时它可以看做是轻量级的decoder结构。FPN看起来很完美,但仍然有一些缺陷:

  • 在上采样时使用了比较粗糙的最近邻插值,使得高层的语义信息不一定能有效传播;

  • 由于经过多次下采样,最高层的感受野虽然很丰富,但可能已经丢失了小目标的语义信息,这样的传播是否还合适;

  • FPN的构建只使用了backbone的4个stage的输出,其输出的多尺度信息不一定足够;

  • FPN中虽然传播了强的语义信息到其他层,但对于不同尺度的表达能力仍然是不一样的,因为本身就提取了不同backbone的输出。

PANet

论文地址:

https://arxiv.org/abs/1803.01534

代码地址:

https://github.com/ShuLiu1993/PANet

PANet是由香港中文大学和腾讯优图联合提出的实例分割框架。模型不是直接实现目标检测,但是论文的核心内容是增强FPN的多尺度融合信息。PANet 在 COCO 2017 挑战赛的实例分割任务中取得了第一名,在目标检测任务中取得了第二名。

FPN的低层次的特征(C5)对应大型目标,而高层级特征与低层级别特征之间路径较长(如图 2a所示红色虚线),增加访问准确定位信息的难度。为了缩短信息路径和用低层级的准确定位信息增强特征金字塔,PANet在FPN基础上创建了自下而上的路径增强(图 2b)。用于缩短信息路径,利用low-level 特征中存储的精确定位信号,提升特征金字塔架构。

PANet网络架构

PANet创建自适应特征池化(Adaptive feature pooling)( 图 2c)。用于恢复每个候选区域和所有特征层次之间被破坏的信息路径,聚合每个特征层次上的每个候选区域。

PANet的目标检测和实例分割共享网络架构的图 2 abc三部分,使得两者性能均有提升。

ThunderNet

论文地址:

https://arxiv.org/pdf/1903.11752.pdf

代码地址:

https://github.com/ouyanghuiyu/Thundernet_Pytorch

ThunderNet是旷视提出的轻量型目标检测框架,实现了ARM平台上的实时检测器,整体结构如图 3所示。 主要简化了FPN结构,只使用C4/C5,同时引入gpooling操作(Face++论文好多这么用,确实有效),最终输出C4分辨率大小的累加特征。ThunderNet使用320×320像素作为网络的输入分辨率。

整体的网络结构分为两部分:Backbone部分和Detection部分。网络的骨干部分为SNet(ShuffleNetV2修改版)。 网络的检测部分,利用了压缩的RPN网络,既Context Enhancement Module(CEM)整合局部和全局特征增强网络特征表达能力。并提出Spatial Attention Module空间注意模块,引入来自RPN的前后景信息用以优化特征分布。

FPN的结合不同层语义信息,但是相对而言每层均有检测分支,对移动终端而言增加计算成本和运行时间。论文提出简单粗暴的CEM(如图 4所示),合并三个尺度特征图C4,C5和Cglb:

1、C4 1×1卷积,通道数量压缩为α×p×p = 245

2、C5进行上采样 + 1×1卷积,通道数量压缩为α×p×p = 245

3、C5全局平均池化得到Cglb,Cglb进行Broadcast + 1×1卷积,通道数量压缩为α×p×p = 245 。

通过利用局部和全局信息,CEM有效地扩大了感受野,并细化了特征图的表示能力。与先前的FPN结构相比,CEM predict预测及减少fc计算,提高模型运算效率。

 ThunderNet网络模型
CEM网络结构

Libra R-CNN

论文地址:

https://arxiv.org/pdf/1904.02701.pdf

代码地址:

https://github.com/OceanPang/Libra_R-CNN

Libra R-CNN是有浙江大学,香港中文大学等联合提出目标检测模型。无论是one-stage two-stage,都涉及选择候选区域,特征提取与融合、loss收敛。针对目标检测的三个阶段,论文提出三个问题:采样的候选区域示范具有代表性,不同level特征如何融合,以及损失函数如何更好收敛。论文针对三个问题提出三个改进方向:

1、IoU-balanced Sampling

M个候选框选择N个hard negative,选中的概率就是:

N个样本通过IoU的值划分为K个区间,每个区间中的候选采样数为Mk,则IoU-balanced sampling的采样公式即为:

作者通过在IoU上均匀采样, 把hard negative在IoU上均匀分布。

2、Balanced Feature Pyramid

 Balanced Feature Pyramid

为了更高效利用FPN特征,论文使用4步改进rescaling, integrating, refining,Strengthening(如上图所示):

a. rescaling。把{C2,C3 ,C5}的多层特征均rescaling到C4尺寸,做加权求平均值。得到的特征C rescaling返回到{C2,C3 ,C5}特征分辨率。

b. Refining&strengthening。论文使用Gaussian non-local attention 增加特征。

c. Indentity,既残差设计。

3、Balanced L1 Loss。

论文使用修订的loss损失函数,改善网络的训练过程。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章