【目标检测】R-CNN系列与SPP-Net总结

@

1. 前言

  最近读完了R-CNN三部曲+SPP-Net,算是Detection里比较经典的一个系列,最近也在读CVPR或者ECCV的其他Detection相关的论文,发现很多都是在改进R-CNN系列的一些细节。因此在这将这4篇论文先分别进行一些讲解,再进行一些比较,阐述一些自己的想法,以便加深自己对这系列论文的理解,也希望可以帮到其他人。

2. R-CNN

2.0 论文链接

R-CNN链接

2.1 概述

  R-CNN算是很经典的一篇论文,当时很多Detection algorithm都是利用图片本身的颜色,纹理,梯度等low-level图片特征进行检测。R-CNN引进了CNN以及proposal等来进行检测,同时也利用pre-training来解决一些样本量很少的任务。
 R-CNN提出了一种全新的训练结构,它的整体流程如下:

  1. 先利用Selective Search在每个图片选出大约2k个region proposals
  2. 由于之后的网络结构只能接受相同大小的proposal,所以需要把每一个proposal拉伸(warp)成227*227大小
  3. 如果proposal与GT IOU大于阈值(0.5)标记为正样本,否则是负样本
  4. 对于每一个proposal利用CNN提取特征
  5. 利用这些特征训练一个SVM分类器,从而得出相应类别的分数
  6. 利用NMS去掉一些冗余的候选框,大致的Detection就完成了
  7. 很容易发现许多proposal都不精确,因此使用Bounding Box Regression对候选框进行微调

2.2 pre-training

  针对很多数据集样本很少,很难单独的使用一个数据集进行训练跟检测,R-CNN首先在其他样本较多与目标数据集任务相似的副本数据集进行有监督预训练,保留其训练的模型参数,利用目标数据集对某些网络进行微调(domain-specific fine-tuning),这样可以产生更好的性能,这也是本文的亮点之一。

2.3 不同阶段正负样本的IOU阈值

  首先在fine-tuning阶段,IOU阈值为0.5,即大于0.5的都是目标,小于0.5的都是背景,而在SVM训练时,小于0.3的都是负样本,正样本为GT。
  为什么要分开设置阈值呢?在fine-tuning期间,为了防止过拟合,阈值设置的宽松一点,就是就算有一半左右的物体与GT相交,那也是算是物体,而不是背景。在训练SVM的时候,则正样本只有GT,阈值大于0.3的忽略掉,小于0.3的算负样本(0.3也是通过实验挑选出来的)。之所以要重新训练SVM,也是因为在之前fine-tuning网络的时候设置的阈值较为宽松,所以softmax进行分类的性能其实并不是很理想。因此重新训练了一个SVM分类器,效果相比softmax更理想了。

2.4 关于fine-tuning

  fine-tuning用来微调一些参数,毕竟在副本任务训练不是当前数据集本身,肯定还是有差距的,CNN通常第一层提取出一些线条,边缘,之后更深的层则将这些基础特征组合起来,副本任务可以理解为提取大多数图像的共同的基本特征(这也就要求副本任务与目标任务要相近),通过在目标任务fine-tuning进行微调,使得detector对提取到目标数据集独特的特征与信息,同时文章中的实验也体现了fine-tuning的重要性与必要性,本文在fine-tuning时将原来网络1000个分类改为N+1(N为类别数量,1为背景)个分类,为了防止过大的影响原来的参数,学习率为预训练学习率的1/10。

2.5 对文章的一些思考

1.我读完文章的时候就在想,对于每一个proposal进行CNN提取特征,一个图片2k左右proposals,一个数据集通常有更多的图片,那是不是有点太费力了?同时一个图片通常没有那么多“物体”,2000个proposal是不是有点太多了,应该会在物体附近很密集。
2.再单独训练一个SVM,是否有一些冗余,虽然文章中给出了单独训练SVM必要性的有力证据, 那是否可以改变一下网络模型使得softmax可行。
3.CNN网络之前必须将proposal进行变形称为固定的227*227是否可以接受任意形状的图片呢。

