论文阅读 || 目标检测系列 —— SPPNet详解

目录

1 SPPNet网络介绍

1.1 SPPNet网络处理流程

1.2 SPPNet的优点

(1)  网络出入尺寸问题

(2)  提取特征效率的问题

2 SPPNet核心算法

2.0 卷积层与特征图

2.1. SPP layer

2.2 候选区域在原图与feature map之间的映射关系

(1)  区域尺寸大小对应关系

(2)  网络中相连两层的feature map之间的坐标映射关系(一般是中心点之间)

(3)  网络中任意两层的feature map之间的坐标映射关系

(4)  候选区域到feature map的映射操作

3 网络训练阶段

3.1 训练方式

3.2 用于图像分类的SPPNet(ImageNet 2012)

(1) 训练时的设置

(2)  基准网络架构

(3)  多级池化提升准确度

(4)  多尺度训练提升准确度

(5)  全图像表示提升准确度

3.3 SPPNet用于物体检测

(1)  检测算法流程和细节

(2) 检测结果


1 SPPNet网络介绍

1.1 SPPNet网络处理流程

  • 1. 候选框提取:使用算法selective search获取输入图片的候选框,提取约2000个候选区域
  • 2. CNN+SPP+FC(与RCNN不同之处): 
    • 把整张图片输入到CNN中,一次性提取特征得到feature maps
    • 并且在feature map中找到各个候选框的映射区域
    • 对候选区域对应的feature map使用SPP(金字塔空间池化),提取出固定长度的特征向量。送入到FC
  • 3. SVM + NMS:将CNN的输出输入到SVM中进行类别判定,再使用非极大值抑制,得到最合适的框
  • 4. 修正bbox

 

1.2 SPPNet的优点

  • 1. 网络接收不同尺寸:SPP layer。避免不必要的精度损失
  • 2. CNN提取特征的效率提高:只使用CNN一次特征提取,避免了反复计算。达到每张图片全部步骤0.5s,比R-CNN快24-102倍(R-CNN对候选区域进行重复卷积计算,计算冗余)
  • 3. 多级池化使网络更加鲁棒:SPP使用了多级别的空间箱(bin),从多尺度中抽取特征,多级池化对物体的形变十分鲁棒。(滑窗池化只有一个窗口)

(1)  网络出入尺寸问题

深度卷积神经网络的基础结构:卷积层 --> 池化层 --> 全连接层。全连接层的输入维度必须提前固定的,这导致网络的输入也必须是固定的。
这就要求我们在检测图片时,需要将图片转换成固定的尺度。影响预测结果的精度:

  • 经过crop(裁剪),导致信息丢失
  • 经过warp(拉伸),变形会导致位置信息扭曲

RCNN就是如此:将输入resize到固定大小,造成信息丢失或失真
SPPNet提出:在最后一层卷积后,使用空间金字塔池化层(Spatial Pyramid Pooling)来代替普通池化层。SPP层对这些特征进行池化生成固定长度的输出,然后在输入到全连接层

 

  • 第一行:固定尺寸输入的CNN对图像处理的方式
  • 第二行:以往的卷积神经网络处理流程:固定尺寸输入--> conv+fc --> 网络输出
  • 第三行:在网络中conv和fc中间插入SPP:能够处不同尺寸的输入

(2)  提取特征效率的问题

下图是RCNN和SPP提取feature map的示意图

      

RCNN:对输入图片,使用segment selective方法提取出约2000个候选区域,然后将候选区域分别输入到CNN中。这样一张图片要经历2000次的前向传播,造成大量冗余。
SPPNet:对于输入图像,获取候选区域与全局特征图(feature map)的映射关系。将完整的输入到CNN中并且得到对应的特征向量。

2 SPPNet核心算法

在介绍SPPNet核心算法之前,强化一下卷积层与特征图。

2.0 卷积层与特征图

卷积网络部分通过【滑窗】进行计算,并输出【代表激活的空间排布的特征图】。
所以 【特征图==>响应的强度+空间位置】

我们可视化了一些特征图,如下图(c)中显示了ImageNet数据集中激活最强的图像。(例左下,第55个滤波器对圆形十分敏感)

