Faster RCNN系列:
Faster RCNN系列1——Anchor生成过程
 Faster RCNN系列2——RPN的真值与预测值概述
 Faster RCNN系列3——RPN的真值详解与损失值计算
 Faster RCNN系列4——生成Proposal与RoI
 Faster RCNN系列5——RoI Pooling与全连接层
一、RPN模块概述
RPN模块的输入、输出如下:
- 输入:feature map(输入图像经过特征提取网络后得到的特征图)、物体标签(训练集中所有物体的类别和边框信息)
 - 输出:Proposal(生成的建议框)、分类Loss、回归Loss
 
二、Anchor生成
Anchor的本质是在原图大小上的一系列的矩形框,Anchor的生成过程和深度学习没有任何的关系,他的本质只是你设定好一些规则,并依据这些规则,在图像中生成不同尺寸,不同长宽比的框,并希望这些框能够最终覆盖你的物体。
Anchor生成的核心代码如下:
def generate_anchors(base_size=16, ratios=[0.5, 1, 2], scales=2**np.arange(3, 6)) :
	#首先创建一个基本Anchor为[0,0,15,15]
	base_ anchor = np.array([1, 1, base_ size, base_ size])一1
	#将基本Anchor进行宽高变化,生成三种宽高比的s :Anchor
	ratio_anchors = _ratio_enum(base_anchor, ratio)
	#将上述Anchor再进行尺度变化,得到最终的9种Anchors
	anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
						for i in xrange (ratio anchors.shape [0])])
	井返回对应于feature map大小的Anchors
	return anchors
 
  传入参数中base_size=16,表示feature map上每一个的感受野大小,即feature map上的每一个点对应输入图像上 
     
      
       
       
         16 
        
       
         × 
        
       
         16 
        
       
      
        16×16 
       
      
    16×16大小的区域。ratios=[0.5, 1, 2],表示缩放比率;scales=2**np.arange(3, 6),即 
     
      
       
       
         s 
        
       
         c 
        
       
         a 
        
       
         l 
        
       
         e 
        
       
         s 
        
       
         = 
        
       
         [ 
        
        
        
          2 
         
        
          3 
         
        
       
         , 
        
        
        
          2 
         
        
          4 
         
        
       
         , 
        
        
        
          2 
         
        
          5 
         
        
       
         ] 
        
       
         = 
        
       
         [ 
        
       
         8 
        
       
         , 
        
       
         16 
        
       
         , 
        
       
         32 
        
       
         ] 
        
       
      
        scales=[2^{3}, 2^{4}, 2^{5}]=[8, 16, 32] 
       
      
    scales=[23,24,25]=[8,16,32],表示缩放倍数。
base_ anchor = np.array([1, 1, base_ size, base_ size]) - 1
这是一个左上角坐标为(0, 0),宽和高都为15的框,大小为16×16,之后的Anchor框都是在这个框的基础上,通过比率和倍数变换得到的。
ratio_anchors = _ratio_ enum(base_anchor, ratio)
将上述生成的 16 × 16 16×16 16×16的基础框,按照 1 : 2 1:2 1:2, 1 : 1 1:1 1:1, 2 : 1 2:1 2:1三种比例进行变换,如下图所示:

anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
for i in xrange (ratio anchors.shape [0])])
将上述生成的Anchor按照 [ 8 , 16 , 32 ] [8, 16, 32] [8,16,32]的倍率进行变换,如下图所示:

在Faster RCNN中,输入图像的大小为 3 × 600 × 800 3×600×800 3×600×800,下采样率为 16 16 16,feature map的大小为 512 × 37 × 50 512×37×50 512×37×50,因此一共有 37 × 50 × 9 = 16650 37×50×9=16650 37×50×9=16650个Anchors。而后通过分类网络与回归网络得到每一个Anchor的前景背景概率和偏移量,前景背景概率用来判断Anchor是前景的概率,回归网络则是将预测偏移量作用到Anchor.上使得Anchor更接近于真实物体坐标。

参考文章
Faster RCNN之Anchors的生成过程理解
《深度学习之Pytorch物体检测实战》


















