前言
   
    本文参考来源于b站up主霹雳吧啦Wz.
    
     原视频
    
    .
    
    Faster R-CNN是作者作者Ross Girshick继Fast R-NN之后的又一力作。同样使用VGG16作为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。
   
     
   
     文章目录
    
    
    
    理论部分
   
    
    
    1.Fast R-CNN简介
   
    在讲Faster R-CNN之前我们先来简单的看一下它的上一代算法:Fast R-CNN
    
    
    
    Fast R-CNN算法的流程可以分为三个步骤:
   
- 
     通过使用Selective Search方法在一张图片上生成1000~2000个
 
 候选区域
 
 (这种方法在Faster R-CNN中RPN网络被替代)
- 
     将图像输入卷积网络生成相应的
 
 特征图
 
 ,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵。(也就是相当于有了一张特征图,然后在特征图上将ss算法扫到的区域框出来)
- 将每个特征矩阵通过ROI pooling层缩放到7×7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
    
    
    2.Faster R-CNN简介
   
Faster R-CNN算法的流程可分为三个步骤:
- 
     将图像输入网络得到相应的
 
 特征图
 
- 
     使用RPN结构生成候选框,将
 
 RPN生成的候选框投影到特征图上
 
 获得相应的特征矩阵
- 
     将每个特征矩阵
 
 通过ROI pooling层缩放到7×7大小的特征图
 
 ,接着将特征图
 
 展平
 
 通过一系列全连接层得到预测结果
 
  
 
 实际上我们的Faster R-CNN可以看作是
 
 RPN+Fast R-CNN
 
 这个形式。Faster R-CNN和Fast R-CNN最主要的区别就在于:
 
 Faster R-CNN将候选框的推举交给RPN网络来实现(替代了SS算法)
 
 。
 
 因此我们的研究重点就在于RPN网络。
    
    
    3. RPN网络
   
     
   
    
    
    参数解释
   
首先,由上一步的conv layers生成了conv feature map。在这张特征图上,我们使用一个滑动窗口进行滑动。每滑动到一个位置上时候,我们就生成一个1-dim向量。在这个向量基础上再通过两个全连接层,分别输出目标概率和边界框回归参数。其中:
- 
     256-d:因为我们前面的backbone网络使用的是
 
 ZF网络
 
 ,它所输出的特征图是
 
 256-d
 
 。如果使用
 
 VGG-16
 
 ,生成的特征图就是
 
 512-d
 
 。
- 2k:是指k个anchor boxes,每个anchor boxes生成两个概率(前景和背景)。所以k个anchor boxes会生成2k个scores。
- 4k:对每个anchor boxes我们会生成4个边界框回归参数。所以k个anchor boxes会生成4k个coordinates。
    
    
    anchor boxes解释
   
     
   
    首先明确上图的含义,左边是原图,右边是相应的特征图,我们使用一个3*3滑动窗口在特征图上进行滑动的时候,特征图会存在一个中心点,通过推算出该中心点在原图上的对应位置,在原图上以这个中心点为中心,生成一系列anchor boxes。举个例子,就是如下这种效果:
    
    
    
    对于k个anchor boxes,存在2k个scores。两个两个为一组(前景和背景的概率),一共k组。比如第一组:
   
- 0.1代表其中一个anchor boxes框选(比如是图中的正方形框)的内容是背景的概率是0.1;
- 0.9代表其中一个anchor boxes框选(比如是图中的正方形框)的内容是前景的概率是0.9;
这里只是对它进行背景还是前景的预测,并没有进行分类!
对于k个anchor boxes,存在4k个coordinates。每四个为一组,共k组。
- 
     
 
 
 dx , d y d_x,d_y 
 
 
 
 
 
 
 
 d
 
 
 
 
 
 
 
 
 
 
 x
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ,
 
 
 
 
 
 d
 
 
 
 
 
 
 
 
 
 
 y
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 是anchor中心点的坐标;
- 
     
 
 
 dw , d h d_w,d_h 
 
 
 
 
 
 
 
 d
 
 
 
 
 
 
 
 
 
 
 w
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ,
 
 
 
 
 
 d
 
 
 
 
 
 
 
 
 
 
 h
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 是anchor的宽和高的调整参数;
 
  
 
 论文里面给出了三种尺度(面积)的anchor(
 
 
 
 128 2 , 25 6 2 , 51 2 2 128^2,256^2 ,512^2 
 
 
 
 
 
 
 1
 
 
 2
 
 
 
 8
 
 
 
 
 
 
 
 
 
 
 2
 
 
 
 
 
 
 
 
 
 ,
 
 
 
 
 2
 
 
 5
 
 
 
 6
 
 
 
 
 
 
 
 
 
 
 2
 
 
 
 
 
 
 
 
 
 ,
 
 
 
 
 5
 
 
 1
 
 
 
 2
 
 
 
 
 
 
 
 
 
 
 2
 
 
 
 
 
 
 
 
 
 
 
 
 ),三种比例(1:1,1:2,3:1),每个位置(每个滑动窗口)在原图上都对应
 
 
 
 3∗ 3 3*3 
 
 
 
 
 
 
 3
 
 
 
 
 ∗
 
 
 
 
 
 
 
 
 3
 
 
 
 
 
 ,9个anchor。
 
   
