【目标检测论文2】——SPPNet

本文接【目标检测论文1】——RCNN  https://blog.csdn.net/qq_29750461/article/details/84560001

简单来讲,SPPNet 就是 引入空间金字塔池化来改进RCNN。

先来复习下 RCNN 执行流程。

图中输入图像中,红色框表示 selective search 输出的可能包含物体的候选框(ROI)。

 读过 RCNN 的大家都知道,RCNN 在执行过程中,要对 所有 selective search 选取的 ~2000个候选区域,均送入卷积层进行提取特征信息,并分类。这个其实是将一张图片处理了2000次,相当耗时的。SPPNet地提出,为了实现,在图像进行卷积后获得的 feature map上提取ROI特征,这样就只需要在整幅图像上做一次卷积。减少了识别的耗时。【如下图展示】

虽然总体流程还是 Selective Search得到候选区域->CNN提取ROI特征->类别判断->位置精修,但是由于所有ROI的特征直接在feature map上提取,大大减少了卷积操作,提高了效率。

不过是有两个问题存在:

有两个难点要解决:

1. 原始图像的ROI如何映射到特征图(一系列卷积层的最后输出)

2. ROI的在特征图上的对应的特征区域的维度不满足全连接层的输入要求怎么办(又不可能像在原始ROI图像上那样进行截取和缩放)?

针对第一个问题:

首先来明白感受野的概念。卷积网络中,某层的输出结果中一个元素所对应输入层区域的大小,称为感受野(receptive field)

如下图展示了 5*5 的感受野:

这个5×5 的区域就叫做感受野,表示一个隐藏层神经元在输入层的感受区域。这 5×5=25 个连接对应有25个权重参数 ww,还有一个全局共用的基值 b。

1 卷积核输出尺寸计算公式
计算卷积核输出size的公式推导:

15×15 的输入图片 (W=15)
5×5 的卷积核 (K=5)
滑动步长(stride)为1 (S=1)

W=15,K=5,S=2 对应的隐藏神经元是多少?

蓝色表示左上角的 5×5 感受野,绿色是其向右滑动轨迹。

因为 W=15,K=5,S=2
一次向右滑动对应 6个隐藏神经元 =>

= 5次滑动 + 1个原始感受视野

= 10个绿色区域/步长2 + 1个原始感受视野

= (W−K)/S+1
得到隐藏层对应的计算公式: 隐藏层边长 =(W−K)/S+1​ 。

有时候为了控制输出的隐藏层空间分布会在输入层外围做零填充,假设填充 P个像素, 此时:隐藏层边长 =(W−K+2P)/S+1。特别的,当 S=1时, 设置零填充为 P=(K−1)/2 可以保证输入层与输出层有相同的空间分布。

因为 W=15,K=5,S=2
一次向右滑动对应 6个隐藏神经元 =>

= 5次滑动 + 1个原始感受视野

= 10个绿色区域/步长2 + 1个原始感受视野

= (W−K)/S+1
得到隐藏层对应的计算公式: 隐藏层边长 =(W−K)/S+1​.

有时候为了控制输出的隐藏层空间分布会在输入层外围做零填充,假设填充 P个像素, 此时:隐藏层边长 =(W−K+2P)/S+1 。特别的,当 S=1 时, 设置零填充为 P=(K−1)/2 可以保证输入层与输出层有相同的空间分布。

对于 Convolution/Pooling layer:W(i)=S(i)⋅(W(i)+1−1)+K(i)−2⋅padding
对于Neuron layer(ReLU/Sigmoid/…) : W(i)=W(i+1)

上面只是给出了前一层在后一层的感受野,如何计算最后一层在原始图片上的感受野呢?如下图,如想计算Map 3上某个点在Map 1上的感受野,只需要从后向前级联一下就可以了,即先计算最后一层到倒数第二层的感受野,再计算倒数第二层到倒数第三层的感受野,依次从后往前推导就可以了。

2 感受野上的坐标映射
通常,我们还需要知道网络里面任意两个feature map之间的坐标映射关系(一般是中心点之间的映射),如下图,我们想得到map 3上的点p3映射回map 2所在的位置p2(橙色框的中心点)

计算公式:

对于 Convolution/Pooling layer:pi=Si⋅pi+1+((Ki−1)/2−padding)
对于Neuron layer(ReLU/Sigmoid/…) :pi=pi+1

论文里提出 :在SPP-net中,假设(x’,y’)表示特征图上坐标点,(x,y)表示该坐标点在原始输入图像上的对应点。则有结论 (x,y)=(S * x’,S * y’) 其中S代表所有卷积层和池化层的stride 乘积。

