目标检测论文阅读:An Analysis of Scale Invariance in Object Detection – SNIP
5/25更新:关于对第一个实验的一些理解,更新部分对这篇论文的理解
5/5更新:关于为什么作者认为过于large物体检测困难的原因:原理和开篇提到的小物体检测有点类似,anchor本质上是大小固定的box,过小物体会出现IoU过低,过大物体也容易出现IoU过低,结果就是容易漏检……不过总的来说,只是相对的。
另外,https://zhuanlan.zhihu.com/p/36431183 里Naiyan Wang大神更新了对于这篇文章的解读,比我单纯搬运翻译深刻很多,有兴趣的朋友不妨去围观。
An Analysis of Scale Invariance in Object Detection – SNIP
论文链接:https://arxiv.org/abs/1711.08189
代码链接:https://arxiv.org/abs/1711.08189(尚没有完全公开)
CVPR2018的文章,这篇文章主要的研究点是目标检测中的小物体问题。小物体检测一直是目标检测中的难题,做过实验的同学应该都知道数据集中small类的AP基本是最低的,主要原因是两个,一个就是CNN网络提取到的语义化特征和分辨率之间的矛盾;另一个也是我最近才想明白的,就是目前的目标检测都采用了Faster RCNN的Anchor思想,小物体有时候即使全部在Anchor内,也容易因为小面积导致IoU过低。
本文的主要工作:
1. 通过实验验证了upsampling对于提高小目标检测的效果
2. 提出了一种Scale Normalization for Image Pyramids的方法
1. Background & Related Work
先以COCO数据集为例,目前普遍使用的ImageNet网络训练得到的模型作为预训练模型
可以看到的是,COCO90%的Instance的大小都在0.472以下,和ImageNet差别非常大,这一方面说明了类似COCO这样的数据集中存在着大量的小物体,另一方面也说明了ImageNet预训练的模型在迁移到样本大小差异较大的COCO中时很可能产生一定的domain-shift偏差。因此作者产生这样的motivation:
- 现在检测网络为了提高对小目标的效果,都采用upsample的方法,这个真的是必要的吗?我能不能直接用低分辨率的图像不做upsample来训练网络(需要调小strides)?
- 能不能通过挑选样本的方式来增加网络效果的,比如我upsample调整了大小以后,只用64x64~256x256的ground truth来训练?用所有的gt来训练真的更好吗?
实际上,现在有很多针对小目标的措施和改良,包括:
- 使用dilated/strous或者deformable这类特殊的卷积来提高检测器对分辨率的敏感度
- 最常用的,upsample来rezie网络输入图像的大小
- 使用FPN这种把浅层特征和深层特征融合的,或者最后在预测的时候,使用浅层特征和深层特征一起预测;也有比较直接地在浅层和深层的feature map上直接各自独立做预测的;这个也就是我们常说的尺度问题(scales)
2. 探究性实验
作者在这一步主要探究的是低分辨率图像+特定的改良网络结构是否会有比较好的效果。
他训练了三个网络:
训练样本都是从ImageNet的样本库中取出,然后先降采样,然后再upsample放大回来,但是这么一折腾,降采样后的图像分辨低了,upsample后分辨率也不会得到提高,这样可以还原小目标低分辨率和面积小的特点。
这三个网络:
- CNN-B使用高分辨率图像训练,分类经过降采样和upsample的图片
- CNN-S使用低分辨率图像训练,分类经过降采样的图片
- CNN-B-FT使用高分辨率图像训练,然后在低分辨率图像上fine-tune,分类经过降采样和upsample的图片
本质上,其实三个网络都是在对小目标进行分类,不过CNN-S因为本身网络结构就不同,输入比较小,不需要经过upsample。最后结果,CNN-B-FT准确率最高,CNN-S其次,作者认为这是因为模型从高分辨率图像中得到了充分的学习。
这就说明了,训练样本和输入样本如果分辨率存在太大误差,performance必然下降。与其为了小目标而专门使用改变网络结构(CNN-S),直接upsample和使用高分辨率图像预训练得到的模型是更好的选择(CNN-B-FT)。
其实和一些人讨论的时候,好像都觉得这个实验对主旨并没有太大帮助。我个人又重新看了几次论文,我是这样理解的:ImageNet物体大、分辨率高,而COCO目标都很小,直接迁移会有问题,作者在试图探究如何进行迁移。降采样后的小图像数据集其实对应的是COCO数据集普遍存在的小目标的情况,试图模仿COCO数据集。因此三个网络的含义应该是:CNN-B,ImageNet预训练后的参数直接用来给COCO这种分辨率低的数据集用;CNN-S,不用ImageNet这种高分辨率的数据集做训练,我把网络就设置成适合COCO这类数据集的,训练和测试都用分辨率低的数据集;CNN-B-FT,ImageNet人家都训练好了,不用白不用,但是用之前,先用低分辨率数据集做一下fine-tune改良效果。
不过这个实验室确实没什么太大的用处。好像只是证明了fine-tune的必要性。
然后还有第二个实验,这个实验主要是想探究图像分辨率对结果的影响:
这个是只检测小目标的不同检测器的mAP值,然后800all和1400all分别是图像统一resize到短边为800、1400的大小,然后使用所有样本进行训练的模型;1400<80px是upsample后只用小目标进行训练的模型……而MST是随机在低分辨率和高分辨率之间采样进行训练的模型
作者想通过这个实验说明如下:
- upsample确实一定程度上可以提高性能,但是并不显著,这是因为Upsample提高了小目标的检测效果,但会让本来正常大小或者本来就大的目标过大,性能下降
- 训练网络需要使用大量样本,样本损失会导致性能下降
- 随机在分辨率之间采样的效果也不好,虽然你的样本满足了多尺度条件,但是还有其它原因限制了性能
本质上,这是因为CNN网络没有尺度不变形,没有把scale这个隐藏变量学习到的机制,只能通过大量参数来强行记忆不同scale的物体。而下面部分谈到的方法也很可能只是治标不治本,关键还是怎么把scale这个隐藏变量抽离出来,甚至可以直接学习;或者直接赋予网络学习scale的能力。
3. IPN与SNIP
作者的主要思路就是在训练和反向传播更新参数时,只考虑哪些在指定的尺度范围内的目标,由此提出了一种特别的多尺度训练方法,即SNIP(Scale Normalization for Image Pyramids)。
如上图所示,作者在训练时划分了三个尺度,对应三种不同分辨率的图像。每个分辨率i下的RoI都有其指定范围,如果gt的box大小在这个范围内,就被标记做valid,否则就被标记为invalid。
在生成Anchor并给Anchor分配label的时候,检查该Anchor是否和某个invalid gt box的overlap超过0.3,若存在,则该Anchor会被视作invalid Anchor;若不存在,则会被视作valid Anchor……这些invalie anchor在train的时候都会被无效化,也不会加入到反向传播的过程中从而对参数产生影响,相当于在每个分辨率上,只对大小合适的目标进行训练,这就符合了作者设计的初衷。相应的,在inference时候,如果区域面积在那个分辨率的指定范围外,也同样会被抛弃,最后,在进行rescale和NMS……
思想很简单,但是效果很好,实现起来要考虑的因素还是比较多的:
1. 作者使用的是Deformable RFCN detector而不是常见的一般卷积,当然受制于实验自身,需要作出一定的改变
2. 作者使用的网络结构是Dual path networks(DPN)和ResNet-101,由于需要内存很大,为了适应GPU内存,作者对图像进行了采样,具体方法是选取一个1000x1000的包含最多目标的区域作为子图像,然后重复该步骤直到所有目标都被选取
3. 作者为了提升RPN的效果,尝试了使用7个尺度,连接conv4和conv5的输出等等;当然还有其他一些设置,这里就不详细提了
由于代码还没有公布,一些细节问题还无法得知。
这个是最终的在COOC数据集上的结果,可以看到效果很好:
因为个人对文中提到的一些网络结构不是很了解,而且代码也没有放出来,因此估计要等代码放出、自己也补充一些相关知识才能有更深入的理解了。在此仅仅把自己的一些理解和困惑写下来,望交流和批评指正。