目标检测——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分类、边框回归这三个阶段是独立的,需分别进行训练和推理,效率较低。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高度自定义进度条实现完整代码附示意图

实现功能&#xff1a; 自定义一个进度条&#xff0c;能手动拖动进度条&#xff0c;也可以点击相应的进度&#xff0c;根据当前进度条的进度显示相应的内容。 效果图&#xff1a; 实现代码&#xff1a; 封装组件&#xff1a; <template><view class"boomBg&qu…

AIoT智能物联网平台技术架构参考

具体来说&#xff0c;AIoT平台能够实现智能终端设备之间、不同系统平台之间、不同应用场景之间的互融互通&#xff0c;进一步推动万物互联的进程。 AIoT智能物联网平台是结合了人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;技术的平台。它旨在通过物…

达梦数据库使用

达梦数据库使用 &#x1f4d1;前言 本文主要是【达梦数据库】——达梦数据库简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他…

【Web】NodeJs相关例题wp

目录 ①[GKCTF 2020]ez三剑客-easynode ②[MoeCTF 2021]fake game ③[安洵杯 2020]Validator ④ [HZNUCTF 2023 final]eznode ⑤[CNSS] &#x1f3ed; EzPollution_pre ⑥[CNSS]✴️ EzPollution ①[GKCTF 2020]ez三剑客-easynode const express require(express); co…

如何缓解可观察性挑战?

可观察性正在成为当代 DevOps 实践的基石。即使传统上不属于 DevOps 的部门也看到了在可观察性团队的支持下带来的好处。然而&#xff0c;到 2023 年&#xff0c;组织发现采用之路比预期更加崎岖。以下是 DevOps 团队在可观察性方面面临的七个最大挑战以及一些缓解这些挑战的建…

数据结构 -- 并查集与图

目录 1.并查集 1.结构 2.原理 3.代码实现 1.存储 2.寻找根节点 3.是否为同一集合 4.求集合个数 5.合并为同一集合中 整体代码 2.图 1.基本知识 1.各个属性 2.特殊名词 3.图的解释 2.图的表示 1.邻接矩阵 2.邻接表 3.图的遍历 1.BFS--广度优先遍历 2.DFS--…

Spark on yarn 模式的安装与部署

任务描述 本关任务&#xff1a; Spark on YARN 模式的安装与部署。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; Spark 部署模式的种类&#xff1b;Spark on YARN 模式的安装。 Spark 部署模式 Spark 部署模式主要分为以下几种&#xff0c;Spark Stand…

2021年2月1日 Go生态洞察:VS Code Go扩展中默认启用Gopls

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

rss服务搭建记录

layout: post title: RSS subtitle: vps搭建RSS服务 date: 2023-11-27 author: Sprint#51264 header-img: img/post-bg-universe.jpg catalog: true tags: - 折腾 文章目录 引言RSShub-dockerRSS-radarFreshrssFluent reader获取fever api配置Fluent Reader同步 结语 引言 一个…

IDEA设置方法注释模板

目录 一.打开设置&#xff1a;File—>Settings... 二.选择Live Templates—>点击右侧 "" 号—>选择Template Group... 三.输入组名称&#xff0c;建议取容易理解的名字&#xff0c;点击OK 四.选中创建好的组&#xff0c;再次点击 "" 号&#…

“大型”基础模型中幻觉的调查

Abstract 基础模型 (FM) 中的幻觉是指生成偏离事实或包含捏造信息的内容。这篇调查论文广泛概述了近期旨在识别、阐明和解决幻觉问题的努力&#xff0c;特别关注“大型”基础模型&#xff08;LFM&#xff09;。该论文对LFM特有的各种类型的幻觉现象进行了分类&#xff0c;并建…

手撕A*算法(详解A*算法)

A*算法原理 全局路径规划算法&#xff0c;根据给定的起点和终点在全局地图上进行总体路径规划。 导航中使用A*算法计算出机器人到目标位置的最优路线&#xff0c;一般作为规划的参考路线 // 定义地图上的点 struct Point {int x,y; // 栅格行列Point(int x, int y):x(x),y(y){…

java学习part18抽象类

Java抽象类 详解-CSDN博客 111-面向对象(高级)-抽象类与抽象方法的使用_哔哩哔哩_bilibili 1.概念 2.抽象类 抽象类不能实例化&#xff0c;可以有属性&#xff0c;也可以有方法。 方法可以实现或者只声明不实现&#xff0c;要加一个abstract abstract class A{//定义一个抽…

springboot整合redis+自定义注解+反射+aop实现分布式锁

1.定义注解 import java.lang.annotation.*; import java.util.concurrent.TimeUnit;/** Author: best_liu* Description:* Date: 16:13 2023/9/4* Param * return **/ Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Documented public interface RedisLo…

Go语言基础:包、函数、语句和注释解析

一个 Go 文件包含以下几个部分&#xff1a; 包声明导入包函数语句和表达式 看下面的代码&#xff0c;更好地理解它&#xff1a; 例子 package mainimport "fmt"func main() { fmt.Println("Hello World!") }例子解释 第 1 行&#xff1a; 在 Go 中&am…

基于SSM的仓库管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

15个超级实用的Python操作,肯定有你意想不到的!

文章目录 1&#xff09;映射代理&#xff08;不可变字典&#xff09;2&#xff09;dict 对于类和对象是不同的3) any() 和 all()4) divmod()5) 使用格式化字符串轻松检查变量6) 我们可以将浮点数转换为比率7) 用globals()和locals()显示现有的全局/本地变量8) import() 函数9) …

【LeetCode刷题】--90.子集II

90.子集II class Solution {public List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> ans new ArrayList<>();List<Integer> list new ArrayList<>();//排序后便于去重Arrays.sort(nums);dfs(0,nums,ans,lis…

fastReID论文总结

fastReID论文总结 fastReIDReID所面临的挑战提出的背景概念&#xff1a;所谓ReID就是从视频中找出感兴趣的物体&#xff08;人脸、人体、车辆等&#xff09;应用场景&#xff1a;存在的问题&#xff1a;当前的很多ReID任务可复用性差&#xff0c;无法快速落地使用解决方式&…

基于SpringBoot实现的教务查询系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | springdata-jpa 环境&#xff1a;jdk1.7 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 管理员端-课程管理 03. 管理员端-学生管理 04. 管理员端-教师管理…