作者丨SFXiang
来源丨AI算法修炼营
传统的图像金字塔
最开始在深度学习方法流行之前,对于不同尺度的目标,大家普遍使用将原图构建出不同分辨率的图像金字塔,再对每层金字塔用固定输入分辨率的分类器在该层滑动来检测目标,以求在金字塔底部检测出小目标;或者只用一个原图,在原图上,用不同分辨率的分类器来检测目标,以求在比较小的窗口分类器中检测到小目标。经典的基于简单矩形特征(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的网络结构如下图所示:
具体的实现细节:
(1)3个尺度分别拥有各自的RPN模块,并且各自预测指定范围内的物体。
(2)对于大尺度的特征图,其RPN只负责预测被放大的小物体,对于小尺度的特征图,其RPN只负责预测被缩小的大物体,这样真实的物体尺度分布在较小的区间内,避免了极大或者极小的物体。
(3)在RPN阶段,如果真实物体不在该RPN预测范围内,会被判定为无效,并且与该无效物体的IoU大于0.3的Anchor也被判定为无效的Anchor。
(4)在训练时,只对有效的Proposal进行反向传播。在测试阶段,对有效的预测Boxes先缩放到原图尺度,利用Soft NMS将不同分辨率的预测结果合并。
(5)实现时SNIP采用了可变形卷积的卷积方式,并且为了降低对于GPU的占用,将原图随机裁剪为1000×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倍的时间并且节省GPU内存。
训练与测试分辨率从不一致的时候性能会下降;
大分辨率输入图像虽然能提升小目标检测性能,但同时使得大目标过大导致其很难分类,此消彼长,最终精度提升并不明显;
多尺度训练(Mutil-Scale training),采样到的图像分辨率很大(1400x2000),导致大目标更大,而图像分辨率过小时(480x640),导致小目标更小,这些均产生了非最优的结果;
SNIP针对不同分辨率挑选不同的proposal进行梯度传播,然后将其他的设置为0。即针对每一个图像金字塔的每一个尺度进行正则化表示;
总体来说,SNIP让模型更专注于物体本身的检测,剥离了多尺度的学习难题。在网络搭建时,SNIP也使用了类似于MST的多尺度训练方法,构建了3个尺度的图像金字塔,但在训练时,只对指定范围内的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相当于是难分类的背景,而那些容易分类的背景就没必要进行多尺度训练了。
因此模型最终只处理这些chips,而不是处理整张图像,这样就达到提升效果的同时提升速度。相比于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的一个示意图:
左侧中,绿色框起来的就是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,802]、[322,1502]、[1202, 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创建自适应特征池化(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计算,提高模型运算效率。
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
为了更高效利用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损失函数,改善网络的训练过程。
参考资料
https://zhuanlan.zhihu.com/p/93922612
https://blog.csdn.net/woduitaodong2698/article/details/86556206
https://blog.csdn.net/u014380165/article/details/82284128?utm_source=blogxgwz5
https://blog.csdn.net/Gentleman_Qin/article/details/84789249
涨分利器!攻克目标检测难点秘籍三:多尺度检测
https://zhuanlan.zhihu.com/p/63047557
https://zhuanlan.zhihu.com/p/70523190
本文暂时没有评论,来添加一个吧(●'◡'●)