SSP-Net论文详解

2024-03-20 12:40
文章标签 详解 论文 net ssp

本文主要是介绍SSP-Net论文详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SSP-Net

SPP-net主要是在R-CNN的基础上进行改进的,但是它仍旧继承了R-CNN的多阶段的处理过程:

  1. Extract region proposal,使用selective search的方法提取2000个候选区域
  2. Compute CNN features,使用CNN网络提取feature map
  3. Classify regions,将提取到的feature输入到SVM中进行分类
  4. Non-maximum suppression,用于去除掉重复的box
  5. Bounding box regression,位置精修,使用回归器精细修正候选框的位置

但它同时也指出了R-CNN存在的一些不足之处:

  • R-CNN对于每个region proposal都重复的使用CNN提取特征,这是非常消耗时间的,使得特征提取成为测试时的一个时间瓶颈
  • 对于不同size的region proposal的feature map,都需要resize到固定大小才能输入到FC layer或SVM分类器,resize会导致图片形变,影响最终的结果。

因此,SPP-net对R-CNN做了改进来解决这些问题,如图1所示,将原来R-CNN中红色框的区域改成了蓝色框的区域,这样改动主要解决了两方面的问题:

  • 直接一整张图输入CNN网络,提取整个图片的特征,然后再根据region proposal的位置来在整个feature map上截取出对应的feature就好啦,这样就避免了重复性用CNN对每个region proposal单独提取特征。
  • 第二点就是在原来的CNN网络的conv5层后加入了SPP layer,这样就可以不需要warp region proposal了,因为SPP layer可以接受不同size的输入,并可以得到相同尺寸的输出。

在这里插入图片描述

3.1 特征提取(Extract Feature)

我们知道在SPP-net中,一整张图输入CNN网络中,然后经过5个卷积层得到整个图的feature map,然后我们需要从这整个feature map上截取出每个region proposal对应的feature,例如图2中,如何在feature map中得到原图中蓝色的region对应的feature呢?我们知道一般要定位一个矩形框,只要知道中心点的坐标和矩形框的宽高就可以啦。所以我们需要根据原图中的region proposal推导出对应的feature map的中心点和宽高就行了。这就需要我们找到卷积网络中两个卷积层之间的映射关系:包括边的映射和点的映射。

img

3.1.1 边的映射

假设 c o n v i conv_i convi 的输出为 c i ∗ c i c_i * c_i cici ,即 c o n v i + 1 conv_{i+1} convi+1 的输入为 c i ∗ c i c_i*c_i cici ,kernel size为 k i k_i ki ,padding为 p p p,stride为 s s s ,那么 c o n v i + 1 conv_{i+1} convi+1 的输出为:

c i + 1 = c i − k i + 2 p s + 1 c_{i+1} = \frac{c_i-k_i+2p}{s}+1 ci+1=sciki+2p+1

因此两个卷积层之间的边的变化比例为 c i + 1 c i \frac{c_{i+1}}{c_i} cici+1

3.1.2 点的映射

(1)有规律的网络:对于有规律的网络,像VGG16,统一使用(3, 3)的卷积核和(2, 2)的池化尺度,这样就使得特征图的尺寸成倍的减少,那么feature map之间的映射关系就是简单的倍数关系,例如在conv5层中中心点的坐标为(2, 2), 那么在conv4中对应点的坐标就是(4, 4)。

(2)无规律的网络:那对于无规律的网络来说,这种映射关系就不是简单的倍数关系了,但是也是有规律可循的,只是比较难理解,我看好多博客里都是直接给公式,没有推到过程,虽然我也没有推导出来,我只能尽力帮大家理解公式,哈哈哈!好了,先上公式:

img

其中, p i p_i pi c o n v i conv_i convi 层上某个点的位置, s s s 是stride, k i k_i ki 是kernel size, p i + 1 p_{i+1} pi+1 c o n v i + 1 conv_{i+1} convi+1 层上对应于 p i p_i pi 的点的位置。好了,接下来我们分几种情况解释这个公式:

a. 当 p a d d i n g = ( k i 2 ) padding=(\frac{k_i}{2}) padding=(2ki) 的下采样时 ,那么当 k i k_i ki为奇数的时候, ( ( k i − 1 ) 2 − p a d d i n g \frac{(k_i-1)}{2}-padding 2(ki1)padding) 为0,当 k i k_i ki 为偶数的时候, ( ( k i − 1 ) 2 − p a d d i n g \frac{(k_i-1)}{2}-padding 2(ki1)padding) 为0.5,又因为特征图中的坐标值不能取小数,因此可以认为 k i − 1 2 \frac{k_i-1}{2} 2ki1 为0,那么 p i = s ∗ p i + 1 p_i=s*p_{i+1} pi=spi+1 ,如下图所示。

