Faster R-CNN由一个推荐区域的全卷积网络和Fast R-CNN组成, Fast R-CNN使用推荐区域。整个网络的结构如下:

1.1 区域推荐网络

输入是一张图片(任意大小), 输出是目标推荐矩形框的集合,以及相应的目标打分。网络的前面使用了一个基本的卷积层集合来提取特征(ZF或VGG-16)。这个基本层同时被RPN网络和Fast R-CNN使用。

在基本层之后,文中使用一个n*n的滑动窗口在最后一层特征图卷积,在每一个窗口位置,得到一个256维或512维的特征。这个特征随后被送进两个全连接层,分别是box-regression layer和box-classification layer。

上段中的迷你网络如下图所示。由于迷你网络是通过滑动窗口的方式,所以得到的特征是共享位置信息的,于是box-regression和box-classification层的全连是通过1×1的卷积实现。

1.1.1 Anchors

在滑动窗口的每个位置,会预测多个推荐区域,数量记为K(文中为9)。reg层有4K个输出(编码K个方框的坐标),cls层有2K个输出(预测目标或非目标的概率)。    这K个推荐区域被称为anchors。每个anchor都在滑动窗口的中心,并有相应的尺度大小和长宽比例。文中采用了三种尺度和三种长宽比,因此K为9。在这层卷积中,padding为1, stride为1, 所以总共会产生W*H(特征图的大小)个anchors。

1.1.2 Anchors的变换不变性(ranslation-Invariant)

变换不变性是说,anchors和根据anchors计算推荐区域的函数是对图像的变换不变的。就是说,如果变换了图像中的一个对象,那么推荐的区域也是相应变换的,同样的函数可以预测任何位置的一个推荐区域。我的理解是针对图像的平移缩放,anchors照样能检出对应的区域。这个性质是与文中提到的MultiBox方法使用k-means生成anchors相对的,因为k-means聚类方法是依赖于初始点的选取的,所以没有变换不变性。

1.1.3 多尺度Anchors 作为回归引用(Regression References)

有两种多尺度预测方式。一种是图像/特征金字塔,图像在多个尺度进行resize,卷积特征在每个尺度的图像上进行计算,比较耗费时间。另一种在特征图上使用多尺度的滑动窗口,这种方法更为高效。

1.1.4 损失函数

为了训练RPN,文中   对每个anchor赋予二值(是目标或非目标)类标签。对两种anchors赋予正标签:1)和真值框有最高交并比的anchor/anchors;2)和任何真值框的IoU高于0.7。对和所有真值框IoU都低于0.3的anchor赋予负标签。其他的anchors不作为训练目标。损失函数如下:

i是一个mini-batch中anchor的序号,pi是anchor i被预测为目标的概率。真值标签pi*是1, 如果anchor赋予了正标签,pi*是0, 如果anchor赋予了负标签。ti是预测的bounding box的4个参数坐标向量,ti*是正anchor的ground-truth box。Lcls是两类的log损失。Lreg(ti, ti*) = R(ti - ti*),R是smooth L1函数(在(2)式中定义)。pi*Lreg只针对正anchors(pi*=1)。cls和reg层分别输出{pi}和{ti}。Ncls(=256)是mini-batch的大小, Nreg是anchor位置的数目(Nreg~2400),默认设置λ=10,来使两项损失权重大致相等。

上式中x,y,w,h表示box的中心坐标和宽度、高度。变量x, xa, x*分别表示预测框、anchor框、真值框。

1.1.5 训练RPN网络

每个mini-batch从单个图像中的正负anchors产生。文中正负anchor的比例为1:1。如果正样本数少于128,则用负样本填充。

1.2 RPN和Fast R-CNN共享特征

RPN和Fast R-CNN单独训练会以不同方式修改卷积层。文中介绍了三种方式共享卷积层。

(i)交替训练。首先训练RPN,使用proposals训练Fast R-CNN。网络使用Fast R-CNN微调,然后用来初始化RPN,迭代这个过程。

(ii)   近似联合训练。在每次SGD迭代时,前馈计算生成区域推荐,看作训练Fast R-CNN检测器的预计算推荐。反馈传播中共享层传播RPN和Fast R-CNN结合的损失。这种方式忽略了关于推荐框坐标的导数。

(iii) 非近似联合训练。Fast R-CNN中的 RoI pooling层接收卷积特征和预测的bounding boxes作为输入,这时反向传播会涉及到box corrdinates.这时需要RoI poling层关于box coordinates是可微的。

1.2.1 4-步交替训练

第一步,训练RPN,用预训练的ImageNet模型初始化,端到端微调区域推荐任务。第二步,通过Fast R-CNN训练一个单独的检测网络,从第一步的模型中产生推荐框。这个网络也用ImageNet模型初始化。这时候两个网络不共享卷积层。第三步,使用检测网络初始化RPN训练,固定了共享卷积层,只微调独属于RPN的层。现在两个网络共享卷积层。第四步,使卷积层固定,微调独属于Fast R-CNN的层。这样,两个网络共享了卷基层,形成了一个统一网络。

