通过空间金字塔的使用, 能够输入任意大小的图像而不需要裁剪, 这样避免了因为裁剪而带来的损失.
其次通过卷积计算整个图像的特征图, 然后使用proposal映射特征图提取特征进行后续预测边界框, 使得目标检测的速度比R-CNN提升很多倍.
流行的CNN输入都是固定大小的图片, 对于任意大小的图片,当前的解决方法是:
1. 裁剪: 这容易导致区域不包括完整的目标
2. 扭曲: 导致了不想要的集合形状.
都影响精度.
其实卷积层不需要一个固定的输入大小, 输入大小往往是由FC层限制的(需要一个固定大小的特征向量作为输入).
本文的两个贡献是:
(1)使用了图像金字塔: 是Bag-of-Words模型的扩展, 把图片从粗到细分层不同的级别, 然后在他们之间汇合局部特征.
(2)SPP层(在FC和conv层之间):
优点:1.产生固定输出,无视大小. 2.用多层空间, 而普通pool只有一层.多层可以对目标变形鲁棒. 训练时每一轮迭代用不同的输入层网络输入不同尺寸的图片, 但是都共享参数. 3.SPP在不同的尺寸特征的提取关键在于灵活的输入.
代码: http://research.microsoft.com/en-us/um/people/kahe/
本文生成特征图没有固定输入大小. 这些特征图都是通过合传统卷积方法相似的方式生成的. 在这些方法中, SIFT向量或者图片块被密度提取, 并且编码. 比如通过向量量化, 稀疏编码, 或者Fisher kernels. 这些编码特征由特征图组成, 通过Bag-of-Words(BoW)或者空间金字塔池化. 同样的, 深度卷积特征也可以通过相似的方法池化.
BoW可以生产固定长度的特征向量, 图像金字塔改善了BoW通过局部空间bins的池化, 从而包含了空间信息,这些空间bins的大小与图像大小成正比,因此无论图像大小如何,bins的数量都是固定的.
在每个空间bin, 最大池化在每个滤波器都响应. 空间金字塔池化的输出是k*M维度向量(k:conv5的滤波器数量, M:bins数量)
可以输入任意比率和尺度, 输入不同的尺度图片, 则提取特征在不同的尺度, 尺度对于网络的精准度非常重要.
粗糙的金字塔层只有一个bin(覆盖整个图片), 这事实上是一个global pooling操作.
single-size training
固定大小的输入, 裁剪为了数据扩增. 假设conv5的输出为aXa, 金字塔某层有nXn个bins, 使用滑动窗口池化, 窗口大小=ceil(a/n), stride=floor(a/n). 串联L层作为FC的输入. 图四是3层金字塔样例.
单一尺度训练的目的是开启多级别池化行为.
Multi-size training
都是相同的滑动窗口计算方式, 窗口大小=ceil(a/n), stride=floor(a/n). 所以输出相同的大小.
在训练时同一轮使用相同的尺度, 轮一轮之间使用不同尺度, 是为了减少切换尺度的开销.
图片冲缩放为256, 从四个角度裁剪224X224. 水平反转和颜色变化图像增强.
最后两层FC使用Dropout. learning rate = 0.01,停滞时/10.
3.1.1 Baseline Network Architectures
在四个CNN上实现(其中包括修改版)
3.1.2 Multi-level Pooling Improves Accuracy
表2中使用了4层金字塔{6x6, 3X3, 2X2, 1X1}.
多层池化的收益不是源于参数的增加, 而是更好的鲁棒性.
3.1.3 Multi-size Training improves accuracy
表2所示, 训练时先是使用224和180两种尺度的图片, 测试时使用224图像.
之后使用[180,224]之间的任意尺度, 但是结果有些下降, 这可能是因为测试时224这个尺寸被更少的访问到
3.1.4 Full-image representations improve accuracy
将图像保持比例不变的情况下缩放到min(w;h)=256. 将整个图片输入SPPNet. 为了公平比较, 也计算中央224X224裁切这一单项图的准确度.
对比表2和表3, 结合多种视图大体上要好于全图像视图. 但是全视图仍然有价值:
(1): 结合几十个尺度视图的训练, 如果额外再加两个全图像视角, 仍然提高精准度.
(2): 全视图和传统方法保持了一致, 对整张图像进行编码的SIFT向量被池化在一起.
(3): 图像恢复类似的任务, 需要相似度评分而不是分类得分, 一个全图像视角就会成为首选(语义分割也是需要全图像像素).
3.1.5 Multi-view Testing on Feature Maps
(多视图, 从多个角度去学习)
3.1.6 Summary and Results for ILSVRC 2014
略
略
略
回顾模型R-CNN: 提取出proposal region 然后进行训练, 对于每一个proposal的映射缩放到固定大小, 然后使用SVM.
R-CNN的主要问题是训练时间(每个提取的窗口都要训练, 重叠区域训练冗余), 测试时主要时间瓶颈是特征提取.
SPPNet是在整个图像训练完之后, 对以selective search选出来的窗口映射特征图, 然后是SPP层, 不需要重新调整大小.
1. 使用selective选择候选窗口.
2. resize图像min(w,h)=s, 然后使用基于ZF-5的SPPNe从整个图像提取特征.
3. 每个候选窗口用4层空间金字塔(1X1, 2X2, 3X3, 6X6, 共50bins) 最后生成256X50维表示对于每个窗口.
4. 把上述的特征提供给FC层之后, 在使用SVM训练.
负的样例为IoU<=30%. 如果一个负例与另一个负例重叠超过70%就会被移除. 用standard hard negative mining训练SVM. 这步迭代一次. 测试时使用非极大值抑制.
min(w,h)=s belong S={480, 576.....}. 对于每一个尺度计算特征图. 合并这些尺度特征的一个策略是逐个channel池化. 还有另外一个更好的方案, 对于每一个候选窗口, 选择一个单一的尺度s, 令缩放后的候选窗口的尺度接近224. 然后从这个尺度抽取的特征图去计算窗口的特征. 如果这个预定义的窗口接近足够密集, 则窗口近似于正方形. 我们的方法粗略地等效于将窗口缩放到224×224,然后再从中抽取特征。但我们的方法在每个尺度只计算一次特征图,不管有多少个候选窗口。
datasets: Pascal VOC 2007数据集.
结果比较差的原因是: 本文fc层是使用image region预训练, 然而在检测实例中他们是用feature map region预训练. 特征map region可以有强大的激活附近的窗口边界, 但是图片区域可能没有. 可以微调来解决这个问题. 微调fc层(ftfc67).
使用ZF-5结构的R-CNN得到效果更好这源于ZF-5有更好的结构
表11也包括附加方法. Selective search使用空间金字塔在SIFT特征映射上. DPM和Reginlet是基于HOG特征. .....
略
首先预训练另一个网络在ImageNet, 使用相同的结构但是不同的随机初始化, 然后重复上文的检测算法. 表12.
给定两个模型,我们首先使用每个模型对测试图像的候选框进行打分。然后对并联的两个候选框集合上应用最大化抑制。一个方法比较置信的窗口就会压制另一个方法不太置信的窗口.
略.
SPP对于处理不同的尺度、尺寸和长宽比是十分灵活的解决方案.