目标检测——SPPNet算法解读

2023-12-07 21:15

本文主要是介绍目标检测——SPPNet算法解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun
链接:https://arxiv.org/abs/1406.4729

目录

  • 1、算法概述
  • 2、Deep Networks with Spatial Pyramid Pooling
    • 2.1 SPP Layer
    • 2.2 网络训练
  • 3、实验结果
    • 3.1 分类
    • 3.2 检测
  • 4、创新点和不足

1、算法概述

之前的工作,神经网络都要求固定尺寸的输入,比如:224x224,这就限制了输入图像的宽高比,当对于其他任意尺寸图像时,基本都是通过裁剪或直接拉伸的方式变换到固定尺寸。但是裁剪有可能不能完全包含目标,直接拉伸也会造成目标的形变及失真,这都会造成识别精度下降。
在这里插入图片描述
为什么卷积神经网络需要固定尺寸的输入?CNN由两部分组成:卷积层和全连接层,实际上卷积层不需要固定尺寸的输入,它可以对任意尺寸的图像生成任意尺寸的特征图;而全连接层根据其定义来看才需要固定尺寸的输入。全连接层通常在CNN的深层阶段,所以本文作者提出空间金字塔池化(SPP, Spatial Pyramid Pooling)层用于固定CNN中最后一层卷积层的输出,使得全连接层的输入得到统一。这一操作使得CNN可以接受任意尺寸的输入,不必经过裁剪(crop)和扭曲拉伸(warp)。在目标检测方面,加入这一操作的SPP-Net比R-CNN快24到102倍,全过程下来速度为0.5s/image。
SPP的优势有:
1、针对不同尺寸的输入可以得到相同维度的输出,而siding window pooling 做不到;
2、SPP使用multi-level spatial bins, 而siding window pooling采用的单一的窗口,multi-level对目标变形非常鲁棒;
3、由于输入尺寸的可变性,SPP可以提取不同尺度的特征。
4、SPP-Net能使得我们在训练中使用多尺度训练,避免过拟合,使得最终的精度相比固定尺寸训练有所提升。

2、Deep Networks with Spatial Pyramid Pooling

2.1 SPP Layer

作者首先可视化了网络特征图,表明了特征图不仅反映了相应的强度和涉及到它们的空间位置。卷积层可以接受任意大小的输入并输出任意尺寸的特征图,但分类器(SVM/softmax)或者全连接层只能接受固定尺寸的输入。
在这里插入图片描述
为了让CNN适应任意大小的图像,作者将最后一个池化层(例如,在最后一个卷积层之后的pool5层)替换为空间金字塔池化层。如上图所示,空间金字塔池化的输出是kM维向量,桶(bins)的数量记为M,k是最后一个卷积层的输出特征图数量,图中k为256。每个特征图的尺寸为axa,被切分为nxn的bins,那么采用窗口为win=ceil(a/n)和步长为str=floor(a/n)的max-pooling。最后将所有的特征级联起来(固定维度kM)作为全连接层的输入。这样就保证了无论输入图像的尺寸,输入全连接层的输入都有同样的大小。
网络处理流程如下:
在这里插入图片描述

2.2 网络训练

单尺度训练,固定裁剪输入图像为224x224,最后一层卷积层输出特征图大小为13x13,设置三个级别的空间金字塔池化操作,SPP设置如下:
在这里插入图片描述
多尺度训练,采用两个尺度训练,180x180,224x224;180尺寸的图片是224尺寸的直接resize得到,而不是通过裁剪得到,所以两种尺度的区域只在分辨率上不同,而在内容/布局上没有区别。对于180x180的输入图像,最后一层卷积层输出特征图大小为10x10,通过SPP层,180x180的输入大小和224x224的输入大小得到相同维度的全连接层输入。
以上单/多尺度训练主要应用于训练阶段,在测试推理阶段,SPPNet可以接受任意大小的输入图像。

3、实验结果

3.1 分类

数据集采用ImageNet 2012,输入图片固定为224x224,Baseline model的结构如下
在这里插入图片描述
将网络最后一个池化层替换成SPP层后,对应的结果分别为:
在这里插入图片描述
可见多尺度训练对模型也有提升
ILSVRC2014分类竞赛的结果如下,SPP-Net取到第三名的结果,第一名是GoogLeNet,第二名VGG
在这里插入图片描述

3.2 检测

SPP-Net也可以用于目标检测。相较于R-CNN的2000次提取特征,SPP-Net只从整个图像中提取一次特征映射(可能在多个尺度上)。然后对特征图上的每个候选框应用空间金字塔池操作,该候选框对应的特征通过SPP操作将变成固定长度的向量,如下图所示。由于只应用一次卷积操作,所以我们的方法可以运行速度提高几个数量级。
在这里插入图片描述
实验设置:相对于R-CNN,SPP-Net还是用selective search提出区域候选框(测试阶段2000个),SPP-Net的backbone部分采用ZF-5,SPP层采用4级空间金字塔(1x1,2x2,3x3,6x6,共50个bins),这样每个候选框区域这就会生成12800维(256x50)的特征向量用于全连接层的输入。后面训练每个类别的SVM分类器也是用这个12800维的特征。训练SVM的样本设置方案和R-CNN一致,也采用负样本难度挖掘技术。
在这里插入图片描述
因为SPP-Net和R-CNN采用的方式差不多,只是SPP-Net将R-CNN的2000次提取特征的过程集中到一次完成,所以它们最终的mAP区别不大,但SPP-Net的速度比R-CNN的快非常多。

4、创新点和不足

  • 创新点:
    1、针对不同尺寸的输入可以得到相同维度的输出,实现了多尺度训练的可能,能让网络见到多尺度图片,增加鲁棒性。
    2、首次提出单尺度/多尺度交替训练。
    3、改进R-CNN的提取特征方式,合并2000次提取为一次提取,大大提升了速度。
  • 不足:
    1、还是没有改进候选框区域生成;
    2、特征提取、SVM分类、边框回归这三个阶段是独立的,需分别进行训练和推理,效率较低。

这篇关于目标检测——SPPNet算法解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【