img

b. 当 p a d d i n g = 0 padding=0 padding=0时,那么中心就偏移了 ( k i − 1 ) 2 \frac{(k_i-1)}{2} 2(ki1) ,因此输出的size相当于在上面的基础上加一个偏移,所以 p i = s ∗ p i + 1 + ( k i − 1 2 ) p_i=s*p_{i+1}+(\frac{k_i-1}{2}) pi=spi+1+(2ki1) ,如果不是很理解,请看下面的示例:

img

c. 当 0 < p a d d i n g < k i / 2 0<padding<k_i/2 0<padding<ki/2 时,那么中心就偏移了 ( k i − 1 ) / 2 − p a d d i n g (k_i-1)/2-padding (ki1)/2padding ,因此输出的size则是相当于在上式的基础上减去一个 padding ,所以 p i = s ∗ p i + 1 + ( k i − 1 2 ) p_i=s*p_{i+1}+(\frac{k_i-1}{2}) pi=spi+1+(2ki1) ,如果不是很理解,请看下面的示例:

img

因此,按照上边的公式找到边和点的映射关系就可以推出原图的region proposal在feature map中的位置。

3.2. SPP Layer

3.2.1 Why we need SPP?

众所周知,我们训练CNN时需要输入固定size的图像,这主要是受CNN中的全连接层所限制。因为卷积层计算的方式类似于滑窗,因此对于不同size的输入,卷积层都可以正确计算。但是对于连接数固定的全连接层,例如4096*1000,那么这个全连接层的输入必须是4096维,否则就会出现错误。因此在训练CNN之前都需要先把图片resize到一个固定的尺寸,常见的resize方法有两种,如图6所示:

img

​ 图6 crop和warp

  • crop:这种方法就是从原图中裁剪出固定大小的图片,这样的方式会使得部分图像的信息丢失。
  • warp:这种方法就是直接将图片resize到规定的大小,这样会导致图片发生形变。

可以看出,固定输入图片的size会导致诸多问题。那么怎样才能设计出一个不需要固定size的CNN网络呢?答案就是使用SPP,空间金字塔。

在目标检测中,这点尤其重要,因为我们会通过selective search来提取出不同size的region proposal,然后对不同的region proposal提取出不同尺寸的feature map, 那这些feature map也要经过warp之后才输入之后的FC layer或SVM分类器,那这样或多或少会影响最后的检测结果。因此加入SPP层会改善结果。

3.2.2 How does it work?

为了使得CNN可以接受多尺度输入,我们把SPP(Spatial Pyramid Pooling)层加到FC layer之前即可。如下图所示,第一行是原来的CNN网络,需要crop/warp输入图片;第二行是加了SPP层的CNN网络,可以接受任何size的输入。

img

​ 图7 网络结构

所以,如果我们在R-CNN的conv5层之后加入SPP layer,那对于不同size的region proposal的feature map就不需要再进行warp了,直接可以进行分类了。如图所示,不同size的feature map经过SPP后都变成固定长度的。

img

​ 图8 SPP Layer

具体来说就是把输入的feature map划分成不同尺度的,比如图中(4, 4) (2, 2) (1, 1)三种不同的尺度,然后会产生不同的bin,比如分成(4, 4)就16个bin,然后在每个bin中使用max pooling,然后就变成固定长度为16的向量。例如下图9和图10中不同尺寸的输入,经过SPP层之后都得到了相同的长度的向量,之后再输入FC layer就可以啦。

img

​ 图9 一种尺寸输入

img

																			图10 另一种尺寸输入

所以,使用SPP Layer之后,不同size的输入就可以输出相同的size。 (注:在文中实际使用的是4层金字塔,就包括( 1 ∗ 1 1 *1 11, 2 ∗ 2 2 *2 22, 3 ∗ 3 , 6 ∗ 6 3 *3, 6 *6 33,66),总共包括50个bin)。

3.3 总结

本文主要讲解了SPP net在目标检测应用上的两个创新点,改进之后的运行速度变快了,准确度也提高了,但仍然存在一些不足之处:

  1. 整个过程还是multi-stage pipeline,还是需要额外保存feature map以供输入SVM进行分类,因此空间的消耗也还是很大。
  2. 在fine-tune的时候SPP-net不像R-CNN一样,Spp-net不会更新spatial pyramid pooling layer之前的conv layer,所以这就限制了准确性。

这篇关于SSP-Net论文详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829487

相关文章

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现