caffe-fasterrcnn程序理解 faster-rcnn 结构杂谈 rcnn fast-rcnn faster-rcnn资料

faster-rcnn 结构杂谈

 参考博客:::https://www.cnblogs.com/longriyao/p/5832274.html
http://www.cnblogs.com/chaofn/p/9310912.html

rcnn fast-rcnn faster-rcnn资料

 

---恢复内容开始---

框架:https://github.com/rbgirshick

论文:链接: https://pan.baidu.com/s/1jIoChxG 密码: ubgm

faster rcnn:

    C++ 实现:      

      https://github.com/YihangLou/FasterRCNN-Encapsulation-Cplusplus
      http://www.cnblogs.com/louyihang-loves-baiyan/p/5493344.html
      http://blog.csdn.net/xyy19920105/article/details/50440957
      http://www.cnblogs.com/louyihang-loves-baiyan/p/5485955.html

    使用讲解

      http://www.cnblogs.com/CarryPotMan/p/5390336.html

    画图:

      http://ethereon.github.io/netscope/#/editor

    工具:

      https://github.com/tzutalin/labelImg

      http://nbviewer.jupyter.org/github/ouxinyu/ouxinyu.github.io/blob/master/MyCodes/Default.ipynb

faster-rcnn结构图: (只截取了最难理解的部分)

这个网络看似很复杂,但是理解了其中关键的层,就基本可以掌握这个结构了。要看源码!!要看源码!!要看源码 !!重要的事情说三遍。

关键的层:

 数据输入层:#表示模块存放的路径 faster-rcnn/lib/roi_data_layer/layer.py

layer {
name: 'input-data'
type: 'Python'
top: 'data'
top: 'im_info'
top: 'gt_boxes'
python_param {
module: 'roi_data_layer.layer' #表示模块存放的路径 faster-rcnn/lib/roi_data_layer/layer.py
layer: 'RoIDataLayer'
param_str: "'num_classes': 81"
}
}
这层好像什么都做,将数据直接复制到下一层  

rpn-data层:文件存放位置 faster-rcnn/lib/rpn/anchor_target_layer.py
layer {
name: 'rpn-data'
type: 'Python'
bottom: 'rpn_cls_score'
bottom: 'gt_boxes'
bottom: 'im_info'
bottom: 'data'
top: 'rpn_labels'
top: 'rpn_bbox_targets'
top: 'rpn_bbox_inside_weights'
top: 'rpn_bbox_outside_weights'
python_param {
module: 'rpn.anchor_target_layer' #文件存放位置 faster-rcnn/lib/rpn/anchor_target_layer.py
layer: 'AnchorTargetLayer'
param_str: "'feat_stride': 16 \n'scales': !!python/tuple [4, 8, 16, 32]"
}
}
这一层很重要:  
  生成 anchor
  处理 gt_boxes等其他工作 具体没仔细看
proposal层:#文件存放路径 faster-rcnn/rpn/proposal_layer.py
layer {
name: 'proposal'
type: 'Python'
bottom: 'rpn_cls_prob_reshape'
bottom: 'rpn_bbox_pred'
bottom: 'im_info'
top: 'rpn_rois'
python_param {
module: 'rpn.proposal_layer'
layer: 'ProposalLayer'
param_str: "'feat_stride': 16 \n'scales': !!python/tuple [4, 8, 16, 32]"
}
}
这层应该就是生成proposal了

rpn_loss_bbox层:文件存放位置比较特殊:
  这个是使用c++代码实现的
    头文件:/faster-rcnn/caffe-faster-rcnn/include/caffe/fast_rcnn_layers.hpp
    实现: faster-rcnn/caffe-faster-rcnn/src/caffe/smooth_L1_loss_layer.cpp smooth_L1_loss_layer.cu
layer {
name: "rpn_loss_bbox"
type: "SmoothL1Loss"
bottom: "rpn_bbox_pred"
bottom: "rpn_bbox_targets"
bottom: 'rpn_bbox_inside_weights'
bottom: 'rpn_bbox_outside_weights'
top: "rpn_loss_bbox"
loss_weight: 1
smooth_l1_loss_param { sigma: 3.0 }
}


如上图所示,(im_info = [M , N , scale_factor]),说一下它的前向传播流程:

