在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的回答 - 知乎
深度学习在 small object detection 有什么进展? - 尼箍纳斯凯奇的回答 - 知乎
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中90%的Instance都在0.472以下,充斥着大量的小物体,而ImageNet中的分布则比较均匀。所以用ImageNet预训练的模型迁移到COCO中可能产生一定的domain-shift,因此作者有了这样的思考:
浅层小物体,深层大物体
例子:SDP、SSH、MS-CNN
缺点:在浅层预测小物体时,是以牺牲语义抽象性来实现的
特征融合/特征金字塔
例子:FPN、Mask-RCNN、RetinaNet
缺点:对于very small/large objects 检测效果不是很好
CNN-B:原图训练/伪高清测试
训练用高分辨率图像,测试用经过降采样和upsample的图像。
CNN-S:低清训练/低清测试
训练用低分辨率图像,测试用降采样的图像。
CNN-B-FT:原图训练,伪高清微调/伪高清测试
训练用高分辨率图像,然后在低分辨率图像上进行fine-tune,测试用经过降采样和upsample的图像。
可以这样理解作者的三个实验:ImageNet物体大、分辨率高,而COCO目标都很小,直接迁移会有问题,作者在试图探究如何进行迁移。降采样后的小图像数据集其实对应的是COCO数据集普遍存在的小目标的情况,试图模仿COCO数据集。
因此三个网络的含义应该是:
上图是在小目标测试集上的检测效果对比,所用测试图像的尺寸都是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与MST有着很密切的联系,MST是在大的feature map上预测小物体,anchor设置的较小,在小feature map上预测大物体,anchor设置的较大,根据anchor与GT的IoU选择正例。MST网络输入是单尺度的,并没有考虑到预训练模型与输入图像尺度差异的问题。SNIP因此做了升级:
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: Efficient Multi-Scale Training
NIPS 2018
论文:https://arxiv.org/pdf/1805.09300.pdf
代码:https://github.com/MahyarNajibi/SNIPER
作者:马里兰大学
创新点:
传统的多尺度训练方案一般都使用图像金字塔,并处理金字塔层图像上的每个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数量,是基于图像中场景的复杂性,自适应调整的。
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: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两种:
每个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在速度上的优点,这是本文的精妙之处。
更多细节:
前面提取的正样本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的难分背景区域,易分背景区域直接忽略,训练速度不仅快了,也更有针对性了。
文章中称网络是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便可认定为正样本。
来看一下实验结果:
参考:
SNIPER(1) 论文 NIPS2018
目标检测-SNIPER-Efficient Multi-Scale Training-论文笔记