SPP-Net中采用的公式其实就是巧妙的化简一下公式 pi=Si⋅pi+1+((Ki−1)/2−padding),令每一层的padding都为padding=⌊Ki/2⌋⇒pi=Si⋅pi+1+((Ki−1)/2−⌊ki/2⌋)
当Ki为奇数时 ((Ki−1)/2−⌊Ki/2⌋=0所以 pi=Si⋅pi+1
当Ki为偶数时 ((Ki−1)/2−⌊Ki/2⌋=−0.5所以 pi=Si⋅pi+1−0.5
而 pi 是坐标值,不可能取小数,所以基本上可以认为 pi=Si⋅pi+1 。公式得到了化简:感受野中心点的坐标 pi 只跟前一层 pi+1和 stride 有关。
SPP-Net的RoI映射实际上就是把原始RoI的左上角和右下角映射到 feature map上的两个对应点。 有了feature map上的两对角点可以确定对应的 feature map 区域(下图中橙色)。



则有: 左上角点 x’= ⌊x/S⌋+1 右下角点 x’=⌈x/S⌉-1 (为了处理有小数的情况 同时左上角点和右下角点都向图像内侧近似,所以左上角加一 右下角减一 同时为了减小这种近似产生的误差 所以左上角向下取整 右下角向上取整)。

S为所有卷积层和池化层的步长之积。

解决第二个问题:

为什么全连接层需要固定长度的输入?

(有全连接的存在深度网络需要固定输入尺寸)

卷积层的参数和输入大小无关,它仅仅是一个卷积核在图像上滑动,不管输入图像多大都没关系,只是对不同大小的图片卷积出不同大小的特征图,但是全连接层的参数就和输入图像大小有关,因为它要把输入的所有像素点连接起来,需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的feature的大小。

因此,固定长度的约束仅限于全连接层。以下图为例说明:

作为全连接层,如果输入的x维数不等,那么参数w肯定也会不同,因此,全连接层是必须确定输入,输出个数的。

传统的CNN由于全连接层的存在,限制了输入必须固定大小(比如AlexNet是224x224),所以在实际使用中往往需要对原图片进行crop或者warp的操作:

1  crop:截取原图片的一个固定大小的patch
2  warp:将原图片的RoI缩放到一个固定大小的patch
无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中:

因为:crop:物体可能会产生截断,尤其是长宽比大的图片。warp:物体被拉伸,失去“原形”,尤其是长宽比大的图片


而且,从生理学角度出发,人眼看到一个图片时,大脑会首先认为这是一个整体,而不会进行crop和warp,所以更有可能的是,我们的大脑通过搜集一些浅层的信息,在更深层才识别出这些任意形状的目标。

SPP为的就是解决上述的问题,做到的效果为:不管输入的图片是什么尺度,都能够正确的传入网络。

左边是训练流程,右边是测试流程,注意SPP-Net是直接用SPP池化层的输出特征作Bounding Box的回归,不像R-CNN是用Conv5的特征。

SPP—空间金字塔池化

   把SS提出的区域建议映射到conv5输出的feature map上(如果原图输入是224x224,对于conv5出来后的输出,是13x13x256的),然后把候选区域进行网格划分,3种划分方案[超参] (1×1,2×2,4×4),共21个方格,每个方格都会覆盖不同数量的多个像素点,然后每个方格里面都做max pooling,所以每个方格最后输出的都是一个像素的值,因此最后SPP pooling之后输出21段定长的特征——(16+4+1) x 256维(如果原图的输入不是224x224,出来的特征依然是(16+4+1) x 256维),最后将feature融合后送入FC层,实现了用SPP pooling层替换Conv5层的功能。

SPP-Net训练流程
1 仍然是取一个pre-train的CNN模型

2 计算出所有SS区域的SPP pooling层的一维特征

3 使用步骤2提取的SPP的特征来fine-tune后面的全连接层(FC6,FC7,FC8),全卷积层不参与再训练(可改进)

【注】与R-CNN的区别:

             特征不同:R-CNN是Conv5之后的pooling层的特征送入FC层
             fine-tune不同:R-CNN是fine-tune所有层,SPP-Net只fine-tune全连接层
            fine-tune好之后,同R-CNN一样,用FC7层的特征训练SVM分类器

4 用SPP pooling来训练Bounding Box回归模型

SPP-Net缺点


SPP-Net只解决了R-CNN卷积层计算共享的问题,但是依然存在着其他问题:

(1) 训练分为多个阶段,步骤繁琐: fine-tune+训练SVM+训练Bounding Box
(2) SPP-Net在fine-tune网络的时候固定了卷积层,只对全连接层进行微调,而对于一个新的任务,有必要对卷积层也进行fine-tune。(分类的模型提取的特征更注重高层语义,而目标检测任务除了语义信息还需要目标的位置信息)

 

借鉴:

https://blog.csdn.net/ibunny/article/details/79397399

https://zhuanlan.zhihu.com/p/24774302

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值