Faster R-CNN

2023-05-16

1. 论文简介

论文名:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

论文地址 :Faster R-CNN

论文作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun

论文时间:2016年(论文发表)

说明:在GPU上推理速度达到5fps(包含候选区域生成的时间),准确率也有进一步的提升。

2. Faster R-CNN算法流程

简单来说就是:RPN+ Fast R-CNN,也就是用RPN网络来生成候选框,而不是使用SS算法来生成候选框。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_6,color_FFFFFF,t_70,g_se,x_16

(1)将图片输入到backbone网络中,从而获得特征图

(2)使用RPN网络生成后候选框,再将候选框投影到特征图上从而获得对应的特征矩阵

(3)将每个特征矩阵通过ROI Pooling层缩放到7x7大小的特征图,再将特征图展平,通过多个全连接层获得最终的预测结果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_10,color_FFFFFF,t_70,g_se,x_16

3. RPN网络结构

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_20,color_FFFFFF,t_70,g_se,x_16

上图为论文中给出的RPN网络。

注意:图中:256-d是使用ZF网络(Zeiler and Fergus model)得到的特征图的channel数量,如果使用VGG16网络,则channel数量是512。论文中,作者提到使用了这两种网络。

FPN网络的作用:1.生成proposal(经过一定的修正);2.初步判定proposal中是前景还是背景。

论文中提到,RPN网络采用了n x n的滑动窗口(即在特征图上使用n x n的窗口进行滑动作为输入,论文中n=3),然后接两个全连接层,其中一个称为box-regression layer(reg),另一个称为box-classification layer(cls)。

实际在执行的时候,在得到feature map之后,接一个3x3的卷积层,之后再接两个1x1的卷积层,其中一个用于回归,针对每个anchor box输出4个边界框回归参数(所以图上是4k),另一个用于分类,针对每个每个anchor box输出2个概率值(所以图上是2k),分别为前景的概率和背景的概率。

例如,以VGG16为例,得到的特征图为HxWx512,经过3x3卷积之后(滑动窗口),得到HxWx512的特征图,一个分支经过最终用于分类的1x1卷积层后,得到HxWx18的特征图;另一个分支经过最终用于回归的1x1卷积层后,得到HxWx36的特征图;这两个特征图后续还会做reshape等等。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_9,color_FFFFFF,t_70,g_se,x_16

所以RPN网络参数量(以VGG16为例):

1个3x3卷积层:3x3x512(channel)x512(number of filters)

2个1x1卷积层:1x1x512(channel)x(4+2)x9(anchors)

上面两个相加:gif.latex?2.4*10%5E%7B6%7D

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_6,color_FFFFFF,t_70,g_se,x_16

 4. Anchors

Faster R-CNN中,作者采用anchor-based的方法(pyramid of anchors),使得训练可以end to end,推理速度更快,也能够检测不同尺寸的目标。

anchor box其实就是原图上的一个一个的矩形框。具体生成方式如下:

对于特征图上的每个3x3的滑动窗口,找到滑动窗口的中心点,然后计算出该中心点对应到原始图像上的位置点,最后基于原始图像上的这个点绘制k(论文中为9)个anchor box。

也就是说,通过backbone网络,我们会得到特征图,由此也会知道整个backbone网络的stride,也就是下采样倍率,那么就可以根据这个stride将特征图上的某一个点映射回到原图上,然后在当前点根据anchor box的尺度和比例得到anchor box。

