当前位置: 首页 > news >正文

目标检测——R-CNN算法解读

论文:Rich feature hierarchies for accurate object detection and semantic segmentation
作者:Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik
链接:https://arxiv.org/abs/1311.2524
代码:http://www.cs.berkeley.edu/˜rbg/rcnn

文章目录

  • 1、算法概述
  • 2、R-CNN细节
    • 2.1 模型设计
    • 2.2 推理阶段
    • 2.3 训练过程
    • 2.4 Bounding-box回归
  • 3、实验结果
  • 4、创新点和不足

1、算法概述

R-CNN的过程论文中给了如下框图
R-CNN处理流程图
R-CNN的思路很直观,可以分为三步:首先从图片中得到若干个目标候选框,然后对每个候选框利用CNN取特征,最后利用每个候选框的特征对候选框进行分类和边框预测。
在R-CNN论文出来之前,目标检测的流行思路是对图像进行多尺度滑窗得到多个图像块,然后对这些图像块分别提取手工设计特征,比如Haar,HOG等,然后利用这些特征对这些图像块进行分类和调整预测框。对应的经典算法就是Haar+adboost人脸检测,HOG+SVM行人检测。可以想象到的是,这种方法滑窗得到的图像块越多,目标被召回的可能性就越大,当然代价就是检测的速度会变慢,误检也有可能增多;传统思路中的手工设计特征也不一定适合其他任务,比如检测车辆、检测动物等。
Selective Search候选框选择
所以R-CNN相对于之前的方法创新点可总结为:1、用Selective Search的候选区域选择方式替换了经典的滑窗方式,使得候选框“少而精”(论文取了2000个候选框);2、用深度学习神经网络自动学习图像块特征替换了传统方式的手工设计特征。

2、R-CNN细节

2.1 模型设计

区域候选框采用selective search;特征提取采用AlexNet,输入图片固定在227x227大小,提取的特征维度为4096维;图像resize,文中提了几种方式,但是实验下来最佳的方式是先对候选区进行padding,其中padding=16,然后忽略长宽比,直接缩放到网络的输入尺寸。并且提到在所有的方法中,如果扩展的过程中超过了图像,就用图像的平均值填充(在输入CNN前会先减去自身的平均值)。

2.2 推理阶段

在推理阶段,区域候选框被限制在2000个,利用训练好的CNN网络对每个候选框提取4096维特征。对于某个类别,将特征送入对应类别的svm分类器进行预测得分。这样,对于C个类别的任务,每个候选框就有C个分数,最后对这些预测分数后的候选框进行类别独立的非极大值抑制(nms)坐标框合并。
时间分析:区域候选框选择加上特征提取(在GPU上13s/image,在CPU上53s/image)

2.3 训练过程

有监督的预训练,采用AlexNet,用数据集ILSVRC2012进行训练得到
特定领域数据进行微调
1、网络调整:调整AlexNet最后输出的类别数量为N+1类,其中1位背景类别;对于VOC数据集,N=20,对于ILSVRC2013,N=200。
2、样本选择:将用selective search提出的区域候选框(全部使用)与ground-truth(标注框)求iou,iou大于等于0.5的视为该gt标注框所对应类别的正样本。否则为负样本。
3、参数设置:采用SGD优化算法,初始学习率设置为0.001,mini-batch size设置为128,其中32个正样本(涵盖所有类),96个负样本。
训练一组SVM分类器
有多少个类别,就需要训练多少个SVM分类器,每个分类器用于判断输入是否是该类别,并通过预测分数得到该类别的概率。
1、样本选择:正样本为CNN提取的ground truth的特征向量;负样本为CNN提取的iou<0.3的region proposals的特征向量,可见训练SVM用的正负样本要比训练CNN网络的样本定义要严格许多。
2、因为负样本远远大于正样本,造成了正负样本不平衡,所以负样本不能全用,采用了hard negative mining

论文附录B有探讨为什么微调CNN和训练SVM定义正负样本的方式不同,以及为什么要用多个SVM而不是直接在CNN后面用softmax直接预测类别
针对第一个疑问:附录中说是由于训练SVM是用微调后的CNN提取的特征训练的,而微调CNN是直接针对图片,其他怎么定义正负样本不太重要,重要的是微调的数据量限制,不得不加入iou为0.5到1之间的”抖动”数据,这些数据相对于ground truth增加了30倍;作者也意识到加入这种“抖动”数据可能是次优的,因为CNN网络没有学习到精度定位的数据特征,所以就引出了第二个疑问,为什么作者没有直接在CNN网络接softmax直接预测类别而是接一组SVM,作者试验过在CNN最后一层直接接softmax,最终导致在VOC 2007上mAP从SVM的54.2%下降到50.9%,作者猜测原因有可能是因为由于网络未学习精确定位的正样本和随机抽取的负样本,不像SVM学习的是精确定位的ground truth和通过难度挖掘的负样本。
到这一步,R-CNN算是介绍完了,但利用svm预测到区域候选框的分数后,候选框数量众多且坐标框不一定准,这就需要nms和Bounding-box回归(参考DPM)来修正了。带bounding-box回归能提升3到4个mAP。

