当前位置:   article > 正文

Fast-RCNN小结_faster rcnn 反向传播

faster rcnn 反向传播

这里写图片描述

背景

  1. 在之前的工作(RCNN和SPP)中,是通过提出大量候选框,把对象进行分类,再通过边界框回归,提高候选框定位精度。是多阶段的,速度慢且不优雅。
  2. 之前的工作在训练过程要占用大量磁盘空间与GPU资源。SPP通过金字塔池化为全连接层提供了固定维度的特征,克服了输入尺寸的问题。但仍然需要把提出来的,共享的feature maps保存下来,作为cache留在磁盘上。这样经过边界框回归后,就可以直接在feature maps上重新提取特征送给全连接层。所以SPP的网络权值不会传播到SPP层之前,只更新全连接层的权值经验证或许对层数较少的网络结构有效,但会限制层数较深的网络性能。

名词

apple-to-apple:两物体的对比

解决的问题

本文为了解决之前工作的一些缺点,提出了对应的解决方案。
1. 把边界框回归和网络结构放在同一个网络架构下,形成一种端到端的训练过程,同时进行分类和边界框回归提高定位精度。这其中用的多任务损失函数。
2. FRCN将更新整个网络包括卷积层的权值,所以它不需要把feature maps留在磁盘上,大大减少了对空间的消耗。而且对卷积层更新权值经测试能够提高mAP。

过程

定义FRCN架构

这里写图片描述

输入

网络的输入有两个,一个是图片,另一个是Roi。
这里写图片描述

Roi池化层

Roi池化层可以看成单尺寸的SPP池化层,是其特殊情况。不一定是正方形。位置在最后一个卷积层和全连接层之间,替换掉原本的池化层。

sibling layer

全连接层后分别连到两个层,一个是使用softmax分类器,分类物体;另一个是针对类别的边界框回归器。

网络微调

与SPPNet不同,Fast RCNN在反向传播的过程中会更新整个网络的权值。而SPP只更新全连接层的权值。why?
更新权值是在反向传播的过程中进行的,回归框的更新传递到区域建议;分类权值的更新传递到网络的开始。经过这样,在一个网络里同时优化两个目标,分类结果和边界框定位。
每次训练过程的input image不是一张? 这个输入还是有点不明白
来自同一张图片的区域框会有相关联的关系,会导致训练速度变慢,以至于需要更长时间来达到收敛状态。

多任务损失函数

分类模块输出的是一个离散的概率分布,表征各类的概率情况。
回归模块输出的是边界框回归偏移,表征边界框调整的内容。
损失函数由上述两部分组成。
这里写图片描述

其中的λ用于控制两个模块的损失平衡。

尺度不变性

两种方法:
1. brute-force。每张图片不论在训练还是测试期间都进行预处理,加上预先定义的边界像素。这样的网络必须从训练数据中直接学习尺度不变性。
2. 图像金字塔的多尺度方法。为每个区域采样多个尺度的图片,也算是一种数据扩充。

SVD快速检测

如果只用来分类的话,全连接层所要消耗的时间要小于卷积层。如果要用来检测的话,需要有边界框回归的内容,需要更多的时间,甚至要占到一半的时间。
通过SVD分解,把原来的一层全连接层分成了两个不同的层。第一层是不带偏置的权值矩阵。第二层是带初始偏置的矩阵。通过分解可以把全连接层的复杂度从原来的uv 降到t(u+v),当t<<u|v时,能够大大减少其时间复杂度。经测试,能在只减少0.3%的mAP的情况下,提高30%的速度。
这里写图片描述

模块

遇到的问题

RoI-centric sampling和image-centric sampling

