【目标检测】Fast RCNN算法详解

2023-05-16

Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015.

继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。在Github上提供了源码。

同样使用最大规模的网络,Fast RCNN和RCNN相比,训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。在PASCAL VOC 2007上的准确率相差无几,约在66%-67%之间.

思想

基础:RCNN

简单来说,RCNN使用以下四步实现目标检测:
a. 在图像中确定约1000-2000个候选框
b. 对于每个候选框内图像块,使用深度网络提取特征
c. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
d. 对于属于某一特征的候选框,用回归器进一步调整其位置
更多细节可以参看这篇博客。

改进:Fast RCNN

Fast RCNN方法解决了RCNN方法三个问题:

问题一:测试时速度慢
RCNN一张图像内候选框之间大量重叠,提取特征操作冗余。
本文将整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框。

问题二:训练时速度慢
原因同上。
在训练时,本文先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。

问题三:训练所需空间大
RCNN中独立的分类器和回归器需要大量特征作为训练样本。
本文把类别判断和位置精调统一用深度网络实现,不再需要额外存储。

以下按次序介绍三个问题对应的解决方法。

特征提取网络

基本结构

图像归一化为224×224直接送入网络。

前五阶段是基础的conv+relu+pooling形式,在第五阶段结尾,输入P个候选区域(图像序号×1+几何位置×4,序号用于训练)?。
这里写图片描述

注:文中给出了大中小三种网络,此处示出最大的一种。三种网络基本结构相似,仅conv+relu层数有差别,或者增删了norm层。

roi_pool层的测试(forward)

roi_pool层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层。
这里写图片描述

roi_pool层的训练(backward)

