OverFeat论文解析
文章目录
本篇博客将要解析的论文是OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks,论文地址为:https://arxiv.org/abs/1312.6229
一、介绍
本文是Pierre Sermanet、David Eigen、Xiang Zhang、Michael Mathieu、Rob Fergus、Yann LeCun等人于2013年发表的一篇文章,该论文提出的模型最终获得了2013年ILSVRC(ImageNet Large Scale Visual Recognition Challenge)分类任务的第四名,以及定位和检测任务的第一名。
该论文基于ConvNets,高效地实现了多尺度滑窗方式,采用多任务学习的方式,同时提升了分类、定位和检测子任务的性能。
二、拟解决的问题
1. 特征提取
在深度学习出现之前,分类、定位以及检测任务的特征都需要手工进行提取,难度以及扩展性都不佳;即使专业人员进行了十分精细地分析获取了相关特征,最终的任务完成效果也不是很好。主要原因就是在于待检测的目标在尺度、位置等方面变化较大,难以提取一种具有高度识别力的特征,因此,本文希望提出一种特征提取的方式,能够适用于分类、定位以及检测任务,并且能够比较好的解决上述问题,由此,诞生了OverFeat。
OverFeat是一种特征提取器,类似于传统图像处理中的SIFT算子、HOG算子一样,并不是指某个网络。
2. 视觉任务
本文希望采用多任务学习的方式,去综合提高各个子任务的性能。
下面明确一下本文需要完成的三个子任务:分类、定位以及检测任务是什么。
- 分类任务:根据图片中的主要目标为该图片分配唯一标签。由于一张图片可能包含多种潜在的但未被标注的目标,因此,每张图片允许进行五次猜测,也就是所谓的Top-5 Error。
- 定位任务:与分类任务一样,一张图片只有一个对应类别标签,因此同样可以有五次猜测的机会,但不同的是,每次猜测时还需要将目标的位置用bounding box的形式标注并返回,如果猜测的box与真实的box的IOU至少大于50%并且对应类别也正确,则定位成功。
- 检测任务:与定位任务不同的地方是每张图片可能包含若干甚至是不包含目标,false positive会通过MAP指标进行惩罚。
三、解决方法
为了解决目标在尺度、位置等方面变化较大的问题,本文采取了一种基于ConvNet的高效多尺度滑窗方法。具体步骤如下:
- 采用多尺寸、多位置滑窗的方式去进行检测
-
首先每张图片通过resize操作获取多个尺度的图片(本文采用的是六个尺度,具体可参加原论文Appendix)
-
然后对于各个尺度的图片的各个位置,获取一个固定大小的窗口,这个窗口具体由特征提取器的stride决定(在本文中,由于使用了offset max-pooling,特征提取器的stride为12,因此,可以认为滑窗的大小为12*12)
滑窗存在的一个问题就是可能难以完整包含目标,有利于分类,但不利于定位和检测,因此,有了后续的步骤2和3。
-
对每个窗口,在进行分类的同时,还完成与该窗口相关的bounding box的位置和大小进行预测
通过预测的bounding box,从而对每个位置的滑窗进行修正。
-
为每个类别在各个尺度和位置进行置信度的累积
与传统的目标检测不同,在各个尺度、各个位置获得大量潜在bounding box后,本文采用的是一种“累积”而不是抑制(非极大值抑制)的方式去合并得到的大量box,提高了最终检测的置信度。
为了利用各个子任务间的相关性,提高各个任务的性能,本文采用了一种多任务学习的方式。
所有的各个子任务之间,共享特征。
- 首先基于分类任务,采用滑窗的方式,在各个尺度图的各个位置上,预测对应滑窗中的目标的类别分数,并以此训练出一个特征提取器以及一个分类器。
- 接着进行定位任务。同样采用滑窗方式,在各个尺度图的各个位置上,预测对应滑窗中的目标的bounding box,此时再结合分类任务得到的同样尺度图同样位置滑窗对应的类别分数,即可完成定位任务。定位任务中使用的特征提取器和分类任务相同,但重新训练了一个回归器。
- 最后是检测任务。与定位任务类似,只不过在最终获取结果时有所不同,以及还需要考虑一个背景分类。
四、分类任务
本文主要是基于12年的ILSVRC的冠军分类模型AlexNet改进得到,本文对AlexNet的模型结构进行了修改,并改善了推理步骤。
1. 模型设计
模型主要基于AlexNet进行改进,具体改动为:
- 没有使用归一化层;
- 使用不重叠的池化(pooling stride>=kernel size)
- 前两层的feature map尺寸更大(由于采用了更小的stride,提升精度,降低速度)
本文有两种模型结构——fast以及accurate,两者具体结构如下图所示:
2. 推理步骤
AlexNet在测试阶段使用了一个很常见的TTA(Test Time Augmentation)技巧——Multi View Voting。就是在测试时,对一张图片,获取其四个角以及中心区域的各个view,并加以水平翻转,最终得到10个view,送入训练好的网络进行推理,得到10个分类分数结果,取均值作为最终的分类分数,从而做出预测。
这种方法存在一些问题,例如:容易忽略很多区域(由于view通常都小于原图),并且存在很多重复计算(由于各个view之间存在大量重叠)。并且AlexNet只使用了一个尺度,也不利于多尺度信息的获取。
本文则采用了多尺度密集滑窗的方式去解决了上述问题。并且由于ConvNet天然的共享权值的特性,能够非常高效地完成密集滑窗预测。具体会在后文进行详细阐述。
3. OffSet Max-Pooling
根据文中的模型结构,对于fast(4 * 2 * 2 * 2)以及accurate(2 * 3 * 2 * 3)模型来说,由于stride conv以及pooling的存在,原图经过特征提取后得到的特征图的尺寸为原图的1/36,也就是说特征提取器OverFeat的stride为32,意味着对于提取到的特征图来说,每个位置对应着原图大概32*32的一个window,这个window较大,较为粗糙,不利于目标的识别。当然我们也可以通过减小conv的stride以及pooling层的个数来降低整体的stride的,但是这样会减小感受野,不利于分类的准确性。
为了在不降低感受野的情况下,提升特征的尺寸,本文提出了OffSet Max-Pooling。
这里推荐一篇博客,这篇博客比较清楚地讲解了OffSet Max-Pooling的基本原理,就不重复造轮子了。
这里谈谈个人理解:OffSet Max-Pooling本质上是一个stride为1的Max Pooling。
Max-Pooling与Average-Pooling是目前深度学习领域最常见的两种Pooling方法,其大致具有两大作用:一是融合信息,二是降低分辨率。融合信息用的是很简单的max或者是sum,而降低分辨率这一操作则是由于其stride通常大于1的缘故,当Conv操作stride大于1时,其实也可以完成降低分辨率的操作。那么这样看来的话,OffSet Max-Pooling实际上是将Max-Pooling中的融合信息的功能保留了下来,而去除了其降低分辨率的功能。
下图是文章中对OffSet Max-Pooling一个1D的阐述:
例如对于上图来说,假设现在进行的stride为1,kernel size为3的Max-Pooling操作,那么顺着这个20维的向量,我们将依次得到红1,绿1,蓝1,红2,绿2,蓝2,。。。,红6,绿6,蓝6这个18维的向量,此时我们将得到的这个18维向量进行调整,使得红色、绿色、蓝色各自按照顺序聚集在一起,然后将调整后的向量送入kernel size为5的分类器中进行分类,每个颜色的6维向量将产生两个输出,最后将这6个输出进行交织,即可得到OffSet Max-Pooling的结果。
总之,通过OffSet Max-Pooling可以将最终提取得到的特征图的stride降低为12,提高分类准确率。
4. 卷积网络与滑窗法的关系
卷积网络诞生之初定下的权值共享特点,为其在图像视觉领域大发异彩奠定了基础。这里Copy一张卷积神经网络的经典动图:
上图的上半部分是本文的训练过程。输入图片经过全卷积的特征提取器之后,由14 * 14的图变为5 * 5的特征图,再在特征图上使用kernel size为5的分类器进行分类,最终得到一个1 * 1的输出,也就是最终的分类分数。
而下半部分则是本文的测试过程。测试过程中,输入的图片比训练时的图片要大,例如变为16 * 16,此时左上角的14 * 14部分,通过卷积以及分类器能够得到一个1 * 1的分类结果,同样,右上角以及左下角、右下角的各个14 * 14的部分将会各自产生1 * 1的分类结果,最终产生一个2 * 2的分类结果,最终对四个结果取平均,即可得到最终分类分数。这个操作和Multi-View的操作很像,但是基于卷积神经网络,这种多视角的方法很容易可以得到实现。
需要注意的一点是,为了实现上述操作,需要将classifier改为全卷积,主要是利用1 * 1卷积实现,这里给出一篇博客
后续这个内容我会在Fully Convolution Network中详述。
以上,便是OverFeat在分类任务中的主要内容。
五、定位任务
定位任务则是在分类任务的基础上进行了bounding box的回归。在分类任务中,我们已经为不同尺度图的各个位置均预测出了对应的分类分数,在定位任务中,我们将classifier替换为一个类似的regressor,输出为每个位置对应的bounding box的四个顶点的坐标。由此,我们便可以得到十分密集的bounding box,最后,采用一种贪婪算法对结果进行合并,挑选出合并结果中分类分数最高的box作为该图片的定位结果。
上图中总共分为四个部分。
- 第一部分为普通的分类器输出的类别分数以及对应的window。图中黄色的框,可以看到它们的大小全部一致,实际上它们是由feature map映射到原图中对应的window,大小应该与特征提取器的stride有关,大致为32 * 32。红色箭头指的红色框为对应尺度图片对应的feature map。此时采用了基本的多尺度滑窗方法。
- 第二部分为使用了OffSet Max-Pooling后的结果。首先通过feature map可以看出,蓝色框对应的feature map比红色框对应的feature map大了很多,应该是三倍,因此,也产生了更为密集的Windows。由于特征提取器的stride下降为了12,此时,window的大小大致应该为12*12。
- 第三部分则加上了Regressor。文章指出,在训练过程中,仅仅使用了与真实标注框ground truth的IOU大于50%的window用于训练,因此可以看出,在第三部分中的框明显少于第二部分,并且形状也都由于训练而各自不同。
- 第四部分则是基于贪婪算法进行合并并挑选剩余box中分类分数最高的box作为最终结果。
这里的贪婪算法较为简单,就不做详细阐述,整体思想大致就是:
- 在多个尺度图上运行分类网络,每个尺度图的结果都选取最好的个window加入到集合中
- 同时也运行框回归网络,得到所有的box(由于IOU的约束,此时所有的box数量也不会特别多,因此没有选取所谓的top-k个)
- 挑选出两个最为相似的box进行合并,若这两个最相似的box的相似度(本文是采用两个box之间的距离进行描述,距离越大,相似度越低)都已经很低了,则停止算法,否则,则将两个box进行合并(合并采用的是两个box坐标的均值)
至此,便可完成定位任务。
六、检测任务
这个部分论文没有详述,感觉有点模糊,个人感觉应该和定位任务差不多,只不过需要添加一个背景类别,同时,在完成box的合并后,不能简单挑选分类置信度最高的那一个box,可能需要其他策略,具体不详。
七、总结
OverFeat作为one-stage目标检测算法的元老级选手,其蕴含的滑窗思想、多任务学习思想对于后续的目标检测算法都有着深远的影响,虽然年代比较久远,开源代码也比较缺失,但其引用量也已有3000+,足见其影响力。
这篇博客是本人的第一篇论文博客,可能写得不好甚至是有错误的地方,希望大家发现后可以在评论区指出,也希望自己的一些理解可以帮助大家对这篇论文了解得更清楚明白。最后附上一些个人阅读论文时参考的一些优质博客。
八、参考文献
[1] https://blog.****.net/hjimce/article/details/50187881
[2] https://zhuanlan.zhihu.com/p/66154322