Faster|Faster RCNN

0.简介 【Faster|Faster RCNN】faster-rcnn是目标检测领域最经典的算法之一,它主要由两部分组成,其一是用于生成候选区域框的深度全卷积网络, 其二是 Fast R-CNN 检测模型。 二者在训练的时候会进行参数共享。今天想要回顾一下faster rcnn,故写下这篇博客。
按照作者的想法,faster rcnn可以分成一下的4个主要内容:

Faster|Faster RCNN
文章图片
图1 faster rcnn结构
1.Conv layers:主要由基础的conv+relu+pooling层组成,用于提取图像中的feature map。用于后面共享的RPN层和全连接层。
2.region proposal networks(RPN):主要用于生成region proposals。利用softmax对候选框(anchor)进行二分类(是否是背景图像positive or negative),利用bbox进行regression修正候选框得到proposals。
3.RoI pooling:收集feature map和proposals,提取出proposal feature map,送入后续全连接层判定目标类别。
4.classification:利用proposal feature map计算proposals类别,再次bbox regression获得更精准的定位。
VGG16-fasterrcnn如图2所示。可以看到该模型的算法步骤为:
(1).将任意大小的P×Q网络reshape成M×N,然后送入网络。
(2).用vgg16网络来提取图像的特征:feature map。
(3).RPN层经过3×3卷积生成positive anchor和bbox regression偏移量,计算出proposals。
(4).RoI层利用proposals从feature map中提取proposals feature送入后续全连接和softmax网络用于bbox_pre和classification。

Faster|Faster RCNN
文章图片
图2 faster rcnn网络结构 目录 1.Conv layers 2.RPN - 2.1 多通道图像卷积基础知识 - 2.2 anchors - 2.3 softmax判定positive和negative - 2.4 bbox regression 原理 - 2.5 对proposals进行bbox regression - 2.6 proposal layer 3.RoI pooling - 3.1 为何做RoI pooling - 3.2 RoI pooling原理 4.classification 5.FasterRCNN训练步骤 - 5.1 训练RPN网络 - 5.2 通过训练好的RPN网络收集proposals - 5.3 训练Faster RCNN网络 1.Conv layers 如图2所示,采用的VGG16模型作为网络基础结构,Conv layers共有13个conv层,13个relu层,4个pooling层。这里,卷积操作有一个通用的公式,给出输入图像X×X,若kernel_size,padding,stride都给出,那么,输出的维度是:
X` = + 1
其中,如图可以直观地看到计算的过程:

Faster|Faster RCNN
文章图片
图3 conv计算图
所以,一个M×N的举证可以变为(M/16)×(N/16)的大小,这样conv layers生成的feature map都可以和原图对应起来。
2.RPN 经典的检测方法都非常耗时,faster rcnn可以利用RPN自动生成候选框,极大地提高了生成候选框的速度。

Faster|Faster RCNN
文章图片
图4 RPN候选框结构图
如图4是RPN结构图。可以看到RPN实际有两条线路,上面是用softmax分类获得positive和negative的anchors,下面是计算bbox的偏移量,纠正一下位置。最后的一层proposal负责综合positive anchors对应bbox regression偏移量获取proposals,同时删除太小和超出边界的proposals。到了proposal layer,完成了目标定位的功能。
2.1 多通道图像卷积基础知识 对于多通道多卷积核做卷积,计算方式如下:

Faster|Faster RCNN
文章图片
图5 多通道卷积计算
输入3个通道,同时有2个卷积核。对于每个卷积核,先输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出。
对于多通道1×1卷积,就是将输入图像每个通道乘以卷积系数后加在一起,就是相当于把原来独立的各个通道“联通在一起”。
2.2 anchors anchors主要用来表示候选框的位置(,,,),用来表示左上角和左下角坐标。长宽比有{1:1,2:1,1:2}三种。如图6,通过anchors引入常用的多尺度方法,anchors基本上能cover各个尺度和形状。

Faster|Faster RCNN
文章图片
图6 anchors示意图
这9个anchors做什么呢?如图7,便利Conv layers计算获得feature maps的每个点,配备9种初始检测框。后面有两次bbox regression可以获得修正好的候选框的位置。
Faster|Faster RCNN
文章图片
图7 anchors生成
解释一下图7中的数字:
1.原文利用ZF model,最后的conv5层生成num_output=256,对应有256张特征图,所以相当于每个点都有256维度。
2.在conv5之后,做了rpn_conv/3 3卷积且nun_ouput=256,相当于每个点融合周围33的空间信息,相当于融合了周围3×3信息,更有鲁棒性。图4和7的红框。
3.假设conv feature map中每个点有k个anchor,每个anchor要分为positive和negative,所以每个点由256d feature转化为cls=2k scores;每个anchor都有(x,y,w,h)对应4个偏移量,所以reg=4k position。
4.全部anchors拿去训练太多,训练会在核实的anchors中随机选择128个positive anchors和128个negative anchors进行训练。
其实RPN就是原图中加上了很多候选框anchors。然后用cnn判断哪些anchros里有目标的positive anchor,哪些没有目标的negative anchor,所以仅仅是个二分类而已
那么anchor一共有多少个?假设原图为800×600,VGG下采样16倍,feature map每个点设置9个anchor,所以:
ceil(800/16)×ceil(600/16)×9=50×38×9=17100
Faster|Faster RCNN
文章图片
图8 生成anchors
2.3 利用softmax判定positive和negative MxN大小的图像送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,如图9

Faster|Faster RCNN
文章图片
图9 判定positive/negative
经过卷积的输出图像为W×H×18。刚好对应feature maps每个点都有9个anchors,同时每个anchors可能是positive和negative,所有这些信息都保存在了W×H×(9×2)大小矩阵。为何这样做?后面softmax分类positive anchors,也就是初步提取检测目标候区域的box(在positive anchors中)。
为何要在softmax前后都接一个reshape layer?其实只是为了便于softmax分类。对应至上面的保存positive/negative anchors的矩阵,其在caffe blob中的存储形式为[1, 2x9, H, W]。而在softmax分类时需要进行positive/negative二分类,所以reshape layer会将其变为[1, 2, 9xH, W]大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。
综上,RPN网络利用anchors和softmax初步提取positive anchors作为候选框。
2.4 bbox regression原理 如图10所示,绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。

Faster|Faster RCNN
文章图片
图10
对于窗口使用表示,分别表示中心坐标和宽高。对于图11,红色的框A代表原始positive anchors,绿色框G代表目标GT,我们的目标是寻找一种关系,使得输入原A经过映射后得到一个框G`与G非常接近。

  • 给定anchor 和
  • 寻找一种变换F,使得
    Faster|Faster RCNN
    文章图片
    图11
    那么经过何种变换F才能让图11的anchors A变成G呢,简单的思路就是:
  • 先做平移:

  • 再做缩放:


    观察上面的公式,需要学习四种变换。当输入的anchor A与GT相差很小时,可以认为这种变换是线性变换,那么可以用线性回归来建模对窗口微调(如果不接近就不适用)。
    接下来的问题就是如何通过线性回归获得,线性回归就是给定输入特征向量X,学习W,使得回归后的值和真实值Y很接近,。对于该问题,输入X是CNN feature map,定义为,同时传入A和GT的变换量,即。输出,那么目标函数可以表示为:

    其中对应anchor的feature map组成的的特征向量,是需要学习的参数,为了让预测值和真实值更加接近,设计L1损失函数。
    positive anchor与ground truth之间的平移量与尺度因子




    对于训练bbox regression回归,输入是cnn feature,监督信号anchor与GT的差距,训练目标是网络输出与监督信号尽可能接近,优化目标函数是:

    在bbox regression工作时,回归网络输出anchor的平移量和变换尺度,可以修正anchor的位置。