3. SPP-Net

3.0 论文链接

SPP-Net地址

3.1 概述

  R-CNN在当时取得了很大的成果,但是他还是有一些问题,最突出的就是效率问题,SPP-Net主要就是解决R-CNN的几个问题: 1. 对于每张图片的每个proposal跑一边CNN,SVM分类器,做了很多冗余的操作。2.proposal在送进网络之前都要进行拉伸(warp),这样会影响图片的质量以及内容,同时也比较费时费力。
 SPP-Net的改进如下:

  1. 送入网络的不再是proposal里的图像,而是一次性的把整个图片送入,而且只输入一次,将通过Selective Search生成的proposal映射到通过卷积网络生成的feature map上,相当于一个proposal中的图像通过一层层卷积得到的feature map
  2. CNN网络之所以需要固定输入图像的尺寸,不在于卷积层与池化层,而在于全连接层,全连接层的参数维度需要固定。之前的解决方法都是固定图片的尺寸,这里在最后一层卷积层与FC层之间插入了一层SPP-layer,对于输入任意尺寸都是可以输出相同尺寸的特征。

3.2 一次性full-image卷积

  相比R-CNN需要对每个proposal做卷积,SPP-Net只做一次卷积,将相应的sub-image映射到full-image卷积后的feature map上从而得到sub-image通过卷积层得到的feature,下图可以很形象的表达:

3.3 Spatital Pyramid Pooling

  这也是本篇paper的亮点之一, 通过一个“池化金字塔”,金字塔的每一层都做一次池化,具体的池化规则相当于为:stride = \(\lfloor a/n \rfloor\) window size = \(\lceil a/n\rceil\) 其中n为每层最终输出的feature map边长, a为经过最后一层卷积层后的feature map的边长。 这样对于每一层的输出都是固定的,将各层的输出拼接起来作为FC层的输入,具体可以用下图表示:

在单尺度情况下,我们知道了输入图片的大小,那么就可以提前计算出“池化金字塔”每层需要几乘几的格子(bin)来池化,同时SPP也起到了多尺度训练的作用。

3.4 多尺度训练与测试

  理论上SPP-Net可以用于任何尺寸的图片输入,但在训练时候不能随意输入任意大小的图片,因为“池化金字塔”的n x n “bins“需要提前设定,不同的尺寸的图片用同一Spatital Pyramid Pooling可能会输出不同规格的feature map。
  训练过程中,其实使用的是共享参数的多个固定尺寸的网络实现了不同输入尺寸的SPP-Net。其中从一个尺寸编导另一个尺寸使用的缩放而不是裁剪,这样不同尺度的区域仅仅是分辨率上的不同,内容与布局没有变化。
  为了降低从一个网络(比如224)向另一个网络(比如180)切换的开销,在每个网络上训练一个完整的epoch,然后在下一个完成的epoch再切换到另一个网络(权重保留)。依此往复。实验中发现多尺寸训练的收敛速度和单尺寸差不多。多尺寸训练的主要目的是在保证已经充分利用现在被较好优化的固定尺寸网络实现的同时,模拟不同的输入尺寸.
  注意,上面的多尺寸解析度只用于训练。在测试阶段,是直接对各种尺寸的图像应用SPP-net的。

3.5 如何将原图的proposal映射到到feature map上

  为了简单起见,对每一层卷积层进行padding,大小为\(\lfloor p /2 \rfloor\),其中\(p\)为卷积核的边长,这样卷积过程中feature map规格不会变,这样原图上的某点\((x, y)\) 与在 feature map上相应点\((x^{'}, y^{'})\)的关系为: 左(上)边界\(x^{'} = \lfloor x/S \rfloor+1,\) 右(下)边界 \(x^{'} = \lceil x / S \rceil - 1\), 同时,如果padding不是\(\lfloor p /2 \rfloor\),需要对x进行一些补偿。