例如,假设当前滑动窗口的中心点是(2,2),特征图尺寸为HxW,原图尺寸为H'xW',我们可以计算H'/H以及W'/W(取整处理),那么(2x(H'/H) , 2xW'/W)就是在原图上的对应的点。

 anchor的尺度和比例():

三种尺度scale:gif.latex?128%5E%7B2%7Dgif.latex?256%5E%7B2%7Dgif.latex?512%5E%7B2%7D

三种比例ratio:1:1,1:2,2:1

如下图所示,中间蓝色的anchor的面积为gif.latex?128%5E%7B2%7D,蓝色正方形表示该anchor的高和宽的比例为1:1,横向的蓝色长方形表示该anchor的高和宽的比例为1:2,纵向的蓝色长方形表示该anchor的高和宽的比例为2:1。红色和绿色的框类似。

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_5,color_FFFFFF,t_70,g_se,x_16

 所以,对于特征图上的每个点,都会在原图上生成9个anchor。对于RPN网络来说,每个anchor都会输出2个代表前景和背景的概率值以及4个边界框回归参数,也就是RPN网络图上的2k和4k。

具体的,当k=9:

2k=18:gif.latex?%28p_%7Bf%7D%5E%7B1%7D%2Cp_%7Bb%7D%5E%7B1%7D%2Cp_%7Bf%7D%5E%7B2%7D%2Cp_%7Bb%7D%5E%7B2%7D%2C...%2Cp_%7Bf%7D%5E%7B8%7D%2Cp_%7Bb%7D%5E%7B8%7D%2Cp_%7Bf%7D%5E%7B9%7D%2Cp_%7Bb%7D%5E%7B9%7D%29,其中f表示前景,b表示背景

4k=36:gif.latex?%28t_%7Bx%7D%5E%7B1%7D%2Ct_%7By%7D%5E%7B1%7D%2Ct_%7Bw%7D%5E%7B1%7D%2Ct_%7Bh%7D%5E%7B1%7D%2Ct_%7Bx%7D%5E%7B2%7D%2Ct_%7By%7D%5E%7B2%7D%2Ct_%7Bw%7D%5E%7B2%7D%2Ct_%7Bh%7D%5E%7B2%7D%2C...%2Ct_%7Bx%7D%5E%7B8%7D%2Ct_%7By%7D%5E%7B8%7D%2Ct_%7Bw%7D%5E%7B8%7D%2Ct_%7Bh%7D%5E%7B8%7D%2Ct_%7Bx%7D%5E%7B9%7D%2Ct_%7By%7D%5E%7B9%7D%2Ct_%7Bw%7D%5E%7B9%7D%2Ct_%7Bh%7D%5E%7B9%7D%29

对于一张1000x600的图像,大约会有20000(≈60 x 40 x 9)个anchor,忽略掉跨边界的anchor后,会剩下大概6000个anchor用于训练。

作者在论文中有说,尽管backbone得到的特征图的感受野小于anchor的大小(ZF网络感受野:171,VG,16感受野:228),但仍然可以进行预测,因为我们可以通过物体的局部信息来推测某个目标。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_9,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_9,color_FFFFFF,t_70,g_se,x_16

 5.训练数据

训练RPN网络时

每个mini-batch从一张图片上采样。每个mini-batch包含256个anchor,其中正负样本比例1:1,如果正样本数量不够128,那么使用负样本进行填充。

正样本的定义:

        (1)和GT具有最大的IoU

        (2)和任何一个GT的IoU大于0.7

实际上,方法(1)可以说是方法(2)的补偿,作者说,通常情况下,方法(2)就能找到足够的正样本,但极少数情况下,使用方法(2)可能找不到正样本(也就是所有的anchor和GT的IoU都小于等于0.7),所以仍然会使用方法(1)。

负样本的定义:

        和所有GT的IoU小于0.3

既不是正样本也不是负样本的anchor都被舍弃。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_9,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_9,color_FFFFFF,t_70,g_se,x_16

训练Fast R-CNN时

RPN训练之后会通过回归参数调整候选框位置和大小,调整之后的称为region proposal(候选框)。

RPN生成的proposal之间存在大量重叠,可以基于cls score的值采用NMS方法来去除一些proposal,IoU阈值设置为0.7,最后每张图片剩下将近2000个候选框。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_9,color_FFFFFF,t_70,g_se,x_16

 6. RPN损失函数

原论文中给出如下式子

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_7,color_FFFFFF,t_70,g_se,x_16

 其中

i:表示mini-batch中的第i个anchor

gif.latex?p_%7Bi%7D:表示第i个anchor是目标(前景)的概率

gif.latex?p_%7Bi%7D%5E%7B*%7D:当anchor为正样本时为1,为负样本时为0

gif.latex?t_%7Bi%7D:表示第i个bounding box的边界框回归参数

gif.latex?t_%7Bi%7D%5E%7B*%7D:表示第i个正样本对应的GT Box

gif.latex?N_%7Bcls%7D:表示一个mini-batch中的样本数,值为256

gif.latex?N_%7Breg%7D:表示anchor位置的数量(对于一张1000x600的图像,大约会有2400(≈60 x 40)个位置)

gif.latex?%5Clambda:平衡系数,论文中取值为10

RPN损失函数由分类损失和回归损失两部分组成。

分类损失:

gif.latex?L_%7Bcls%7D%3D-logp_%7Bi%7D

举个例子:

最终得到的2k个类别score为:(0.1,0.9,0.3,0.7,...,0.8,0.2),每2个为一组,对应真实标签为:1,0,...,1。

那么gif.latex?%5Csum%20L_%7Bcls%7D%3D-log0.9-log0.3-...-log0%2C8

作者提到,为了简便起见,采用了2个类别的softmax。

当然,我们也可以用sigmoid,也就是binary cross entropy,也就是

gif.latex?L_%7Bcls%7D%3D-p_%7Bi%7D%5E%7B*%7Dlogp_%7Bi%7D-%281-p_%7Bi%7D%5E%7B*%7D%29log%281-p_%7Bi%7D%29

这个时候需要注意,分类输出的应该是k个值。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_9,color_FFFFFF,t_70,g_se,x_16

 回归损失:

和Fast R-CNN是一样的原理,都是使用smooth gif.latex?L_%7B1%7D损失函数。

gif.latex?L_%7Breg%7D%28t_%7Bi%7D%2Ct_%7Bi%7D%5E%7B*%7D%29%3D%5Csum%20smooth_%7BL_%7B1%7D%7D%28t_%7Bi%7D%2Ct_%7Bi%7D%5E%7B*%7D%29

gif.latex?t_i%3D%5Bt_%7Bx%7D%2Ct_%7By%7D%2Ct_%7Bw%7D%2Ct_%7Bh%7D%5D

gif.latex?t_%7Bi%7D%5E%7B*%7D%3D%5Bt_%7Bx%7D%5E%7B*%7D%2Ct_%7By%7D%5E%7B*%7D%2Ct_%7Bw%7D%5E%7B*%7D%2Ct_%7Bh%7D%5E%7B*%7D%5D

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6buE6buE5ZG85ZG855qE5a2m5Lmg5pel6K6w,size_6,color_FFFFFF,t_70,g_se,x_16

 gif.latex?x%2Cx_%7Ba%7D%2Cx%5E%7B*%7D分别属于predicted box,anchor box,ground-truth box。

7. Fast R-CNN损失函数

参考:Fast R-CNN

8. Faster R-CNN训练过程

现在:联合训练,Total Loss = RPN Loss+Faster R-CNN,反向传播。(pytorch官方示例)

原论文:

(1)利用ImageNet预训练模型初始化backbone,然后单独训练RPN网络;

(2)固定RPN网络参数,利用ImageNet预训练模型初始化backbone,利用RPN网络生成的proposal训练Fast R-CNN;

(3)固定Fast R-CNN训练好的backbone参数,微调RPN网络;

(4)固定backbone,微调Fast R-CNN全连接层参数;

(5)最后,RPN和Fast R-CNN共享backbone参数。

 

 

 

 

 

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

Faster R-CNN 的相关文章

随机推荐

  • ARM开发中ubuntu设置成静态IP的优劣分析

    ARM linux开发中 xff0c 我们经常将主机ubuntu设置成静态IP 这有一些好处 xff0c 譬如你的uboot的环境变量中serverip就不用每次改来改去的了 我一直也是这么做的 xff0c 但是今天突然发现这样会带来很多问
  • 手把手教你做计算机网络基础大题—路由表

    一 题目 设某路由器建立了如下路由表 xff1a 目的网络子网掩码下一跳128 96 39 0255 255 255 128接口m0128 96 39 128255 255 255 128接口m1128 96 40 0255 255 255
  • 新手入门:ST-Link和J-Link仿真器的使用

    当编译完成之后 xff0c 点击下载 xff0c 出现这样的错误提示 xff0c 说明我们的仿真器配置没有配置好 xff0c 下面我们讲讲J Link和ST Link分别应该如何配置 xff08 1 xff1a 编译 xff0c 后续只编译
  • 深度学习图像分类实战——pytorch搭建卷积神经网络(AlexNet, LeNet, ResNet50)进行场景图像分类(详细)

    目录 1 一 实验过程 1 1 实验目的 1 2 实验简介 1 3 数据集的介绍 1 4 一 LeNet5网络模型 1 5 二 AlexNet网络模型 1 6 三 ResNet50 xff08 残差网络 xff09 网络模型 二 实验代码
  • c++实现经典游戏贪吃蛇(超详解)

    经典版 要求 xff1a 1碰到四周和自身游戏结束 xff1b 2迟到食物蛇身增长 xff1b 3食物吃得越多游戏越快 xff1b 4通过w a s d可控制蛇头的方向 xff1b 5蛇身颜色不一致 源码 xff08 需要easy x 贪吃
  • c++中求数组的长度

    c 43 43 中求数组的长度 数组长度 61 sizeof 数组名 sizeof 数组类型 span class token macro property span class token directive hash span span
  • 实验 1 UML 类图实验

    实验内容 作图工具 xff1a PowerDesigner 1 绘制以下类图并生成源代码 xff08 语言不限 xff09 xff1a 2 根据以下描述绘制类图 xff0c 再正向工程生成 Java 源代码 xff08 也可生成其他面 2
  • 贪吃蛇(C++)

    一 项目思路 该项目用于计算机软件课设 贪吃蛇要解决的问题有 xff1a 蛇身的移动 xff0c 事物的随机生成 xff0c 蛇头与食物重合 xff0c 蛇吃食物身体的变长 蛇身移动的处理可以改变蛇首元素 xff08 蛇身用数组存储 xff
  • C语言编程工具Dev C++的安装教程

    一 Dev C 43 43 安装包 xff08 5 11版本 xff09 无偿分享 Dev C 43 43 5 11 简体中文版下载地址 xff1a 百度网盘 xff1a 链接 xff1a https pan baidu com s 1Yb
  • winform基础 C#编程

    1 winform应用程序是一种智能客户端技术 xff0c 帮助我们获得信息或者传输信息 2 当后台需要获取前台控件属性 xff0c 需要使用Name属性 visible 指示一个空间是否可见 enabled 指示一个空间是否可用 3 事件
  • 联合索引为啥需要满足最左前缀原则?

    在回答这个问题之前 首先需要先了解清楚何为联合索引 联合索引就是MySQL设计大叔为了节省内存而创建的将多个列的值作为非叶子节点存储的B 43 树结构 比如按照key part1 key part2 key part3列创建了idx key
  • 堆栈和变量的分配区域

    转载自 http mengren425 blog 163 com blog static 56903931200791003721118 一 预备知识 程序的内存分配 一个由c C 43 43 编译的程序占用的内存分为以下几个部分 1 栈区
  • 2023海南大学835软件工程原理方法与应用考研总结

    不知不觉23考研已经结束一个星期了 xff0c 考试的过程还历历在目 政治复习虽然看完了徐的视频 xff0c 刷完了1000题 xff0c 写了肖8肖4 xff0c 背了肖4大题 xff0c 但选择题写的时候还是十分纠结 xff0c 用了一
  • vue 封装 axios 请求

    需求 xff1a 向后端请求拿数据 好处 xff1a 把所有的请求方法放在一个文件夹里面 xff0c 方便优化 先把 axios 安装起 npm install axios save 接下来按照步骤走吧 go go go 1 在src路径下
  • Python:从清华源安装第三方库

    python 在使用pip安装的时候 xff0c 一些小一点的还好 xff0c 安装一些大的包的时候 xff0c 会非常的慢甚至出现timeout的报错 xff0c 这时我们就可以使用清华大学的镜像来安装 xff0c 打开终端 xff1a
  • 用OpenStack搭建简单的云平台并启动云主机

    OpenStack OpenStack简介OpenStack重要集成组件OpenStack平台部署部署环境建立虚拟机 配置时间同步安装OpenStack安装 RabbitMQ 消息队列服务Memcached缓存令牌的安装安装和配置OpenS
  • 关于VMware USB arbitration Serve 服务无法启动的问题

    文章目录 问题方法一方法二 问题 虚拟机插入U盘或者PA等其他USB设备时无法识别 xff0c 经过一番查询发现是本机的VMware USB arbitration Serve 没有启动 xff0c 然后 打开以后尝试启动VMware US
  • keil5安装记录(基于stm32芯片配置)

    参考资料地址正点原子 下载上述地址中的文件 xff0c 根据自己芯片的型号下载 xff0c 如仅安装keil仅下载网盘中的 软件资料 即可 xff0c 同时也可在官网下载 xff0c 但是不推荐下载最新版本 xff0c 因为很多报错没有可参
  • 黎曼几何与黎曼流形

    目录 0 黎曼几何 1 欧几里得几何与黎曼几何的区别 2 黎曼流形 3 黎曼距离 4 切空间 5 黎曼均值 6 SPD矩阵如何形成黎曼流型 7 切线空间映射 8 同余变换和同余不变 9 黎曼对齐 科普性笔记 xff0c 做了解 xff0c
  • Faster R-CNN

    1 论文简介 论文名 xff1a Faster R CNN Towards Real Time Object Detection with Region Proposal Networks 论文地址 xff1a Faster R CNN 论