2.5 对proposals进行bbox regression RPN的第二条线路如图12所示

Faster|Faster RCNN
文章图片
图12 rpn的bbox regression线路
经过该卷积,输出图像为W×H×36,存储形式为[1,4×9,H,W],这里的每个点都有9个anchors,每个anchor有四个回归的变量:
图8中,VGG输出50 38256的特征,对应设置50 38k个anchors,RPN输出:
1.大小为50 382k的positive/negative分类特征矩阵
2.大小为50 384k的regression坐标回归矩阵
2.6 proposal layer 该层负责综合所有的,变换量和positive anchors,计算出精准的proposals,输入到后续的ROI Pooling Layer。他有三个输入:positive negative anchors的分类结果,对应的bbox reg的变换量rpn_bbox_pred和im_info另外还有feat_stride=16。
如图13,im_info = [M,N,scale_factor=1/16]保存了所有的缩放信息,用于计算anchor的偏移量。

Faster|Faster RCNN
文章图片
图13
proposal layer forward的顺序依次是:
1.生成anchors,利用对所有的anchors做bbox regression回归。(生成anchors与训练时完全一致)
2.按照输入的positive scores从大到小排序anchors,提取前topN个anchors,即提取修正位置后的positive anchors
3.限定图像positive为图像的边界。
4.剔除非常小(长宽一定)的positive anchors
5.对剩下的positive做NMS
6.proposals layer有三个输入:positive和negative anchors分类结果,对应的bbox reg的结果作为proposal输入。
之后输出的proposal=[x1,y2,x2,y2],这里的输出对应的是M*N的尺度,检测在这里就此结束。
总结一下RPN就是
生成anchors -> softmax分类器提取positive anchors -> bbox reg回归positive anchors ->proposal layer 生成proposals
3 RoI pooling RoI pooling负责生成收集proposal,并计算出proposal feature maps,送入后续的网络。从图2中我们可以看到RoI pooling有两个输入:
1.原始的feature maps
2.RPN输出的proposal boxes(大小不一样!!!)
3.1 为何做RoI pooling 对于传统的CNN(VGG,ResNet),当网络训练好后输入的图像尺寸必须是一个固定的值,同时网络输出也是一个固定大小的vector。如果图像的输入尺寸不一样,就会变得很麻烦。有两种方法解决:
1.从图像中crop一部分传入网络
2.将图像warp成需要的大小

