SPPNet总结

SPPNet总结背景:RCNN使用CNN作为特征提取器,首次使得目标检测跨入深度学习的阶段。但是在RCNN中,因为全连接层的神经元个数是固定的(权重矩阵的维数是固定的),所以采取对于每一个区域候选都需要首先将图片放缩到固定尺寸(227×227),然后为每个区域候选提取CNN特征的方案。这里存在两个瓶颈,第一重复为每个regionproposal提取特征是及其费时的,SelectiveSearch对于每幅图片产生2k左右个regionproposal,也就是意味着一幅图片需要经过2k次完整的CNN计算得到最终的结果。

大家好,又见面了,我是你们的朋友全栈君。

背景:

RCNN使用CNN作为特征提取器,首次使得目标检测跨入深度学习的阶段。但是在RCNN中,因为全连接层的神经元个数是固定的(权重矩阵的维数是固定的),所以采取对于每一个区域候选都需要首先将图片放缩到固定尺寸(227×227),然后为每个区域候选提取CNN特征的方案。这里存在两个瓶颈,第一重复为每个region proposal提取特征是及其费时的,Selective Search对于每幅图片产生2k左右个region proposal,也就是意味着一幅图片需要经过2k次完整的CNN计算得到最终的结果。第二对于所有的region proposal放缩到固定尺寸会导致我们不期望看到的几何形变,而且由于速度瓶颈的存在,不可能采用多尺度或者是大量的数据增强去训练模型,这就导致它的性能必然较差。

改进:

对于背景所描述的问题,既然只有全连接层需要固定的输入,那么只需在全连接层前加入一个网络层,然他对任意的输入产生固定的输出就行了。SPPnet在这个想法上继续加入SPM的思路,SPM主要的思路就是对于一幅图像分成若干尺度的一些组块,比如一幅图像分成1份,4份,8份等。然后对于每一块提取特征然后融合在一起,这样就可以兼容多个尺度的特征了。SPPnet首次将这种思想应用在CNN中,对于卷积层特征我们首先给它分成不同的尺寸,然后每个尺寸提取一个固定维度的特征,最后拼接这些特征就是一个固定维度的输入了。

模块设计:

金字塔池化层:(用一个空间金字塔池化层替换掉了最后一个池化层)
在这里插入图片描述

黑色图片代表卷积之后的特征图,接着我们以不同大小的块来提取特征,分别是4×4,2×2,1×1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial bins),我们从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出,若前一层卷积层使用k个卷积核,则最后的输出为21*k维的特征向量,这个固定维度的向量就是全连接层的输入。

训练阶段:

理论上讲训练时网络的输入可以是任意尺寸的图片,但是使用GPU时最好是固定尺寸的图片,所以想出来能够在保持金字塔池化层奏效的同时又能够充分利用GPU的训练方法。

单尺度训练:
例:训练时输入统一是224×224的图片,在经过conv5的卷积后是一个13×13(a×a)的特征图,我们希望把它分别池化成3×3,2×2,1×1(n×n)的bins,我们要通过类似于滑动窗口的池化操作来实现,因此我们需要定义这个滑动窗口的尺寸和步长,具体定义为:
windows_size=[a/n] 向上取整 , stride_size=[a/n]向下取整。

多尺寸训练:

带有SPP的网络可以应用于任意尺寸,为了解决不同图像尺寸的训练问题,我们考虑一些预设好的尺寸。现在考虑这两个尺寸:180×180,224×224。我们使用缩放而不是裁剪,将前述的224的区域图像变成180大小。这样,不同尺度的区域仅仅是分辨率上的不同,而不是内容和布局上的不同。对于接受180输入的网络,我们实现另一个固定尺寸的网络。本例中,conv5输出的特征图尺寸是axa=10×10。我们仍然使用win = 上取整[a/n],str = 下取整[a/n],实现每个金字塔池化层。这个180网络的空间金字塔层的输出的大小就和224网络的一样了。

