深度学习第26讲:目标检测算法经典论文研读之空间金字塔池化网络SPP-Net

        在上一篇论文研读中,笔者和大家一起分析了深度学习目标检测算法的开山之作R-CNN模型。对于R-CNN在目标检测上的核心思路也有了基本的认识,就是先生成候选框,再进行CNN特征提取送入分类器进行分类。但R-CNN有两个很大的问题影响了算法的整体性能。

        第一个问题在于需要将1~2k个候选框进行裁剪缩放成固定尺寸,一方面裁剪缩放后的图像存在着一定的比例失调和拉伸变形,对于后续利用CNN进行特征提取效果存在着些许影响,另一方面裁剪和缩放也会耗费一些时间。另外一个关键问题在于生成完候选框后需要将所有的候选框都送进CNN进行特征提取生成特征向量,这太耗时了,也导致了R-CNN方法速度极慢。

640?wx_fmt=png

裁剪和缩放后的图像变形

        我们来细究一下:为什么CNN的输入需要固定的图像尺寸呢?通常一个CNN包括两个部分:卷积层和全连接层(池化层类似卷积层)。卷积部分通过卷积核滑窗进行计算,并输出代表激活后的特征图,实际上卷积并不需要固定的尺寸输入,它可以通过不同尺寸的卷积核和不同的滑动步长和padding等手段产生任意尺寸的特征图。同理,池化层也不需要固定的尺寸输入限制。所以问题就出在全连接层上了,而全连接层一般位于网络的最后阶段。所以针对这个问题,何恺明大佬在R-CNN结构的基础上提出了空间金字塔池化网络(Spatial Pyramid Pooling Net),很好的解决了这一难题。

640?wx_fmt=png

SPP-Net论文摘要

        在论文中,何恺明将SPP层放在最后一个卷积层之后,利用SPP层对卷积输出产生的特征图进行池化产生固定长度的输出,再将这个输出送进全连接层。总而言之,SPP层的作用就是在卷积层和全连接层之间对卷积层的输出信息进行某种汇总,这样就可以避免在一开始就对图像进行裁剪和缩放。

空间金字塔池化的基本原理

        我们直接定位到网络的最后一个卷积层和全连接层中间,在卷积层和全连接层加一个空间金字塔池化层。或者说将最后一个卷积层之后的池化层替换成空间金字塔池化层。所谓的空间金字塔池化就是池化操作从底端一层一层往上做池化,像金字塔的形状一样,故而称之为空间金字塔池化。

        假设原图输入大小为 224x224,到第五层卷积后的特征图输出大小为13x13x256。如下图所示:

640?wx_fmt=png

        将特征图分成 1x1(金字塔底),2x2(金字塔中间)和 4x4(金字塔顶)三张子图,分别对三张子图做最大池化。输出的特征图就是 (16+4+1)x 256 的大小,即使原图输入尺寸不是 224x224,在经过空间金字塔池化后输出维度依然会是 (16+4+1)x 256 的大小,因而就消除了输入图像尺寸不一致的问题。在实际设计网络结构时,只需要根据全连接层的输入维度设计号空间金字塔的结构即可。

SPP-Net

        SPP-Net的基本流程还是和R-CNN大体差不多,都是先选择性搜索产生候选区域->CNN提取候选区域特征->送入分类器进行判别->位置精修,但是候选框的特征提取是在CNN输出特征图之上进行的,这就大大减少了卷积操作的次数,可谓是一次卷积,终身受益。利用空间金字塔池化层对特征图中每个候选框的特征向量进行固定,因而就达到后面全连接层的统一尺度输入的问题。SPP-Net与R-CNN的流程对比如下图所示:

640?wx_fmt=png

        一个3x3的空间金字塔结构配置如下:

640?wx_fmt=png

        所以,我们总结一下SPP-Net的基本思路:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。再将特征向量输入到分类器进行分类。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,相较于R-CNN来说SPP-Net的速度可谓飞速。

        从根本上而言,SPP-Net并不能算作是一种独立的目标检测网络,空间金字塔池化层可以加在任何网络结构上并提升这些网络的检测效果。论文中给四种网络结构中都添加了 SPP-Net层,结果都提升了检测准确度。

        四种网络的基本架构如下:

640?wx_fmt=png

        对四种网络添加SPP层和不添加SPP层的top1和top5错误率比较:

640?wx_fmt=png

        SPP-Net的实际检测效果:

640?wx_fmt=jpeg

SPP-Net  Tensorflow 实现代码参考:

https://github.com/chengjunwen/spp_net

参考资料:

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

往期精彩:


一个数据科学从业者的学习历程

640?

640?wx_fmt=jpeg

长按二维码.关注数据科学家养成记

640?wx_fmt=jpeg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值