Fast R-CNN论文笔记《Fast R-CNN》
2016-03-11 09:02
218 查看
1.Introduction
在之前介绍的R-CNN中,训练是分多阶段进行的(multi-stage pipeline),基本上都要分为4步extracting features、fine-tuning a network with log loss、training SVMs和fitting bounding box regressors。新提出的SPPnet网络也和这个过程类似,故导致训练比较缓慢。本文中,提出了一个新的单阶段训练算法,它可以同时学习去分类物体建议框和改善他们的空间位置,对应于原文中就是:Wepropose a single-stage training algorithm that jointly learns to classify object proposals and refine their spatial locations
2.Fast R-CNN的结构和训练
Fast R-CNN的整体结构如下所示:首先,输入的是一张完整图片和一组物体建议框(也叫RoIs)。
然后,对Conv feature map进行特征提取。每一个区域经过RoI pooling layer和FC layers得到一个固定长度的feature vector(这里需要注意的是,输入到后面RoI pooling layer的feature map是在Conv feature map上提取的,故整个特征提取过程,只计算了一次卷积。关于这一点的详细说明,大家可以看SPP net的论文,也可以看我前面的关于Spp-net论文笔记 ,虽然在最开始也提取出了大量的RoI,但他们还是作为整体输入进卷积网络的,我理解的最开始提取出的RoI区域只是为了最后的Bounding
box 回归时使用,用来输出原图中的位置)。
最后,这些特征向量在经过全接连层之后进入两个并列的输出层:softmax layer,输出每一个RoI的概率分布;
bbox regressor,输出每一个种类的的边界盒回归偏差(至于如何理解bounding box regression,见上一篇R-CNN论
文笔记)整个结构是使用多任务损失的端到端训练(trained end-to-end with a multi-task loss)
2.1 RoI pooling layer
在本文中,每一个RoI都有一个四元组(r,c,h,w)表示,其中(r,c)表示左上角,而(h,w)则代表高度和宽度。这一层使用最大池化(max pooling)来将RoI区域转化成固定大小的H*W的特征图。假设一个RoI的窗口大小为h*w,则转换成H*W之后,每一个网格都是一个h/H* w/W大小的子网,利用最大池化将这个子网中的值映射到H*W窗口即可。Pooling对每一个特征图通道都是独立的,这是SPP layer的特例,即只有一层的空间金字塔。
2.2 从预训练的网络中初始化数据
有三种预训练的网络:CaffeNet,VGG_CNN_M_1024,VGG-16,他们都有5个最大池化层和5到13个不等的卷积层。用他们来初始化Fast R-CNN时,需要修改三处:①最后一个池化层被RoI pooling layer取代
②最后一个全连接层和softmax被替换成之前介绍过的两个兄弟并列层
③网络输入两组数据:一组图片和那些图片的一组RoIs
2.3 检测中的微调
使用BP算法训练网络是Fast R-CNN的重要能力,前面已经说过,SPP-net不能微调spp层之前的层,主要是因为当每一个训练样本来自于不同的图片时,经过SPP层的BP算法是很低效的(感受野太大). Fast R-CNN提出SGD mini_batch分层取样的方法:首先随机取样N张图片,然后每张图片取样R/N个RoIs e.g. N=2 and R=128除了分层取样,还有一个就是FRCN在一次微调中联合优化softmax分类器和bbox回归,看似一步,实际包含了多任务损失(multi-task loss)、小批量取样(mini-batch sampling)、RoI pooling层的反向传播(backpropagation
through RoI pooling layers)、SGD超参数(SGD hyperparameters)。
多任务损失
两个输出层,第一个是(K+1)个类别的离散分布概率第二个是k个类别的Bounding box regression offset
整体loss:
左边是分类损失,右边是定位损失,由于本人对数学实在无感,自己看的也是摸不到头脑,这里不再献丑,欢迎大神指导。
相关文章推荐
- 羊皮书APP(Android版)开发系列(四)全屏幕延迟启动
- 嵌入式SQL
- github开启双因素验证后无法push【solved】
- 给网站的URL加上锚点#
- java中volatile关键字的含义
- String的subString()方法实现内部机制
- 复杂性、易错性
- Extjs4.1 - Ext.util工具包详解
- Windows Embedded Standard 7 快速入门指南 1 of 4
- Android系统架构
- Linux下使用popen()执行shell命令
- Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转
- Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转
- Eclipse Plugin Development 从现在开始
- UVa489 Hangman Judge
- 在Eclipse中导出带有自己签名的Android apk文件
- 架构要素-高可用性
- win10系统桌面图标间距该怎么设置?
- CentOS 6.7网络配置
- 正则表达式学习参考