1.3 实现细节

训练时,会将与边界有交叉的anchors删除,否则会难以收敛。测试时,仅仅将与边界交叉的anchors切到边界即可。

Faster RCNN论文解析的更多相关文章

  1. [原创]Faster R-CNN论文翻译

    Faster R-CNN论文翻译   Faster R-CNN是互怼完了的好基友一起合作出来的巅峰之作,本文翻译的比例比较小,主要因为本paper是前述paper的一个简单改进,方法清晰,想法自然.什 ...

  2. k[原创]Faster R-CNN论文翻译

    物体检测论文翻译系列: 建议从前往后看,这些论文之间具有明显的延续性和递进性. R-CNN SPP-net Fast R-CNN Faster R-CNN Faster R-CNN论文翻译   原文地 ...

  3. [Network Architecture]Mask R-CNN论文解析(转)

    前言 最近有一个idea需要去验证,比较忙,看完Mask R-CNN论文了,最近会去研究Mask R-CNN的代码,论文解析转载网上的两篇博客 技术挖掘者 remanented 文章1 论文题目:Ma ...

  4. Faster R-CNN论文详解 - CSDN博客

    废话不多说,上车吧,少年 paper链接:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks ...

  5. 【目标检测】Cascade R-CNN 论文解析

    目录 0. 论文链接 1. 概述 2. 网络结构的合理性 3. 网络结构 4. 参考链接 @ 0. 论文链接 Cascade R-CNN 1. 概述   这是CVPR 2018的一篇文章,这篇文章也为 ...

  6. Faster RCNN论文学习

    Faster R-CNN在Fast R-CNN的基础上的改进就是不再使用选择性搜索方法来提取框,效率慢,而是使用RPN网络来取代选择性搜索方法,不仅提高了速度,精确度也更高了 Faster R-CNN ...

  7. Faster R-CNN论文阅读摘要

    论文链接: https://arxiv.org/pdf/1506.01497.pdf 代码下载: https://github.com/ShaoqingRen/faster_rcnn (MATLAB) ...

  8. Faster RCNN代码解析

    1.faster_rcnn_end2end训练 1.1训练入口及配置 def train(): cfg.GPU_ID = 0 cfg_file = "../experiments/cfgs/ ...

  9. faster rcnn算法及源码及论文解析相关博客

    1. 通过代码理解faster-RCNN中的RPN http://blog.csdn.net/happyflyy/article/details/54917514 2. faster rcnn详解 R ...

随机推荐

  1. mdev自动创建和删除设备节点

    设备节点的创建有二种方法: 1)手动创建:mknode命令  当insmod后,还需要手动moknod创建设备节点才能被应用层打开,并且使用完成之后还要删除节点. 2) 自动创建:mdev mdev, ...

  2. Jumpserver堡垒机搭建(脚本自动化)

    #!/bin/bash # coding: utf- # Copyright (c) set -e #返回值为非0时,退出脚本 echo "0. 系统的一些配置" setenfor ...

  3. 使用单例模式来打造ActivityManager类

    单例(Singleton)模式 定义 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象. GoF对单例模式的定义是: ...

  4. C++ map练习

    C++ STL之map map介绍 C++里的map数据结构,会存储键值对信息key-value,通过key得到value的信息.map的key与value有一个特点就是:每个唯一的key拥有唯一对应 ...

  5. Shell中的${}、##和%%使用范例

    假设定义了一个变量为,代码如下: file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值: ${file#*/}: 删掉第一个 / 及其左边的字符串:di ...

  6. CentOS6.5 虚拟机 磁盘扩容

    1. 关闭虚拟机 2. 编辑虚拟机设置:增加硬盘的置备大小,或者添加新的硬盘 3. 启动虚拟机,查看可用磁盘大小 : # df -Th Filesystem Type Size Used Avail ...

  7. keepalived+nginx+tomcat+redis实现负载均衡和session共享(原创)

    keepalived+nginx+tomcat+redis实现负载均衡和session共享 直接上链接,码了一天,就不再重写了,希望能帮到大家,有问题欢迎留言交流.

  8. 微信小程序 唯一标识 加减

    var nums = 'goods_list[' + e.currentTarget.dataset.indexs+'].goods_num' //console.log(nuns) var num ...

  9. laydate5.0 设置最大最小值

    由于新版的laydate时间插件在初始化时已设置时间最大最小范围,且生成对象,无法重新渲染改变其日期最大最小值. 有网友经实验贴出如下方法可达成目的,故做记录. //开始时间 var startDat ...

  10. Java软件开发者,如何学习大数据?

    正常来讲学习大数据之前都要做到以下几点 1.学习基础的编程语言(java,python) 2.掌握入门编程基础(linux操作,数据库操作.git操作) 3.学习大数据里面的各种框架(hadoop.h ...