[深度学习]Object detection物体检测之SPPNet(3)

目录

1.论文的综述

2.Spatial Pyramid Pooling结构

3.Training the Network训练网络的细节

4.SPP-NET FOR OBJECT DETECTION


论文全称:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

论文地址:https://arxiv.org/pdf/1406.4729.pdf

论文一作是kaiming He,怎么到处都是你,真的强的不像话呀。

1.论文的综述

当下卷积神经网络的弊端是输入必须是fixed size统一大小,然而这么做是很不科学的,为了把图片送进我们训练好的网络我们必须crop或者warp,具体看下图。crop的坏处是使图像不完整,warp的坏处是使图像产生了几何畸变。这两种情况都会降低分类的准确率,并且统一的输入大小不符合现实生活中的实际情况,因为很多物体没有固定的长宽比,而照片也没有固定的像素。

所以作者就思考一种解决办法,他们分析其实传统卷积网络无非就是卷积部分加上全连接部分,卷积分部提取图像特征其实并非一定要统一的size,只是后面的全连接需要统一大小的feature,所以作者在卷积层和全连接层之间加入一个Spatial Pyramid Pooling空间金字塔池化,它的作用是使得大小不一致的feature变成固定大小的feature,来匹配全连接层。下面是传统方法和本论文方法的区别图:

那么SPPNet有什么特性使它特别适合CNN呢?

  1. SPP能够生成固定长度的输出,而不考虑输入大小,而在以前的深度网络中使用的滑动窗口池化却不能;
  2. SPP使用multi-level spatial bins多级空间箱,而e sliding window pooling滑动窗口池化只使用单个窗口大小。多级池已被证明是鲁棒的对象变形。
  3. 由于输入尺度的灵活性,SPP可以在可变尺度下提取特征。(这里第三点有点疑惑,论文里面这说的不明白)

无论是在testing还是training,可变输入都是允许的,这就可以增加尺度不变性,减少过拟合。

论文还开发了一种简单的多尺度训练方法。对于接受可变输入大小的单个网络,通过共享所有参数的多个网络来近似它,而每个网络都使用固定的输入大小进行训练。在每个epoch中,我们用给定的输入大小训练网络,然后为下一个epoch切换到另一个输入大小。实验表明,这种多尺度训练与传统的单尺度训练是收敛的,可以提高测试精度。

其实SPPNet原本是一个更关注于classification的问题,同时论文里面也提到它适用于很多其他的问题例如一个就是object detection。作者分析了RCNN的弊端是费时,因为不同的region会重叠,所以会重复计算feature。而SPPNet的优势是只需要进行一次卷积的过程,而不在乎有多少个region。这个方法比R-CNN快100倍都不止。
SPPNet继承了深度CNN feature map的强大功能,也继承了SPP在任意窗口大小上的灵活性,从而获得了出色的准确性和效率。这使得它能够满足现实生活中应用的实时性。

2.Spatial Pyramid Pooling结构

如上图所示,Spatial Pyramid Pooling替代了最后一个池化层(在最后一个卷积层之后的池化),通过local spatial bins这种结构来维护空间信息,这些spatial bins的大小与图像大小成正比,并且无论图像大小如何,spatial bins的数量都是固定的。这与之前的深层网络的滑动窗口池化形成了对比,后者的滑动窗口数量取决于输入大小。Spatial Pyramid Pooling的输出是k*m dimension向量,其spatial bins的数量记为M (k是最后一个卷积层中的filter层数)。fixed-dimensional固定维向量是完全连通层的输入的大小。

3.Training the Network训练网络的细节

关于如果做到根据图像的比例来调整spatial bins的大小,这里论文提供了一个例子:

为了最后得到3*3,2*2,1*1的3-level pyramid pooling,sizeX的大小和stride的大小会根据最后一层卷积输入的大小来调整,这里三个spatial bins的sizeX分别为5,7,13,stride分别为4,6,13。我们可以算一下其中第一个,(13-5)/4+1确实是等于3。

这里训练网络一开始只是Single-size training(240*240),后来变成了Multi-size training(240*240和180*180),输入的数据只是分辨率大小不同,并不是从240*240的图像随机crop出180*180。但是为了实现Multi-size training,还是需要增添一个fixed-size-input (180×180) network,使得180*180输入可以被接受。

具体怎么训练呢?其实是先训练240*240网络的一个batch,再转换到180*180网络训练一个batch,这样循环得到的结果跟single size training收敛的结果一致。

可是在测试集的时候是怎么做到接受不同的大小的输入的呢?其实这里有一个误区,我们以前学的网络模型都是固定大小的输入,但其实输入多大的图像卷积都是没问题的,输入多大卷积输出就多大而已。这里测试的时候比较简单粗暴的直接把不同size的图像输入卷积层。

以下就是SPPNet在ImageNet 2012的实验结果:

4.SPP-NET FOR OBJECT DETECTION

SPPNet方法是从feature map的区域中提取窗口级的特征,而R-CNN直接从图像区域中提取。这么做的好处就是降低了卷积过程中重复计算所带来的时间消耗,下面这张图形象的展示了这个问题:

RCNN的整个过程是这样的:

  1. 通过selective search为每一张待检测图片提取出2000左右的候选框;
  2. 每张图片中的候选框调整到227*277大小,然后分别输入到CNN中提取特征;
  3. 提取到的特征后,利用svm对这些特征进行分类识别;
  4. 利用NMS算法对结果进行抑制处理。

2000个左右的region proposal都要使用CNN来提取特征,计算量是很大的。然后利用这些特征进行分类时,同样需要很大的内存。

SPPNet的整个过程:

  1. 同样是使用selective search算法为每一张待检测的图片提取出2000左右的候选框,这一点和RCNN相同;
  2. 特征提取阶段,整个图片输入到SPPNet中,提取出整张图片的feature map,然后将原图上的候选框映射到feature map上。然后对各个候选框对应的feature map上的块做金字塔空间池化,提取出固定长度的特征向量;
  3. 使用SVM算法对得到的特征向量分类识别;
  4. 使用NMS做极大值抑制。

最大的区别是第二个步骤,只需要一次卷积而不用在意有多少的候选框,这使得提取特征的时间大大缩短。

那么具体是怎么做映射的呢?其实这跟感受野有关,feature map中的一个像素点其实对应于原始image的一个感受野范围。映射关系还跟padding有关,具体可以查看论文。简单点说,如果一次卷积或者pooling过程之后的输出,假设输出的一个像素点(x,y),映射到输入的中心点是(x`,y`),则(x,y)跟输入的(Sx`,Sy`)那么多的像素点有关(即为感受野),S就是之前的stride,看看下图卷积的过程就明白了。如果是多层的卷积和pooling,那么S代表之前所有的stride的乘积。

关于x和x·的对应关系,主要找出左上角和右下角两个点就能确定整个区域了。下面就是论文给出两个分别找出左上角右下角的公式。

当然了这只是对应于论文里面的模型有效,如果改变了padding的值就要向x添加适当的偏移量。

图片四

猜你喜欢

转载自blog.csdn.net/sinat_33487968/article/details/83829862
今日推荐