(1)一般对于输入的图像,P*Q的原图先统一缩放为M*N,并且在前面的特征提取层(也可称“共享卷积层”)中,由于stride = 1 , pad = 1 , kernel size = 3 * 3,所以卷积前后图像大小不变,只有四个Pool层起到了作用,因此原始图像经过提取层后的feature map大小为(M / 16)* (N /16),这样做也是为了使原始图像到feature map的缩放系数为整数从而使得feature map上的每个特征点和M*N的原始图像的区域坐标更方便地实现一一映射关系,这对后面生成proposal会有帮助;

(2)RPN结构中第一个层是一个3*3的卷积层,它作用在经过特征提取层后的feature map上,我觉得这个3*3的卷积作用是为了增加目标附近区域的语义理解;然后再经过两条支路,每条都首先经过一个1*1的卷积。先看上面一条,这条的作用是对“foreground”和"background"进行二分类,所以经过1*1之后的深度为18(9*2,对应每个点生成9个anchors和每个anchor两个类别),再看下面一条,也是经过一个1*1的卷积,深度为36(9*4)进行矩形框回归,然后这两条支路汇合,首先去除掉background类别,然后对于剩下的forground类别,利用im_info先将anchors放大到M*N的原始图像上,这些放大后在原始图像上的区域就是一开始的proposals,数量很多所以我们还要进行两次筛选:第一次,判断这些proposals是否大范围超出图像边界,剔除严重超出边界的;第二次,对剩下的proposals进行nms,然后对nms后的proposals根据cls scores进行排序,选取top-N个作为最终的proposals(一般在600个左右),其实到这里检测任务差不多就完成了,但作者后面还加另一步,相当于一个refine;

(3)之后就涉及到ROI Pooling层了,由于RPN输出的proposals对应的M*N的输入图像,所以我们先通过im_info中的scale_factor将其映射到特征提取层的feature map上,但由于后面需要经过全连接层,而这里每个proposals映射到feature map上的大小均不同,所以我们使用了ROI Pooling层将这些proposals映射后的大小固定(7*7或者6*6,好像论文和实现里稍微有点不同,看代码就知道了),然后这块固定的区域再经过全连接层进行分类和坐标框回归;

 关于如何训练,参考这个:https://www.cnblogs.com/zf-blog/p/7142463.html

补充:

(1)bounding box regression:

---恢复内容开始---

框架:https://github.com/rbgirshick

论文:链接: https://pan.baidu.com/s/1jIoChxG 密码: ubgm

faster rcnn:

    C++ 实现:      

      https://github.com/YihangLou/FasterRCNN-Encapsulation-Cplusplus
      http://www.cnblogs.com/louyihang-loves-baiyan/p/5493344.html
      http://blog.csdn.net/xyy19920105/article/details/50440957
      http://www.cnblogs.com/louyihang-loves-baiyan/p/5485955.html

    使用讲解

      http://www.cnblogs.com/CarryPotMan/p/5390336.html

    画图:

      http://ethereon.github.io/netscope/#/editor

    工具:

      https://github.com/tzutalin/labelImg

      http://nbviewer.jupyter.org/github/ouxinyu/ouxinyu.github.io/blob/master/MyCodes/Default.ipynb

faster-rcnn结构图: (只截取了最难理解的部分)

这个网络看似很复杂,但是理解了其中关键的层,就基本可以掌握这个结构了。要看源码!!要看源码!!要看源码 !!重要的事情说三遍。

关键的层:

 数据输入层:#表示模块存放的路径 faster-rcnn/lib/roi_data_layer/layer.py

layer {
name: 'input-data'
type: 'Python'
top: 'data'
top: 'im_info'
top: 'gt_boxes'
python_param {
module: 'roi_data_layer.layer' #表示模块存放的路径 faster-rcnn/lib/roi_data_layer/layer.py
layer: 'RoIDataLayer'
param_str: "'num_classes': 81"
}
}
这层好像什么都做,将数据直接复制到下一层  