PS: paper中直接给出结论, 具体证明还没有去做,之后补上

3.6 SPP-Net的一些不足

  1. 虽然解决了R-CNN许多大量冗余计算的问题,但是还是沿用了R-CNN的训练结构,也训练了SVM分类器, 单独进行BBox regression。
  2. SPP-Net 很难通过fine-tuning对SPP-layer之前的网络进行参数微调,效率会很低,原因具体是(Fast-RCNN中的解释): SPP做fine-tuning时输入是多个不同的图片,这样对于每一个图片都要重新产出新的feature map,效率很低,而Fast-RCNN对其进行了改进。

4. Fast R-CNN

4.0 论文链接

Fast R-CNN链接

4.1 概述

  Fast R-CNN最主要的是解决了SPP-Net与R-CNN训练步骤复杂、冗余的缺点,首先它同样对整个图像只做一次卷积提取full-image feature map,其次它利用了ROI pooling layer(可以看做SPP的简化版) 进行固定送入FC层的feature尺寸,从而达到对任意尺寸的图像进行训练及测试,最后它将分类与回归同时进行,相当于多任务学习,他们共享前面网络的特征与计算,这样也不需要利用磁盘对特征进行存储。同时Fast R-CNN也对损失函数,FC层加速等做了优化。同时该文章还通过实验证明了深度网络具有较好的scale-invariance,即对scale并不是特别敏感。

4.2 网络结构

