【目标检测】Faster RCNN详解(二)

Faster RCNN github : https://github.com/rbgirshick/py-faster-rcnn

Faster RCNN paper : https://arxiv.org/abs/1506.01497

深度学习中的卷积操作:https://www.cnblogs.com/Yu-FeiFei/p/6800519.html

同时结合参考一下文章,理解faster-rcnn:

几个关于faster的介绍都看一下(有空重新整理):https://www.cnblogs.com/king-lps/category/1208643.html

从编程实现角度学习Faster R-CNN(附极简实现):https://zhuanlan.zhihu.com/p/32404424

从结构、原理到实现,Faster R-CNN全解析(原创):https://zhuanlan.zhihu.com/p/32702387

RPN网络3x3卷积作用:http://caffecn.cn/?/question/449

令人“细思极恐”的Faster-R-CNN : https://mp.weixin.qq.com/s/yMg_WNMQwpjcJgZYwvzXjA

 

多通道图像卷积基础知识介绍

缩进在介绍RPN前,还要多解释几句基础知识,已经懂的看官老爷跳过就好。

  1. 对于单通道图像+单卷积核做卷积,第一章中的图3已经展示了;
  2. 对于多通道图像+多卷积核做卷积,计算方式如下:

图5 多通道+多卷积核做卷积示意图(摘自Theano教程)

缩进如图5,输入图像layer m-1有4个通道,同时有2个卷积核w1和w2。对于卷积核w1,先在输入图像4个通道分别作卷积,再将4个通道结果加起来得到w1的卷积输出;卷积核w2类似。所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!

缩进对多通道图像做1x1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。

 正文开始:

缩进经过RCNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。

图1 Faster CNN基本结构(来自原论文)

缩进依作者看来,如图1,Faster RCNN其实可以分为4个主要内容:

  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(Region of interest)。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

所以本文以上述4个内容作为切入点介绍Faster RCNN网络。

缩进图2展示了python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构,可以清晰的看到该网络对于一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;而Conv layers中包含了13个conv层+13个relu层+4个pooling层,可以看出VGG16中用于特征提取的部分是13个卷积层(conv1_1---->conv5.3),不包括pool5及pool5后的网络层次结构;RPN网络首先经过3x3卷积,再分别生成foreground anchors与bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。

path:${py-faster-rcnn-root}/models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt

图2 faster_rcnn_test.pt网络结构

1、Conv layers

缩进Conv layers包含了conv,pooling,relu三种层。以python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构为例,如图2,Conv layers部分共有13个conv层,13个relu层,4个pooling层。这里有一个非常容易被忽略但是又无比重要的信息,在Conv layers中:

  1. 所有的conv层都是:kernel_size=3,pad=1
  2. 所有的pooling层都是:kernel_size=2,stride=2

为何重要?在Faster RCNN Conv layers中对所有的卷积都做了扩边处理(pad=1,即填充一圈0),导致原图变为(M+2)x(N+2)大小,再做3x3卷积后输出MxN---{ 输出图片大小计算:[(M+2) - 3 +1]x[(N+2)  - 3 +1] }。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小。如图3:

     说明: 卷积核mxm,输入图片WxH(扩边之后的尺寸),则输出图片的尺寸是 (W-m+1)x(H-m+1)

    

图3

类似的是,Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)*(N/2)大小。综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。

缩进那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!这样Conv layers生成的featuure map中都可以和原图对应起来。

2、Region Proposal Networks (RPN)

 2.1 anchors 的概念

[[ -84.  -40.   99.   55.]  
 [-176.  -88.  191.  103.]  
 [-360. -184.  375.  199.]  
 [ -56.  -56.   71.   71.]  
 [-120. -120.  135.  135.]  
 [-248. -248.  263.  263.]  
 [ -36.  -80.   51.   95.]  
 [ -80. -168.   95.  183.]  
 [-168. -344.  183.  359.]]  

提到RPN网络,就不能不说anchors。如上其中每行的4个值[x1,y1,x2,y2]代表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为:width:height = [1:1, 1:2, 2:1]三种,如图6。实际上通过anchors就引入了检测中常用到的多尺度方法。