这样,这个180网络就和224网络拥有一样的参数了。换句话说,训练过程中,我们通过使用共享参数的两个固定尺寸的网络实现了不同输入尺寸的SPP-net。为了降低从一个网络(比如224)向另一个网络(比如180)切换的开销,我们在每个网络上训练一个完整的epoch,然后在下一个完成的epoch再切换到另一个网络(权重保留)。最后发现多尺寸训练的收敛速度和单尺寸差不多。

多尺寸训练的主要目的是在保证已经充分利用现在被较好优化的固定尺寸网络实现的同时,模拟不同的输入尺寸。除了上述两个尺度的实现,我们也在每个epoch中测试了不同的sxs输入,s是从180到224之间均匀选取的。后面将在实验部分报告这些测试的结果。
注意,上面的单尺寸或多尺寸解析度只用于训练。在测试阶段,是直接对各种尺寸的图像应用SPP-net的。

测试阶段:

1.首先通过选择性搜索(SS),对待检测的图片进行搜索出2000个候选窗口。
2.把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。(意思是需要将用SS生成的proposals从原图映射到特征图)
3.采用SVM算法进行特征向量分类识别。

优点:

1.最后能够形成拥有多个尺度特征的特征向量
2.它的输入是可以是不同尺寸的图片,并且不需要再用形变将proposals变为固定的尺寸了

缺点:

1.仍然用的是SS的方法提取proposals
2.仍然用的是SVM分类器,训练时极占内存

准确率:

在VOC2007上MAP能达到60.9%

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134599.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • word文档怎么打印成册子_零基础学word文档

    word文档怎么打印成册子_零基础学word文档Word2003是微软公司提供的一款文字处理软件,可以对文字进行排版和编辑、分段等各种处理,最终将编辑好的内容打印出来,是办公室一族中必备的办公软件之一。Word2003具有一个“书籍折页”的功能,能够在一页纸上打印两页的内容,打印后可以从中缝装订成折叠的小册子,更便于携带和阅读,具体怎么来设置呢?就让Word联盟为大家带来分享!动画演示:①打开“页面设置”对话框,切换到

    2025年9月18日
    6
  • java executeupdate,Java线程安全中的executeUpdate方法[通俗易懂]

    java executeupdate,Java线程安全中的executeUpdate方法[通俗易懂]IhavemultiplethreadstryingtoupdateaMySQLdatabase?isexecuteUpdatemethodthread-safetouse?解决方案No,itisnotthread-safetouse.Infact,ifsomeotherthreadusesastatement,andthenanot…

    2022年10月20日
    2
  • JVM内存模型(通俗易懂)

    JVM内存模型(通俗易懂)1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。2.jdk、jre、jvm是什么关系?(1)JRE(JavaR

    2022年4月28日
    78
  • 100个句子记完7000个单词_有趣的童年趣事100字

    100个句子记完7000个单词_有趣的童年趣事100字1.WithmyownearsIclearlyheardtheheartbeatofthenuclearbomb.我亲耳清楚地听到原子弹的心脏的跳动。2.Nextyearthebeardedbearwillbearadearbabyintherear.明年,长胡子的熊将在后方产一头可爱的小崽。3.EarlyIsearchedth

    2022年8月24日
    9
  • 查看gcc版本信息和关联信息的命令[通俗易懂]

    查看gcc版本信息和关联信息的命令[通俗易懂]1、查看gccg++的版本以及其链接的信息:ls/usr/bin/gcc*-l                       ls/usr/bin/g++*-l2、如果本系统安装有多个版本的gcc,g++,想用哪个版本直接更改链接即可:首先删除原有链接:sudorm/usr/bin/gcc然后创建新的链接:sudoln–

    2022年6月26日
    56
  • Ubuntu下内核编程之第一个模块helloworld[通俗易懂]

    Ubuntu下内核编程之第一个模块helloworld[通俗易懂]模块是驱动开发的必经之路,这也是我们在前边要构建内核源码树的目的所在。因为模块属于kernel编程了,和用户空间的c语言变成不同。他要依附于内核源码树的存在而存在,下面就开始我们的第一个模块的编写吧。     Ubuntu下内核编程之第一个模块——我的叫jun_module。随你怎么起名。以下是建立的全过程:     1、首先肯定是编写模块的源代码,和Makefile。我们建立一个专用

    2022年10月8日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号