2.4 Bounding-box回归

作者使用bounding-box回归来提升预测框定位的准确性,当每个候选框通过某个类别的SVM得到预测分数后,也会通过该类别的线性回归器回归到新的坐标框。这种方法类似于DPM的bounding-box,与之不同的是,回归所用的特征这里用的是从CNN提取出来的。
在这里插入图片描述
如上图所示,红色框为region proposal,绿色框为ground truth,蓝色框为最终预测的框,也就是想将红色框调整为蓝色框。转换方式如下:
在这里插入图片描述
其中Px,Py,Pw,Ph代表region proposal的中心点坐标及宽高。中心点经过平移,宽高通过缩放可以将P转换到G ̂,从转换公式可以看出,就只需要学习dx§,dy§,dw§,dh§四个函数即可,每个d*§都是一个线性回归函数,它是通过CNN提取P这个区域候选框对应的pool5层特征学习得到的。记为 ,其中w就是线性回归需要学习的权重。
而红框与绿框之间真正的平移和缩放为:
在这里插入图片描述
只有当d
接近于t*的时候,G ̂才接近G,最终利用最小二乘及加上正则化的优化公式为:
在这里插入图片描述
可见学习线性回归,学习的是x,y,w,h的偏移量(平移、缩放),使得P到G ̂的偏移量尽量接近P到G的偏移量。
构造用于训练回归器的样本集,(Pi,Gi),其中P是SS算法生成的region proposal,G是ground truth。只有当IOU(Pi,Gi)>0.6时才可以视为变化是线性的。所以构造数据集时需要当心这点。有了数据集,然后利用上面公式5进行优化,即可得到线性回归器的权值。于是得到了一组BBox Repression。
还需要注意的是,此线性回归器的输入并不是(x,y,w,h)四个值,而是对应的box作为CNN的输入,在pool5提取到的特征,所以训练时回归器时也要先训练好CNN。同时在测试阶段使用线性回归器时,需要得到特定box(经过了NMS)的特征,于是:要么再跑一遍CNN,要么在第一次跑CNN时,记录下所有box的特征。所以由此看出还是比较麻烦的。

3、实验结果

作者在VOC2007和VOC2010上测试结果如下:
在这里插入图片描述
在这里插入图片描述
可以看出相对于之前的DPM方法,提升很多;值得注意的是当R-CNN加入了Bounding-box对预测坐标进行修正后,mAP都有3到4个点的提升。

4、创新点和不足

创新点:
1、用Selective Search的候选区域选择方式替换了经典的滑窗方式,使得候选框“少而精”。
2、用CNN网络提取特征用于检测
不足:
1、候选框区域生成耗时;
2、候选框区域特征提取重复操作;
3、特征提取、SVM分类、边框回归这三个阶段是独立的,需分别进行训练和推理,效率较低。

相关文章:

目标检测——R-CNN算法解读

论文&#xff1a;Rich feature hierarchies for accurate object detection and semantic segmentation 作者&#xff1a;Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik 链接&#xff1a;https://arxiv.org/abs/1311.2524 代码&#xff1a;http://www.cs.berke…...

基于傅里叶变换的运动模糊图像恢复算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、傅里叶变换与图像恢复 4.2、基于傅里叶变换的运动模糊图像恢复算法原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %获取角度 img…...

使用mock.js模拟数据

一、安装mock.js npm i mockjs 二、配置JSON文件 我们创建一个mock文件夹&#xff0c;用于存放mock相关的模拟数据和代码实现。 我们将数据全部放在xxx.json文件夹下&#xff0c;里面配置我们需要的JSON格式的数据。 注意&#xff1a;json文件中不要留有空格&#xff0c;否则…...

Android Handler同步屏障:深入解析

Android Handler同步屏障&#xff1a;深入解析 在Android开发中&#xff0c;Handler和MessageQueue是处理线程间通信的重要组件。除了常见的消息发送和处理功能&#xff0c;Handler还提供了一个高级特性&#xff1a;同步屏障。本文将深入探讨这一特性&#xff0c;包括它的工作…...

HT for Web (Hightopo) 使用心得(5)- 动画的实现

其实&#xff0c;在 HT for Web 中&#xff0c;有多种手段可以用来实现动画。我们这里仍然用直升机为例&#xff0c;只是更换了场景。增加了巡游过程。 使用 HT 开发的一个简单网页直升机巡逻动画&#xff08;Hightopo 使用心得&#xff08;5&#xff09;&#xff09; 这里主…...

Leetcode(面试题 08.01.)三步问题

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Leetcode(面试题 08.01.)三步问题相关的内容 一、题目分析 1.小孩可以上一阶&#xff0c;两阶&#xff…...

AIGC: 关于ChatGPT中输出表格/表情/图片/图表这些非文本的方式

