小目标检测模型总结+SNIP+SNIPER

小目标检测

在MS COCO数据集中,对于面积小于32*32的物体,MS COCO就认为它是小物体,在评测时,会对这个范围内的物体计算APsmall。

在行人库CityPerson中,原图大小为1024*2048,小目标定义为高度小于75的目标。

目前小目标检测的方法大致有一下4类(不过这是2018年的回答了):

  1. Scale

    最简单粗暴的方法就是放大图片。这就是在尺度上做文章,如FPN(Feature Pyramid Network),SNIP(An Analysis of Scale Invariance in Object Detection – SNIP)。

    特征图的分辨率 stride 的设置也算在这个里面。

    另外,如果图像尺寸特别大,可以考虑 YOLT(You only look twice)中切图的方法。

  2. Context

    小物体需要有更多的周边信息来帮助识别,如何利用这些信息,two stage 可以从 ROI Pooling 上下手,另也有 Jifeng Dai 老师的 Relation Network for Object Detection。

    或者上dilated类似混合感知野,或者在head部分引入SSH相似的模块。

  3. Anchor

    回归的好不如预设的好,S3FD 做了非常细致的 anchor 的实验,可以帮助我们更合理地设计anchor。

  4. Matching strategy

    对于小物体不设置过于严格的 IoU threshold,也可以参考iou loss和cascade rcnn的思路。

  5. 使用GAN,在检测器后面对抗一把。

  6. 用soft attention去约束confidence相关的feature map,或者做一些pixel wise的attention。

参考:小目标检测问题中“小目标”如何定义?其主要技术难点在哪?有哪些比较好的传统的或深度学习方法? - ChenJoya的回答 - 知乎

深度学习在 small object detection 有什么进展? - 尼箍纳斯凯奇的回答 - 知乎

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

小目标检测模型总结+SNIP+SNIPER

上图很清晰地描述了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对于提高小目标检测的效果

小目标检测模型总结+SNIP+SNIPER

  • CNN-B:原图训练/伪高清测试

    训练用高分辨率图像,测试用经过降采样和upsample的图像。

  • CNN-S:低清训练/低清测试

    训练用低分辨率图像,测试用降采样的图像。

  • CNN-B-FT:原图训练,伪高清微调/伪高清测试

    训练用高分辨率图像,然后在低分辨率图像上进行fine-tune,测试用经过降采样和upsample的图像。

小目标检测模型总结+SNIP+SNIPER

可以这样理解作者的三个实验:ImageNet物体大、分辨率高,而COCO目标都很小,直接迁移会有问题,作者在试图探究如何进行迁移。降采样后的小图像数据集其实对应的是COCO数据集普遍存在的小目标的情况,试图模仿COCO数据集。

因此三个网络的含义应该是:

  • CNN-B,ImageNet预训练后的参数直接用来给COCO这种分辨率低的数据集用;
  • CNN-S,不用ImageNet这种高分辨率的数据集做训练,我把网络就设置成适合COCO这类数据集的,训练和测试都用分辨率低的数据集;
  • CNN-B-FT,ImageNet人家都训练好了,不用白不用,但是用之前,先用低分辨率数据集做一下fine-tune改良效果。

实验验证分辨率对于提高小目标检测的效果

小目标检测模型总结+SNIP+SNIPER

上图是在小目标测试集上的检测效果对比,所用测试图像的尺寸都是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)接近时,才把它用来做检测器的训练样本,实际的操作是只对在这个指定范围内的目标回传损失,就是说训练过程实际上只是针对这些目标进行的。

小目标检测模型总结+SNIP+SNIPER

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引入的多种分辨率图像作为输入一定程度上可以缓解这种现象。

参考:

SNIP 算法笔记

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(也就是部分包含)则保持残留的部分。

小目标检测模型总结+SNIP+SNIPER

如上图,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

小目标检测模型总结+SNIP+SNIPER

如上图,第一行的绿框是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便可认定为正样本。

来看一下实验结果:

小目标检测模型总结+SNIP+SNIPER

参考:

SNIPER(1) 论文 NIPS2018

目标检测-SNIPER-Efficient Multi-Scale Training-论文笔记