原文链接:https://arxiv.org/abs/1406.4729

按照发展的时间线走,在正式进行 fast R-CNN 等工作的介绍之前,还是简单概括一下 SPPNet 吧,毕竟也是 KaiMing 大神的作品。

文章要点

解决带有全连接层的 CNN 只能固定输出图片尺寸的问题。而解决的方式就是使用空间金字塔池化(Spatial Pyramid Pooling,SPP)的操作,在需要固定输入维度的全连接层前面加入 SPP 层,由此构建 SPPNet。

问题铺垫

.

目标检测: SPPNet

因为当前的神经网络都是需要固定的输入图像尺寸,224x224 等,一般都是使用直接裁剪(crop)或者 wrap 的方式,但是 crop 可能只截取图像的一部分,wrap 存在形变,各有各的缺点,这样均有可能损失准确率,而且在某些目标尺度多样的课题上采用固定的输入尺寸也未必合适。 由此引出思考,如何能对任意尺度的图片进行操作?

.

目标检测: SPPNet

文中给出了 SPP 的方法,它是词袋(bag-of-words)的一个拓展,如上图是中间卷积层的卷积核对某些局部特征的响应,而这些同类的特征在不同尺寸的感受野中,包括不同图片的不同位置都有,所以特征图不仅包含了对某个特征的反映强度,同时包含了特征所在的空间信息。值得注意的是,一些传统方法的特征图也都没有对输入尺寸做限制,且有些方法反而还要在多尺度的图像上进行操作。这里 SPP 主要有以下几点好处

  • SPP 可以不论输入的尺寸,输出都是同一尺寸
  • SPP 使用多级空间池化,比单级池化更有鲁棒性
  • SPP 可以在不同尺寸上提取特征

SPP 用在分类中

.

目标检测: SPPNet

由上图主要及前面的图片可以看出,SPP 在分类任务中的使用主要是放在全连接层前面,然后对输入的每一个通道的特征图都做一个多尺度的分块池化操作,尺度由细到粗,最后形成一个固定长度的特征向量,再输入到全连接层,文中在不同的分类网络上验证了 SPP 带来分类性能的提升。

SPP 用在检测中

.

目标检测: SPPNet

对于目标检测问题,多尺寸的问题尤为明显,所以一些传统的方法, DPM 是从 HOG 特征图上提取特征的,Selective search 则是在编码后的 SIFT 特征图上提取特征,Overfeat 也是从卷积神经网络的窗口上进行特征提取。这里 SPP 在目标检测领域也是采用了同样的方法, SPP 用在 R-CNN ,但是有别于 R-CNN,SPP 是输入整张图片,然后在 SPP 层前面的特征图中找到对应的 region proposal 的位置,然后进行一个多级池化的操作(有别于分类问题中对整张特征图进行池化),由此,每个 region proposal 都产生多级池化后的特征图并拼接在一起。 R-CNN 是每张图片用 SS 的方法提取 2000 个 region proposal 然后重复训练多次来特取特征, 而 SPPNet 则是整张图片提取特征(可能同一张图片采用不同尺寸输入网络中),然后从对应的目标窗口产生多级的池化特征,耗时的卷积操作只做一个,因此在速度上有了很大的提升。

这里还需要提的就是 region proposal 坐标映射的问题,即从原图直接映射到当前尺寸的特征图中,文中是对真值框的左上角和右下角两个点的坐标进行映射,且左上角 floor(x/S)+1 , 即除以分辨率变化倍数,向下取整,然后加1; 右下角是 ceil(x/S)-1,即除以分辨率变化倍数,向上取整,然后减1。

目标检测: SPPNet