图6 anchors示意图

注:关于上面的anchors size,其实是根据检测图像设置的。在python demo中,会把任意大小的输入图像reshape成800x600(即图2中的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。

那么这9个anchors是做什么的呢?借用Faster RCNN论文中的原图,如图7,遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。

名词解释:

box-regression layer (reg

box-classification layer (cls) 

上图解释

        在每一个滑动窗口的位置,reg layer 中 我们同时预测k个区域建议,所以reg层有4k个输出,即k个box的坐标编码,即[x, y, w, h]对应4个偏移量。cls层输出2k个得分,即对每个建议框是目标/非目标的估计概率(为简单起见,是用二类的softmax层实现的cls层,还可以用logistic回归来生成k个得分)。k个建议框被相应的k个称为anchor的box参数化。每个anchor以当前滑动窗口中心为中心,并对应一种尺度和长宽比,我们使用3种尺度和3种长宽比,这样在每一个滑动位置就有k=9个anchor。对于大小为WxH(典型值约2,400)的卷积特征映射,总共有WxHxk个anchor。我们的方法有一个重要特性,就是平移不变性,对anchor和对计算anchor相应的建议框的函数而言都是这样。

解释一下上面这张图的数字。

  1. 在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions
  2. 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,RPN网络中3x3的卷积作用:相当于每个点又融合了周围3x3的空间信息(猜测这样做也许更鲁棒?反正我没测试),同时256-d不变(如图4和图7中的红框)
  3. 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分foreground和background,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有[x, y, w, h]对应4个偏移量,所以reg=4k coordinates
  4. 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(什么是合适的anchors下文5.1有解释)

注意,在本文讲解中使用的VGG conv5 num_output=512,所以是512d,其他类似.....

其实RPN最终就是在原图尺度上生成anchor,在featuremap 上3*3卷积核的中心点对应原图(re-scale,源代码设置re-scale为600*1000)上的位置(点),将该点作为anchor的中心点,设置了多尺度候选anchor。然后再去分类和回归

那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:

其中ceil()表示向上取整,是因为VGG输出的feature map size= 50*38。

2.2、RPN网络

缩进经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如RCNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster RCNN的巨大优势,能极大提升检测框的生成速度。

RPN网络

可以看到RPN网络实际分为2条线,上面一条经过18个1*1卷积,通过softmax分类anchors获得foreground和background(检测目标是foreground),下面一条经过36个1*1卷积,用于计算对于anchors的bounding box regression(边框回归)偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

2.3、分类分支:softmax判定foreground与background

缩进一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,如图8:

图8 RPN中判定fg/bg网络结构

该1x1卷积的caffe prototxt定义如下:

layer {  
  name: "rpn_cls_score"  
  type: "Convolution"  
  bottom: "rpn/output"  
  top: "rpn_cls_score"  
  convolution_param {  
    num_output: 18   # 2(bg/fg) * 9(anchors)  
    kernel_size: 1 pad: 0 stride: 1  
  }  
}  

可以看到其num_output=18,也就是经过该卷积的输出图像为WxHx18大小(注意第二章开头提到的卷积计算方式)。这也就刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是foreground和background,所有这些信息都保存WxHx(9x2)大小的矩阵。为何这样做?后面接softmax分类获得foreground anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)。

缩进那么为何要在softmax前后都接一个reshape layer?其实只是为了便于softmax分类,至于具体原因这就要从caffe的实现形式说起了。在caffe基本数据结构blob中以如下形式保存数据:

blob=[batch_size, channel,height,width]

对应至上面的保存bg/fg anchors的矩阵,其在caffe blob中的存储形式为[1, 2*9, H, W]。而在softmax分类时需要进行fg/bg二分类,所以reshape layer会将其变为[1, 2, 9*H, W]大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。贴一段caffe softmax_loss_layer.cpp的reshape函数的解释,非常精辟:

"Number of labels must match number of predictions; "  
"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "  
"label count (number of labels) must be N*H*W, "  
"with integer values in {0, 1, ..., C-1}.";  

综上所述,RPN网络中利用anchors和softmax初步提取出foreground anchors作为候选区域。

2.4、回归分支:对proposals进行bounding box regression

bounding box regression原理参考:

详细请参考: https://blog.csdn.net/zijin0802034/article/details/77685438/

    我自己整理的文章:https://blog.csdn.net/ytusdc/article/details/78604827

   Bound Box Regression详解 : http://caffecn.cn/?/question/160

在了解bounding box regression后,再回头来看RPN网络第二条线路,如图11。

图11 RPN中的bbox reg

先来看一看上图11中1x1卷积的caffe prototxt定义:

layer {  
  name: "rpn_bbox_pred"  
  type: "Convolution"  
  bottom: "rpn/output"  
  top: "rpn_bbox_pred"  
  convolution_param {  
    num_output: 36   # 4 * 9(anchors)  
    kernel_size: 1 pad: 0 stride: 1  
  }  
}  

可以看到其num_output=36,即经过该卷积输出图像为WxHx36,在caffe blob存储为[1, 36, H, W],这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的[dx(A),dy(A),dw(A),dh(A)]变换量。

2.5、Proposal Layer

缩进Proposal Layer负责综合所有[dx(A),dy(A),dw(A),dh(A)]变换量和foreground anchors,微调proposal,送入后续RoI Pooling Layer。还是先来看看Proposal Layer的caffe prototxt定义:

layer {  
  name: 'proposal'  
  type: 'Python'  
  bottom: 'rpn_cls_prob_reshape'  
  bottom: 'rpn_bbox_pred'  
  bottom: 'im_info'  
  top: 'rois'  
  python_param {  
    module: 'rpn.proposal_layer'  
    layer: 'ProposalLayer'  
    param_str: "'feat_stride': 16"  
  }  
}  

Proposal Layer有3个输入:fg/bg anchors分类器结果rpn_cls_prob_reshape,对应的bbox reg的[dx(A),dy(A),dw(A),dh(A)]变换量rpn_bbox_pred,以及im_info;另外还有参数feat_stride=16,这和图4是对应的。

缩进首先解释im_info。对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为WxH=(M/16)x(N/16)大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。

图12

缩进Proposal Layer forward(caffe layer的前传函数)按照以下顺序依次处理:

  1. 生成anchors,利用[dx(A),dy(A),dw(A),dh(A)]对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)
  2. 按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors。
  3. 限定超出图像边界的foreground anchors为图像边界(防止后续roi pooling时proposal超出图像边界)
  4. 剔除非常小(width<threshold or height<threshold)的foreground anchors
  5. 进行nonmaximum suppression
  6. 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal输出。

