Faster-RCNN·代码解读系列01:Selective Search 和 R-CNN、Fast-CNN 简介

Selective Search 和 R-CNN、Fast-CNN 简介

  • 1 目标检测算法简介
  • 1.0滑窗法的思路
  • 1.1 Selective Search 和 R-CNN 简介
    • 1.2.1 Selective Search简介
    • 1.1.1 Selective Search的思路
    • 1.1.2 Selective Search图解
  • 1.2 Selective Search 和 Fast-CNN简介
    • 1.2.1 SPP和ROI Pooling简介
    • 1.2.2 FastR-CNN简介

1 目标检测算法简介

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.0滑窗法的思路

首先需要一个已经训练好的分类器,然后把图像按照一定间隔和不同的大小分成若干窗口,在这些窗口上执行分类器,如果得到较高的分类分数,就认为是检测到了物体。把每个窗口都用分类器执行一遍之后,再对得到的分数做一些后处理如非极大值抑制(Non-Maximum Suppression, NMS)等,最后就得到了物体类别和对应区域,其方法示意图如图所示。

在这里插入图片描述

1.1 Selective Search 和 R-CNN 简介

1.2.1 Selective Search简介

滑窗法相当于对一张图像上的子区域进行类似穷举式的搜索, 一般情况下这种低效率搜索到的区域里大部分都是没有任何物体的。所以一个很自然的想法就是只对图像中最有可能包含物体的区域进行搜索,进而提升物体检测的效率。在这种思路的方法中,最为熟
知的是 Selective Search。

1.1.1 Selective Search的思路

Selective Search的思路是,可能存在物体的区域都应该是有某种相似性的或连续的区域。针对这两个特点,Selective Search采用的是超像素合并的思路,**首先用分割算法在图像上产生很多的小区域,这些区域就是最基础的子区域,或者可以看作是超像素。然后根据这些区域之间的相似性进行区域合并,成为大一点的区域。**衡量相似性的标准可以是颜色、纹理和大小等。不断迭加这种小区域合并为大区域的过程,最后整张图会合并成为一个区域。

1.1.2 Selective Search图解

这个过程中,**给每个区域做一个外切的矩形,就得到了许许多多的可能是物体的区域方框。**其实无论是滑窗还是Selective Search,这种找出可能包含物体的区域的方法,统称为Region Proposal。算法执行过程的示意图如图11-3所示。
在这里插入图片描述

可以看到Selective Search和滑窗法相比第一个优点就是高效,因为不再是漫无目的的穷举式搜索。另外,在 Selective Search中,一开始的区域是小区域,合并过程中不断产生大区域,所以天然能够包含各种大小不同的疑似物体框。另外计算相似度采用了多样的指标,提升了找到物体的可靠性。至于算法本身当然也不能太慢,否则和滑窗法相比的优势就体现不出来了

有了Selective Search高效地寻找到可能包含物体的方框(实际中常进行一定像素的外 扩包含一定背景),那么接下来只要接个CNN提取特征,然后做个分类不就相当于检测吗?这正是于深度学习做物体检测的开山之作R-CNN ( Region-based Convolutional Neural Networks) , 当然直接用Selective Search选出的框未必精确,所以还加入了一些改进,如和物体标注框单位置的回归来修正Selective Search提出的原始物体框。R-CNN就像Alexnet,让物体检测的指标跃上了新台阶(PASCAL VOC, mAP从40.1%提升53.3%)

1.2 Selective Search 和 Fast-CNN简介

R-CNN虽然比起滑窗法已经快了很多,但可用性还是很差,因为一个稍微“靠谱”的识别任务需要用Selective Search提出上千个框(R-CNN中是2000个 )。这上千个图像区域都需要单独过一遍卷积神经网络进行前向计算,速度自然快不了。

1.2.1 SPP和ROI Pooling简介

由于卷积的同变性质(equivariance) ,通过每类别对应物体的激活响应图的例子,定性理解了物体通过卷积网络之后,会在语义层的响应图上的对应位置有特别的响应。

因此产生思路:对整张图片执行一次卷积神经网络的前向计算,到了最后一层的激活响应图的时候,通过某种方式把目标物体所在区域部分的响应图拿出来作为特征给分类器。这样做对画面内所有可能物体的检测就可以共享一次卷积神经网络的前向计算,大大节省了时间。

第一个在物体检测中实现这个思路的就是SPP,全称为空间金字塔池化(Spatial Pyramid Pooling),

在这里插入图片描述