Fast R-CNN 将整个图片与通过Selective Search筛选出的region proposals一同输入,经过卷积层、池化层产出feature map,计算出原图的proposal在feature map的映射,将相应的feature送到ROI pooling层,进行池化,产出固定长度的feature vector作为FC层(SVD分解实现)的输入最终分支成两个兄弟输出层:一个通过softmax产生K+1个分类的概率,另一个对于每个object 类别输出四个实数,代表一个较为精确的BBox position,最后进行NMS得到最终的结果。具体网络结构如下图:(摘取自:Coding_ML

4.3 ROI pooling

  具体做法首先将原始图片的proposal映射到feature map上,取出相应的feature,假设feature长H宽W,要输出的规格为h x w,那么就把原feature分成 h x w,对每一块区域做max pooling,得到一个固定h x w规格的feature vector送入FC层。

4.4 SVD分解实现FC层加速

  图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多,而在目标检测任务中,selective search算法提取的建议框比较多,几乎有一半的前向计算时间被花费于全连接层,就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次(每个建议框都要计算),因此在Fast R-CNN中可以采用SVD分解加速全连接层计算;
SVD原理:
【待补充】

  在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置;实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作。

PS:因为最近事情真的比较多,所以SVD的学习以后再进行。

4.5 使用softmax进行预测概率而不是SVM

  针对Fast R-CNN,文中分别进行实验并对比了采用SVM和采用softmax的mAP结果,不管AlexNet【S for small】、VGG_CNN_M_1024【M for medium】、VGG-16【L for large】中任意网络,采用softmax的mAP都比采用SVM的mAP高0.1%~0.8%,这是由于softmax在分类过程中引入了类间竞争,分类效果更好;(对于类间竞争,我的理解是softmax所有类的概率相加为1,一个类的概率变高,其他类的概率必然有所下降,这样即使论文中的competition between classes)
Fast R-CNN去掉了SVM这一步,所有的特征都暂存在显存中,就不需要额外的磁盘空间,省时省力。

 【疑问】 关于为什么Fast R-CNN可以舍弃SVM分类器而直接采用softmax,而不会出现因为IOU阈值选的0.5导致softmax的精度下降,我目前没有十分确切的想法,认为可能有以下几点原因(猜想):

  1. R-CNN是对原图片进行wrap,所以可能会导致图片的某些信息在卷积层跟池化层丢失(因为拉伸或者压缩,一些像素出现在不应该出现的位置),而Fast R-CNN则将原图完好的进行了卷积与池化,再通过ROI池化。
  2. Fast R-CNN 通过较深的网络训练,相比R-CNN有更强的性能,因此搜反而,softmax更好一点。
  3. ROI pooling 比 max pooling 更好一点(雾

4.6 单尺度训练与测试

  brute-force(单一尺度)和image pyramids(多尺度)。单一尺度直接在训练和测试阶段将image定死为某种scale,直接输入网络训练就好,然后期望网络自己能够学习到scale-invariance的表达;多尺度在训练阶段随机从图像金字塔(缩放图片的scale得到,相当于扩充数据集)中采样训练,测试阶段将图像缩放为金字塔中最为相似的尺寸进行测试;

  可以看出,多尺度应该比单一尺度效果好。作者在5.2节对单一尺度和多尺度分别进行了实验,不管哪种方式下都定义图像短边像素为s,单一尺度下s=600(维持长宽比进行缩放),长边限制为1000像素;多尺度s={480,576,688,864,1200}(维持长宽比进行缩放),长边限制为2000像素,生成图像金字塔进行训练测试;实验结果表明AlexNet(S for small)、VGG_CNN_M_1024(M for medium)下单一尺度比多尺度mAP差1.2%~1.5%,但测试时间上却快不少,VGG-16(L for large)下仅单一尺度就达到了66.9%的mAP(由于GPU显存限制多尺度无法实现),该实验证明了深度神经网络善于直接学习尺度不变形,对目标的scale不敏感。

以上基本上论文翻译,文中解释的很好。

4.7 R-CNN(SPP-Net)与Fast-RCNN不同的样本采样

  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层前面的卷积层,而只能更新后面的全连接层?
  有网友解释说卷积特征是线下计算的,从而无法在微调阶段反向传播误差;另一种解释是(论文解释),反向传播需要计算每一个RoI感受野的卷积层梯度,通常所有RoI会覆盖整个图像,如果用RoI-centric sampling方式会由于计算too much整幅图像梯度而变得又慢又耗内存。

4.8 需要fine-tuning的参数

  SPPnet论文中采用ZFnet(AlexNet的改进版)这样的小网络,其在微调阶段仅对全连接层进行微调,就足以保证较高的精度,作者文中采用VGG-16(L for large)网络,若仅仅只对全连接层进行微调,mAP会从66.9%降低到61.4%, 所以文中也需要对RoI池化层之前的卷积层进行微调;

那么问题来了?向前微调多少层呢?所有的卷积层都需要微调吗?
  作者经过实验发现仅需要对conv3_1及以后卷积层(即9-13号卷积层)进行微调,才使得mAP、训练速度、训练时GPU占用显存三个量得以权衡;
  作者说明所有AlexNet(S for small)、VGG_CNN_M_1024(M for medium)的实验结果都是从conv2往后微调,所有VGG-16(L for large)的实验结果都是从conv3_1往后微调。

4.9 Fast R-CNN 多任务训练及损失函数

4.9.1 损失函数

  Fast R-CNN网络分类损失和回归损失如下图所示【仅针对一个RoI即一类物体说明】,黄色框表示训练数据,绿色框表示输入目标:

-cls_score层用于分类,输出K+1维数组p,表示属于K类物体和背景的概率;
-bbox_predict层用于调整候选区域位置,输出4*K维数组,也就是说对于每个类别都会训练一个单独的回归器;
-loss_cls层评估分类代价,由真实分类u对应的概率决定( is log loss for true class \(u\).):

\[L_{cls}(p, u) = -log_{p_{u}} \]

-loss_bbox评估回归损失代价,比较真实分类u对应的预测平移缩放参数和真实平移缩放参数的差距:

\[L_{loc}(t^{u}, v) = \sum_{i \in \{x, y, w, h\}} smooth_{L_{1}{(t_{i}^{u} - v_{i})}} \]

t代表预测值,v代表真实值,u代表类别,其中

\[smooth_{L_{1}}(x) = \begin{cases} 0.5x^{2} & if\left|x\right| < 1 \\ \left|x\right| - 0.5 & otherwise, \end{cases}\]

\(L_{1}\) loss相对R-CNN与SPP-Net中的\(L_{2}\) loss对异常值更不敏感,同时也能有效防止梯度爆炸

smooth L1损失函数曲线如下图所示,相比于L2损失函数,其对离群点、异常值不敏感,可控制梯度的量级使训练时不容易跑飞;

微调时总得损失函数为:\(L(p, u, t^{u}, v) = L_{cls}(p, u) + \lambda[u \geq 1]L_{loc}(t^{u}, v)\)

4.9.2 对于多任务

  首先不看多任务训练效果,至少比起R-CNN其训练方便、简洁。多任务训练考虑各任务间共享卷积层的相互影响,是有潜在可能提高检测效果的;
文中通过实验发现AlexNet【S for small】、VGG_CNN_M_1024【M for medium】、VGG-16【L for large】三种网络采用多任务训练比不采用mAP提高了0.8%~1.1%【测试时不采用Bounding-box regression】。

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

  首先看普通max pooling层如何求导,设为\(x_{i}\)输入层节点,\(y_{i}\)为输出层节点,那么损失函数L对输入层节点\(x_{i}\)的梯度为:

\[\frac{\partial L}{\partial x_{i}} = \begin{cases} 0, & \delta(i, j) = false \\ \frac{\partial L}{\partial y_{i}} & \delta(i, j) = true \end{cases}\]

其中判决函数\(\delta(i, j)\)表示输入i节点是否被输出j节点选为最大值输出。不被选中【\(δ(i,j)=false\)】有两种可能:\(x_{i}\)不在\(y_{i}\)范围内,或者\(x_{i}\)不是最大值。若选中【\(δ(i,j)=true\) 】则由链式规则可知损失函数L相对的梯度等于损失函数L相对\(y_{i}\)的梯度×(\(y_{i}\)\(x_{i}\)的梯度->恒等于1),故可得上述所示公式;

对于RoI max pooling层,设\(x_{i}\)为输入层的节点,\(y_{ri}\) 为第r个候选区域的第j个输出节点,一个输入节点可能和多个输出节点相关连,如下图所示,输入节点7和两个候选区域输出节点相关连;

  该输入节点7的反向传播如下图所示。对于不同候选区域,节点7都存在梯度,所以反向传播中损失函数L对输入层节点\(x_{i}\)的梯度为损失函数L对各个有可能的候选区域r【\(x_{i}\)被候选区域r的第j个输出节点选为最大值 】输出\(y_{ri}\)梯度的累加,具体如下公式所示:

\[\frac{\partial L}{\partial x_{i}} = \sum_{r}{\sum_{j}} [i = i * (r, j)]\frac{\partial L}{\partial y_{rj}} \]

\[ [i = i * (r, j)] = \begin{cases} 1, & i = i*(r, j) \geq1 \\ 0, & otherwise \end{cases} \]

  判决函数\([i = i*(r, j)]\)表示i节点是否被候选区域r的第j个输出节点选为最大值输出,若是,则由链式规则可知损失函数L相对\(x_{i}\)的梯度等于损失函数L相对\(y_{rj}\)的梯度×(\(y_{rj}\)\(x_{i}\)的梯度->恒等于1),上图已然解释该输入节点可能会和不同的\(y_{rj}\)有关系,故损失函数L相对\(x_{i}\)的梯度为求和形式。

4.11 Fast R-CNN 训练与测试的流程图


5. Faster R-CNN

5.0 论文链接

Faster RCNN

5.1 概述

  Fast R-CNN还是用的Selective Search来提取region proposal, Faster R-CNN就此问题提出了使用RPN生成region proposal,然后再接上Fast R-CNN形成了一个完全的end-to-end的CNN对象检测模型,可以完全在GPU运行,同时RPN与后面的detection network 共享full-image convolutional features。
 算法总体流程如下:

  1. 利用预训练的一些网络对原图进行卷积池化等操作得到一个full-image convolutional feature map(这个过程通常会利用padding保证卷积过程中输入size =输出size,这样只有在池化过程中size才会发生改变,从而方便利用feature map找到原图的区域)
  2. 通过RPN生成一些带着有物体置信度(objectness score)的矩形proposal(RPN通过softmax判断proposal为物体还是背景以及用简单BBox regression 对proposal进行修正)
  3. 将feature map 与 通过RPN生成的proposal作为RoI pooling layer的输入,从而得到固定size的proposal feature map
  4. 最后将所有的proposal feature map 送到检测网络中,利用1x1卷积进行分类与BBox回归。

  可以发现,其他上述流程等于在Fast RCNN加了一个RPN生成proposal,同时对proposal进行了两次调修与分类,使得结果更加准确。因为两个网络共享相同的full-image convolutional feature map 与 计算,所以相比Fast RCNN效率有了很大的提高。

5.2 RPN-Net的流程细节

5.2.1 RPN算法流程

  为了生成proposal,RPN在预训练的网络模型生成的特征图(convolutional feature map )上滑动一个小网络(slide a small network),这个网络把特征图上的一个n x n窗口(文章中n=3)的特征作为输入,对于每个窗口,以窗口的中心点作为基准,通过不同(文章中9个)的anchors映射到原图从而得到一个个proposals,之后通过对这些proposal进行softmax分类与BBox regression的学习,从而输出调优后的proposal with score。
大体流程可以用下图表示:

5.2.2 anchor

  之前提到的anchor其实代表的就是“长宽比与面积以及滑动窗口的中心”,比如有3个面积以及3个长宽比,那么对于每个滑动窗口都有9个以滑动窗口中心映射到原图像素点为中心满足长宽比与面积要求的proposal(emmm,有点绕)。假如feature map 的尺寸为WxH,每个滑动窗口最多有k个anchors(比如3x3),那么整个特征图就有W x H x k个anchors(通常会在特征图进行pading从而维持这个数量)。

  之前实现多尺度通常有两种,一种是输入的图片进行多尺度变换,另一种是卷积核进行多尺度变换(比如滑动窗口进行相关变换)。不过通常这两种是结合起来使用。anchor的设计,也可以满足多尺度性能,因为anchor本身就结合了不同的长宽比与面积,因此只在单尺度图片上进行训练,也能具有多尺度的性能。

5.2.3 正负样本的标注规则

a. 对每个标定的真值候选区域,与其重叠比例最大的anchor记为前景样本
b. 对a)剩余的anchor,如果其与某个标定重叠比例大于0.7,记为前景样本;如果其与任意一个标定的重叠比例都小于0.3,记为背景样本
c. 对a),b)剩余的anchor,弃去不用。
d. 跨越图像边界的anchor弃去不用