ChatGPT 不止是 文本输出 ChatGPT是一个文本模型, 它本身并不能直接去生成图片图表等内容在我们的工作当中&#xff0c;经常需要通过表格, 图表的方式去进行数据的处理和展示在这种情况下&#xff0c;GPT由于不支持去直接的生成图片和图表&#xff0c;我们还能够使用它的GPT帮…...

聊聊logback的addtivity属性

序 本文主要研究一下logback的addtivity属性 LoggerModel ch/qos/logback/classic/model/LoggerModel.java PhaseIndicator(phase ProcessingPhase.SECOND) public class LoggerModel extends Model {private static final long serialVersionUID 5326913660697375316L;S…...

在网络安全护网中,溯源是什么?

在网络安全护网中&#xff0c;溯源是什么&#xff1f; 在网络安全护网中&#xff0c;溯源是指通过收集、分析和解释数字证据来追踪和还原网络攻击或其他网络犯罪活动的过程。它旨在确定攻击者的身份、行为和意图&#xff0c;以便采取适当的对策&#xff0c;并为法律机构提供必…...

【刷题】动态规划

动态规划 139. 单词拆分&#xff08;一维&#xff09; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&…...

hadoop操作

文件操作 注意当前所在的路径&#xff0c;创建一个mytest文件夹 创建一个1.txt文件 将1.txt文件移动到mytest中&#xff0c;通过mv改名字&#xff0c;然后查看mytest文件夹的txt文件变成了test.txt 删除文件 上传下载文件 新建1.txt 然后编辑它 随便输入什么 上传 然后看看网…...

角色管理--高级产品经理岗

研发组织管理--角色管理--高级产品经理岗 定位 产品从规划到推进落地的绝对主力&#xff0c;同时能赋能新人&#xff0c;带领新人高质&#xff0c;高效的完成产品的各项工作&#xff1b; 所需资质 某一领域产品专家&#xff0c;有产品架构能力&#xff0c;熟悉产品落地流程…...

nginx: [alert] could not open error log file

先把cmd的报错信息粘出来 nginx: [alert] could not open error log file: CreateFile() “logs/error.log” failed (3: The system cannot find the path specified) 2023/11/29 11:27:37 [emerg] 5040#18772: CreateDirectory() “D:\enviroment\nginx-1.24.0\conf/temp/cli…...

MySQL数据库:外键、唯一键、唯一索引

目录 说明 一、如果要使用外键&#xff0c;表的存储引擎选择哪个&#xff1f; 1.1 答 1.2 示范 1.2.1 主表 &#xff08;1&#xff09;MyISAM的表&#xff1a;masterTable2 &#xff08;2&#xff09;InnoDB的表&#xff1a;masterTable1 1.2.2 从表 &#xff08;1&am…...

CSS核心功能手册:从熟悉到精通

CSS核心功能代码 文章目录 CSS核心功能代码[toc]参考HTML代码尺寸操作设置元素尺寸内边距外边距设置默认布局边距用途和使用场景&#xff1a; 背景设置**背景颜色 (background-color)**:**背景图像 (background-image)**:**背景重复 (background-repeat)**:**背景位置 (backgro…...

编程的重要性及解决技术难题的方法

看到这个话题之后&#xff0c;出于好奇&#xff0c;使用某chat&#xff0c;输入相应主题得到的一篇文章&#xff0c;分享给大家。 PS&#xff1a;现在不同版本的chat和其快速更新升级也可以说是编程的结果&#xff0c;其重要性和发展历程也反映了编程的重要性。 一、编程的重要…...

如何成为一名高效的前端开发者(10X开发者)

如今&#xff0c;每个人都想成为我们所说的“10倍开发者”。然而&#xff0c;这个术语经常被误解和高估。 本质上&#xff0c;一个高效或者10倍开发者&#xff0c;在我看来&#xff0c;是指那些能够充分利用所有可用工具的人&#xff0c;通过让这些工具处理冗余和重复的任务&am…...

Docker port 命令

docker port&#xff1a;列出指定的容器的端口映射&#xff0c;或者查找将PRIVATE_PORT NAT到面向公众的端口。 语法 docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]实例 查看容器mymysql的端口映射情况&#xff1a; docker port mymysql##效果如下&#xff1a; …...

PostgreSQL-SQL联表查询LEFT JOIN 数据去重复

我们在使用left join联表查询时&#xff0c;如果table1中的一条记录对应了table2的多条记录&#xff0c;则会重复查出id相同的多条记录。 1、解决方法一 SELECT t1.* FROM table1 t1 LEFT JOIN table2 t2 ON t1.id t2.tid 第一种方法我们发现还是有重复数据 2、解决方法二…...

Golang与MongoDB的完美组合

引言 在现代开发中&#xff0c;数据存储是一个至关重要的环节。随着数据量的增加和复杂性的提高&#xff0c;开发人员需要寻找一种高效、可扩展且易于使用的数据库解决方案。MongoDB作为一种NoSQL数据库&#xff0c;提供了强大的功能和灵活的数据模型&#xff0c;与Golang的高…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...