RCNN极其细致初学者阅读笔记

7次阅读

共计 3953 个字符,预计需要花费 10 分钟才能阅读完成。

版权声明:本文由 Kathy 投稿

1、Introduction

1.1 R-CNN and SPPnet

R-CNN 的弊端:

多阶段(3)的训练过程

训练的时间和空间开销大

速度过慢

R-CNN 的问题症结在于其不能共享计算,而 SPPnet 改进了这个问题,通过对整张图卷积得到特征图,从这张特征图上进行 region proposal 而能够共享卷积的计算结果,加速了 R-CNN;后通过空间金字塔池化实现了任意尺度图像的输入。

SPPnet 的问题在于:训练仍是多阶段的;特征提取后仍需存放到磁盘造成大的开销;不像 R -CNN,其微调算法不能更新金字塔池化之前的卷积层,从而限制了网络的深度。

1.2 contribution

提出 Fast R-CNN,其优点为:

更高的检测精度 mAP

训练时单阶段的

训练过程可以更新所有层网络参数

无需为特征图缓存消耗内存

2、Fast R-CNN architecture and training

网络结构为:

输入整张图片,通过卷积池化提取特征图

在特征图上提取 RoI (region of interest),相当于 region proposal 阶段。

RoI Pooling 输出固定尺寸的 RoI 特征图(尺度降为 1 的简易版 SPP)

FCs 映射得到固定维度的特征向量

对特征向量分别进行分类(获得 K + 1 维结果,类别 + 背景)和回归(获得 K4 维结果,每类的 box 定位)

注意这个观点:为什么说 Fast R-CNN 的训练将多阶段压缩为单阶段?之前的 R -CNN 是先 region proposal,在 SVM 分类,再回归 box 三部分,这里第一阶段不变,但是训练部分的后两个阶段被合并了。理解:R-CNN 训练了 SVM 和 FC 分别用于分类和回归,而 Fast R-CNN 只训练了一个网络,既能分类也能回归,两者相互促进。虽然看上去网络的最后分类和回归分流并列了,但是两者的学习是共同反馈,指导网络参数的调整的,优化的是一个网络,所以时间和内存开销都小了。(Faster R-CNN 甚至把非训练的 region proposal 也放到网络上去了,三位一体)

2.1 The RoI pooling layer

RoI pooling 就是 level= 1 的 SPP,在每个 bin 内作最大值池化。略有不同的是,SPP 计算了 pooling 的步长,池化利用了图像每个像素;而 RoI pooling 则计算 bin 的尺寸后,直接在 bin 内取最大值池化,相当于 stride=size(bin),这样势必会舍掉很多边缘像素(于是有了 Rolalign)

一个认识:有没有量化误差、够不够精确,看的不单是简单的像素级丢失,而是输出对于输入的响应。比如 RoIpooling 和 RoIAlign 相比,将输入进行像素或者尺寸的变化,后者的变化很及时和明显,而前者就显得迟钝和不灵敏(因为像素丢失和 maxpooling,相比之下卷积计算就比 maxpooling 好一些)。再比如 SPP 用到了每个像素,会比 RoIpooling 灵敏,但是如果特征图尺寸 20.520.5,显然也不如 RoIAlign。

2.2 Initializing from pre-trained networks

从预训练模型的基础上开始实验,需要做三个改动:

最后一个池化层(后面就是 FC 了)替换为 RoI pooling 层,尺寸设置根据后面 FC 的匹配来确定

将最后一个 FC 层替换为两个并行的子层,分别用于分类和回归

网络设置两个输入:图片及其 RoI。(注意,在 Fast R-CNN,region proposal 还不属于网络,它是 SS 算法预处理的结果)

2.3 Fine-tuning for detection

通过反向传播可以更新网络的所有权重参数,这一点是 SPPnet 做不到的(没看懂为什么);提出有效利用共享参数训练,也无非是借鉴 SPP,先提取特征图,再提取 RoI,每张图的卷积特征是一样的,所以这些 RoI 共享计算;三阶段的合并单模型学习。

Multi-task loss

由于将分类和回归任务统一训练,损失函数必然是多任务的,具体形式如下:

先看损失函数的输入,p 是 RoI 特征向量的分类结果,由 softmax 输出得到的 K+ 1 维的类概率向量,通过下标索引 p0,…pk;u,v 分别是 RoI 的 ground truth label 的类别和坐标;tu 是真实类别 u 的实际回归(预测)结果;(坐标归一化过)

右边分为两个函数:第一个是类别损失,

,表征真实类别概率的负对数损失;第二项是定位损失,其中 [u>=1] 函数值在 u >= 1 时取 1,否则为 0,背景类的 u 索引为 0, 第 0 类,这样做可以在输入 RoI 为背景时不计算定位损失(本来就没有物体),对于回归的定位损失函数:

输入是真实坐标 v 和预测的坐标 tu,可以看出只计算正确类的定位损失,这样一来将分类和定位的误差严格区分开了。送过来的 RoI 不止一个,所以用 i 表示,计算方式是平滑的鲁棒 L1 损失:-

该损失对异常值相比 L2 损失(均方差)更加不敏感,当回归目标无界限限制时,L2 训练需要精细地调整学习率防止梯度爆炸,而此处采用的方法则不那么敏感。(对比:YOLO 采用的就是 L2,因为他的回归是有界的,不会超出一个 grid cell 范围)

还有一个参数 lambda,用于调整分类和回归损失的比重。

针对这个分离分类和回归的损失函数,作者还补充了一个 CVPR 的论文,其使用的是相关损失训练,而且还是双网络进行分类和回归,这个思想和这里的不一样,Fast R-CNN 只是 loss 分离了分类和回归,但是指导的是同一个网络。

Mini-batch sampling

采用的 batch 为 128,在 R -CNN 中有 1:3 的正负样本构成,这里类似,128 来自两张图,每张提取 64 个 RoI。其中正样本占 25%,从 iou 大于 0.5 的 RoI 中采样,这些 RoI 中包含物体,标记为 u >1,会参与计算定位误差;剩下 75%RoI 从 iou 在 [0.1,0.5) 之间的负样本采样,仍是 1:3(正样本比例保持较小,适应实际情况,降低假阳性误检),它们标记 u = 0 不参与定位损失计算。iou 小于 0.1 的可以考虑进行难分样本挖掘。除了 0.5 的概率进行水平翻转外,未采取其他的数据增强。

Back-propogation through RoI pooling layers

关于 RoI Max pooling 的反向求导没看太明白,这里有讲,用得到的时候看一下:https://blog.csdn.net/yzf0011…

SGD hyper-parameters

2.4 Scale invariance

提供了两种尺度不变性学习方法:

强制学习。训练和检测阶段,将图片变换到固定尺寸,ground truth 在同一标准(size)下有了多尺度的特点,直接从图像中学习物体的尺度变化特性。

图像金字塔。通过下采样或差值的方法,改变原图的尺寸,为网络提供变化尺度的输入。这在数据量不大的小样本情况下也是一种数据增强方式。

3、4 Fast R-CNN detection & Main result

3.1 Truncated SVD for faster detection(截断 SVD)

这里描述的是,在检测任务中由于大量的 RoI 提出,导致 FC 层的计算非常大(大于卷积层的运算)几乎占到 forward 的一半,因此作者借鉴了其他论文采用截断 SVD 进行模型的压缩和加速,取代了连接权 W,减少了参数。(数学性比较强,暂时不分析)

后面就作者展示的效果来看还是很喜人的,mAP 掉了 0.3%, 但提速了 30% 左右,大大加速了 fc 层。(在有 FC 层的网络中可以借鉴截断 SVD)

fine-tune 的位置:fine-tine 当然有效果,但是并非所有层都应该进行学习。作者经过实验发现,conv1 学习与否对网络的精度提升并无影响,因此需要选择合适的 fie-tune 层。

5、Design evaluation

5.1 Does multi-task training help?

实验和数据说话:

SML 是三个不同深度的基础模型,第 1,2 列,3,4 列分别作对比。第一列的 loss 只有分类损失,第二列是多任务损失,但是不输出 bbox,进行分类实验对比,发现加了回归定位损失指导的模型对分类任务完成更好;第三列是拆分 loss 分阶段训练,第四列是多任务损失联合训练,进行回归对比实验,发现联合 loss 的效果比分阶段的效果好。

结论:分类和回归的损失同时用于训练,共同指导参数优化时,可以起到相互补充、改善模型精度的效果;多任务共同训练的效果,要比单任务分阶段训练的效果好。

5.2 Scale invariance : to brute force or finesse?

关于选择单尺度还是多尺度训练,先给出结论:多尺度训练的效果当然比单尺度好,但是越是对于深层网络而言,单尺度训练反而可以获得更好的时间和速度的折衷。

实验数据如下:

左边的 SPPnet 是一个类似于 S 模型的小模型。纵向对比可以看出,多尺度训练的效果总是强于单尺度的;横向对比计算耗时依次为:2.7 倍、3.9 倍、4.6 倍,而精度提升为:1.2 倍、1.3 倍、1.5 倍,相比于时间的增长,作者认为深度网络的单尺度训练折中比较好(这里的数据看不出来吧 ….),解释是:深度网络更加擅长学习尺度的不变性,喂给单尺度输入就能学习较好了,多尺度的锦上添花相比其速度变慢来说退居次位。

5.3 Do we need more training data?

5.4 Do SVMs outperform softmax?

数据就不用贴了,肯定是比 svm 好。作者认为原因是,softmax 由其表达式知输出和为 1,因此每个标量(RoI 打分)之间引入竞争机制,winner-take-all,进一步拉大了准确回归和较差回归的差距,使得结果更好。

5.5 Are more proposal always better?

更多的 region 未必有效,mAP 反而下降。

正文完
 0