这里有个点需要注意:
    对于ZF感受野为171;对于VGG感受野为228。可是我们从上面可以知道,生成的anchor有256和512的,那么感受野还没有这个anchor大,我们能进行判断嘛?
    
    如上图:作者给出了相应的解释,作者认为一个比较小的感受野(也就是看见一个物体的一部分),我们也可以大概的知道这个物体是什么。(有种窥一斑也可以知全豹的感觉)。实际使用的时候也证明这样是有效的。
   
对于一张1000x600x3的图像,大约有 60x40x9(20k)个anchor,忽略跨越边界的 anchor以后,剩下约6k个anchor。对于RPN 生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU 设为0.7,这样每张图片只剩2k个候选框。
    
    
    RPN训练过程中正负样本的选择标准
   
     
   
    通过滑动窗口在特征图上进行滑动,我们得到了上万个anchor,这些anchor不能都用来训练RPN网络。在原论文中作者说每张图片我们随机的采样256个anchor。这256个anchor是由正样本和负样本组成。正负样本的比例为1:1。如果正样本不足一半,我们就用负样本来填充。
    
    下面是正负样本的选择标准:
    
    
    
    
    
    正样本的选择标准:
   
- an anchor that has an IoU overlap higher than 0.7 with any ground-truth box.
- the anchor/anchors with the highest Intersection-overUnion (IoU) overlap with a ground-truth box
    负样本的选择标准:
    
    We assign a negative label to a non-positive anchor if its IoU ratio is lower than 0.3 for all ground-truth boxes.
   
    丢弃掉的anchor:
    
    Anchors that are neither positive nor negative do not contribute to the training objective.
   
    
    
    RPN Multi-task loss
   
    
    
    其中:
    
    i: the index of an anchor in a mini-batch
    
    
     
      
       p 
i
        p_i
      
      
       
        
        
        
         
          p
         
         
          
           
            
             
              
              
              
               
                i
               
              
             
            
            
             
            
           
           
            
             
             
            
           
          
         
        
       
      
     
    
    :第i个anchor预测为object的概率
    
    
     
      
       p 
i
∗
:
        p_i^*:
      
      
       
        
        
        
         
          p
         
         
          
           
            
             
              
              
              
               
                i
               
              
             
             
              
              
              
               
                ∗
               
              
             
            
            
             
            
           
           
            
             
             
            
           
          
         
        
        
        
        
         :
        
       
      
     
    
    当为正样本时候为1,当为负样本时候为0
    
    
     
      
       t 
i
        t_i
      
      
       
        
        
        
         
          t
         
         
          
           
            
             
              
              
              
               
                i
               
              
             
            
            
             
            
           
           
            
             
             
            
           
          
         
        
       
      
     
    
    : 表示预测第i个anchor的边界框回归参数
    
    
     
      
       t 
i
∗
        t_i^*
      
      
       
        
        
        
         
          t
         
         
          
           
            
             
              
              
              
               
                i
               
              
             
             
              
              
              
               
                ∗
               
              
             
            
            
             
            
           
           
            
             
             
            
           
          
         
        
       
      
     
    
    :表示第i个anchor对应的GT Box的边界框回归参数
    
    
     
      
       N 
c
l
s
        N_{cls}
      
      
       
        
        
        
         
          N
         
         
          
           
            
             
              
              
              
               
                
                 c
                
                
                 l
                
                
                 s
                
               
              
             
            
            
             
            
           
           
            
             
             
            
           
          
         
        
       
      
     
    
    :表示一个mini-batch中的所有样本数量256
    
    
     
      
       N 
r
e
g
        N_{reg}
      
      
       
        
        
        
         
          N
         
         
          
           
            
             
              
              
              
               
                
                 r
                
                
                 e
                
                
                 g
                
               
              
             
            
            
             
            
           
           
            
             
             
            
           
          
         
        
       
      
     
    
    :表示anchor位置的个数(不是anchor个数)约2400(60*40)
    
    
     
      
       λ 
        \lambda
      
      
       
        
        
        
         λ
        
       
      
     
    
    =10
   
    
    
    分类损失
   
    按多类别交叉熵损失来理解:
    
    
    
    按二值交叉熵损失理解:
    
     
   
     
   
    
    
    Fast R-CNN Multi-task loss
   
     
   
    
    
     
   
    
    
    4.Faster R-CNN训练
   
    
     直接采用RPN Loss+ Fast R-CNN Loss的联合训练方法
    
   
原论文中采用分别训练RPN以及Fast R-CNN的方法:
- 利用ImageNet预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
- 固定RPN网络独有的卷积层以及全连接层参数,再利用 ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN 网络生成的目标建议框去训练Fast RCNN网络参数。
- 固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN 网络独有的卷积层以及全连接层参数。
- 同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全 连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层 参数,构成一个统一网络。
    
    
    5.Faster R-CNN框架
   
    Faster R-CNN应用了端对端的思想,将Region proposal;Feature extraction;Classification;Bounding-box regression都融合进了CNN网络。
    
    Faster R-CNN与前代算法框架的比较:
    
     
   
 