引自拓展阅读博客
R-CNN和SPPnet中采用RoI-centric sampling:从所有图片的所有候选区域中均匀取样,这样每个SGD的mini-batch中包含了不同图像的样本,不同图像之间不能共享卷积计算和内存,运算开销大;
Fast R-CNN中采用image-centric sampling: mini-batch采用层次采样,即先对图像采样【N个】,再在采样到的图像中对候选区域采样【每个图像中采样R/N个,一个mini-batch共计R个候选区域样本】,同一图像的候选区域卷积共享计算和内存,降低了运算开销;
image-centric sampling方式采样的候选区域来自于同一图像,相互之间存在相关性,可能会减慢训练收敛的速度,但是作者在实际实验中并没有出现这样的担忧,反而使用N=2,R=128的RoI-centric sampling方式比R-CNN收敛更快。

这里解释一下为什么SPPnet不能更新spatial pyramid pooling层前面的卷积层,而只能更新后面的全连接层?
博主没有看过SPPnet的论文,有网友解释说卷积特征是线下计算的,从而无法在微调阶段反向传播误差;另一种解释是,反向传播需要计算每一个RoI感受野的卷积层梯度,通常所有RoI会覆盖整个图像,如果用RoI-centric sampling方式会由于计算too much整幅图像梯度而变得又慢又耗内存。

随机图片和区域的话,边界框回归在下次迭代就用不上了吧,那有什么用呢? 就是输入的内容是一张图片及其回归框还是啥别的东西

每张图片单独处理? 难道input是多张图片,region也是来自多张图片的region,本文用的是两张图片,每张各64个region。

为什么SPP不能更新SPP层前的权值?

SPP中的微调只更新spp层后面的全连接层,对很深的网络这样肯定是不行的。在微调阶段谈及SPP-net只能更新FC层,这是因为卷积特征是线下计算的,从而无法再微调阶段反向传播误差。

哪些层需要被微调

像SPP这样只微调全连接层,经过测试,这样的策略不适用于较深的神经网络。
在一些小型网络中,第一卷积层学习到的是通用的,与特定任务无关的特征。可以理解为如果要学习一个判断人脸年龄的神经网络,第一层学习的是人脸的通用特征,而没有学习年龄相关的特征。
对于VGG网络而言,经过测试发现,从卷积层3_1开始及往后,更新权值是很有必要的。

多任务训练有帮助吗

多任务训练是方便的,因为它避免了一系列连续任务。而且其是有可能提升性能的,因为这些任务可能会通过一些共享的表述影响彼此。

Scale invariance: to brute force or finesse?

尺度不变性,是使用单尺度训练还是多尺度训练。
深度卷积网络本身就可以直接学习到物体对象的尺度不变性。
多尺度方法可以略微提高性能,但会花费许多计算时间,很得不偿失,所以,尤其对深的神经网络而言,使用单尺度训练在速度和准确度之间取得了一个最佳的平衡。

是否需要更多数据

SVM算法 vs softmax算法

softmax算法比SVM算法性能会提高,可能是因为其在对RoI评分的时候,在类间引入了竞争。

是否需要更多的候选框

稀疏的候选框似乎更能提高检测质量。

RoI池化层如何进行反向求导训练

池化层的反向传播

平均池化:将值平均分成n分传播给上层。
这里写图片描述
最大池化:记录前向传播时的最大值得位置,在反向传播的时候将值反馈给上一层的对应位置。
这里写图片描述

拓展阅读

对RCNN系列论文的解读与问题解释:https://blog.csdn.net/wopawn/article/category/6349140
特征值分解与奇异值分解:https://blog.csdn.net/xiaocong1990/article/details/54909126
卷积层,池化层,全连接层的反向传播解释:https://www.cnblogs.com/zf-blog/p/8638664.html
RNN(循环神经网络),CNN(卷积神经网络),DNN(深度神经网络)的关系:
https://blog.csdn.net/u014271114/article/details/56495558
博客多内容:https://blog.csdn.net/u011534057
适合进阶
博客多专题:https://www.cnblogs.com/pinard/category/894694.html
这个大佬的博客写的好认真啊,适合入门

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/250241
推荐阅读
相关标签
  

闽ICP备14008679号