小目标检测模型总结+SNIP+SNIPER
小目标检测
在MS COCO数据集中,对于面积小于32*32的物体,MS COCO就认为它是小物体,在评测时,会对这个范围内的物体计算APsmall。
在行人库CityPerson中,原图大小为1024*2048,小目标定义为高度小于75的目标。
目前小目标检测的方法大致有一下4类(不过这是2018年的回答了):
-
Scale
最简单粗暴的方法就是放大图片。这就是在尺度上做文章,如FPN(Feature Pyramid Network),SNIP(An Analysis of Scale Invariance in Object Detection – SNIP)。
特征图的分辨率 stride 的设置也算在这个里面。
另外,如果图像尺寸特别大,可以考虑 YOLT(You only look twice)中切图的方法。
-
Context
小物体需要有更多的周边信息来帮助识别,如何利用这些信息,two stage 可以从 ROI Pooling 上下手,另也有 Jifeng Dai 老师的 Relation Network for Object Detection。
或者上dilated类似混合感知野,或者在head部分引入SSH相似的模块。
-
Anchor
回归的好不如预设的好,S3FD 做了非常细致的 anchor 的实验,可以帮助我们更合理地设计anchor。
-
Matching strategy
对于小物体不设置过于严格的 IoU threshold,也可以参考iou loss和cascade rcnn的思路。
-
使用GAN,在检测器后面对抗一把。
-
用soft attention去约束confidence相关的feature map,或者做一些pixel wise的attention。
参考:小目标检测问题中“小目标”如何定义?其主要技术难点在哪?有哪些比较好的传统的或深度学习方法? - ChenJoya的回答 - 知乎
SNIP
An Analysis of Scale Invariance in Object Detection - SNIP
CVPR 2018
论文:https://arxiv.org/abs/1711.08189
代码:http://bit.ly/2yXVg4c
创新点:
- 通过有选择地回传梯度,实现有选择地训练,从而更好地检测极端尺寸的物体
简介:
看目标检测论文的试验结果不难发现,AP small基本都是最低的,主要原因一是网络提取的语义化特征和分辨率之间的矛盾,二是小目标往往会因为IoU过低而被漏检。
这篇文章分析了小尺度与预训练模型尺度之间的关系,提出了一个和Cascade R-CNN有异曲同工之妙的中心思想:要让输入分布接近模型预训练的分布。作者提出了一个多尺度训练(MST)的升级版SNIP。
COCO和ImageNet
上图很清晰地描述了COCO和ImageNet的尺度差别,COCO中90%的Instance都在0.472以下,充斥着大量的小物体,而ImageNet中的分布则比较均匀。所以用ImageNet预训练的模型迁移到COCO中可能产生一定的domain-shift,因此作者有了这样的思考:
- 有必要全部做upsample来放大小物体吗?可不可以在预训练的时候就选择低分辨率的图像作为输入?
- 预训练之后,在对模型进行微调的时候,是否可以对样本进行选择,选择那些从64*64到256*256的对象?
Related Work
-
浅层小物体,深层大物体
例子:SDP、SSH、MS-CNN
缺点:在浅层预测小物体时,是以牺牲语义抽象性来实现的
-
特征融合/特征金字塔
例子:FPN、Mask-RCNN、RetinaNet
缺点:对于very small/large objects 检测效果不是很好
实验验证upsampling对于提高小目标检测的效果
-
CNN-B:原图训练/伪高清测试
训练用高分辨率图像,测试用经过降采样和upsample的图像。
-
CNN-S:低清训练/低清测试
训练用低分辨率图像,测试用降采样的图像。
-
CNN-B-FT:原图训练,伪高清微调/伪高清测试
训练用高分辨率图像,然后在低分辨率图像上进行fine-tune,测试用经过降采样和upsample的图像。
可以这样理解作者的三个实验:ImageNet物体大、分辨率高,而COCO目标都很小,直接迁移会有问题,作者在试图探究如何进行迁移。降采样后的小图像数据集其实对应的是COCO数据集普遍存在的小目标的情况,试图模仿COCO数据集。
因此三个网络的含义应该是:
- CNN-B,ImageNet预训练后的参数直接用来给COCO这种分辨率低的数据集用;
- CNN-S,不用ImageNet这种高分辨率的数据集做训练,我把网络就设置成适合COCO这类数据集的,训练和测试都用分辨率低的数据集;
- CNN-B-FT,ImageNet人家都训练好了,不用白不用,但是用之前,先用低分辨率数据集做一下fine-tune改良效果。
实验验证分辨率对于提高小目标检测的效果
上图是在小目标测试集上的检测效果对比,所用测试图像的尺寸都是1400*2000。
-
800all表示网络基于800*1400的图像训练。
-
1400all基于1400*2000的图像,不难看出,1400all的结果更好一些,主要原因就是训练图像的分辨率和测试图像的分辨率一致,这和前面在ImageNet上进行的试验结果也吻合。
但是这个提升非常小,作者猜测原因在于1400*2000的图像是经过放大得到的,模型在训练过程中可以提高对小目标的检测,但是对于较大目标,则会因为尺寸过大而难以训练,从而影响了最终的效果。
-
1400<80px表示训练数据尺寸是1400*2000,但是训练过程中忽略中等尺寸和大尺寸的目标,这个模型的效果非常差,猜想原因是忽略这些训练数据(占比大约30%)所带来的数据损失对模型效果的影响更大。
-
MST表示训练一个检测器时采用不同尺度的图像进行训练(包括480*800),按理说效果不错,但实际上和800all差不多,主要原因在于训练数据中那些尺寸非常大或非常小的object会影响训练效果,因此这篇文章在引入MST思想的同时限定了不同尺寸的object在训练过程中的梯度回传,这就是SNIP。
SNIP算法思想
SNIP与MST有着很密切的联系,MST是在大的feature map上预测小物体,anchor设置的较小,在小feature map上预测大物体,anchor设置的较大,根据anchor与GT的IoU选择正例。MST网络输入是单尺度的,并没有考虑到预训练模型与输入图像尺度差异的问题。SNIP因此做了升级:
- 只有物体的尺度与预训练数据集的尺度(224*224)接近时,才把它用来做检测器的训练样本,实际的操作是只对在这个指定范围内的目标回传损失,就是说训练过程实际上只是针对这些目标进行的。
valid anchor & invalid anchor:当某个ROI的面积在指定范围内时,该ROI就是「valid」,也就是会在此次训练中回传梯度,否则就是「invalid」(如紫色框所示)。这些「invalid」的ROI所对应的「invalid ground truth」会用来决定RPN网络中Anchor的有效性。具体来说,「invalid Anchor」 就是和「invalid ground truth」的IOU大于0.3的Anchor,如Figure6左边的黑色框所示。
另外,作者还分析了RPN网络中不同标签的Anchor比例(一共就2种Anchor,正负样本),我们知道在RPN网络中,一个Anchor的标签是根据Anchor和Ground Truth的IOU值来确定的,只有下面2种情况才会认为Anchor是正样本:
-
假如某个Anchor和某个ground truth的IOU超过某个阈值(默认0.7),那么这个Anchor就是正样本。
-
假如一个ground truth和所有Anchor的IOU都没有超过设定的阈值,那么和这个ground truth的IOU最大的那个Anchor就是正样本
遵循Faster RCNN的设定,将conv4
的输出作为RPN网络的输入,然后在此基础上设定了15种Anchor(5种尺度,三种比例),然后作者介绍了一个有趣的发现,那就是在COCO数据集上(图像大小为800×1200)只有30%的Ground Truth满足Anchor是正样本的第一个条件,即使将阈值调节成0.5,也只有58%的Ground Truth满足Anchor是正样本的第一个条件。
这就说明,即使阈值等于0.5,仍然有42%的正样本Anchor和Ground Truth的IOU值小于0.5。显然,这种正样本的质量是不高的。所以SNIP引入的多种分辨率图像作为输入一定程度上可以缓解这种现象。
参考:
SNIPER
SNIPER: Efficient Multi-Scale Training
NIPS 2018
论文:https://arxiv.org/pdf/1805.09300.pdf
代码:https://github.com/MahyarNajibi/SNIPER
作者:马里兰大学
创新点:
- 不处理整幅图像,SNIPER仅仅处理图像金字塔上GT附近的chips,相当于综合了R-CNN 在scale上的优点 和Fast R-CNN在速度上的优点。
简介
传统的多尺度训练方案一般都使用图像金字塔,并处理金字塔层图像上的每个pixel,SNIPER仅处理图像金字塔上的context regions around ground-truth instances(也即chips),并结合SNIP思想,仅筛选合适尺度的gt instance参与模型训练,对比使用金字塔图像上的每个pixel,训练速度快了3倍。
负样本的chips如何生成(负样本chips用于抑制false negative,也称难分负样本区域)?难分负样本区域由RPN(训练得比较简单粗糙,a short learning schedule)输出的proposals形成,这些proposals中包含了确实是gt bbox的区域,也包含了false positives,再利用正样本chips + gt bbox剔除正样本区域,剩余的就是难分负样本区域(包含false positives),那么训练阶段每张图像上生成的chips数量,是基于图像中场景的复杂性,自适应调整的。
R-CNN和Fast R-CNN:
RCNN本身具有很好的尺度不变形,因为它先从图片中提取proposal,然后都resize到224去提取特征,但是这样每个proposal不共享特征的计算,很慢。
Fast系列为了解决这个问题,输入大小不固定,不同尺度的图片都经过同一个的cnn提取特征,经过RoI Pooling得到尺寸一样的图,然后拿proposal去对应位置扣特征,这就破坏了RCNN原来的尺度不变形,但是它很快且整体做特征提取能捕捉更多的context。
SNIP是忽略掉大图中的大proposal和小图中的小proposal,也就是把一些极端的情况都忽略掉,相对来说只保留了尺度大致一致(和Imagenet的预训练模型的尺度差不多)的proposal参与训练,但是它也有个缺点就是训练太慢了。
综上,本文提出一种SNIPER的方法,通过生成scale specific context-regions,本文叫做chip,生成多个尺度的chips,不管是哪个尺度都采样到512x512,这样既保留R-CNN的尺度不变性和Fast R-CNN的速度,也在SNIP基础上,过滤极端尺寸的同时,又过滤到了很大一部分背景,从而比SNIP快很多。
Chip Generation
chip:scale specific context-regions that cover maximum proposals at a particular scale
chip是某个图片的某个scale上的一系列固定大小的的以恒定间隔排布的小窗,每个window都可能包含一个或几个objects。
在每个scale上, K × K K×K K×K大小的chip以等间隔(d pixels)的方式排布。每个scale都会生成这些chips,而且chip的大小是固定的,变化的是图片的尺寸。这跟anchor的思想刚好相反,因为anchor中,不变的是feature map,变化的是anchor。
chip又分positive和negative两种:
- 每个Positive Chip都包含若干个ground truth boxes,所有的Positive Chips则覆盖全部有效的ground truth boxes。
- 每个 Negative Chips 则包含若干个 false positive cases。
Positive Chip Selection
每个scale,都会有个area range R i = [ r m i n i , r m a x i ] , i ∈ [ 1 , n ] R_i=[r^i_{min},r^i_{max}],i∈[1,n] Ri=[rmini,rmaxi],i∈[1,n],这个范围决定了这个scale上哪些ground truth box是用来训练的。所有ground truth box中落在 R i R_i Ri范围内的ground truth box 称为有效的(对某个scale来说),其余为无效的,有效的gt box集合表示为 G i G_i Gi 。从所有chips中选取包含(完全包含)有效 gt box最多的chip,作为Positive Chip,其集合称为 C p o s i C^i_{pos} Cposi ,每一个gt box都会有chip包含它。因为 R i Ri Ri的区间会有重叠,所以一个gt box可能会被不同scale的多个chip包含,也有可能被同一个scale的多个chip包含。被割裂的gt box(也就是部分包含)则保持残留的部分。
如上图,SNIPER在一个合适的尺度范围内处理了所有gt bbox,而仅需要四个512 x 512 pixel的小尺度chips,无需大尺度的图像金字塔操作。
所以说 SNIPER 相当于综合了R-CNN 在scale上的优点 和Fast R-CNN在速度上的优点,这是本文的精妙之处。
更多细节:
- 在实际采样中,出于计算量和样本平衡的角度考虑,所有的chip不可能都被参与训练,在论文中,作者使用了贪心的策略根据chip包围的gt bbox的数量的多少,从每个尺度中抽取了前 K 个chip作为正chip,记做 C p o s i C^i_{pos} Cposi。最后在放大或者缩小的图像中,将采样的chips裁剪出来,得到一系列大小固定( 512 x 512 pixel )的子图,这些子图将作为后续检测算法的训练样本。
- 源码中生成chips的方式并不是之前所说的先生成图像金字塔,再从图像金字塔中裁剪出 512 x 512 pixel的chips,源码中采用的方式是从原图中采样出等比例的chips,再将其resize到 512 x 512 pixel,这两种策略是等价的,但是第二种无疑实现起来更为简单。
Negative Chip Selection
前面提取的正样本chips,可以覆盖训练集中的所有gt bboxes,但我们却忽略了图像中的大部分背景区域,这些背景区域又可以分为两种:难分背景区域、易分背景区域。
- 对于难分背景区域,模型最好是能在训练中也将之使用,与正样本一起参与训练,提升模型对复杂场景的鲁棒性。
- 对易分区域而言,模型将这些区域与难分区域同等对待,耗费同样的训练时间在上面,就显得性价比很低了。
所以需要尽量避免筛选简单易分背景区域、并尽量选择难分背景区域参与模型训练。
对于易分背景区域的剔除,一个简单的解决办法就是使用一个简单的、粗糙的扫描器,在图像上过一遍,筛选出可能存在正样本目标的区域。因为扫描器本身比较简单粗糙,可以召回率优先,精确率次之。
- 召回率:针对原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。
- 精确率:针对预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。
那些未被召回的样本,可能不仅没有正例存在,连有挑战性的负样本也不存在,训练的价值不大。
在实际操作中,作者是用了一个简单的RPN,生成了一些准确率不高、但召回率不错的proposals,这些proposals召回了大量正样本gt bboxes区域,也引入了大量的难负样本预期,然后没有被该RPN召回的区域,就是易分背景区域了,直接忽略之即可。
下面就是选择这些难分背景区域,参与到训练中。RPN得到了高召回的proposals,对于每个尺度 i ,先剔除 C p o s i C^i_{pos} Cposi中已包含的所有正样本proposals(此时就只剩下大量的难分负样本proposals了),再来个贪心算法(greedily select all the chips which cover at least M M M proposals in R i R_i Ri),就是挑选同样合适尺度(就是负样本proposals的尺度也要适宜)的负样本proposals,再将这些proposals组合成合适的负样本chips(不能称为组合,因为它们本身就在某个chips之内了,将其划分为负样本chips即可),就构成了 C n e g i C^i_{neg} Cnegi。
如上图,第一行的绿框是gt box,第二行的红点对应RPN生成的false positive的中心坐标,橙色框是根据生成的难分false positive proposals,利用贪心算法生成的难分背景区域。
最终,SNIPER仅处理包含false positives的难分背景区域,易分背景区域直接忽略,训练速度不仅快了,也更有针对性了。
Label Assignment
文章中称网络是end-to-end的,但应该没有把生成positiv/negative chips的过程算进去,初步筛选proposals的RPN也比较粗糙,不太可能和后面的结构参数共享。作者有意模糊了这个概念,可以说通过SNIPER筛选了chips后,模型可以用过SNIP的训练方式end2end,但不能说整套流程都是end2end的。
网络是直接在chips上end2end训练的,生成proposas,再进一步进行分类、回归。与SNIP类似,无需在 R i R_i Ri内过滤掉不合尺度的gt box,而是在训练阶段直接不考虑这些proposals。与Fast R-CNN类似,IoU>0.5便可认定为正样本。
来看一下实验结果:
参考: