Fast-R-CNN论文笔记

目标检测之Fast R-CNN论文精讲,Fast RCNN_哔哩哔哩_bilibili

一 引言

1.1 R-CNN和SPPNet缺点

😀R-CNN

Training is a multi-stage pipeline

多阶段检测器(两阶段和一阶段检测器) 1️⃣首先训练了一个cnn用来提取候选区域的特征,这个cnn训练好后再提取整个数据集上所有区域的特征;

2️⃣然后利用特征来额外训练一个svm网络来对候选区域进行分类。

如果是RCNN-BB算法,还会3️⃣额外训练一个框回归的模型来回归出候选框的精确位置。

Training is expensive in space and time

在训练svm和框回归模型的时候,需要把每一张图片上的每一个候选框的这个特征都提取出来,这些特征都被提取出来后才能训练后续的模型;

所以利用cnn提取到这个特征,需要先把它写到磁盘里供后续训练使用;

所以在训练过程中会耗费大量的空间来存特征、会耗费大量的时间来提取特征

Object detection is slow

对于一张测试图片RCNN也需要先产生2000个候选区域,每个候选区域都需要通过cnn的前向传播来提特征; 因此测试一张图片的速度也会特别慢,导致一张图的测试时间可能会达到47秒。

😅因为R-CNN需要使用一个cnn来前向传播,提取每一个候选区域的特征,没有用到共享计算;因此后续提出的SPP-net这个网络,就尝试通过共享计算来加速r cnn的训练和测试过程;

😲RCNN ---> SPP-Net

在SPP-Net可以只用把一整张图传进去给cnn,然后在cnn里只使用这一整张图进行一次前向传播,计算整张图的一个特征图,最后再把各个候选区域的特征给抠出来就可以了,也就是在整张图上共享计算;

否则在R-CNN里,还需要先产生2000个候选区域,每个候选区域都需要通过cnn的前向传播来提特征;

SPP-Net优化了R-CNN第三个缺点;

😆SPP-Net

它的核心其实就是引入了一个这个spp层,也叫空间金字塔池化(SPP和ASPP)层。 这个空间金字塔池化层的尺寸和步长是一个动态变化的过程 它会根据你输出特征图的尺寸来动态的改变尺化合的尺寸和步长; 

在得到4x4大小、2x2大小和1x1大小的一个特征图之后,再把这些特征给拼接起来,形成了一个固定长度的一个特征,然后再把这个特征传给后续的全连接层形成最终的一个候选区域的图片特征;

1️⃣但SPP-Net仍是一个多阶段过程;

SPP-Net的微调很难更新卷积层

1.2 Fast-RCNN优势

  1. 比RCNN和SPPNET具有更高的一个检测精度
  2. 它的训练过程是一个单阶段的过程
  3. 训练能更新所有的网络层,而不像sppnet不能更新卷积层
  4. 由于训练过程变成单阶段了,所以不需要额外的磁盘空间来缓存特征

二 Fast R-CNN模型结构和训练流程

模型结构

😺对于一整张输入图片,会先通过一个深度卷积神经网络来得到整张图片的图片特征; 😸根据候选区域在原图上的一个图片位置,使用ROI投影来获取到候选区域; 😹有了候选区域的特征图之后,再通过ROI池化层把尺寸不固定的候选区域特征图给转换成特定尺寸的一个特征图; 😻再接上两个全连接层来得到每一个区域的特征向量; 😼再额外接上两个并行的全连接层,其中一个利用soft max函数负责预测类别, 😽另一个直接预测和框坐标相关的一个框回归; 🙀这个预测类别的分支输出k加一个数据集的类别,另外加上一个背景类; 😿预测坐标的分支直接输出4*(k+x),也就是每个类别对应的坐标;

vs spp-net

😈是SPP-NET在最后一个卷积层后面跟上的是一个空间金字塔池化,但是Fast-RCNN在最后一个卷积层后面跟上的是一个ROI池化层