如图11-4所示,假设输入图片中框住小马和摄影师的两个框是Selective Search选出来的框,那么经过了(没有全连接层的)卷积神经网络,到了最后一层输出的n个通道的响应图时,原图像上的两个框也会对应两个区域。这样的区域称为感兴趣区域(Region Of Interest, ROI)。一般常用的分类器,无论是SVM还是称浅层神经网络,都需要输入固定的维度。所以如果可以有一种方式把ROI的信息都转化成固定维度的向量,那么就能把每个ROI都给分类器去计算获得结果,并且在进入分类器之前,只需要运行一次卷积神经网络的前向计算,所有的ROI都共享同样的响应图。

思路①:SPP就是这样一种方法,对于每一个ROI,如图11-4中所示,SPP分层将指定区域划分为不同数目,图中分为3个层次,最底层划分为4x4=16个子区域,中间层是2x2=4个子区域,最顶层则直接整个区域进行池化,对于每个通道,每个ROI变成了一个21维的向量,因为有n个通道,所以每个ROI都生成了一个21×n维的向量。因为越是底层划分的数目越多,SPP是通过像金字塔一样的结构来获得感兴趣区域不同尺度的信息,所以叫空间金字塔池化。

SPP不仅**实现了对ROI的分类,而且对于整张图像只需要进行一次卷积神经网络的前向计算,大幅降低了算法执行的时间。**另外需要提的是,SPP把任意大小的向量转化为固定大小的向量的方法还有另一个意义,就是让输入神经网络的图像大小不再固定,在执行分类任务的时候,这种做法的优点是不需要再对图像进行裁剪或者缩放。

SPP的论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》发表在 2014 的 ECCV 上,有兴趣的读者可以自行搜索原文参考。

思路②【FastR-CNN】:在SPP中,包含信息最多的其实就是最底层,所以另一个思路是直接把ROI划分为固定的大小,并不分层。如把所有ROI区域池化到7x7的大小,再送入分类器,这就是ROI Pooling,如图11-4的右下部分所示。

1.2.2 FastR-CNN简介

SPP用于物体检测相比R-CNN获得了速度上的巨大提升,但仍然继承了一些R-CNN的缺点。最明显的是分阶段训练,不仅麻烦,而且物体框回归训练过程和卷积神经网络的训练过程是割裂的,整个参数优化的过程不是一体的,限制了达到更高精度的可能性。

针对SPP的缺点,R-CNN的作者Ross B. Girshick再度发力,在 SPP检测的基础上提出了两个主要的改进/变化:

第一点是ROI提取特征后,把物体框的回归和分类这两个任务的loss融合一起训练,相当于端到端的多任务训练( end-to-end with a multi-task loss) 这让整个训练过程不再是多个步骤分别进行,训练效率也更高;

第二点是把SPP换成了 ROI Pooling,这就是Fast R-CNN。在计算预测的框和标注框的loss时,采用了一种叫做Smooth-L1的loss计算方法:
在这里插入图片描述

就是把L2和L1拼一块了,其中小的偏差利用L2计算,大的偏差利用L1计算。而Smooth-L1对偏差很大的值没有那么敏感,好处是提高 loss计算的稳定性。

在这种框架下,因为卷积神经网络计算对每张图像只执行了一次,所以重复计算大都在ROI Pooling之后,于是**提出用SVD分解然后忽略次要成分,把全连接层的计算量减小,达到精度损失极其微小的情况下,获得较大幅度的计算速度提高,**这也是算是论文中的一个小的优点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777704.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高级计算机体系结构--期末教材复习

Chap2 性能评测和并行编程性能评测并行编程为什么需要三次 barrier改进方法 Chap3 互连网络交换和路由二维网格中 XY 路由 死锁、活锁及饿死死锁避免的方法:虚通道、转弯模型二维网格中最小 西向优先、北向最后和负向优先算法转弯模型:超立方体的部分自适…

原生JavaScript实现录屏功能

1. 前言 使用JavaScript实现浏览器中打开系统录屏功能 示例图: 2. 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><…

深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看

在CNN的学习过程中我会提供相应的手算例子帮助理解训练过程。 其他关于神经网络的学习链接如下&#xff1a; 一、了解卷积神经网络 卷积神经网络的作用 总的来说&#xff0c;卷积神经网络的第一个主要作用是对图像进行特征提取&#xff0c;所谓特征提取&#xff0c;就是明白…

7.6第三天作业

一、在数据库中创建一个表student&#xff0c;用于存储学生信息 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT ); &#xff08;1.&#xff09;先创建一个数据库 &#xff08;2.&#xff09;创建student表 查看是否创建成功 1、向studen…

QT c++函数模板与类模板的使用

QT c类模板的使用 #pragma once#include <QtWidgets/QMainWindow> #include "ui_QtWidgetsApplication5.h"class QtWidgetsApplication5 : public QMainWindow {Q_OBJECTpublic:QtWidgetsApplication5(QWidget *parent nullptr);~QtWidgetsApplication5();te…

代码随想录算法训练营第13天|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法、102.二叉树的层序遍历

