目录
2.2 候选区域在原图与feature map之间的映射关系
(2) 网络中相连两层的feature map之间的坐标映射关系(一般是中心点之间)
(3) 网络中任意两层的feature map之间的坐标映射关系
3.2 用于图像分类的SPPNet(ImageNet 2012)
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) 区域尺寸大小对应关系
我们定义第层的变量:
- 【input size】
- 【output size】
- 【kernel size】
- 【stride】
- 【padding】
则该层的输出尺寸的公式如下:
(2) 网络中相连两层的feature map之间的坐标映射关系(一般是中心点之间)
- 对于conv/pool layer:
- 对于relu/sigmoid/...:
仔细理解了下公式,举出下面的例子
上图中,第一个方格是第二层的feature map,第二三四是第一层的feature map,是为了展示映射关系对应的过程。(理解方式有很多种,找一种自己更好理解的)
- 找到layer2的像素值(特征值),在layer1的感受野的左上角的像素值(特征值)。映射关系为
,此时的关系不会受到kernel size的影响
- 讨论不同层的映射关系时,指的是区域中心点的坐标之间的对应。所以需要加上个偏量a:卷积核中心点的长度。
- 如果padding !=0,还需要加上个偏量b:-padding。
(3) 网络中任意两层的feature map之间的坐标映射关系
下图是Kaiming He在ICCV15上的汇报用的PPT,讲解如何求解Receptive Field
【A simple solution】
- 何凯明在SPP-net中采用的方法。对于公式
- 令每一层padding都为
- 当
为奇数时,
- 当
为偶数时,
- 当
是坐标值,不能取小数。故此时基本认为
,感受野中心点的坐标
只与前面一层
有关
【A general solution】
- 是把公式
级联整合一下
-
(4) 候选区域到feature map的映射操作
SPPNet是把原始ROI的左上角和右下角 映射到feature map 上的两个对应点。有了feature map 上的两对角点就确定了相应在feature map上的区域
从原图坐标到特征图中坐标
的映射关系为
- 前面每层都进行填充,得简化公式:
- 将简化公式进行级联得到:
,其中(
)
- 对应feature map上
,它在原始图的对应点为
- 所以将原始图片中的候选框,映射到feature map 中,则有关系:
- 左上角:
- 右下角:
- 左上角:
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:对于每个候选窗口,选择单一尺度来缩放图片,使该候选窗口的大小接近224x224。然后计算出该候选窗口的特征值
只调优全连接层
对于任意的尺寸窗口,都是从conv5的特征图中池化而来,为了简单起见,只调优全连接层。
结构:特征提取网络+SPP之后,fc更换为 --FC4096--FC4096--FC21。
权重初始化:FC8的是高斯分布。
学习率:修正所有的学习率为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.youkuaiyun.com/u011974639/article/details/78053203
https://blog.youkuaiyun.com/mengduanhonglou/article/details/78470682