rpn-data层:文件存放位置 faster-rcnn/lib/rpn/anchor_target_layer.py
layer {
name: 'rpn-data'
type: 'Python'
bottom: 'rpn_cls_score'
bottom: 'gt_boxes'
bottom: 'im_info'
bottom: 'data'
top: 'rpn_labels'
top: 'rpn_bbox_targets'
top: 'rpn_bbox_inside_weights'
top: 'rpn_bbox_outside_weights'
python_param {
module: 'rpn.anchor_target_layer' #文件存放位置 faster-rcnn/lib/rpn/anchor_target_layer.py
layer: 'AnchorTargetLayer'
param_str: "'feat_stride': 16 \n'scales': !!python/tuple [4, 8, 16, 32]"
}
}
这一层很重要:  
  生成 anchor
  处理 gt_boxes等其他工作 具体没仔细看
proposal层:#文件存放路径 faster-rcnn/rpn/proposal_layer.py
layer {
name: 'proposal'
type: 'Python'
bottom: 'rpn_cls_prob_reshape'
bottom: 'rpn_bbox_pred'
bottom: 'im_info'
top: 'rpn_rois'
python_param {
module: 'rpn.proposal_layer'
layer: 'ProposalLayer'
param_str: "'feat_stride': 16 \n'scales': !!python/tuple [4, 8, 16, 32]"
}
}
这层应该就是生成proposal了

rpn_loss_bbox层:文件存放位置比较特殊:
  这个是使用c++代码实现的
    头文件:/faster-rcnn/caffe-faster-rcnn/include/caffe/fast_rcnn_layers.hpp
    实现: faster-rcnn/caffe-faster-rcnn/src/caffe/smooth_L1_loss_layer.cpp smooth_L1_loss_layer.cu
layer {
name: "rpn_loss_bbox"
type: "SmoothL1Loss"
bottom: "rpn_bbox_pred"
bottom: "rpn_bbox_targets"
bottom: 'rpn_bbox_inside_weights'
bottom: 'rpn_bbox_outside_weights'
top: "rpn_loss_bbox"
loss_weight: 1
smooth_l1_loss_param { sigma: 3.0 }
}


如上图所示,(im_info = [M , N , scale_factor]),说一下它的前向传播流程:

(1)一般对于输入的图像,P*Q的原图先统一缩放为M*N,并且在前面的特征提取层(也可称“共享卷积层”)中,由于stride = 1 , pad = 1 , kernel size = 3 * 3,所以卷积前后图像大小不变,只有四个Pool层起到了作用,因此原始图像经过提取层后的feature map大小为(M / 16)* (N /16),这样做也是为了使原始图像到feature map的缩放系数为整数从而使得feature map上的每个特征点和M*N的原始图像的区域坐标更方便地实现一一映射关系,这对后面生成proposal会有帮助;

(2)RPN结构中第一个层是一个3*3的卷积层,它作用在经过特征提取层后的feature map上,我觉得这个3*3的卷积作用是为了增加目标附近区域的语义理解;然后再经过两条支路,每条都首先经过一个1*1的卷积。先看上面一条,这条的作用是对“foreground”和"background"进行二分类,所以经过1*1之后的深度为18(9*2,对应每个点生成9个anchors和每个anchor两个类别),再看下面一条,也是经过一个1*1的卷积,深度为36(9*4)进行矩形框回归,然后这两条支路汇合,首先去除掉background类别,然后对于剩下的forground类别,利用im_info先将anchors放大到M*N的原始图像上,这些放大后在原始图像上的区域就是一开始的proposals,数量很多所以我们还要进行两次筛选:第一次,判断这些proposals是否大范围超出图像边界,剔除严重超出边界的;第二次,对剩下的proposals进行nms,然后对nms后的proposals根据cls scores进行排序,选取top-N个作为最终的proposals(一般在600个左右),其实到这里检测任务差不多就完成了,但作者后面还加另一步,相当于一个refine;

(3)之后就涉及到ROI Pooling层了,由于RPN输出的proposals对应的M*N的输入图像,所以我们先通过im_info中的scale_factor将其映射到特征提取层的feature map上,但由于后面需要经过全连接层,而这里每个proposals映射到feature map上的大小均不同,所以我们使用了ROI Pooling层将这些proposals映射后的大小固定(7*7或者6*6,好像论文和实现里稍微有点不同,看代码就知道了),然后这块固定的区域再经过全连接层进行分类和坐标框回归;

 关于如何训练,参考这个:https://www.cnblogs.com/zf-blog/p/7142463.html

补充:

(1)bounding box regression:

猜你喜欢

转载自www.cnblogs.com/shuimuqingyang/p/10156684.html
今日推荐