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

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要