5.2.3 Loss Function

  RPN的loss function 学习了 Fast R-CNN中的loss function,如下:

\[L(\{p_{i}\},\{t_{i}\}) = \frac{1}{N_{cls}}\sum_{i}{L_{cls}(p_{i},p_{i}^{*})} + \lambda \frac{1}{N_{reg}}\sum_{i}{p_{i}^{*}L_{reg}(t_{i}, t_{i}^{*})} \]

  其中,\(i\)代表anchor在mini-batch里的序号,\(p_{i}\)代表预测为物体的概率,\(p_{i}^{*}\) = 1代表GT是物体,否则为背景。同理\(t_{i}\)代表的是预测的proposal框的四个点,\(t_{i}^{*}\)代表GT的坐标点。\(L_{cls}\)代表的是是否为物体的log loss,\(L_{reg}\)用的是Fast R-CNN里的\({smooth} {L_{1}}\),而具体的参数形式为R-CNN附录中的求解方式(边框回归),这两部分通过\(N_{cls}\),\(N_{reg}\)来标准化,通过\(\lambda\)来进行平衡权重。
  值得注意的是, 之前模型的BBox regression通常是所有的尺度共享参数,在Fast R-CNN中,他对不同的anchor分别训练了不同的回归器,共有k个。

5.2.4 训练RPN

  训练RNP的样本采集是“image-centric”,即每个mini-batch 包含一张图片中的多个anchor。如果所有anchor都参与训练,那么负样本会远远大于正样本,因此会引起生成器偏移,文章采用256个anchors,其中128个正样本128个负样本,多填少补尽量维持比例1:1.