之后输出proposal=[x1, y1, x2, y2],注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应原始输入图像尺度的,这点在后续网络中有用。另外我认为,严格意义上的检测应该到此就结束了,后续部分应该属于识别了~

RPN网络结构就介绍到这里,总结起来就是:

生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposal

3、 三个creator

RPN网络

 

整体结构

 

RPN还没讲完,上图展示了RPN网络的具体结构。RPN网络是全卷积网络,这样对输入图片的尺寸就没有要求了。RPN网络要完成的任务是训练自己提供rois

训练自己:二分类bounding box 回归(由AnchorTargetCreator实现

提供rois:为Fast-RCNN提供训练需要的rois(由ProposalCreator实现

1、RPN网络中AnchorTargetCreator分析:

AnchorTargetCreator : 负责在训练RPN的时候,从20000个anchor中选择一些(比如256)进行训练,以使得正负样本比例大概是1:1。同时给出训练的位置参数真实值。 即返回gt_rpn_locgt_rpn_label

       1、对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本。
       2、对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过0.7的anchor,作为正样本,正样本的数目不超过128个。
       3、随机选择和gt_bbox重叠度小于0.3的anchor作为负样本。负样本和正样本的总数为256。

对于每个anchor, gt_label 要么为1(前景),要么为0(背景),所以这样实现二分类。在计算回归损失的时候,只计算正样本(前景)的位置回归损失,不计算负样本的位置回归损失。

2、RPN网络中ProposalCreator分析

提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本:从上万个anchor中,选择一定数目(2000),微调大小和位置后,生成RoIs,用以Fast R-CNN训练。RPN生成RoIs的过程(ProposalCreator)如下:

      1、对于每张图片,利用它的feature map, 计算 (H/16)× (W/16)×9(大概20000)个anchor属于前景的概率,以及对应的位置参数。
      2、选取概率较大的12000个anchor。(先筛选出界的,然后score排序)
      3、利用回归的位置参数,修正这12000个anchor的位置,得到RoIs
      4、利用非极大值((Non-maximum suppression, NMS)抑制,选出概率最大的2000个RoIs

注意:在inference的时候,为了提高处理速度,12000和2000分别变为6000和300.

注意:这部分的操作不需要进行反向传播,因此可以利用numpy/tensor实现。

RPN网络 至 RoIHead网络

3、ProposalTargetCreator分析:

ProposalTargetCreator是RPN网络与ROIHead网络的过渡操作,前面讲过,RPN会产生大约2000个RoIs,这2000个RoIs不是都拿去训练,而是利用ProposalTargetCreator 从RoIs中选择128个RoIs用以训练,继续进行分类和位置参数的回归。选择的规则如下:

  • RoIs和gt_bboxes 的IoU大于0.5的,选择一些(比如32个)
  • 选择 RoIs和gt_bboxes的IoU小于等于0(或者0.1)的选择一些(比如 128-32=96个)作为负样本

为了便于训练,对选择出的128个RoIs,还对他们的gt_roi_loc 进行标准化处理(减去均值除以标准差),正负样本比例1:3

总结:

AnchorTargetCreatorProposalTargetCreator是为了生成训练的目标,只在训练阶段用到,ProposalCreator是RPN为Fast R-CNN生成RoIs,在训练和测试阶段都会用到。三个共同点在于他们都不需要考虑反向传播(因此不同框架间可以共享numpy实现)

所以测试阶段ProposalCreator为Fast R-CNN生成了300个RoIs,不经ProposalTargetCreator 直接送给RoIHead网络。而训练阶段ProposalCreator产生的2000个RoI再经ProposalTargetCreator得到128个RoI。(别忘了ProposalCreator的用途是为训练RoIHead网络分配ground truth的,测试阶段当然不需要了)

生成预测结果

测试的时候对所有的RoIs(大概300个左右) 计算概率,并利用位置参数调整预测候选框的位置。然后再用一遍极大值抑制(之前在RPN的ProposalCreator用过)。

注意:

  • 在RPN的时候,已经对anchor做了一遍NMS,在RCNN测试的时候,还要再做一遍
  • 在RPN的时候,已经对anchor的位置做了回归调整,在RCNN阶段还要对RoI再做一遍
  • 在RPN阶段分类是二分类,而Fast RCNN阶段是21分类

4、RoI pooling

      训练阶段ProposalTargetCreator选择出128个anchor之后,然后使用了RoIPooling 将这些不同尺寸的区域全部pooling到同一个尺度(7×7)上。之后接全连接进行进一步分类和回归

4.1 为何需要RoI Pooling

Rol pooling层有2个输入:

  1. 原始的feature maps
  2. RPN输出的proposal boxes(大小各不相同)

缩进先来看一个问题:对于传统的CNN(如AlexNet,VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。有2种解决办法:

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

图13 crop与warp破坏图像原有结构信息

两种办法的示意图如图13,可以看到无论采取那种办法都不好,要么crop后破坏了图像的完整结构,要么warp破坏了图像原始形状信息。回忆RPN网络生成的proposals的方法:对foreground anchors进行bound box regression,那么这样获得的proposals也是大小形状各不相同,即也存在上述问题。所以Faster RCNN中提出了RoI Pooling解决这个问题(需要说明,RoI Pooling确实是从SPP发展而来,但是限于篇幅这里略去不讲,有兴趣的读者可以自行查阅相关论文)。

RoIPooling 和 RoIAlign:https://blog.csdn.net/ytusdc/article/details/86692558

当所有的RoIs都被pooling成(512×7×7)的feature map后,将它reshape 成一个一维的向量,然后连接两层全连接层。最后再接两个全连接层,分别是:

  • FC 21 用来分类,预测RoIs属于哪个类别(20个类+背景)
  • FC 84 用来回归位置(21个类,每个类都有4个位置参数)

对于分类问题,直接利用交叉熵损失. 而对于位置的回归损失,一样采用Smooth_L1 Loss, 只不过只对正样本计算损失。而且是只对正样本中的这个类别4个参数计算损失。举例来说:

  • 一个RoI在经过FC 84后会输出一个84维的loc 向量. 如果这个RoI是负样本,则这84维向量不参与计算 L1_Loss
  • 如果这个RoI是正样本,属于label K,那么它的第 K×4, K×4+1 ,K×4+2, K×4+3 这4个数参与计算损失,其余的不参与计算损失。

5、损失函数

5.1 四类损失

虽然原始论文中用的4-Step Alternating Training 即四步交替迭代训练。然而现在github上开源的实现大多是采用近似联合训练(Approximate joint training),端到端,一步到位,速度更快。

在训练Faster RCNN的时候有四个损失:

  • RPN 分类损失:anchor是否为前景(二分类)
  • RPN位置回归损失:anchor位置微调
  • RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)
  • RoI位置回归损失:继续对RoI位置微调

四个损失相加作为最后的损失,反向传播,更新参数。

5.2、rpn_loss与roi_loss的异同

都是分类与回归的多目标损失。所以Faster-RCNN共有4个子损失函数。

对于 rpn_loss中的分类是2分类,是256个样本参与,正负样本各一半,分类预测值是rpn网络的1*1卷积输出,分类真实标签AnchorTargetCreator生成的ground truth。 rpn_loss中的回归样本数是所有20000个(严格讲是20000个bbox中所有完整出现在原图中的bbox)bbox来参与,回归预测值是rpn网络的另一个1*1卷积输出,回归目标AnchorTargetCreator生成的ground truth

对于roi_loss中的分类是21分类,是128个样本参与,正负样本1:3。分类预测值是Roi_head网络的FC21输出,分类真实标签ProposalTargetCreator生成的ground truthroi_loss中的回归样本数是128个,回归预测值是Roi_head网络的FC84输出,回归目标ProposalTargetCreator生成的ground truth

5.3、损失函数

与检测网络类似的是,依然使用Conv Layers提取feature maps。整个网络使用的RPN Loss如下:

 上述公式中,i表示anchors index,pi表示foreground softmax predict probability 概率,pi*代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是foreground,pi*=1;反之IoU<0.3时,认为是该anchor是background,pi*=0;至于那些0.3<IoU<0.7的anchor则不参与训练);t 代表predict bounding box,t*代表对应foreground anchor对应的GT box。可以看到,整个Loss分为2部分:

  1. cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为forground与background的网络训练
  2. reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。注意在该loss中乘了pi*,相当于只关心foreground anchors的回归(其实在回归中也完全没必要去关心background)。

缩进由于在实际过程中,Ncls和Nreg差距过大,用参数 λ 平衡二者,使总的网络Loss计算过程中能够均匀考虑2种Loss。这里比较重要是Lreg使用的soomth L1 loss,计算公式如下:

缩进了解数学原理后,反过来看图17:

  1. 在RPN训练阶段,rpn-data(python AnchorTargetLayer)层会按照和test阶段Proposal层完全一样的方式生成Anchors用于训练
  2. 对于rpn_loss_cls,输入的rpn_cls_scors_reshape和rpn_labels分别对应p与p*,Ncls参数隐含在p与p*的caffe blob的大小中
  3. 对于rpn_loss_bbox,输入的rpn_bbox_pred和rpn_bbox_targets分别对应 t 于 t*,rpn_bbox_inside_weigths对应p*,rpn_bbox_outside_weights对应 λ,Nreg同样隐含在caffe blob大小中

同样 ROI 阶段的分类和回归损失:

对数损失中计算的是一个one-hot 向量

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值