首先考虑普通max pooling层。设 x i x_i xi为输入层的节点, y j y_j yj为输出层的节点。
∂ L ∂ x i = { 0 δ ( i , j ) = f a l s e ∂ L ∂ y j δ ( i , j ) = t r u e \frac{\partial L}{\partial x_i}=\begin{cases}0&\delta(i,j)=false\\ \frac{\partial L}{\partial y_j} & \delta(i,j)=true\end{cases} xiL={0yjLδ(i,j)=falseδ(i,j)=true

其中判决函数 δ ( i , j ) \delta(i,j) δ(i,j)表示i节点是否被j节点选为最大值输出。不被选中有两种可能: x i x_i xi不在 y j y_j yj范围内,或者 x i x_i xi不是最大值。

对于roi max pooling,一个输入节点可能和多个输出节点相连。设 x i x_i xi为输入层的节点, y r j y_{rj} yrj为第 r r r个候选区域的第 j j j个输出节点。
这里写图片描述
∂ L ∂ x i = Σ r , j δ ( i , r , j ) ∂ L ∂ y r j \frac{\partial L}{\partial x_i}=\Sigma_{r,j}\delta(i,r,j)\frac{\partial L}{\partial y_{rj}} xiL=Σr,jδ(i,r,j)yrjL

判决函数 δ ( i , r , j ) \delta(i,r,j) δ(i,r,j)表示i节点是否被候选区域r的第j个节点选为最大值输出。代价对于 x i x_i xi的梯度等于所有相关的后一层梯度之和。

网络参数训练

参数初始化

网络除去末尾部分如下图,在ImageNet上训练1000类分类器。结果参数作为相应层的初始化参数。
这里写图片描述
其余参数随机初始化。

分层数据

在调优训练时,每一个mini-batch中首先加入N张完整图片,而后加入从N张图片中选取的R个候选框。这R个候选框可以复用N张图片前5个阶段的网络特征。
实际选择N=2, R=128。

训练数据构成

N张完整图片以50%概率水平翻转。
R个候选框的构成方式如下:

类别比例方式
前景25%与某个真值重叠在[0.5,1]的候选框
背景75%与真值重叠的最大值在[0.1,0.5)的候选框

分类与位置调整

数据结构

第五阶段的特征输入到两个并行的全连层中(称为multi-task)。
这里写图片描述
cls_score层用于分类,输出K+1维数组 p p p,表示属于K类和背景的概率。
bbox_prdict层用于调整候选区域位置,输出4*K维数组 t t t,表示分别属于K类时,应该平移缩放的参数。

代价函数

loss_cls层评估分类代价。由真实分类 u u u对应的概率决定:
L c l s = − log ⁡ p u L_{cls}=-\log p_u Lcls=logpu

loss_bbox评估检测框定位代价。比较真实分类对应的预测参数 t u t^u tu和真实平移缩放参数为 v v v的差别:
L l o c = Σ i = 1 4 g ( t i u − v i ) L_{loc}=\Sigma_{i=1}^4 g(t^u_i-v_i) Lloc=Σi=14g(tiuvi)
g为Smooth L1误差,对outlier不敏感:
g ( x ) = { 0.5 x 2 ∣ x ∣ < 1 ∣ x ∣ − 0.5 o t h e r w i s e g(x)=\begin{cases} 0.5x^2& |x|<1\\|x|-0.5&otherwise \end{cases} g(x)={0.5x2x0.5x<1otherwise

总代价为两者加权和,如果分类为背景则不考虑定位代价:
L = { L c l s + λ L l o c u 为 前 景 L c l s u 为 背 景 L=\begin{cases} L_{cls}+\lambda L_{loc}& u为前景\\ L_{cls} &u为背景\end{cases} L={Lcls+λLlocLclsuu

源码中bbox_loss_weights用于标记每一个bbox是否属于某一个类

全连接层提速

分类和位置调整都是通过全连接层(fc)实现的,设前一级数据为 x x x后一级为 y y y,全连接层参数为 W W W,尺寸 u × v u\times v u×v。一次前向传播(forward)即为:
y = W x y=Wx y=Wx
计算复杂度为 u × v u\times v u×v

W W W进行SVD分解,并用前t个特征值近似:
W = U Σ V T ≈ U ( : , 1 : t ) ⋅ Σ ( 1 : t , 1 : t ) ⋅ V ( : , 1 : t ) T W=U\Sigma V^T\approx U(:,1:t) \cdot \Sigma(1:t,1:t) \cdot V(:,1:t)^T W=UΣVTU(:,1:t)Σ(1:t,1:t)V(:,1:t)T

原来的前向传播分解成两步:
y = W x = U ⋅ ( Σ ⋅ V T ) ⋅ x = U ⋅ z y=Wx = U\cdot (\Sigma \cdot V^T) \cdot x = U \cdot z y=Wx=U(ΣVT)x=Uz
计算复杂度变为 u × t + v × t u\times t+v \times t u×t+v×t
在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。
这里写图片描述

在github的源码中,这部分似乎没有实现。

实验与结论

实验过程不再详述,只记录结论

  • 网络末端同步训练的分类和位置调整,提升准确度
  • 使用多尺度的图像金字塔,性能几乎没有提高
  • 倍增训练数据,能够有2%-3%的准确度提升
  • 网络直接输出各类概率(softmax),比SVM分类器性能略好
  • 更多候选窗不能提升性能

同年作者团队又推出了Faster RCNN,进一步把检测速度提高到准实时,可以参看这篇博客。
关于RCNN, Fast RCNN, Faster RCNN这一系列目标检测算法,可以进一步参考作者在15年ICCV上的讲座Training R-CNNs of various velocities。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【目标检测】Fast RCNN算法详解 的相关文章

  • 30个最常用的空间SQL用例

    在开始使用空间 SQL 时 xff0c 至少对我而言 xff0c 最大的挑战之一是拥有一个快速简便的参考 xff0c 以将你当前的 GIS 工作流转换为 SQL 有许多令人惊叹的资源可以扩展这方面的知识 xff0c 但本指南旨在成为一本真正
  • Chroma向量数据库

    嵌入向量 xff08 vector embedding xff09 是表示任何类型数据的 A I 原生方式 xff0c 使它们非常适合与各种 A I 驱动的工具和算法一起使用 它们可以表示文本 图像 xff0c 很快还可以表示音频和视频 有
  • 几何深度学习 - 利用几何先验知识的深度学习

    深度学习很难 虽然通用逼近定理表明足够复杂的神经网络原则上可以逼近 任何东西 xff0c 但不能保证我们可以找到好的模型 尽管如此 xff0c 通过明智地选择模型架构 xff0c 深度学习取得了巨大进步 这些模型架构对归纳偏差进行编码 xf
  • 胶囊网络(Capsule Network)的TensorFlow实现

    现在我们都知道Geoffrey Hinton的胶囊网络 xff08 Capsule Network xff09 震动了整个人工智能领域 xff0c 它将卷积神经网络 xff08 CNN xff09 的极限推到一个新的水平 网上已经有很多的帖
  • 【laravel5.1】Blade模板继承简要使用

    模板继承什么用 xff1f 自然是增强基础页面的复用 xff0c 有利于页面文档的条理 xff0c 也便于更改多处使用的内容 xff0c 如页头 页脚 1 用法概要 64 include 39 common header 39 包含子视图
  • PLC梯形图编程入门

    梯形图 xff08 LAD xff09 是PLC编程的最佳可视化语言 xff0c 它看起来非常类似于继电器电路图 xff0c 因此如果 你对继电器控制和电子电路有所了解的话 xff0c 那么学起来会非常容易 xff01 在这个教程中 xff
  • 软件开发入门自学指南

    每天都看到很多对编程感兴趣的人在问是不是可以自学软件开发 xff0c 或者应该怎么自学编程才能入门 在这篇文章里 xff0c 我将尝试重现一个初学者在学习计算机编程时可能会碰到的问题 xff0c 并尽量提供相应的解决思路 xff0c 希望对
  • 回望2014

    时光荏苒 xff0c 流光飞逝 xff0c 一转眼的时间又是一年 回望一下2014年 xff0c 这一年应该是成长的一年 xff0c 是温暖的一年 xff0c 也是丰收的一年 在这过去的一年里 xff0c 大概可以从工作和生活两方面说说吧
  • 2011,我的IT我的梦

    代码不过十万行 xff0c 别娶媳妇别买房 xff0c 这句诙谐的语言 xff0c 形象的描述了IT行业对程序员的最基本IT素质的要求 xff0c 很荣幸的是 xff0c 我在大学时代就完成了这个基本的任务 xff0c 因此我人生的第一份I
  • LitePal编译出错Error:Unsupport type 'dbname'解决方法

    使用LitePal前 xff0c 需要先配置一下第三方库 xff0c 我们可以通过两种方式来配置 xff1a 1 通过官网下载链接 在官方下载地址上下载需要的版本库 xff0c 然后放到工程目录下的libs文件夹中 xff0c 并右键jar
  • select 建立了索引但是不走索引

    create index indexName on A abc 此时select abc from A 不走索引 可用如下方法让搜索走索引 select distinct abc from A a where exists select 1
  • 关于conda install命令出现CondaHTTPError问题

    在安装过程中 xff0c 安装包时报错 xff1a 打开C Users 用户名 condarc文件 xff0c 没有则创建 xff0c 复制如下内容保存 xff08 一行不能多 xff0c 一行不能少 xff09 xff1a channel
  • 【MySQL技术内幕】15-InnoDB存储引擎文件

    之前介绍的文件都是 MySQL数据库本身的文件 和存储引擎无关 除了这些文件外 每个表存储引擎还有其自己独有的文件 本节将具体介绍与 InnoDB存储引擎密切相关的文件 这些文件包括重做日志文件 表空间文件 1 表空间文件 InnoDB采用
  • Linux进程的睡眠和唤醒

    在Linux中 xff0c 仅等待CPU时间 的进程称为就绪进程 xff0c 它们被放置在一个运行队列中 xff0c 一个就绪进程的状态标志位为TASK RUNNING 一旦一个运行中的进程时间片用完 xff0c Linux内核的调度器会剥
  • mkdir命令详解

    mkdir命令来自于英文词组 make directories 的缩写 xff0c 其功能是用来创建目录文件 使用简单 xff0c 但需要注意若要创建的目标目录已经存在 xff0c 则会提示已存在而不继续创建 xff0c 不覆盖已有文件 而
  • 如何在 MySQL 中创建超级用户

    如何在 MySQL 中创建超级用户 xff1f 本指南将引导您完成在 MySQL 中创建新用户并使其成为具有类似于 root 的数据库访问权限的超级用户的步骤 1 首先 xff0c 你必须使用具有CREATE USER权限的root用户登录
  • 统计员工年度,月度的加班和调休统计

    根据需求 xff0c 写了一个统计部门员工年度的加班与调休统计报表 实现结果如下 xff1a 页面代码如下所示 xff1a 64 model IEnumerable lt lvElecCenter Areas HR Models Leave
  • 我的2014-前进在梦想的道路上

    离2014的结束还有2天 xff0c 一年终去 xff0c 感触颇多 xff1a 或是振奋 xff0c 或是感动 xff0c 或是美好 停下手头繁忙的工作 xff0c 静下心来 xff0c 我们一起 来 盘点这一年的工作和生活 这一年你是否
  • 云计算知识3:弹性计算云EC2的基本架构

    弹性计算云EC2主要特性 灵活性 xff1a EC2允许用户对运行实例类型 数量自行配置 xff0c 还可以选择实例运行的地理位置 xff0c 根据用户的需求随时改变实例的使用数量 低成本 xff1a EC2使得企业不必为暂时的业务增长而购
  • 如何将一个网络分为两个子网、如何通过已知IP和子网掩码计算其同一网段的主机IP

    IPV4的IP地址格式通常表示为xxx xxx xxx xxx xff0c 其中xxx为十进制数 xff0c 取值范围是 0 xff0c 255 xff0c 若用16进制表示则为xx xx xx xx xff0c 其中xx的取值范围是 0

随机推荐

  • Unity3D 人称设置(第一人称视角、第三人称视角)

    设置第一人称视角 1 把物体的坐标和摄像机的坐标设置成一样的 xff0c 这样摄像机就在物体内部 xff0c 就是第一人称的视角 2 把摄像机拖拽进物体对象内 xff0c 摄像机变成物体的子对象 xff0c 这样摄像机就能跟着物体一起移动
  • Unity3D 射击游戏练习实例

    知识点 xff1a 刚体组件 xff08 rigidbody xff09 xff0c 受力和碰撞的组件触发器 xff08 Trigger xff09 xff0c 开启后物体碰撞效果取消 xff0c 但仍会返回碰撞消息复制物体对象 xff1a
  • Cocos2dx 环境搭建

    Cocos2dx 环境搭建 准备软件和工具包 xff0c 参考 xff1a Cocos2dx 入门学习准备安装visual studio 安装Python2 7 xff08 直接默认下一步就可以 xff0c 要注意Python安装的路径 x
  • 缺失MSVCR相关文件怎么办

    根据系统的提示 xff0c 看缺失的是哪个文件 xff0c 正常是msvcr100 120 dll在百度上搜索对应文件下载把下载好的msvcr文件 xff0c 放到 C Windows SysWOW64 目录下正常msvcr文件会缺失好几个
  • Cocos2dx 源码解释

    程序入口 AppDelegate AppDelegate在AppDelegate h中定义的 AppDelegate h中的AppDelegate类 xff1a AppDelegate类下的applicationDidFinishLaunc
  • Visual Studio 2019(VS2019) 基本操作

    卸载 加载项目 1 卸载项目 xff1a 不删除项目代码 xff0c 但是停止对该项目的一切使用和调用 xff08 好处是保留代码 xff09 2 加载项目 xff1a 重新加载已停用的项目 xff0c 可以继续使用和调用 修改VS主题风格
  • Elasticsearch 中文分词&多词搜索&权重

    目录 中文分词器 一 安装中文分词器ik 二 使用中文分词器 多词搜索 权重 中文分词器 一 安装中文分词器ik 源码地址 xff1a https github com medcl elasticsearch analysis ik 根据提
  • C# do while循环结构

    注意 循环结构一共有三种 xff1a while循环 https blog csdn net shenqiankk article details 96299600do while循环for循环 https blog csdn net sh
  • C# for循环结构

    注意 循环结构一共有三种 xff1a while循环 https blog csdn net shenqiankk article details 96299600do while循环 https blog csdn net shenqia
  • C# 构造方法(函数)

    构造方法的作用 构造方法用来创建对象 xff0c 并且在构造方法中对对象进行初始化 构造方法的特殊性 没有返回值 xff0c 不需要写类型 xff0c 连void都不要写 构造方法的方法名 xff0c 与类名要相同 构造方法结构 publi
  • GDI+ 绘图方法

    GDI绘直线步骤 创建GDI对象 xff1a Graphics g 61 this CreateGraphics 创建画笔对象 xff1a Pen pen 61 new Pen Brushes Red 创建两个点 xff1a Point p
  • C# 连接MySQL数据库

    C 引用MySQL步骤 xff1a 下载mysql data dll xff1a http soft onlinedown net soft 618668 htm将文件放在项目目录下在VS2019项目内 xff0c 引用mysql data
  • Navicat of MySQL连接和使用

    请先安装MySQL服务 MySQL数据库安装 xff1a https blog csdn net shenqiankk article details 99756531 新建连接 如果出现Can t connect to MySQL ser
  • Mysql创建数据库字符集的选择

    转载 xff1a https blog csdn net JingChC article details 82908686 字符集选择 xff1a 在国内正常都是用 UTF 8 排序选择 xff1a 排序一般分为两种 xff1a utf b
  • Linux进程状态解析 之 R、S、D、T、Z、X (主要有三个状态)

    linux是一个多用户 xff0c 多任务的系统 xff0c 可以同时运行多个用户的多个程序 xff0c 就必然会产生很多的进程 xff0c 而每个进程会有不同的状态 Linux进程状态 xff1a R TASK RUNNING xff0c
  • python装饰器(详解)

    1 什么是装饰器 器指的是工具 xff0c 可以定义成成函数 装饰指的是为其他事物添加额外的东西点缀 合到一起的解释 xff1a 装饰器指的定义一个函数 xff0c 该函数是用来为其他函数添加额外的功能 就是拓展原来函数功能的一种函数 2
  • linux基础---常用命令学习

    1 显示日期的指令 xff1a date Linux时钟分为系统时钟 xff08 System Clock xff09 和硬件 xff08 Real Time Clock xff0c 简称RTC xff09 时钟 系统时钟是指当前Linux
  • JdbcTemplate queryForObject Incorrect result size: expected 1, actual 0

    使用Spring中的jdbcTemplate 时 xff0c 通过id查询不到结果时返回Incorrect result size expected 1 actual 0 64 Override public lt T gt T query
  • Ubuntu usb wifi驱动安装(MT7601u芯片)

    软件环境 Ubuntu 14 04 硬件环境 芯片 xff1a MT7601u 确定芯片 xff0c 在电脑插上usb wifi xff0c 在ubuntu命令行 xff0c 输入lsusb命令 xff0c 在所列的列表中有MT7601u即
  • 【目标检测】Fast RCNN算法详解

    Girshick Ross Fast r cnn Proceedings of the IEEE International Conference on Computer Vision 2015 继2014年的RCNN之后 xff0c Ro