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

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

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

相关文章

信创之国产浪潮电脑+统信UOS操作系统体验8:安装Docker并进行测试验证scratch镜像

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、前言 今日在进行Docker容器相关知识的学习&#xff0c;不过学习环境都不是基于统信UOS操作系统的&#xff0c;为了实验&#xff0c;老猿觉得手头国产浪潮电脑统信UOS操作系统就是原生的linux操作系统&a…

【SparkSQL】基础入门(重点:SparkSQL和Hive的异同、SparkSQL数据抽象)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Spark SQL的定义、特点、发展历史、与hive的区别、数据抽象、SparkSession对象。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一…

用flutter 写一个专属于儿子的听书的app

背景: 儿子最近喜欢上了用儿童手表听故事&#xff0c;但是手表边里的应用免费内容很少&#xff0c;会员一年要300多&#xff0c;这么一笔巨款&#xff0c;怎能承担的起&#xff0c;所以打算自己开发一个专属于儿子的听书app。 最终效果&#xff1a; 架构&#xff1a; 后端由两…

论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network

前言 Distributed Initialization for Visual-Inertial-Ranging Odometry with Position-Unknown UWB Network这篇论文是发表在ICRA 2023上的一篇文章&#xff0c;本文提出了一种基于位置未知UWB网络的一致性视觉惯性紧耦合优化测距算法( DC-VIRO )的分布式初始化方法。 对于…

解决:ModuleNotFoundError: No module named ‘qt_material‘

解决&#xff1a;ModuleNotFoundError: No module named ‘qt_material’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named qt_material背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错&…

Django快速搭建静态网页

Django的快速搭建 这个是例子 这个是一个目录 项目名称&#xff1a;项目似乎被命名为DJ0928&#xff0c;这是Django项目的根目录。 文件都是Django项目的核心配置文件。 settings.py 包含了项目的配置设置。urls.py 定义了项目的URL路由。wsgi.py 和 asgi.py 分别用于Web服务器…

力扣刷题篇之分治

系列文章目录 目录 系列文章目录 前言 一、分解问题 二、解决子问题 三、合并结果 总结 前言 刷题按照&#xff1a; [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09; 参考&#xff1a; 「五大常用算法」一文搞懂分治算法…

爬虫学习 异步爬虫(五)

多线程 多进程 协程 进程 运行中的程序 线程 被CPU调度的执行过程,操作系统 运算调度的min单位 在进程之中,进程中实际运作单位 from threading import Thread#创建任务 def func(name):for i in range(100):print(name,i)if __name__ __main__:#创建线程t1 Thread(target …

异步操作的方法

在高级语言中已经有了异步的原语言&#xff0c;而在C 中的最好的方式就是 libevent 的方式,我这还是相当认同的&#xff0c;高级语言就不需要在苦哈哈的&#xff0c;事件转圈了&#xff0c;但是原理还是以事件为基础的 一句话就是在一个循环中等着他执行完,这个循环中有很多其他…

CodeMeter软件保护及授权管理解决方案(二)

客户端管理工具 CodeMeter Runtime是CodeMeter解决方案中的重要组成部分&#xff0c;其为独立软件包&#xff0c;开发者需要把CodeMeter Runtime和加密后的软件一起发布。CodeMeter Runtim包括以下组件用于实现授权的使用&#xff1a; CodeMeter License Server授权服务器 Co…

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

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

2948. 交换得到字典序最小的数组 (分组排序)

Problem: 2948. 交换得到字典序最小的数组 文章目录 题目思路Code 题目 给你一个下标从 0 开始的 正整数 数组 nums 和一个 正整数 limit 。 在一次操作中&#xff0c;你可以选择任意两个下标 i 和 j&#xff0c;如果 满足 |nums[i] - nums[j]| < limit &#xff0c;则交换…

Python之数据可视化

文章目录 一、1、matplotlib简单应用1.1、绘制带有中文标签和图例的图1.2、 绘制散点图1.3、绘制饼状图1.4、多个图形一起显示 一、 1、matplotlib简单应用 matplotlib模块依赖于numpy模块和tkinter模块&#xff0c;可以绘制多种形式的图形&#xff0c;包括线图、直方图、饼状…

05_MySQL主从复制架构

任务背景 ##一、真实案例 某同学刚入职公司&#xff0c;在熟悉公司业务环境的时候&#xff0c;发现他们的数据库架构是一主两从&#xff0c;但是两台从数据库和主库不同步。询问得知&#xff0c;已经好几个月不同步了&#xff0c;但是每天会全库备份主服务器上的数据到从服务…

一文详解Python中常用数据类型

文章目录 Python 中常用的数据类型包括&#xff1a;Python 中布尔类型(bool)Python 中的数字类型概述Pyhon中的字符串概述Python 中的List概述Python 中的元组类型(tuple)Python中的字典&#xff08;Dictionary&#xff09;Python中的集合&#xff08;Set&#xff09;Python中的…

Python---练习:求某同学成绩的总分及平均分

需求&#xff1a; 已知某同学的语文(70)、数学(90) 、英语(80)、历史(75)、地理(85)五门课的成绩,编程求该同学的总分以及平均分。 思考&#xff1a; 要求是算总分和平均分&#xff0c;先看总分&#xff0c;已经知道了各科成绩&#xff0c;那么可以用把成绩赋值给每个学科的…

使用Postman创建Mock Server

这篇文章将教会大家如何利用 Postman&#xff0c;通过 Mock 的方式测试我们的 API。 什么是 Mock Mock 是一项特殊的测试技巧&#xff0c;可以在没有依赖项的情况下进行单元测试。通常情况下&#xff0c;Mock 与其他方法的主要区别就是&#xff0c;用于取代代码依赖项的模拟对…

Linux下Docker 离线安装详细步骤,亲测成功

1.离线原因&#xff1a;公司新创不能使用开元linux&#xff0c;使用了一个变种centOS&#xff0c;致使yum被禁 2.步骤&#xff1a; 2.1 下载docker tar包&#xff0c;下载地址&#xff1a;Index of linux/https://download.docker.com/linux/ 2.2 新建自己的软件目录&am…

IELTS学习笔记_grammar_新东方

参考&#xff1a; 新东方 田静 语法 目录&#xff1a; 导学简单句… x.1 导学 学语法以应用为主。 基础为&#xff1a;单词&#xff0c;语法 进阶为&#xff1a;听说读写译&#xff0c;只考听说读写。 words -> chunks -> sentences, chunks&#xff08;语块的重要…

嵌入式设备与PC上位机通信协议设计的几点原则

嵌入式设备在运行中需要设置参数&#xff0c;这个工作经常由PC机来实现&#xff0c;需要为双方通信设计协议&#xff0c;有代表性协议是如下三种&#xff1a; 从上表可以看到&#xff0c;一般嵌入式设备内存和运算性能都有限&#xff0c;因此固定二进制是首选通信协议。 一&am…