Fast R-CNN 与 Faster R-CNN

Fast R-CNN 论文链接 Fast R-CNN
Faster R-CNN 论文链接 Faster R-CNN

Fast R-CNN

解决R-CNN的问题

R-CNN存在的主要问题:

  1. 步骤繁琐:分为多步训练,先要微调一个预训练网络,针对每一个类别都需要训练一个SVM分类器,最后需要对Bounding-Box进行回归,而Region-Proposal需要用selective search得到。
  2. 计算资源消耗大,费时:由于训练分类SVM和回归时需要用到网络的输出特征图作为输入,对缓存以及时间的消耗都很大。
  3. 前向时间慢:每个Region-Proposal都需要做卷积,重复操作耗时。

基于VGG16的Fast RCNN算法在训练速度上比RCNN快了将近9倍,比SPPnet快大概3倍;测试速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。

算法

Fast R-CNN主干网络使用的是VGG-16。

训练

输入网络的图像大小为 224 × 224 224\times224 224×224,经过5个 C o n v Conv Conv层和两个 D o w n S a m p l e DownSample DownSample层( C o n v + D o w n S a m p l e + C o n v + D o w n S a m p l e + C o n v ∗ 3 Conv + DownSample+Conv+DownSample+Conv*3 Conv+DownSample+Conv+DownSample+Conv3)之后将最后一个 C o n v Conv Conv的输入和 R e g i o n   P r o p o s a l Region\ Proposal Region Proposal输入至 R O I P o o l i n g ROIPooling ROIPooling层,再经过两个 S i z e = 4096 Size=4096 Size=4096的全连接层,最后并行输入两个全连接层( S i z e 1 = 21 , S i z e 2 = 84 Size_1 =21, Size_2=84 Size1=21,Size2=84),输出每个 R e g i o n   P r o p o s a l Region \ Proposal Region Proposal属于21个类别的得分以及每个 R e g i o n Region Region的四个坐标。前者为分类得分,后者为回归输出,分类的损失计算 L a b e l Label Label以及分类层输出的得分,使用的是 S o f t m a x   W i t h   L o s s Softmax \ With \ Loss Softmax With Loss;回归的损失计算的是回归层的输出和 T a r g e t Target Target坐标及 W e i g h t Weight Weight,使用的是 S m o o t h   L 1   L o s s Smooth \ L1 \ Loss Smooth L1 Loss

测试

将两个Loss层更改为一个 S o f t m a x Softmax Softmax层,输入分类的得分,输出分类的概率,再对各类别采用 N M S ( N o n − M a x i m u m − S u p p r e s s i o n ) NMS(Non-Maximum-Suppression) NMS(NonMaximumSuppression)

Fast R-CNN详解

网络输入:

  1. 图像
  2. R e g i o n   P r o p o s a l Region \ Proposal Region Proposal(由 S e l e c t i v e   S e a r c h Selective \ Search Selective Search得到)

对每个类别训练一个回归器,非背景类别的 R e g i o n   P r o p o s a l Region \ Proposal Region Proposal才需要进行回归。

ROI Pooling:作用是对不同大小的 R e g i o n   P r o p o s a l Region \ Proposal Region Proposal,从网络最后一层卷积输出的 f e a t u r e   m a p feature \ map feature map提取固定 s i z e size size f e a t u r e   m a p feature\ map feature map。全连接层需要输入尺寸一致,所以不能直接将不同大小的 R e g i o n   P r o p o s a l Region \ Proposal Region Proposal映射到 f e a t u r e   m a p feature\ map feature map作为输出,需要做尺寸变换。在Fast R-CNN中,VGG16使用 H = W = 7 H=W=7 H=W=7,即将一个 h × w h\times w h×w R e g i o n   P r o p o s a l Region \ Proposal Region Proposal分割成 H × W H\times W H×W大小的网格,然后将这个 R e g i o n   P r o p o s a l Region \ Proposal Region Proposal映射到最后一个卷积层输出的 f e a t u r e   m a p feature\ map feature map,最后将每个网格里的最大值作为该网格的输出,经过该层网络输出的 f e a t u r e   m a p feature\ map feature map大小固定为 H × W H \times W H×W

Fast R-CNN 三大改进

1. 针对整张图像进行卷积,减少很多重复计算。
2. 用 R O I   P o o l i n g ROI\ Pooling ROI Pooling进行特征的尺寸变换。
3. 将回归器输入网络一起训练,每个类别对应一个回归器,并用 S o f t m a x Softmax Softmax代替原来的SVM分类器。

在实际训练中,每个mini-batch包含2张图像和128个 r e g i o n   p r o p o s a l region \ proposal region proposal(或者叫ROI),也就是每张图像有64个ROI。然后从这些ROI中挑选约25%的ROI,这些ROI和ground truth的IOU值都大于0.5。另外只采用随机水平翻转的方式增加数据集。
测试的时候则每张图像大约2000个ROI。

损失函数