👽SPP-NET它在提取到候选区域的特征之后,像RCNN一样额外训练支持向量机进行分类或回归; 但是Fast-RCNN在是后面直接接了两个并行的全连接层实现分类和回归;

2.1 ROI 池化层

The RoI pooling layer uses max pooling to convert the features inside any valid region of interest into a small feature map with a fixed spatial extent of H × W (e.g., 7 × 7), where H and W are layer hyper-parameters that are independent of any particular RoI.

它能将任意有效的候选区域内的这个特征给转化成一个小的特征图并且这个小的特征图具有特定的一个空间范围;

它本质上就是使用最大池化把不规则的一个特征图给转换成一个特定尺寸的输出;

只不过在这个空间金字塔池化层这里它是分别使用了三个不同的磁化来得到三个不同大小的一个输出;

但是在FAST-RCNN这里作者只用了一个池化来得到一个输出

The RoI layer is simply the special-case of the spatial pyramid pooling layer used in SPPnets [11] in which there is only one pyramid level

它仅仅是空间金字塔池化层的一种特殊情况,因为金字塔池化层是有三个输出,但是ROI层在这里它只有一个输出;

2.2 从预训练模型中初始化一个Fast-R-CNN

作者试验了三个预训练的imagenet网络,每个网络都具有五个最大池化层,并且具有5到13个卷积层;(这三个预训练模型的具体结构会在4.1小节给详细列出)

这里的预训练网络其实指的就是在imagenet上预训练好的一个图像分类模型, 预训练的分类模型一般都是这种结构: 🙈先传入一整张图片给一个深度卷积网络; 🙉这个深度卷积网络会得到这一整张图片的一个特征图,然后接上一个固定尺寸的最大池化层,来对这一个特征图做最大池化; 🙊再接上几个全连接层; 🙉最后再跟上一个全连接层和soft max函数来输出image net数据解上的1000个图像类别; 

这里的这个初始化,它指的其实就是把一个预训练的一个图像分类网络 给变成Fast-RCNN网络的一个过程; 也就是从上面这个模型变成下面这个模型的过程: 

第一步先把最后的一个最大池化层给替换成ROI池化层

第二步是把最后的一个全连接层和soft max层给替换成了两个并行的全连接层;

其中一个分支用来预测k加一个类别;

另一个分支用来预测边界框回归;

第三步是把网络给修改成了两个数据输入;

除了输入图片外还需要输入图片中的一系列候选区域坐标,以便于你在最终的这个特征图中根据这个候选区域的坐标把这个候选区域的特征给抠出来

2.3 在检测任务上进行微调

微调模型它其实就是使用反向传播来训练整个网络的一个权重

🤔为什么Fast-RCNN有很好的训练权重能力,SPP-NET却不能?

答:这涉及到训练过程中样本的一个采样方法;

在模型训练时,需要一批一批的图片喂给这个卷积神经网络,一次会传入多张图片。在反向传播更新权重的时候,是需要利用你正向传播得到的中间每一层的值去更新权重的;

在训练时,因为一批样本它是通过随机采样得到的,比如需要128个候选区,这128个区域它可能是来自不同的图片,也就是说你需要传入128张这种类似的原图进去; 然后在128个特征图中各自抠出各自所需要的这个后面区域; 在前向传播和反馈传播的过程中,会占用大量的显存,降低模型的训练效率

在FAST-RCNN的训练过程中,随机梯度下降Stochastic Gradient Descent(SGD)的这个mini-batch它是通过一种按层抽样的方法;

以N等于二,R等于128为例: 🙋会首先采样两张图片; 🙋‍♂️然后在每张图片上各自采样64个候选区域;

👍这样做的好处就是每次在前向传播的时候,只能传两张图片进去就可以了; 因为每张图片的64个区域都是在一张图上去得到的,所以说你只需要两张原图传进去,然后在两张原图的特征图上各自扣出64个候选区域就可以了;

而不是像SPP-Net一样需要去传入128个原图,大大提升了训练效率