打卡Day13 1.理论基础2.二叉树的递归遍历3.二叉树的迭代遍历3.二叉树的统一迭代法4.102.二叉树的层序遍历扩展107. 二叉树的层序遍历 II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117. 填充每个…

嵌入式C语言面试相关知识——关键字(不定期更新)

嵌入式C语言面试相关知识——关键字 一、博客声明二、C语言关键字1、sizeof关键字2、static关键字3、const关键字4、volatile关键字5、extern关键字 一、博客声明 又是一年一度的秋招&#xff0c;怎么能只刷笔试题目呢&#xff0c;面试题目也得看&#xff0c;想当好厂的牛马其实…

数据可视化之智慧城市的脉动与洞察

在数字化转型的浪潮中,城市作为社会经济发展的核心单元,正经历着前所未有的变革。城市数据可视化大屏看板作为这一变革中的重要工具,不仅极大地提升了城市管理效率,还为公众提供了直观、全面的城市运行状态视图,成为智慧城市建设不可或缺的一部分。本文将深入探讨以“城市…

一文理解 Treelite,Treelite 为决策树集成模型的部署和推理提供了高效、灵活的解决方案

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、什么是 Treelite&#xff1f; Treelite 是一个专门用于将决策树集成模型高效部署到生产环境中的机器学习模型编译器&#xff0c;特别适合处理大批量数据的推理任务&#xff0c;能够显著提升推理性能…

Java之网络面试经典题(一)

目录 ​编辑 一.Session和cookie Cookie Session 二.HTTP和HTTPS的区别 三.浅谈HTTPS为什么是安全的&#xff1f; 四.TCP和UDP 五.GET和Post的区别 六.forward 和 redirect 的区别&#xff1f; 本专栏全是博主自己收集的面试题&#xff0c;仅可参考&#xff0c;不能相…

嵌入式Linux系统编程 — 7.2 进程的环境变量

目录 1 什么是进程的环境变量 2 环境变量的作用 3 应用程序中获取环境变量 3.1 environ全局变量 3.2 获取指定环境变量 getenv 4 添加/删除/修改环境变量 4.1 putenv()函数添加环境变量 4.2 setenv()函数 4.3 unsetenv()函数 1 什么是进程的环境变量 每一个进程都有一…

Android - Json/Gson

Json数据解析 json对象&#xff1a;花括号开头和结尾&#xff0c;中间是键值对形式————”属性”:属性值”” json数组&#xff1a;中括号里放置 json 数组&#xff0c;里面是多个json对象或者数字等 JSONObject 利用 JSONObject 解析 1.创建 JSONObject 对象&#xff0c;传…

快手大模型首次集体亮相,用AI重塑内容与商业生态

7月6日&#xff0c;在2024世界人工智能大会期间&#xff0c;快手举办了以“新AI新应用新生态”为主题的大模型论坛&#xff0c;会上&#xff0c;快手大模型首次集体亮相&#xff0c;视频生成大模型可灵、图像生成大模型可图等产品的多项新功能正式发布。 继图生视频、视频续写…

Appium启动APP时报错Security exception: Permission Denial

报错内容Security exception: Permission Denial: starting Intent 直接通过am命令尝试也是同样的报错 查阅资料了解到&#xff1a;android:exported | App quality | Android Developers exported属性默认false&#xff0c;所以android:exported"false"修改为t…

QT学习积累——如何提高Qt遍历list的效率

目录 引出Qt遍历list提高效率显示函数的调用使用&与不使用&除法的一个坑 总结自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重载带参数的按钮触发信号触发信号拓展 lambda表达式返回值mutable修饰案例 引出 QT学习积累——如何提高Qt遍历list…

Springboot学习之用EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

Kotlin中的数据类型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机&#xff0c;虚拟机装有Ubuntu系统&#xff1b; 2.在你的windows电脑安装了WinSCP工具&#xff1b; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP&#xff0c;点击新标签页&#xff0c;进入到如下图的…

Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制

这里写目录标题 0. 机器人配置1. Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制1.1 TurtleBot3 Waffle Pi端配置1.2 PC端配置1.2.1 安装turtlebot3的环境配置1.2.2 创建项目并安装Turtlebot31.2.3 配置环境变量 1.3 PC端与TurtleBot3进行通信1.3.1 PC端与机器人端互PING和SSH连…

用C#调用Windows API向指定窗口发送按键消息详解与示例

文章目录 1. 按键消息的定义及功能2. 引入所需的命名空间3. 定义Windows API函数4. 定义发送消息的方法5. 获取窗口句柄6. 调用API发送按键消息7. 使用示例注意事项总结 在C#中调用Windows API向指定窗口发送按键消息是一种常见的操作&#xff0c;这通常用于自动化脚本、游戏辅…