Faster|Faster RCNN
文章图片
图14 crop和warp都破坏图像结构
可以看到,无论采取哪种办法都不好,要么crop后破坏了图像的完整结构,要么warp破坏了图像原始形状信息。RoI pooling就是解决大小不一样如何处理的问题。
3.2 RoI pooling原理 RoI的工作过程如下:
  • 由于proposal对应M*N尺寸,首先使用spatial_scale参数将其映射回feature map(1/16)的尺寸。
  • 将每个proposal对应的feature map区域分为的网格
    -对网格的每一份都进行max_pooling处理
    这样处理后,即使大小不一样的proposals输出结果都是固定大小。如图15proposals实现了固定长度输出。
    Faster|Faster RCNN
    文章图片
    图15 proposal示意图
4 Classification Classification部分的输入是proposal feature maps,通过full connect层与softmax计算每个proposal具体属于哪个类别(person car television),输出cls_prob概率向量;同时再次利用bbox regression获得每个proposals的位置偏移量bbox_pred,回归出更加精确的检测框。classification的网络图如下所示

Faster|Faster RCNN
文章图片
图16 classification网络结构图
从RoI pooling得到7×7=49大小的proposal feature maps后,送入后续网络,可以看到做了两件事情:
1.通过全连接和softmax对proposals进行分类
2.再次对proposals进行bbox regression,获取更高精度的rect box
这里看看全连接层的示意图17

Faster|Faster RCNN
文章图片
图17 全连接示意图
计算公式如下:
Faster|Faster RCNN
文章图片

其中W和b都是预先训练好的,大小固定,当然X和Y都是固定的。所以,这里才一次印证了RoI pooling的必要性。
5 Faster RCNN训练 faster rcnn实在已经训练好的model(VGG,resnet)基础上继续训练。实际上训练过程有以下6个步骤:
1.在训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
2.利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
3.第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
4.第二次训练RPN网络,对应stage2_rpn_train.pt
5.利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt
6.第二次训练Fast RCNN网络,对应stage2_fast_rcnn_train.pt
训练过程类似于“迭代”,循环了2次。"A similar alternating training can be run for more iterations, but we have observed negligible improvements"。接下来讲解这6个训练过程,如图18所示。

Faster|Faster RCNN
文章图片
图18 Faster RCNN训练步骤 5.1 训练RPN网络 VGG预先训练,提取特征,Conv layers中所有的层都画在一起了(VGG/ResNet),红圈所示。如图19所示

Faster|Faster RCNN
文章图片
图19 stage1_rpn_train.pt
整个网络的Loss如下:

上式表示anchors index,表示positive softmax probability,表示GT predict概率(当第i个anchor与GT的IoU>0.7,认为该anchor是positive的,
=1,IoU<0.3的认为是negative,=0,0.3~0.7的不参与训练)。t表示predict bounding box,表示对应positive的GT box。可以看到,Loss分成2个部分:
1.cls losss oftmax网络,用于分类anchors为positive和negative的网络。
2.reg loss rpnlossbbox层计算的L1 loss,用于bbox regression网络训练。乘了一个是因为只关心positive anchor,不关心negative。
由于两者相距很大,使用参数平衡,例如:,,设置。这里用到了smooth L1 loss,计算公式如下:
Faster|Faster RCNN
文章图片

了解完数学原理后,反过来看图18:
1.RPN训练阶段,rpn-data层会按照和test阶段proposal层完全一样的方式生成anchor进行训练。
2.对于rpn_loss_cls,输入的scores和label分别是
3.对于rpn_loss_bbox,输入的rpn_bbox_pred和rpn_bbox_target分别对应和,rpn_bbox_inside_weight对应。
训练和检测生成存储anchors的顺序完全一样,这样结果才能被用于检测
5.2 通过训练好的RPN网络收集proposals 利用训练好的RPN网络,获取proposal RoI,同时获得positive softmax probability,如图20,将获得的信息保存在pickle中,该网络本质上和检测中的RPN网络一样。

Faster|Faster RCNN
文章图片
图20 rpn-test.pt 5.2 训练Faster RCNN网络 读取之前的pickle文件,获得proposals和positive probability。data层输入网络,然后:
1.将提取的proposals作为roi传入网络,如图篮筐
2.计算bbox_inside_weights+bbox_outside_weights,作用与RPN一样,传入soomth_L1_loss layer,如图21绿框

Faster|Faster RCNN
文章图片
图21 stage1_fast_rcnn_train.pt
这样就能训练最后的softmax和最终的bbox regression

    推荐阅读