🥳训练时的多任务损失函数

Fast-RCNN是有两个并行的输出层;

第一个输出用来产生k加一个类别; 其中p0 表示某个候选区域是背景类的概率; p1到pk表示属于k数据集类别的概率;

第二个分支输出是一个框回归的一个偏移量; 它预测出来的tx和ty表示框的中心点归一化后的偏移量; tw和th表示跟边界框的宽和高相关的一个值;

p和t都是每个候选区域的预测值

求损失函数的时,除了要有预测值之外,还需要有一个提前标注好的一个目标值,也就是ground truth;

这里把标注好的候选区域类别给用u符号表示; 把边界框回归的目标值给定义成v这个符号;

😘类别损失公式: 

 λ [u≥1 ] 一般等于1。 它表示只有当目标类别是≥1的时候,值才等于一; 表示需要求这个回归损失,如果u等于零,就表示这是一个背景类,这个值也就是零,所以最后回归损失就是零,因为背景类它是没有预测框的,也就不需要去求后边这个回归损失。

😲**类别损失函数: 

😊**框回归损失函数: 

🤡vs RCNN smoothL2

假如使用L2损失,这条曲线是可以向两端无限延伸,如果预测出来的这个预测值和目标值偏差过大的话,即x过大,导致smooth值一直无限的往上延伸;

在图像上,斜率其实就是梯度,当无线往上延伸的时候,这个梯度就会趋向于无穷大,最终会产生梯度爆炸现象,没法训练;

所以这个smooth L1损失它在x≥1时,等于|x|-0.5,它的梯度恒等于1,相当于是给梯度设置了一个上限,不会再像L2损失一样产生梯度爆炸;

当x绝对值小于一的时候,多乘了一个0.5系数,是为了让这个分段函数在 x=1的这个点两端的一个梯度值连续

👻Mini-Batch采样策略

在微调期间,每个随机梯度下降的mini batch都先随机去采样了两张图片; 然后在每个图片上在采样64个候选区域; 这样就构成了一个128个候选区域的一个mini batch

在这128个候选区域里有25%,也就是32个候选区域是正样本; 剩下的96个候选区域是负样本;

正样本的采样方法跟 RCNN一样,以IoU≥0.5来作为正样本; 在剩下的候选区域里,IoU在0.1~0.5之间的候选区域作为负样本; 对于阈值低于0.1的样本,都采用难例挖掘 hard negative mining的这种方法来挑选难样本进行训练;

在训练期间,每张图片都随机的以0.5的概率去做水平翻转

🤢RoI池化层的反向传播公式

Back-propagation through RoI pooling layers这里假设只使用一张图,也就是mini batch的N=1来进行推导; N=1就表示在一张图上取出了128个候选区域,通过ROI池化层,而不像之前一样使用两张,一张取出64个候选区域。

举例: 

 在这张图上一共取出来了128个候选区域的一个特征图,这个特征图是其中第二个候选区域的特征图; 假设它是一个7x7大小的一个特征图,假如使用了一个3x3步长为二的一个最大池化; 对这个特征图进行操作,通过池化处理以后会得到一个3x3的输出特征图;

这里的这个xi指的就是输入特征图上的每一个位置的一个元素值;

这里的y r j表示的就是输出输出特征图上的每一个位置的一个元素值,也就是第二个特征图上的这个输出;