2.1. SPP layer

上图所示的操作流程:

【input】输入为任意尺寸
【feature map】通过卷积模块最后一层时(此处为conv5),得到的特征图的大小也是不确定的
【SPP layer
        【输入】与候选区域对应的feature map 上的一块区域,约2000多个
        【输出】将feature map 分成4x4、2x2、1x1个块(Spatial Bins),然后对每块进行全局池化,得到21x256维特征向量。所以SPP层的输出,不随输入尺度的变化而变化
        【FC】接收了固定的尺寸

空间金子塔的输出维度:kM维。M代表块的数量,k代表最后一层卷积层的过滤器的数量。这个固定维度的向量就是全连接层的输入。

2.2 候选区域在原图与feature map之间的映射关系

feature map的大小是根据输入 [图片的大小] 和 [卷积层的卷积核的kernel size 和stride] 决定的。

在feature map上找到原图上对应的候选区域,两者的映射关系怎样计算呢?

即感受野大小的计算。感受野(receptive files)是指某一层输出结果中的一个元素所对应的的上一层区域大小

                      

(1)  区域尺寸大小对应关系

我们定义第l层的变量:

  • 【input size】W_{1}*H_{1}
  • 【output size】W_{2}*H_{2}
  • 【kernel size】F*F
  • 【stride】S
  • 【padding】P

则该层的输出尺寸的公式如下:

(2)  网络中相连两层的feature map之间的坐标映射关系(一般是中心点之间)

  • 对于conv/pool layer:p_{i} = s * p_{i+1} +((k_{i}-1)/2-padding)
  • 对于relu/sigmoid/...:p_{i}=p_{i+1}

仔细理解了下公式,举出下面的例子 

               

上图中,第一个方格是第二层的feature map,第二三四是第一层的feature map,是为了展示映射关系对应的过程。(理解方式有很多种,找一种自己更好理解的)

  • 找到layer2的像素值(特征值),在layer1的感受野的左上角的像素值(特征值)。映射关系为p1 = s1 * p2,此时的关系不会受到kernel size的影响
  • 讨论不同层的映射关系时,指的是区域中心点的坐标之间的对应。所以需要加上个偏量a:卷积核中心点的长度。p1 = s1 * p2 +(k-1)/2
  • 如果padding !=0,还需要加上个偏量b:-padding。p1 = s1 * p2 +((k-1)/2-padding)

(3)  网络中任意两层的feature map之间的坐标映射关系

下图是Kaiming He在ICCV15上的汇报用的PPT,讲解如何求解Receptive Field

                    

【A simple solution】

  • 何凯明在SPP-net中采用的方法。对于公式  p_{i} = s * p_{i+1} +((k_{i}-1)/2-padding)
  • 令每一层padding都为     padding = [k_{i}/2]                 \Rightarrow p_{i} = s \cdot p_{i+1} +((k_{i}-1)/2+[k_{i}/2]])
    • k_{i}为奇数时,   (k_{i}-1)/2+[k_{i}/2]=0               \Rightarrow p_{i}=s\cdot p_{i+1}
    • k_{i}为偶数时,   (k_{i}-1)/2+[k_{i}/2]=-0.5         \Rightarrow p_{i}=s\cdot p_{i+1}-0.5
  • p_{i}是坐标值,不能取小数。故此时基本认为\dpi{120} p_{i}=s_{i}\cdot p_{i+1},感受野中心点的坐标p_{i}只与前面一层p_{i+1}有关

【A general solution】

  • 是把公式 p_{i} = s * p_{i+1} +((k_{i}-1)/2-padding)  级联整合一下
  •       

(4)  候选区域到feature map的映射操作

SPPNet是把原始ROI的左上角和右下角 映射到feature map 上的两个对应点。有了feature map 上的两对角点就确定了相应在feature map上的区域

                             