分类损失 L o g Log Log损失, k k k个类别+1个背景类,回归损失 S m o o t h   L 1 Smooth \ L1 Smooth L1损失。
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L(p,u,t^u,v) = L_{cls}(p,u)+\lambda [u \ge 1] L_{loc}(t^u, v) L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)
其中,
L c l s ( p , u ) = − l o g   p u L_{cls}(p,u)=-log\ p_u Lcls(p,u)=log pu
表示的是类别 u u u l o g log log损失;
L l o c ( t u , v ) = ∑ i ∈ { x , y , w , h } s m o o t h L 1 ( t i u − v i ) L_{loc}(t^u, v)=\sum_{i \in \{ x,y,w,h\}}smooth_{L1}(t^u_i-v_i) Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)
其中,
s m o o t h L 1 ( x ) = { 0.5 x 2 , i f   ∣ x ∣ < 1 ∣ x ∣ − 0.5 , o t h e r w i s e smooth_{L1}(x)=\begin{cases} 0.5x^2,\quad if \ |x| < 1 \\ |x|-0.5,\quad otherwise \end{cases} smoothL1(x)={0.5x2,if x<1x0.5,otherwise
其中 t u t^u tu表示预测的结果, u u u表示类别, v v v为真值。

ROIPooling和总体结构

采用SVD分解改进全连接层。如果是一个普通的分类网络,那么全连接层的计算应该远不及卷积层的计算,但是针对object detection,Fast RCNN在 R O I   p o o l i n g ROI \ pooling ROI pooling后每个 r e g i o n   p r o p o s a l region \ proposal region proposal都要经过几个全连接层,这使得全连接层的计算占网络的计算将近一半,如下图,所以作者采用SVD来简化全连接层的计算。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验结果

精度

在这里插入图片描述

速度

在这里插入图片描述

对比实验

由于本文主要讲RCNN多步骤的网络结构合并在一起,因此需要实验证明这种multi-task训练的方式有效,实验对比结果如下:一共有S,M,L三个组,每个组有4列,分别表示:

  1. 仅采用分类训练,测试也没有回归;
  2. 采用论文中的分类加回归训练,但是测试时候没有回归;
  3. 采用分段训练,测试时候有回归;
  4. 采用论文中的分类加回归训练,且测试时候有回归。
    这种multi-task在最近两年的object detection算法中非常普遍。
    在这里插入图片描述

然后是多尺度和单尺度的对比:这里多尺度的5表示输入图像采用5中不同的尺寸,比如 [ 480 , 576 , 688 , 864 , 1200 ] [480,576,688,864,1200] [480,576,688,864,1200],在测试的时候发现多尺度虽然能在mAP上取得一点提升,但是时间代价也比较大。作者直接给出原因:深度卷积网络可以学习尺度不变性。
在这里插入图片描述

总结

Fast RCNN将RCNN众多步骤整合在一起,不仅大大提高了检测速度,也提高了检测准确率。其中,对整张图像卷积而不是对每个region proposal卷积,ROI Pooling,分类和回归都放在网络一起训练的multi-task loss是算法的三个核心。另外还有SVD分解等是加速的小贡献,数据集的增加时mAP提高的小贡献。
当然Fast RCNN的主要缺点在于region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),这也是后续Faster RCNN的改进方向之一。

Faster R-CNN

在这里插入图片描述
Faster R-CNN由以下部分组成:

1. Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals。
3. ROI Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

在这里插入图片描述

上图为Python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构,可以清晰的看到该网络对于一副任意大小 P × Q P \times Q P×Q的图像,首先缩放至固定大小 M × N M \times N M×N,然后将 M × N M\times N M×N图像送入网络;而Conv layers中包含了 13 ∗ c o n v + 13 ∗ r e l u + 4 ∗ p o o l i n g 13*conv+13*relu+4*pooling 13conv+13relu+4pooling;RPN网络首先经过 3 × 3 3\times 3 3×3卷积,再分别生成 f o r e g r o u n d   a n c h o r s foreground\ anchors foreground anchors b o u n d i n g   b o x   r e g r e s s i o n bounding\ box\ regression bounding box regression偏移量,然后计算出 p r o p o s a l s proposals proposals;而 R O I   P o o l i n g ROI \ Pooling ROI Pooling层则利用 p r o p o s a l s proposals proposals f e a t u r e   m a p s feature\ maps feature maps中提取 p r o p o s a l   f e a t u r e proposal\ feature proposal feature送入后续全连接和 s o f t m a x softmax softmax网络作 c l a s s i f i c a t i o n classification classification(即分类 p r o p o s a l proposal proposal到底是什么 o b j e c t object object)。

逐层分析

  1. Conv layers C o n v   l a y e r s Conv\ layers Conv layers包含了 c o n v conv conv p o o l i n g pooling pooling r e l u relu relu三种层。以python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构为例, C o n v   l a y e r s Conv\ layers Conv layers部分共有13个 c o n v conv conv层,13个 r e l u relu relu层,4个 p o o l i n g pooling pooling层。在 C o n v   l a y e r s Conv\ layers Conv layers中所有的 c o n v conv conv层都是: k e r n e l _ s i z e = 3 , p a d = 1 kernel\_size=3,pad=1 kernel_size=3,pad=1,所有的 p o o l i n g pooling pooling层都是: k e r n e l s i z e = 2 , s t r i d e = 2 kernel_size=2,stride=2 kernelsize=2,stride=2。在Faster R-CNN中的 C o n v   l a y e r s Conv\ layers Conv layers中对所有的卷积都做了扩边处理( p a d = 1 pad=1 pad=1,即填充一圈0),导致原图变为 ( M + 2 ) × ( N + 2 ) (M+2)\times (N+2) (M+2)×(N+2)大小,再做 3 × 3 3\times 3 3×3卷积后输出 M × N M\times N M×N。正是这种设置,导致 C o n v   l a y e r s Conv\ layers Conv layers中的 c o n v conv conv层不改变输入和输出矩阵大小。在这里插入图片描述 C o n v   l a y e r s Conv\ layers Conv layers中的 p o o l i n g pooling pooling k e r n e l _ s i z e = 2 , s t r i d e = 2 kernel\_size=2,stride=2 kernel_size=2,stride=2。这样每个经过 p o o l i n g pooling pooling层的 M × N M\times N M×N矩阵,都会变为 ( M / 2 ) × ( N / 2 ) (M/2)\times (N/2) (M/2)×(N/2)大小。综上所述,在整个 C o n v   l a y e r s Conv\ layers Conv layers中, c o n v conv conv r e l u relu relu层不改变输入输出大小,只有 p o o l i n g pooling pooling层使输出长宽都变为输入的 1 2 \frac{1}{2} 21。,一个 M × N M\times N M×N大小的矩阵经过 C o n v   l a y e r s Conv\ layers Conv layers固定变为 ( M / 16 ) × ( N / 16 ) (M/16)\times (N/16) (M/16)×(N/16),这样 C o n v   l a y e r s Conv\ layers Conv layers生成的 f e a t u u r e   m a p featuure\ map featuure map中都可以和原图对应起来。
  2. Region Proposal Networks(RPN):经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如RCNN使用SS(Selective Search)方法生成检测框。而Faster R-CNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。在这里插入图片描述RPN网络实际分为2条线,上面一条通过 s o f t m a x softmax softmax分类 a n c h o r s anchors anchors获得 f o r e g r o u n d foreground foreground b a c k g r o u n d background background(检测目标是 f o r e g r o u n d foreground foreground),下面一条用于计算对于 a n c h o r s anchors anchors b o u n d i n g   b o x   r e g r e s s i o n bounding\ box\ regression bounding box regression偏移量,以获得精确的 p r o p o s a l proposal proposal。而最后的 p r o p o s a l proposal proposal层则负责综合 f o r e g r o u n d   a n c h o r s foreground\ anchors foreground anchors b o u n d i n g   b o x   r e g r e s s i o n bounding\ box\ regression bounding box regression偏移量获取 p r o p o s a l s proposals proposals,同时剔除太小和超出边界的 p r o p o s a l s proposals proposals。整个网络到了 p r o p o s a l   l a y e r proposal\ layer proposal layer这里,就完成了相当于目标定位的功能。
  3. RPN网络相关的是Anchor,由四个值构成 [ x 1 , y 1 , x 2 , y 2 ] [x_1,y_1,x_2,y_2] [x1,y1,x2,y2]代表矩形左上和右下角点坐标。 9 9 9个矩形共有 3 3 3种形状,长宽比为大约为: w i d t h : h e i g h t = [ 1 : 1 , 1 : 2 , 2 : 1 ] width:height = [1:1, 1:2, 2:1] width:height=[1:1,1:2,2:1]三种,通过anchors就引入了检测中常用到的多尺度方法。在这里插入图片描述anchors中长宽 1 : 2 1:2 1:2中最大为 352 × 704 352\times 704 352×704,长宽 2 : 1 2:1 2:1中最大 736 × 384 736\times 384 736×384,基本是cover了 800 × 600 800\times 600 800×600的各个尺度和形状。遍历 c o n v   l a y e r s conv\ layers conv layers计算获得的 f e a t u r e   m a p s feature\ maps feature maps,为每一个点都配备 9 9 9 a n c h o r s anchors anchors作为初始的检测框。这样做获得检测框很不准确,之后 2 2 2 b o u n d i n g   b o x   r e g r e s s i o n bounding\ box\ regression bounding box regression可以修正检测框位置。
    在这里插入图片描述上图中在原文中使用的是ZF model中,其 C o n v   L a y e r s 中 Conv\ Layers中 Conv Layers最后的 c o n v 5 conv5 conv5 n u m _ o u t p u t = 256 num\_output=256 num_output=256,对应生成256张特征图,所以相当于 f e a t u r e   m a p feature\ map feature map每个点都是 256 − d 256-d 256d;在 c o n v 5 conv5 conv5之后,做了 r p n _ c o n v / 3 × 3 rpn\_conv/3\times 3 rpn_conv/3×3卷积且 n u m _ o u t p u t = 256 num\_output=256 num_output=256,相当于每个点又融合了周围 3 × 3 3\times 3 3×3的空间信息,同时 256 − d 256-d 256d不变;假设在 c o n v 5 conv5 conv5 f e a t u r e   m a p feature\ map feature map中每个点上有 k k k a n c h o r anchor anchor(默认 k = 9 k=9 k=9),而每个 a n h c o r anhcor anhcor要分 f o r e g r o u n d foreground foreground b a c k g r o u n d background background,所以每个点由 256 d 256d 256d f e a t u r e feature feature转化为 c l s = 2 k   s c o r e s cls=2k\ scores cls=2k scores;而每个 a n c h o r anchor anchor都有 [ x , y , w , h ] [x, y, w, h] [x,y,w,h]对应 4 4 4个偏移量,所以 r e g = 4 k   c o o r d i n a t e s reg=4k\ coordinates reg=4k coordinates;由于如果所有 a n c h o r s anchors anchors参与训练则太多了,训练程序会选取 256 256 256个合适的 a n c h o r s anchors anchors进行训练。
    PS: 文中使用的VGG网络 c o n v 5 conv5 conv5 n u m _ o u t p u t = 512 num\_output=512 num_output=512,所以是 512 d 512d 512d
    RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用CNN去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。作为二分类任务。
    A n c h o r Anchor Anchor数量:原图 800 × 600 800\times 600 800×600VGG下采样 16 16 16倍, f e a t u r e   m a p feature\ map feature map每个点设置 9 9 9 A n c h o r Anchor Anchor
    c e i l ( 800 / 16 ) × c e i l ( 600 / 16 ) × 9 = 50 × 38 × 9 = 17100 ceil(800/16)\times ceil(600/16) \times 9 = 50 \times 38 \times 9=17100 ceil(800/16)×ceil(600/16)×9=50×38×9=17100
    在这里插入图片描述
  4. Bounding Box Regression原理
    如图所示绿色框为飞机的 G r o u n d   T r u t h ( G T ) Ground\ Truth(GT) Ground Truth(GT),红色为提取的 p o s i t i v e   a n c h o r s positive\ anchors positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以采用一种方法对红色的框进行微调,使得 p o s i t i v e   a n c h o r s positive\ anchors positive anchors G T GT GT更加接近。
    在这里插入图片描述
    对于窗口一般使用四维向量 [ x , y , w , h ] [x,y,w,h] [x,y,w,h]表示,分别表示窗口的中心点坐标和宽高。对于下图,红色的框 A A A代表原始的 p o s i t i v e   A n c h o r s positive\ Anchors positive Anchors,绿色的框 G G G代表目标的 G T GT GT,目标是寻找一种关系,使得输入原始的 a n c h o r   A anchor\ A anchor A经过映射得到一个跟真实窗口 G G G更接近的回归窗口 G ′ G' G,即:
    在这里插入图片描述
    1、给定 a n c h o r   A = ( A x , A y , A w , A h ) anchor\ A = (A_x, A_y, A_w, A_h) anchor A=(Ax,Ay,Aw,Ah) G T = [ G x , G y , G w , G h ] GT=[G_x, G_y, G_w, G_h] GT=[Gx,Gy,Gw,Gh]
    2、寻找一种变换 F F F,使得 F ( A x , A y , A w , A h ) = ( G x ′ , G y ′ , G w ′ , G h ′ ) F(A_x, A_y, A_w, A_h)=(G'_x,G'_y, G'_w, G'_h) F(Ax,Ay,Aw,Ah)=(Gx,Gy,Gw,Gh),其中 ( G x ′ , G y ′ , G w ′ , G h ′ ) ≈ ( G x , G y , G w , G h ) (G'_x,G'_y, G'_w, G'_h)\approx (G_x, G_y, G_w, G_h) (Gx,Gy,Gw,Gh)(Gx,Gy,Gw,Gh)
    步骤:
    先做平移: G x ′ = A w ⋅ d x ( A ) + A x G'_x=A_w\cdot d_x(A)+A_x Gx=Awdx(A)+Ax G y ′ = A h ⋅ d y ( A ) + A y G'_y=A_h\cdot d_y(A)+A_y Gy=Ahdy(A)+Ay
    再做缩放: G w ′ = A w ⋅ e x p ( d w ( A ) ) G'_w=A_w\cdot exp(d_w(A)) Gw=Awexp(dw(A)) G h ′ = A h ⋅ e x p ( d h ( A ) ) G'_h=A_h\cdot exp(d_h(A)) Gh=Ahexp(dh(A))
    需要学习四个变换 d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) d_x(A),d_y(A),d_w(A),d_h(A) dx(A),dy(A),dw(A),dh(A),当输入的 a n c h o r   A anchor\ A anchor A G T GT GT相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调(注意,只有当 a n c h o r s   A anchors\ A anchors A G T GT GT比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)。
    线性回归就是给定输入的特征向量 X X X, 学习一组参数 W W W, 使得经过线性回归后的值跟真实值 Y Y Y非常接近,即 Y = W X Y=WX Y=WX。对于该问题,输入 X X X c n n   f e a t u r e   m a p cnn\ feature\ map cnn feature map,定义为 ϕ \phi ϕ;同时还有训练传入 A A A G T GT GT之间的变换量,即 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th)。输出是 ( d x ( A ) , d y ( A ) , d w ( A ) , d x ( A ) ) (d_x(A),d_y(A),d_w(A),d_x(A)) (dx(A),dy(A),dw(A),dx(A))四个变换。目标函数表示为: d ∗ ( A ) = W ∗ T ⋅ ϕ ( A ) d_*(A)=W^T_*\cdot \phi (A) d(A)=WTϕ(A)其中 ϕ ( A ) \phi(A) ϕ(A) 是对应 a n c h o r anchor anchor f e a t u r e   m a p feature\ map feature map组成的特征向量, W ∗ W_* W是需要学习的参数, d ∗ ( A ) d_*(A) d(A)是得到的预测值( ∗ * 表示 x , y , w , h x,y,w,h x,y,w,h,也就是每一个变换对应一个上述目标函数)。为了让预测值 d ∗ ( A ) d_*(A) d(A)与真实值 t ∗ t_* t差距最小,设计 L 1 L1 L1损失函数: L o s s = ∑ i N ∣ t ∗ i − W ∗ T ⋅ ϕ ( A i ) ∣ Loss=\sum ^N_i|t^i_*-W^T_*\cdot \phi (A^i)| Loss=iNtiWTϕ(Ai)函数优化目标为: W ^ ∗ = a r g m i n W ∗ ∑ i n ∣ t ∗ i − W ∗ T ⋅ ϕ ( A i ) ∣ + λ ∣ ∣ W ∗ ∣ ∣ \hat{W}_*=argmin_{W_*}\sum^n_i|t^i_*-W^T_*\cdot \phi(A^i)|+\lambda ||W_*|| W^=argminWintiWTϕ(Ai)+λW为了方便描述,这里以 L 1 L1 L1损失为例介绍,而真实情况中一般使用 s o o m t h − L 1 soomth-L1 soomthL1损失。
    需要说明,只有在 G T GT GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。
    对应于Faster RCNN原文, p o s i t i v e   a n c h o r positive\ anchor positive anchor g r o u n d   t r u t h ground\ truth ground truth之间的平移量 ( t x , t y ) (t_x,t_y) (tx,ty)与尺度因子 ( t w , t h ) (t_w,t_h) (tw,th)如下: t x = ( x − x a ) / w a t y = ( y − y a ) / h a t_x=(x-x_a)/w_a \quad t_y=(y-y_a)/h_a tx=(xxa)/waty=(yya)/ha t w = l o g ( w / w a ) t h = l o g ( h / h a ) t_w=log(w/w_a) \quad t_h=log(h/h_a) tw=log(w/wa)th=log(h/ha)对于训练 b o u d i n g   b o x   r e g r e s s i o n bouding\ box\ regression bouding box regression网络回归分支,输入是 c n n   f e a t u r e   ϕ cnn\ feature\ \phi cnn feature ϕ,监督信号是 A n c h o Ancho Ancho G T GT GT的差距 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th),即训练目标是:输入 ϕ \phi ϕ的情况下使网络输出与监督信号尽可能接近。那么当 b o u d i n g   b o x   r e g r e s s i o n bouding\ box\ regression bouding box regression工作时,再输入 ϕ \phi ϕ时,回归网络分支的输出就是每个 A n c h o r Anchor Anchor的平移量和变换尺度 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th),显然即可用来修正 A n c h o r Anchor Anchor位置了。
  5. 对proposals进行bounding box regression
    RPN中的bbox reg
    n u m _ o u t p u t = 36 num\_output=36 num_output=36,即经过该卷积输出图像为 W × H × 36 W\times H\times 36 W×H×36,在 c a f f e   b l o b caffe\ blob caffe blob存储为 [ 1 , 4 × 9 , H , W ] [1, 4\times 9, H, W] [1,4×9,H,W],这里相当于 f e a t u r e   m a p s feature\ maps feature maps每个点都有 9 9 9 a n c h o r s anchors anchors,每个 a n c h o r s anchors anchors又都有 4 4 4个用于回归的 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_x(A),d_y(A),d_w(A),d_h(A)] [dx(A),dy(A),dw(A),dh(A)]变换量。VGG输出 50 × 38 × 512 50\times 38\times 512 50×38×512的特征,对应设置 50 × 38 × k 50\times 38\times k 50×38×k a n c h o r s anchors anchors,而 R P N RPN RPN输出:
    1、大小为 50 × 38 × 2 k 50\times 38\times 2k 50×38×2k的positive/negative softmax分类特征矩阵;
    2、大小为 50 × 38 × 4 k 50\times 38\times 4k 50×38×4k的regression坐标回归特征矩阵;
    恰好满足RPN完成 p o s i t i v e / n e g a t i v e positive/negative positive/negative分类 + b o u n d i n g   b o x   r e g r e s s i o n +bounding\ box\ regression +bounding box regression坐标回归。
  6. Proposal Layer
    P r o p o s a l   L a y e r Proposal\ Layer Proposal Layer负责综合所有 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_x(A),d_y(A),d_w(A),d_h(A)] [dx(A),dy(A),dw(A),dh(A)]变换量和 p o s i t i v e   a n c h o r s positive\ anchors positive anchors,计算出精准的 p r o p o s a l proposal proposal,送入后续 R o I   P o o l i n g   L a y e r RoI\ Pooling\ Layer RoI Pooling Layer
    P r o p o s a l   L a y e r Proposal\ Layer Proposal Layer有3个输入: p o s i t i v e   v s   n e g a t i v e   a n c h o r s positive\ vs\ negative\ anchors positive vs negative anchors分类器结果 r p n _ c l s _ p r o b _ r e s h a p e rpn\_cls\_prob\_reshape rpn_cls_prob_reshape,对应的 b b o x   r e g bbox\ reg bbox reg [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_x(A),d_y(A),d_w(A),d_h(A)] [dx(A),dy(A),dw(A),dh(A)]变换量 r p n _ b b o x _ p r e d rpn\_bbox\_pred rpn_bbox_pred,以及 i m _ i n f o im\_info im_info i m i n f o im_info iminfo是对于一副任意大小 P × Q P\times Q P×Q图像,传入 F a s t e r   R − C N N Faster\ R-CNN Faster RCNN前首先 r e s h a p e reshape reshape到固定 M × N M\times N M×N i m i n f o = [ M , N , s c a l e _ f a c t o r ] im_info=[M, N, scale\_factor] iminfo=[M,N,scale_factor]则保存了此次缩放的所有信息。然后经过 C o n v   L a y e r s Conv\ Layers Conv Layers,经过 4 4 4 p o o l i n g pooling pooling变为 W × H = ( M / 16 ) × ( N / 16 ) W\times H=(M/16)\times (N/16) W×H=(M/16)×(N/16)大小,其中 f e a t u r e _ s t r i d e = 16 feature\_stride=16 feature_stride=16则保存了该信息,用于计算 a n c h o r anchor anchor偏移量。在这里插入图片描述
    P r o p o s a l   L a y e r   f o r w a r d Proposal\ Layer\ forward Proposal Layer forward按照以下顺序依次处理:
    1、生成 a n c h o r s anchors anchors,利用 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_x(A),d_y(A),d_w(A),d_h(A)] [dx(A),dy(A),dw(A),dh(A)]对所有的 a n c h o r s anchors anchors b b o x   r e g r e s s i o n bbox\ regression bbox regression回归(这里的 a n c h o r s anchors anchors生成和训练时完全一致);
    2、按照输入的 p o s i t i v e   s o f t m a x   s c o r e s positive\ softmax\ scores positive softmax scores由大到小排序 a n c h o r s anchors anchors,提取前 p r e _ n m s _ t o p N ( e . g . 6000 ) pre\_nms\_topN(e.g. 6000) pre_nms_topN(e.g.6000) a n c h o r anchor anchor,即提取修正位置后的 p o s i t i v e   a n c h o r s positive\ anchors positive anchors
    3、限定超出图像边界的 p o s i t i v e   a n c h o r s positive\ anchors positive anchors为图像边界,防止后续 r o i   p o o l i n g roi\ pooling roi pooling p r o p o s a l proposal proposal超出图像边界;
    4、剔除尺寸非常小的 p o s i t i v e   a n c h o r s positive\ anchors positive anchors
    5、对剩余的 p o s i t i v e   a n c h o r s positive\ anchors positive anchors进行 N M S ( n o n m a x i m u m   s u p p r e s s i o n ) NMS(nonmaximum\ suppression) NMS(nonmaximum suppression)
    6、KaTeX parse error: Undefined control sequence: \l at position 8: Proposa\̲l̲ ̲Layer有3个输入: p o s i t i v e positive positive n e g a t i v e   a n c h o r s negative\ anchors negative anchors分类器结果 r p n _ c l s _ p r o b _ r e s h a p e rpn\_cls\_prob\_reshape rpn_cls_prob_reshape,对应的 b b o x   r e g ( e . g . 300 ) bbox\ reg(e.g. 300) bbox reg(e.g.300)结果作为 p r o p o s a l proposal proposal输出。
    之后输出 p r o p o s a l = [ x 1 , y 1 , x 2 , y 2 ] proposal=[x_1, y_1, x_2, y_2] proposal=[x1,y1,x2,y2],注意,由于在第三步中将 a n c h o r s anchors anchors映射回原图判断是否超出边界,所以这里输出的 p r o p o s a l proposal proposal是对应 M × N M\times N M×N输入图像尺度的,这点在后续网络中有用。严格意义上的检测应该到此就结束了,后续部分应该属于识别了。
    RPN总结:
    生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals

RoI Pooling

R o I   P o o l i n g RoI\ Pooling RoI Pooling层则负责收集 p r o p o s a l proposal proposal,并计算出 p r o p o s a l   f e a t u r e   m a p s proposal\ feature\ maps proposal feature maps,送入后续网络。 R o l   p o o l i n g Rol\ pooling Rol pooling层有2个输入:

  1. 原始的 f e a t u r e   m a p s feature\ maps feature maps
  2. R P N RPN RPN输出的 p r o p o s a l   b o x e s proposal\ boxes proposal boxes(大小各不相同)

为何需要RoI Pooling

先来看一个问题:对于传统的 C N N CNN CNN(如 A l e x N e t AlexNet AlexNet V G G VGG VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的 v e c t o r   o r   m a t r i x vector\ or\ matrix vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。有 2 2 2种解决办法:

  1. 从图像中 c r o p crop crop一部分传入网络
  2. 将图像 w a r p warp warp成需要的大小后传入网络

在这里插入图片描述
c r o p crop crop后破坏了图像的完整结构, w a r p warp warp破坏了图像原始形状信息。所以需要 R o I   P o o l i n g RoI\ Pooling RoI Pooling

RoI Pooling原理

R o I   P o o l i n g   l a y e r   f o r w a r d RoI\ Pooling\ layer\ forward RoI Pooling layer forward过程:

  1. 由于 p r o p o s a l proposal proposal是对应 M × N M\times N M×N尺度的,所以首先使用 s p a t i a l _ s c a l e spatial\_scale spatial_scale参数将其映射回 ( M / 16 ) × ( N / 16 ) (M/16)\times (N/16) (M/16)×(N/16)大小的 f e a t u r e   m a p feature\ map feature map尺度;
  2. 再将每个 p r o p o s a l proposal proposal对应的 f e a t u r e   m a p feature\ map feature map区域水平分为 p o o l e d _ w × p o o l e d _ h pooled\_w\times pooled\_h pooled_w×pooled_h的网格;
  3. 对网格的每一份都进行 m a x   p o o l i n g max\ pooling max pooling处理。

这样处理后,即使大小不同的 p r o p o s a l proposal proposal输出结果都是 p o o l e d _ w × p o o l e d _ h pooled\_w\times pooled\_h pooled_w×pooled_h固定大小,实现了固定长度输出。
在这里插入图片描述

Classification

C l a s s i f i c a t i o n Classification Classification部分利用已经获得的 p r o p o s a l   f e a t u r e   m a p s proposal\ feature\ maps proposal feature maps,通过 f u l l   c o n n e c t full\ connect full connect层与 s o f t m a x softmax softmax计算每个 p r o p o s a l proposal proposal具体属于那个类别(如人,车,电视等),输出 c l s _ p r o b cls\_prob cls_prob概率向量;同时再次利用 b o u n d i n g   b o x   r e g r e s s i o n bounding\ box\ regression bounding box regression获得每个 p r o p o s a l proposal proposal的位置偏移量 b b o x _ p r e d bbox\_pred bbox_pred,用于回归更加精确的目标检测框。 C l a s s i f i c a t i o n Classification Classification部分网络结构如图:
在这里插入图片描述
R o I   P o o l i n g RoI\ Pooling RoI Pooling获取到 7 × 7 = 49 7\times 7=49 7×7=49大小的 p r o p o s a l   f e a t u r e   m a p s proposal\ feature\ maps proposal feature maps后,送入后续网络,可以看到做了如下 2 2 2件事:

  1. 通过全连接和 s o f t m a x softmax softmax p r o p o s a l s proposals proposals进行分类,这实际上已经是识别的范畴了
  2. 再次对 p r o p o s a l s proposals proposals进行 b o u n d i n g   b o x   r e g r e s s i o n bounding\ box\ regression bounding box regression,获取更高精度的 r e c t   b o x rect\ box rect box

这里来看看全连接层 I n n e r P r o d u c t   l a y e r s InnerProduct\ layers InnerProduct layers,简单的示意图如图:”
在这里插入图片描述
其计算公式如下:
( x 1 x 2 x 3 ) ( w 11 w 12 w 21 w 22 w 31 w 32 ) + ( b 1 b 2 ) = ( y 1 y 2 ) \begin{pmatrix}x_1& x_2&x_3\end{pmatrix}\begin{pmatrix}w_{11}& w_{12}\\w_{21}&w_{22}\\w_{31}&w_{32}\end{pmatrix}+\begin{pmatrix}b_1& b_2\end{pmatrix}=\begin{pmatrix}y_1& y_2\end{pmatrix} (x1x2x3)w11w21w31w12w22w32+(b1b2)=(y1y2)
其中 W W W b i a s   B bias\ B bias B都是预先训练好的,即大小是固定的,当然输入 X X X和输出 Y Y Y也就是固定大小。所以,这也就印证了之前 R o I   P o o l i n g RoI\ Pooling RoI Pooling的必要性。

Faster R-CNN训练

Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为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 第二次训练Fast
6. RCNN网络,对应stage2_fast_rcnn_train.pt

可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。

训练RPN网络

首先读取RBG提供的预训练好的model(本文使用VGG),开始迭代训练。来看看stage1_rpn_train.pt网络结构,如图:在这里插入图片描述
与检测网络类似的是,依然使用 C o n v   L a y e r s Conv\ Layers Conv Layers提取 f e a t u r e   m a p s feature\ maps feature maps。整个网络使用的 L o s s Loss Loss如下:
L ( { p i } , { t i } ) = 1 N c l s ∑ i L c l s ( p i , p i ∗ ) + λ 1 N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) L(\{p_i\},\{t_i\})=\frac{1}{N_{cls}}\sum_iL_{cls}(p_i,p^*_i)+\lambda \frac{1}{N_{reg}}\sum_ip^*_iL_{reg}(t_i,t^*_i) L({pi},{ti})=Ncls1iLcls(pi,pi)+λNreg1ipiLreg(ti,ti)
上述公式中 i i i表示 a n c h o r s   i n d e x anchors\ index anchors index p i p_i pi表示 p o s i t i v e   s o f t m a x   p r o b a b i l i t y positive\ softmax\ probability positive softmax probability p i ∗ p^*_i pi代表对应的 G T   p r e d i c t GT\ predict GT predict概率(即当第 i i i a n c h o r anchor anchor G T GT GT I o U > 0.7 IoU>0.7 IoU>0.7,认为是该 a n c h o r anchor anchor p o s i t i v e positive positive p i ∗ = 1 p^*_i=1 pi=1;反之 I o U < 0.3 IoU<0.3 IoU<0.3时,认为是该 a n c h o r anchor anchor n e g a t i v e negative negative p i ∗ = 0 p^*_i=0 pi=0;至于那些 0.3 < I o U < 0.7 0.3<IoU<0.7 0.3<IoU<0.7 a n c h o r anchor anchor则不参与训练); t t t代表 p r e d i c t   b o u n d i n g   b o x predict\ bounding\ box predict bounding box t ∗ t^* t代表对应 p o s i t i v e   a n c h o r positive\ anchor positive anchor对应的 G T   b o x GT\ box GT box。可以看到,整个 L o s s Loss Loss分为 2 2 2部分:

  1. c l s   l o s s cls\ loss cls loss,即 r p n _ c l s _ l o s s rpn\_cls\_loss rpn_cls_loss层计算的 s o f t m a x   l o s s softmax\ loss softmax loss,用于分类 a n c h o r s anchors anchors p o s i t i v e positive positive n e g a t i v e negative negative的网络训练
  2. r e g   l o s s reg\ loss reg loss,即 r p n _ l o s s _ b b o x rpn\_loss\_bbox rpn_loss_bbox层计算的 s o o m t h   L 1   l o s s soomth\ L1\ loss soomth L1 loss,用于 b o u n d i n g   b o x   r e g r e s s i o n bounding\ box\ regression bounding box regression网络训练。注意在该 l o s s loss loss中乘了 p i ∗ p^*_i pi,相当于只关心 p o s i t i v e   a n c h o r s positive\ anchors positive anchors的回归(其实在回归中也完全没必要去关心 n e g a t i v e negative negative)。

