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

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.