• SPP-net


    前言

    论文原文

    传统的CNN网络要求固定尺寸的图像输入(比如224x224),使得数据集的图片为了适应特定尺寸,不得不剪切或扭曲。然而,剪切的图片不一定包含整个物体,扭曲的图片会导致位置错乱。最终导致识别准确率因内容缺失或错乱而只能妥协。

    为什么传统CNN需要固定尺寸的图像输入?一个CNN通常由两部分组成:卷积层和全连接层。

    • 卷积层会以滑动窗口的方式进行操作,并输出特征图。实际上,卷积层不需要固定尺寸的图像输入,也能输出不同尺寸的特征图。
    • 全连接层需要有固定长度的输入。因此,固定尺寸的限制仅来自于全连接层,而它通常存在于神经网络较深的部分。

    所以,本文提出了SPP层,它接在卷积层之后,全连接层之前。如下图所示:

    • 原本图片需要裁剪/拉伸为同样尺寸,才输入卷积层。
    • 添加SPP层后,图片不再需要作加工,直接输入卷积层。SPP层能接受不同尺寸的特征图,并输出固定长度的向量,随后输入全连接层。

    使用spp的深度神经网络

    卷积层与特征图

    卷积层和池化层都能接受不同尺寸的输入。其输出和输入的比例基本近似…

    SPP层

    卷积层能接受任意尺寸的输入,但输出的尺寸也是任意的。而全连接层要求固定长度的输入。为了满足这个条件,我们将卷积层末尾处的pooling层替换成spp层。如下图所示。首先,spp层的输入是一个特征图。在16x、4x和1x三种尺度上分别作pooling,每个空间块会使用对应的filter(本文都使用max pooling)作pooling。输出则是kM长度的向量,其中M是空间块数,k是最后一层卷积层的filter数。之后,固定长度的向量会输入到全连接层。


    举个例子:

    1. 上图中最后一个卷积层是 c o n v 5 conv_5 conv5,它输出的特征图维度为wh256,作为spp层的输入。
      spp层作了3种比例pooling。
    2. 在16x比例的pooling中,每个通道的特征都均分为了16个空间块,然后在每个空间块下作max pooling,输出长度为16的向量。256个通道下输出的向量拼接成为16*256长度的向量。
      • 4x和1x同理。其中1x又称为全局池化,它在整张图上作池化。
    3. 3种比例输出的3个向量拼接在一起,作为全连接层的输入。

    SPP层的训练

    spp层是如何做到输入任何尺寸的特征图,都能输出同样长度的向量?其实spp层是用多种参数的max pooling层组合完成效果的。

    如下图所示,假设以224*224的尺寸输入网络时,spp层由如下的3个pooling层(pool3x3,pool2x2和pool1x1)组成,其输出接入fc6。卷积层 c o n v 5 conv_5 conv5输出的特征图为13x13,所以3个pooling层的输出尺寸为3x3,3x3和1x1。

    假如在下个epoch,以180×180的图片输入网络呢? c o n v 5 conv_5 conv5的特征图输出尺寸为10x10,那么对于axa=10x10尺寸的图片,只要设置pooling参数为 w i n = ⌈ a / n ⌉ win=\left \lceil a/n \right \rceil win=a/n s t r = ⌊ a / n ⌋ str=\left \lfloor a/n \right \rfloor str=a/n,即可让输出与180-network的输出维度等同于240-network的输出了。而两个网络其它的参数是完全相同的。

    换句话说,我们只用两个共享参数的网络(两者间只有spp层的win和str参数不同),就能适应两种尺寸输入的图片了。为了节约开销,我们通常在一个epoch中使用一个尺寸的输入(比如224 x 224),并在另一个epoch中使用另一个尺寸的输入(180 x 180)。在两个epoch间,网络仅会切换spp层的滑动参数,而其它层维持不变。

    如何得到不同输入尺寸的图片? 步骤如下:

    1. 将数据集裁剪成224x224的图片,并用于第一个epoch。
    2. 在第二个epoch,将224x224的图片缩放为180x180。之后以此类推。

    在本文训练中,不同epoch应当输入一样的内容。并不是说第一个epoch里输入第一组224x224的图片,到下个epoch就输入180x180的其它图片了。图片的素材在不同epoch间是相同的。

    Q&A

    如何理解SPP层的实现?

    • 其实SPP层只是3个max pooling层,而它的win和stride参数在epoch间切换。
    • 当使用两种尺寸输入时,SPP相当于要实现两个网络,卷积层和全连接层是完全一样的,只有spp layer的参数不同(为了能输出固定长度的向量)。
    • 使用多分辨率训练。第一次224x224的图像是从原图裁剪出来的。第二次180x180的图像是从224x224的图像缩放而来的。
    • SPP-net的输出维度只取决于bin的数量和filter数,所以才叫做kM-dimensional

    SPP的multi-size training部分,它直接将224x224的图片缩放成了180x180?所以说,使用的图片都是一样的,只是大小不同?

    个人认为是的。数据集还是同一份,刚开始图片的大小不一。在224-network中,将原图剪裁出224x224,训练一个epoch。在180-network中,将224x224缩放为180x180,训练一个epoch。

    为什么第一次输入是224x224,输出是13x13,第二次输入是180x180,输出却成了10x10?缩放比例并不相等

    根据卷积层输出大小计算,卷积层的输出为O=(I-K+2P)/S+1

    总结

    所以说,SPP-net的做法只是在epoch间切换下pooling层的参数就完事了?
    SPP-net的缺点见 SPP(Spatial Pyramid Pooling)网络 结尾。

  • 相关阅读:
    套路【2】实验环境搭建
    [补题记录] Atcoder Beginner Contest 308(C~E)
    VUE-----axios
    汽车自动驾驶是人工智能吗,自动驾驶是人工智能
    神经网络(二)回归与线性模型
    如何给子DIV平均分配宽度
    【代码随想录训练营】Day51-动态规划
    计算机网络——数据链路层功能概述、封装成帧、差错控制、流量控制与可靠传输机制
    【YOLOv5入门】目标检测
    揭秘!付费会员制下的那些小心机!
  • 原文地址:https://blog.csdn.net/duoyasong5907/article/details/126808160