由于在实际过程中, N c l s N_{cls} Ncls N r e g N_{reg} Nreg差距过大,用参数 λ \lambda λ平衡二者(如 N c l s = 256 , N r e g = 2400 N_{cls}=256,N_{reg}=2400 Ncls=256,Nreg=2400时设置 λ = N r e g N c l s ≈ 10 \lambda=\frac{N_{reg}}{N_{cls}}\approx10 λ=NclsNreg10),使总的网络 L o s s Loss Loss计算过程中能够均匀考虑 2 2 2 L o s s Loss Loss。这里比较重要是 L r e g L_{reg} Lreg使用的 s o o m t h   L 1   l o s s soomth\ L1\ loss soomth L1 loss,计算公式如下: L r e g ( t i , t i ∗ ) = ∑ i ∈ { x , y , w , h } s m o o t h L 1 ( t i − t i ∗ ) s m o o t h L 1 ( x ) = { 0.5 x 2 , i f   ∣ x ∣ < 1 ∣ x ∣ − 0.5 , o t h e r w i s e L_{reg}(t_i,t^*_i)=\sum_{i\in \{x,y,w,h\}}smooth_{L1}(t_i-t^*_i) \\ smooth_{L1}(x)=\begin{cases}0.5x^2,\quad if \ |x| < 1 \\|x|-0.5,\quad otherwise \end{cases} Lreg(ti,ti)=i{x,y,w,h}smoothL1(titi)smoothL1(x)={0.5x2,if x<1x0.5,otherwise

  1. 在RPN训练阶段, r p n − d a t a rpn-data rpndata p y t h o n   A n c h o r T a r g e t L a y e r python\ AnchorTargetLayer python AnchorTargetLayer)层会按照和 t e s t test test阶段 P r o p o s a l Proposal Proposal层完全一样的方式生成 A n c h o r s Anchors Anchors用于训练
  2. 对于 r p n _ l o s s _ c l s rpn\_loss\_cls rpn_loss_cls,输入的 r p n _ c l s _ s c o r s _ r e s h a p e rpn\_cls\_scors\_reshape rpn_cls_scors_reshape r p n _ l a b e l s rpn\_labels rpn_labels分别对应 p p p p ∗ p^* p N c l s N_{cls} Ncls参数隐含在 p p p ∗ ^* c a f f e   b l o b caffe\ blob caffe blob的大小中
  3. 对于 r p n _ l o s s _ b b o x rpn\_loss\_bbox rpn_loss_bbox,输入的 r p n _ b b o x _ p r e d rpn\_bbox\_pred rpn_bbox_pred r p n _ b b o x _ t a r g e t s rpn\_bbox\_targets rpn_bbox_targets分别对应 t t t t ∗ t^* t r p n _ b b o x _ i n s i d e _ w e i g t h s rpn\_bbox\_inside\_weigths rpn_bbox_inside_weigths对应 p ∗ p^* p r p n _ b b o x _ o u t s i d e _ w e i g t h s rpn\_bbox\_outside\_weigths rpn_bbox_outside_weigths未用到(从 s o o m t h _ L 1 _ L o s s   l a y e r soomth\_L1\_Loss\ layer soomth_L1_Loss layer代码中可以看到),而 N r e g N_{reg} Nreg同样隐含在 c a f f e   b l o b caffe\ blob caffe blob大小中

这样,公式与代码就完全对应了。特别需要注意的是,在训练和检测阶段生成和存储 a n c h o r s anchors anchors的顺序完全一样,这样训练结果才能被用于检测!

通过训练好的RPN网络收集proposals

在该步骤中,利用之前的 R P N RPN RPN网络,获取 p r o p o s a l   r o i s proposal\ rois proposal rois,同时获取 p o s i t i v e   s o f t m a x   p r o b a b i l i t y positive\ softmax\ probability positive softmax probability,如图,然后将获取的信息保存在 p y t h o n   p i c k l e python\ pickle python pickle文件中。该网络本质上和检测中的 R P N RPN RPN网络一样,没有什么区别。
在这里插入图片描述

训练Faster RCNN网络

读取之前保存的 p i c k l e pickle pickle文件,获取 p r o p o s a l s proposals proposals p o s i t i v e   p r o b a b i l i t y positive\ probability positive probability。从 d a t a data data层输入网络。然后:

  1. 将提取的 p r o p o s a l s proposals proposals作为rois传入网络,如下图蓝框
  2. 计算 b b o x _ i n s i d e _ w e i g h t s + b b o x _ o u t s i d e _ w e i g h t s bbox\_inside\_weights+bbox\_outside\_weights bbox_inside_weights+bbox_outside_weights,作用与 R P N RPN RPN一样,传入 s o o m t h _ L 1 _ l o s s   l a y e r soomth\_L1\_loss\ layer soomth_L1_loss layer,如下图绿框

这样就可以训练最后的识别 s o f t m a x softmax softmax与最终的 b o u n d i n g   b o x   r e g r e s s i o n bounding\ box\ regression bounding box regression了。
在这里插入图片描述
之后的stage2训练都是大同小异,不再赘述了。 F a s t e r   R − C N N Faster\ R-CNN Faster RCNN还有一种 e n d − t o − e n d end-to-end endtoend的训练方式,可以一次完成 t r a i n train train
Faster R-CNN-github

问题

  1. 为什么Anchor坐标中有负数?
    回顾 a n c h o r anchor anchor生成步骤:首先生成 9 9 9 b a s e   a n c h o r base\ anchor base anchor,然后通过坐标偏移在 50 × 38 50\times 38 50×38大小的 1 16 \frac{1}{16} 161下采样 F e a t u r e   M a p Feature\ Map Feature Map每个点都放上这 9 9 9 b a s e   a n c h o r base\ anchor base anchor,就形成了 50 × 38 × k 50\times 38\times k 50×38×k a n h c o r s anhcors anhcors。至于这 9 9 9 b a s e   a n c h o r base\ anchor base anchor坐标是什么其实并不重要,不同代码实现也许不同。
    显然这里面有一部分边缘 a n c h o r s anchors anchors会超出图像边界,而真实中不会有超出图像的目标,所以会有 c l i p   a n c h o r clip\ anchor clip anchor步骤。
    在这里插入图片描述
  2. Anchor到底与网络输出如何对应?
    VGG输出 50 × 38 × 512 50\times 38\times 512 50×38×512的特征,对应设置 50 × 38 × k 50\times 38\times k 50×38×k a n c h o r s anchors anchors,而 R P N RPN RPN输出 50 × 38 × 2 k 50\times 38\times 2k 50×38×2k的分类特征矩阵和 50 × 38 × 4 k 50\times 38\times 4k 50×38×4k的坐标回归特征矩阵。
    在这里插入图片描述其实在实现过程中,每个点的 2 k 2k 2k个分类特征与 4 k 4k 4k回归特征,与 k k k a n c h o r anchor anchor逐个对应即可,这实际是一种“人为设置的逻辑映射”。当然,也可以不这样设置,但是无论如何都需要保证在训练和测试过程中映射方式必须一致。
  3. 为何有ROI Pooling还要把输入图片resize到固定大小的MxN
    由于引入 R O I   P o o l i n g ROI\ Pooling ROI Pooling,从原理上说 F a s t e r   R − C N N Faster\ R-CNN Faster RCNN确实能够检测任意大小的图片。但是由于在训练的时候需要使用大 b a t c h batch batch训练网络,而不同大小输入拼 b a t c h batch batch在实现的时候代码较为复杂,而且当时以 C a f f e Caffe Caffe为代表的第一代深度学习框架也不如 T e n s o r f l o w Tensorflow Tensorflow P y T o r c h PyTorch PyTorch灵活,所以作者选择了把输入图片 r e s i z e resize resize到固定大小的 800 × 600 800\times 600 800×600

参考:
Fast RCNN算法详解
一文读懂Faster RCNN
快速理解RPN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值