y rj的这个值是通过在池化和的范围内挑选出最大的那一个值,然后得到的这个位置的值; ![[Fast R-CNN.pdf#page=3&rect=466,90,530,100&color=note] 这里的Xi*, 小括号指的就是这个石化和覆盖区域内的最大值; 所以这个值和这个值是相等的.反向传播公式:

👾训练过程的超参数

全连接层初始化的时候,使用了一个零为均值,然后0.01或者0.01为标准差的高斯分布来初始化,偏差项被初始化为零;

设置了一个学习率以及这个权重衰减的一个值;

2.4 目标的尺度不变性

尺度不变性指的就是有两个相同的目标,一个目标比较,一个目标比较,如果这两个目标都能够被模型识别出来,就说明这个模型具有比较好的尺度不变性。

作者设计了两种方法:

1️⃣brute-force approach

可以把它理解成单尺度训练。

在单尺度训练过程中,每一张图片都被处理成了一个预定义好的图片尺寸来进行训练或者进行预测;

他的目的是让网络来直接学会尺度不变形

多尺度方法。

在训练期间,每一张图片都先被随机采样成一个特定的尺度,而不是像第一种一样采用一个预定义的固定尺度;

这种多尺度的训练方法也是一种数据增强的方式

👋这两种方法在第五章有实验结果做对比。

三 Fast-RCNN测试流程

一旦fast cn的网络被微调好后就可以进行目标检测,整个网络只需要接收两个输入,分别是一张图片和这个图片中的一系列目标候选区域,就能够预测出候选区域的类别和精确坐标。

对于图像分类任务来说,花费在全连接层上的时间比花费在卷积层上的时间要小

相反的对于检测任务来说,由于ROI的数量非常的大,因此几乎一半前馈传播时间都被花费在了计算全连接层上;

这是因为在测试一张图片的时候只需要通过一次前馈传播把这一整张图的一个特征图给提取出来就可以;

但是在后面进行全连接层运算的时候,需要把这一张图上所有的候选区域抠出来后的候选区域特征图都通过后面的全连接层去进行运算;

所以全连接层会占据大量的一个测试时间

👏大的全连接层的一个加速方法就是通过截断奇异值分解 Truncated SVD方法

🧙‍♂️奇异值分解SVD: 

🎅截断奇异值分解 Truncated SVD: 中间的这个对角矩阵有一个性质,就越靠近左上角的这个值越重要,越靠近右下角的这个值越不重要,既然右下角的这个值不重要,就可以直接把这些值给去掉。

🤸相当于只保留左上角一部分变成一个t乘t的矩阵; 🤸‍♂️相应的前面这个矩阵就把最后这几列给去掉变成u乘t的一个矩阵 🤸‍♀️后面这个矩阵就把最后的这几这几行给去掉就变成一个t乘v的一个矩阵 相当于对原始的这么一个u乘v的矩阵做了一个压缩 

全连接层中,它本质上就是让参数矩阵w和一个输入特征x去进行相乘;

把单个全连接层w给替换成两个全连接层

这两个全连接层中的第一个是使用了一个权重矩阵

第二个使用这个来作为权重矩阵;

左边的这个全连接层用右边两个更小的全连接层近似替换了;

替换前左边的这个参数是u乘w的参数; 右边压缩后的参数其实是u乘t加上一个v乘t;

右边这个压缩的力度越大,右边的这个参数是越小的;参数越少;模型的运行速度就会越快

所以说通过这种截断的奇异值分解法,可以提高全连接层的一个推理速度

四 主要结论

😇fast-rcnn在三个数据集上都取得了一个最优的一个平均精度 😎与RCNN和SPPNET相比,Fast-RCNN具有更快的训练速度和测试速度 😲在VGG-16上微调卷积层能够提高模型的平均精度

4.1 实验配置

作者使用了三个预训练的ImageNet模型:

🤗第一个模型是RCNN的CaffeNet模型 它本质上是使用了一个AlexNet这个模型,作者额外给它起了一个名字 也就是model-s(其中这个s就表示small的意思)

😌第二个模型是使用了 VGG CNN M 1024 这个模型 这个模型它和model s具有相同的一个模型深度,但是它更宽一些,所以也所以就给这个模型起名为model m() m就是medium的意思)

🤣最后一个网络模型就是非常深的这个 VGG16模型,由于第三个模型是最大的一个,所以就给它起名为model L (L就表示large的意思)

所有的实验都使用单尺度训练和单尺度预测,也就是说模型在训练和预测时输入的图片尺寸都被固定成了600大小;

  • 15
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUTA️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值