SPPNet
Abstract
Key insight
- 传统的CNN要求输入图像尺寸是固定的,所以通常要改变图片的size/scale,这样会损失信息
Break point
- 提出了Spatial Pyramid Pooling,可以将任意size的feature map池化成固定大小
1. Introduction
传统CNN的问题
传统的CNN要求输入图像尺寸是固定的
- crop处理,可能不包含整个物体,还会丢失上下文信息
- warping处理,会导致图像变形
- 以上都会导致CNN对不同scale/size泛化能力不强
原因
- 全连接网络要求输入大小是固定的
SPP
- 将SPP层加在最后一个卷积层后面,然后再送入FC网络
优点
- 不管输入尺寸为多少,SPP都能生成固定尺寸的输出,这使得CNN无需固定输入图片尺寸
- CNN使用多尺度图片输入进行训练,增加了scale-invariance,减少了过拟合
- SPP运用了多尺度的信息,空间信息更加丰富,使得CNN对物体的形变更加robust
- SPP可以广泛运用在任何CNN架构上,提高performance
SPP对R-CNN的改进
R-CNN的问题
- 对生成的多个region proposal都独立提取特征,存在大量重复的计算(region有重叠部分)
改进
- 将整张图片一次性输入CNN提取特征,将提取出的region proposal的坐标映射到feature map上,共享了计算
- 使用了SPP
2. Deep Networks With Spatial Pyramid Pooling
2.1 Convolutional Layers and Feature Maps
该节主要可视化了卷积神经网络的feature map,并分析了一些filter的识别的模式(在CS231n中有提到过这种方法)
feature map的可视化
直接画图就可以了
filter识别模式的分析
- 挑出某一个卷积层中的某一个filter
- 在数据集中,寻找在该filter上有最大activation的图片(应该是通过feature map的L2 norm来判断的?不太清楚)
- 在原图中标注出activation最强的部分
可以发现特定的filter在寻找一些特定模式
2.2 The Spatial Pyramid Pooling Layer
- 将feature map(假设有K个channel)划分为固定数量的bin(见上图的网格,假设bin的数目为),在每个bin里使用Max Pooling(或者AvgPooling)
- 最终每个金字塔得到-dimension的特征向量,然后拼接起来
- 值得注意的是,最粗粒度的金字塔级别,只是用了一个bin,这等同于Global Average Pooling
2.3 Training the Network
Single-size training
- 从图上crop出大小的图片
- 目的是测试SPP的实现,并且实验表明了SPP可以提高accuracy
SPP的实现
- 使用Sliding Window策略
- 假设输入尺寸为
- 假设网格划分尺寸为
- Window Size:
- Strid:
- 实现的金字塔
- 最后拼接起来不同金字塔级别得到的特征向量
Multi-size training
- 设定一些预先选定的尺寸
- 在文中选用 和
- 如何得到的图片?
- 将的图片resize到, 使得两图只是scale不一样,但是内容布局一样
- 训练两个网络,每训练一个epoch,交换两个网路的输入图片尺寸(应该用一个网络就够了吧?)
注意在测试时不需要用multi-size
目的
- 模拟不同输入尺寸的图片的训练
3. SPP-Net For Image Classification
3.1 Experiments on ImageNet2012 Classification
数据增强
和AlexNet是一样的
- Resize图片使得(w,h)较小的一个的维度是256
- 从图片中间以及四个角crop出224大小的图片
- Horizontal flipping
- Color altering
正则化
- Dropout
学习率
- 从0.01开始,错误率不下降的时候,除以10
3.1.1 Baseline Network Architectures
3.1.2 Multi-level Pooling Improves Accuracy
- 多个金字塔层级的池化提高准确率
3.1.3 Multi-size Training Improves Accuracy
- 多输入尺度训练提高准确率
3.1.4 Full-image Representations Improve Accuracy
- 不进行crop,直接将全图送入网络训练,提了准确率
3.1.5 Multi-view Testing Improve Accuracy
固定尺度输入多个View
-
测试时,Resize图片使得(w,h)较小的一个的维度是固定的大小S(比如256之类的)
-
然后将图片再做一系列的augementation,将得到的图片都送入CNN得到score
- 在标准的10-view里面,S=256
- 从中间和四个角crop出得到五张图片
- 然后再将他们水平翻转得到10张图片
-
然后将score进行平均
多个尺度输入多个View
-
测试时,Resize图片使得(w,h)较小的一个的维度是固定的大小S
- 由于是多尺度,这里的S有224,256,300,360,448,560
-
然后将图片再做一系列的augementation,将得到的图片都送入CNN得到score
- 对于18-view
- 从中间和四个角,以及四个边的中间crop出得到9张图片
- 然后再将他们水平翻转共得到18张图片
-
然后将score进行平均
3.1.6 Summary and Results for ILSVRC 2014
3.2 Experiments on VOC 2007 Classification
3.3 Experiments on Caltech101
4 SPP-Net For Object Detection
Key Point
- 直接将一整张图片送入CNN提取特征
- 将Regin Proposal映射到feature map上
- 对proposal使用SPP
Fine-tuning
- 只fine-tune全连接网络(感觉做法有问题)
- FC6,FC7,FC8
- FC8被换成了21-way(20个类+背景)
- 初始化为Guassian(0, 0.01)
- learning rate从1e-4到1e-5
- 250K个batch使用1e-4
- 50k个batch使用1e-5
- 正负例平衡
- 每个batch中25%是正例,75%为负例
- IOU threshold
- 正例为0.5-1
- 负例为0.1-0.5
Proposal
- 使用Selective Search的fast模式
- 一张图大概提取2000个proposal
预处理
-
减去均值(per-pixel)
-
将图片resize到
特征提取
- 将一整张图送入CNN提取特征
- 用4-level的SPP()
- 总共50个bin
- 输出size为
- FC输出的IOU threshold没说
训练SVM
- IOU threshold为0.3
- 负例互相之间IOU超过70%则去除一个
- 使用了hard negtive mining的策略来训练SVM
NMS
- 使用NMS来去除多余结果
- IOU阈值为0.3
Bbox Regression
- 使用了和R-CNN里一样的边框回归来refine坐标
- IOU阈值为0.5
Mapping a Window to Feature Maps
Feature map之间坐标映射关系
我们需要知道网络里面任意两个feature map之间的坐标映射关系(一般是中心点之间的映射),如下图,我们想得到map 3上的点p3映射回map 2所在的位置p2(橙色框的中心点)
- 对于 Convolution/Pooling layer:
- 对于Neuronlayer(ReLU/Sigmoid/..) :
SPP-Net映射方法
SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的两个对应点。 有了feature map上的两队角点就确定了 对应的 feature map 区域(下图中橙色)。
- 左上角的点映射到 feature map上的使得 在原始图上感受野(上图绿色框)的中心点 与尽可能接近。
-
把原始图片中的ROI映射为 feature map中的映射区域(上图橙色区域)其中 左上角取:
右下角的点取:
下图可见
的作用效果分别是增加和减少。也就是 左上角要向右下偏移,右下角要想要向左上偏移。个人理解采取这样的策略是因为论文中的映射方法(左上右下映射)会导致feature map上的区域反映射回原始ROI时有多余的区域(下图左边红色框是比蓝色区域大的)
网友评论