5.3 RPN与Fast R-CNN共享特征图训练

  前面已经讨论如何训练提取proposal的RPN,分类采用Fast R-CNN。如何把这两者放在同一个网络结构中训练出一个共享卷积的Multi-task网络模型。

  我们知道,如果是分别训练两种不同任务的网络模型,即使它们的结构、参数完全一致,但各自的卷积层内的卷积核也会向着不同的方向改变,导致无法共享网络权重,论文作者提出了三种可能的方式:

  1.Alternating training:此方法其实就是一个不断迭代的训练过程,既然分别训练RPN和Fast-RCNN可能让网络朝不同的方向收敛,a)那么我们可以先独立训练RPN,然后用这个RPN的网络权重对Fast-RCNN网络进行初始化并且用之前RPN输出proposal作为此时Fast-RCNN的输入训练Fast R-CNN。b) 用Fast R-CNN的网络参数去初始化RPN。之后不断迭代这个过程,即循环训练RPN、Fast-RCNN。

  2.Approximate joint training:这里与前一种方法不同,不再是串行训练RPN和Fast-RCNN,而是尝试把二者融入到一个网络内,具体融合的网络结构如下图所示,可以看到,proposals是由中间的RPN层输出的,而不是从网络外部得到。需要注意的一点,名字中的"approximate"是因为反向传播阶段RPN产生的cls score能够获得梯度用以更新参数,但是proposal的坐标预测则直接把梯度舍弃了,这个设置可以使backward时该网络层能得到一个解析解(closed results),并且相对于Alternating traing减少了25-50%的训练时间。(此处不太理解: 每次mini-batch的RPN输出的proposal box坐标信息固定,让Fast R-CNN的regressor去修正位置?)

  3.Non-approximate training:上面的Approximate joint training把proposal的坐标预测梯度直接舍弃,所以被称作approximate,那么理论上如果不舍弃是不是能更好的提升RPN部分网络的性能呢?作者把这种训练方式称为“ Non-approximate joint training”,但是此方法在paper中只是一笔带过,表示“This is a nontrivial problem and a solution can be given by an “RoI warping” layer as developed in [15], which is beyond the scope of this paper”,

  上面说完了三种可能的训练方法,可非常神奇的是作者发布的源代码里却用了另外一种叫做4-Step Alternating Training的方法,思路和迭代的Alternating training有点类似,但是细节有点差别:

第一步:用ImageNet模型初始化,独立训练一个RPN网络;
第二步:仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;
第三步:使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;
第四步:仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。

5.4 RPN中对anchor box 分类与回归的作用

  作者通过实验验证了他们的作用,如果把cls layer去掉(没有NMS与排名可以用了),从这些unscored proposal取1000个送入下一层会发现mAP几乎是没有变化的,但是如果仅仅取100个,会急速下降。
  如果去掉reg layer,因此送到ROI pooling layer 就只是没有微调的anchor box, mAP会下降到52.1%,证明在RPN层的BBox 是很有用也是很有必要的。
  同时作者也通过实验证明了NMS并不会减少最后的mAP,反而可以减少一些冗余的proposal

参考文献

Fast R-CNN论文详解
Fast R-CNN详解
Faster R-CNN

posted @ 2018-10-06 20:40  向前奔跑的少年  阅读(4699)  评论(0编辑  收藏  举报