从原图坐标(x,y)到特征图中坐标(x^{'},y^{'})的映射关系为

  • 前面每层都进行填充,得简化公式:p_{i}=s\cdot p_{i+1}
  • 将简化公式进行级联得到:p_{0}=S\cdot p_{i+1},其中(S=\prod_{0}^{i}s_{i}
  • 对应feature map上(x^{'},y^{'}),它在原始图的对应点为  (x,y)=(Sx^{'},Sy^{'})
  • 所以将原始图片中的候选框,映射到feature map 中,则有关系:
    • 左上角:x^{'}=[x/S]+1;    y^{'}=[y/S]+1
    • 右下角:x^{'}=[x/S]-1;    y^{'}=[y/S]-1

3 网络训练阶段

spp不支持反向传播,spp那个时候,由于时代的局限性,没有backward,不能更新卷积层。是到了roi pooling之后才做出backward的

前面的CNN是Imagenet上面训练的,然后直接不动。

3.1 训练方式

论文中训练网络分为两种:single-size,Multi-size

【single-size】

理论上,SPPNet的输入为任意尺度。实际上,为了方便计算,caffe等实现中的 GPU、CUDA等比较适合固定尺寸输入。所以训练时输入时固定尺寸

  • 输入为224x224
  • 在conv5之后的特征图为13x13(a*a)
  • 金字塔层bins(n*n),将pooling层作为 sliding window pooling
  • windows_size=[a/n]向上取整,stride_size=[a/n]向下取整

此时,对于pool 3*3:[13/3]向上取整=5,sizeX=5;[13/3]向下取整=4,stride_size=4。
当输入为180x180时,conv5之后为10x10,使用相同的计算方式计算

    

【Multi-size training】

使用两个尺度进行训练:224x224、180x180。训练时,224x224通过crop得到,180x180的通过缩放224x224得到。之后迭代训练,即用224的图片训练一个epoch,再用180的图片训练一个epoch,交替进行。

两种尺度下,在SPP后,输出特征维度都为 (9+4+1)x256,参数共享,后面跟全连接层。

收敛速度:和单尺度训练的相近
目的:模拟测试时不同的输入尺度

3.2 用于图像分类的SPPNet(ImageNet 2012)

论文当中讲述了在三种数据集上的实验:ImageNet 2012、VOC 2007 Classification、Caltech101。这里对第一个数据集实验进行总结。

(1) 训练时的设置

  • 数据集1000类别的Image2012
  • 数据增强方式:翻转、裁剪(图像缩放到较小的维度为256,从中裁出224x224)、颜色变换
  • 初始学习率:0.01,。当错误率停滞后除以10
  • 最后两个FC后面使用Dropout

(2)  基准网络架构

SPP的优势,是和使用的卷积神经网络无关

  • -ZF-5:基于Zeiler和Fergus的“快速”模式[4]的网络结构。数字5代表5层
  • -Convnet*-5:基于Krizhevsky等人工作[3]的修改。在conv2和conv3(而不是conv1和conv2)之后加入了两个池化。这样每一层之后的特征图就和ZF-5的尺寸一样了
  • -Overfeat-5/7:基于Overfeat论文[5],使用了[6]的修改。对比ZF-5/Convnet*-5,这个架构在最后一个池化层产生了更大的特征图(18x18 而不是13x13)。还在conv3和后续的卷积层使用了更多的滤波器(512)。

基准模型中,最后一层池化后会产生6x6的特征图,然后-FC4096--FC4096--FC1000--softmax。
我们针对ZF-5进行了70个epoch,另外两个使用了90轮。

 

(3)  多级池化提升准确度

  • 方式:(1) 上表中的SPP层,使用了4层金字塔,6x6、3x3、2x2、1x1(共50个块)。 (2) 为了试验的公平比较,我们仍然使用标准的10-view预测法,每一个view都是一个224x224的裁切。保证其他因素尽量一致
  • 结果:表中的(b)显示了使用单尺度训练的结果,比原本网络top-1的错误率都有所下降,最大提升(top-1 error,1.65%)
  • 结论:这些提升只能来自于多层池化
  • 其他实验:排除多层池化带来更多参数使网络变优的原因
    • 使用另外一个SPP(4x4,3x3,2x2,1x1,共30个)训练另一个ZF-5网络,此时网络fc6的输入是30x256(原本的是36x256),有更少的参数。网络的top-1/top-5错误率是35.6/14.04,和50块金字塔网络结果相近,都好于no-SPP基准网络

(4)  多尺度训练提升准确度

  • 方式1:(1) 训练尺度为224和180,测试尺度为224;(2) 仍然使用标准的10-view预测法
  • 结果:表中的(c)显示了使用多尺度训练的结果:Overfeat-7的Top-1 错误率降到29.68%,比非SPP网络低了2.33%,比单尺寸训练降低了0.68%。
  • 方式2:将方式1中的输入尺寸改为[180;224]之间多个尺寸;
  • 结果:SPP-net(Overfeat-7)的top1/5错误率是30.06%/10.96%。
          Top-1错误率比方式1略高,可能因为224这个尺寸(测试时用的尺寸)被更少的访问到。但结果仍然比单尺寸版本要好。
  • 结论:使用多尺度训练会提升网络性能

(5)  全图像表示提升准确度

  • 方式:保持图片比例不变情况下缩放到min(w;h)=256,然后输入SPPNet;同时将图片中央224x224裁剪这一单一视角输入SPPNet。
  • 结果:见上图。验证了ZF-5/Overfeat-7,top-1错误率在全视图表示中全部下降。
  • 结论:这说明保持完整内容的重要性。即使网络训练时只使用了正方形图像,却也可以很好地适应其他的比例。

3.3 SPPNet用于物体检测

(1)  检测算法流程和细节

(待检测图片经过CNN的次数为1,最后一个池化更换为SPP。除了前面两点,在物体检测方面SPPNet 和RCNN流程基本一致)

  • 候选框提取:使用选择性搜索算法selective search的“fast”模式对每张图片产生2000个候选窗口。
  • 通过CNN:缩放图像以满足min(w;h)=s,输入到CNN中获取特征图。(暂时使用ZF-5的SPPNet模型,单一尺度训练)
  • 通过SPP+FC:在每个候选窗口,使用一个4级的SPP (1x1,2x2,3x3,6x6,共50块)。每个窗口产生12800为特征,将这些特征传入CNN中的FC得到特征
  • SVM:针对每个分类训练一个二分线性SVM分类器
  • NMS:对上面的窗口分类结果使用非极大值抑制

训练SVM时
【正样本】真实标注的窗口;【负样本】与真实框的IoU不超过0.3的候选框,如果一个负样本和另一个负样本的IoU超过0.7就被移除。【标准的难负例挖掘算法】使用这个算法训练SVM。这个步骤只迭代一次。【训练时间】全部20个分类训练SVM小于1小时。

多尺度特征预测的改进
方式1:将图像缩放成min(w;h)=s,s=>S{480;576;688;864;1200},然后针对每个尺度去计算conv5的特征图。然后一种结合不同尺度特征图的策略是逐通道池化。
方式2:对于每个候选窗口,选择单一尺度s \in S来缩放图片,使该候选窗口的大小接近224x224。然后计算出该候选窗口的特征值

只调优全连接层
对于任意的尺寸窗口,都是从conv5的特征图中池化而来,为了简单起见,只调优全连接层。

结构:特征提取网络+SPP之后,fc更换为 --FC4096--FC4096--FC21。
权重初始化:FC8的是高斯分布\delta =0.01
学习率:修正所有的学习率为1e-4,再将全部三层调整为1e-5。
调优时样本:【正样本】与标注窗口的IoU达到 [0.5,1]的窗口;【负样本】IoU为 [0.1,0.5)的。在mini-batch中,25%是正样本。
另外:我们使用学习率1e-4训练了250k个minibatch,然后使用1e-5训练50k个minibatch(这部分关于学习率使用的描述,自己没有理清楚)。
训练时间:由于只训练了fc层,所以速度很快,在GPU上2个小时(不包括预缓存特征所需要的1小时)

(2) 检测结果

 

 

 

https://blog.csdn.net/u011974639/article/details/78053203
https://blog.csdn.net/mengduanhonglou/article/details/78470682

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值