faster rcnn分析及其他

最近在跑py-faster-rcnn的代码,终于大概弄懂了结构

caffe的可视化网页为指路

前期得到feature maps的方法结构主要有ZF和VGG16两种,ZF结构较小,VGG16较大,精度差不多,所以选择占显存小的ZF。两者的区别是conv层不同。

faster rcnn由三部分构成:特征提取+RPN+ROI Pooling+Classifier

本文以ZF为特征提取网络讲解。

参考:链接

1)、Conv layers提取特征图:

作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取input image的feature maps,该feature maps会用于后续的RPN层和全连接层

2)、RPN(Region Proposal Networks):

    RPN网络主要用于生成region proposals,首先生成一堆Anchor box,对其进行裁剪过滤后通过softmax判断anchors属于前景(foreground)或者后景(background),即是物体or不是物体,所以这是一个二分类;同时,另一分支bounding box regression修正anchor box,形成较精确的proposal(注:这里的较精确是相对于后面全连接层的再一次box regression而言)

3)、Roi Pooling:

该层利用RPN生成的proposals和VGG16最后一层得到的feature map,得到固定大小的proposal feature map,进入到后面可利用全连接操作来进行目标识别和定位

4)、Classifier:

    会将Roi Pooling层形成固定大小的feature map进行全连接操作,利用Softmax进行具体类别的分类,同时,利用L1 Loss完成bounding box regression回归操作获得物体的精确位置.

rpn网络

用来生成检测框

参考:https://zhuanlan.zhihu.com/p/31426458

参考:https://www.cnblogs.com/houkai/p/6824455.html

  1. rpn_conv/3*3

     将卷积得到的feature maps做3*3的卷积

   2. rpn_cls_score_reshape

   是一个reshape,caffe中的blob结构为[batch_size,channel,height,width],为了二分类,存储形式为[batch_size,2,9*height,width]

  3.rpn_cls_prob

   是softmax,用来分类fg和bg

  4. rpn_cls_prob_reshape

  是一个reshape,   这个reshape为了保存anchors,在feature maps上的每个点有9个anchors,且每个分为fg和bg,所以为了保存fg、bg的anchors,它的储存形式为[batch_size,2*9,height,width]

  5.rpn_bbox_pred

  是一个1*1卷积,输出维度为36,它的存储形式为[1,4*9,h,w],9个anchors,每个有4个算出来的变量,对应bounding box和gt的回归。

 6.proposal

 综合所有的4个变换量和fg anchors,按照im_info的信息,将图像大小映射到原图大学,计算出proposals送给ROI。

  1. 再次生成anchors,并对所有的anchors做bbox reg位置回归(注意这里的anchors生成顺序和之前是即完全一致的)
  2. 按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors。即提取修正位置后的foreground anchors
  3. 利用feat_stride和im_info将anchors映射回原图,判断fg anchors是否大范围超过边界,剔除严重超出边界fg anchors。
  4. 进行nms(nonmaximum suppression,非极大值抑制)
  5. 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal输出。

补充:

1.权值共享:

权值共享就是同一个Feature Map中神经元权值共享,该Feature Map中的所有神经元使用同一组权值

参考:https://blog.csdn.net/denghecsdn/article/details/77848246

2.pooling层作用

对输入的特征图进行压缩。

  • 使特征图变小,简化网络计算复杂度
  • 进行特征压缩,提取主要特征

pooling操作使特征图变小,可能影响网络准确度,因此可以通过增加特征图的深度来弥补

3.卷积层作用

用来提取特征。使用多层次的卷积可以得到更深层次的特征。在CNN中比较重要的是权值共享,每个filter上的每个channel是共享的

4.LRN层作用

局部响应归一化层。一般是在激活后进行的一种操作。

LRN仿造生物学上活跃的神经元对相邻神经元的抑制现象(侧抑制)

好处有以下两点:

  • 归一化有助于快速收敛
  • 对局部神经元的活动创建竞争机制,是的其中响应比较大的值变得更大,并抑制相对响应较小的神经元,增强了模型泛化能力

5.filter

是感受野

6.feature map计算方法:

在CNN网络中roi从原图映射到feature map中的计算方法:

INPUT为32*32,filter的大小即kernel size为5*5,stride = 1,pading=0,卷积后得到的feature maps边长的计算公式是: 
output_h =(originalSize_h+padding*2-kernelSize_h)/stride +1 
所以,卷积层的feature map的变长为:conv1_h=(32-5)/1 + 1 = 28 
卷积层的feature maps尺寸为28*28. 
由于同一feature map共享权值,所以总共有6*(5*5+1)=156个参数。 
卷积层之后是pooling层,也叫下采样层或子采样层(subsampling)。它是利用图像局部相关性的原理,对图像进行子抽样,这样在保留有用信息的同时可以减少数据处理量。pooling层不会减少feature maps的数量,只会缩减其尺寸。常用的pooling方法有两种,一种是取最大值,一种是取平均值。 
pooling过程是非重叠的,S2中的每个点对应C1中2*2的区域(也叫感受野),也就是说kernelSize=2,stride=2,所以pool1_h = (onv1_h - kernelSize_h)/stride +1 = (28-2)/2+1=14。pooling后的feature map尺寸为14*14.

 fast rcnn以及faster rcnn做检测任务的时候,涉及到从图像的roi区域到feature map中roi的映射,然后再进行roi_pooling之类的操作。  
       比如图像的大小是(600,800),在经过一系列的卷积以及pooling操作之后在某一个层中得到的feature map大小是(38,50),那么在原图中roi是(30,40,200,400),
在feature map中对应的roi区域应该是
roi_start_w = round(30 * spatial_scale);
roi_start_h = round(40 * spatial_scale);
roi_end_w = round(200 * spatial_scale);
roi_end_h = round(400 * spatial_scale);
其中spatial_scale的计算方式是spatial_scale=round(38/600)=round(50/800)=0.0625,所以在feature map中的roi区域[roi_start_w,roi_start_h,roi_end_w,roi_end_h]=[2,3,13,25];
具体的代码可以参见caffe中roi_pooling_layer.cpp

6.ROI Pooling 和 ROI Align

参考:链接

猜你喜欢

转载自blog.csdn.net/weixin_38440272/article/details/82658774