pytorch faster rcnn复现系列(一) RPN层输入输出维度理解

目录

1.  1*1 FC层

2.  anchor_target_layer_>rpn_data                              ​

     3. 二分类 softmaxloss

     4. 回归损失 rpn_loss_bbox

5. softmax 二分类分类概率

6. prosal_layer_>rpn_rois 2000个rpn_rois

7. proposal_target_layer_>roi_data 128个rois


 

想要复现faster rcnn,理解rpn是必备的,而明白其输入输出又是复现的第一步。

以FCN中rpn的caffe模型来讲解rpn的过程。

首先是数据读入操作,假设输出的data是1*3*600*1000,im_info是1*3[h w  imscale],gt_boxes是1*5[ymin xmin ymax xmax,class],后面的所有维度都是以这个假设为前提。

这里写图片描述

faster rcnn中 softmax,softmax loss和cross entropy的讲解

总体理解:

1.  1*1 FC层

 1个共享卷积层之后,紧跟着RPN结构。最开始是一个512*3*3的conv+relu。

下面紧跟着一个18*1*1,一个36*1*1的全连接功能的层。

2.  anchor_target_layer_>rpn_data

 先说cls这边。rpn_data层(anchor_target_layer类型的层),输入 ,输出分别为以下

  bottom: 'rpn_cls_score'#[1,2*k,H,W] 类似与fc层的输出
  bottom: 'gt_boxes'
  bottom: 'im_info'#原图c h w,因为坐标回归的是原图坐标的xy偏移,需要用hw 过滤不在图片内部的
  bottom: 'data'
  K表示9个anchor,3*3,HW表示的是rpn第一层卷积的特征图的宽高。
  top: 'rpn_labels' # [1,1,k*H,W] 生成rpn的标签,前景为1,背景为0,然后给softmaxLoss层,
  top: 'rpn_bbox_targets'#[1,4*K,H,W] smooth_l1_loss输入
  top: 'rpn_bbox_inside_weights'#[1,4*K,H,W]smooth_l1_loss输入
  top: 'rpn_bbox_outside_weights'#[1,4*K,H,W] smooth_l1_loss输入

   将 20000 多个候选的 anchor 选出 256 个 anchor 进行分类和回归位置。选择过程如下:

  • 对于每一个 ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个 anchor 作为正样本

  • 对于剩下的 anchor,从中选择和任意一个gt_bbox重叠度超过 0.7 的 anchor,作为正样本,正样本的数目不超过 128 个

  • 机选择和gt_bbox重叠度小于 0.3 的 anchor 作为负样本。负样本和正样本的总数为 256。例如:正样本100负样本156

对于每个 anchor, gt_label 要么为 1(前景),要么为 0(背景),而 gt_loc 则是由 4 个位置参数 (tx,ty,tw,th) 组成,这样比直接回归座标更好。

                                     

3. 二分类 softmaxloss

求二分类的loss的时候,softmaxloss,输入是rpn_lables【自己生成的rpn标签】+rpn_cls_scole【预测的】_>reshape【二分类,每一个特征图上的点都是一个二分类,reshape的作用是将格式转换成和rpn_lables的一样】

4. 回归损失 rpn_loss_bbox

输入rpn_data 生成的rpn的bbox相关信息,与fc层rpn_bbox_pred【预测的】一起作为输入,进行损失计算。

两个输入的维度都是[1,4*k,H,W],不需要reshape操作。

5. softmax 二分类分类概率

输入[1,2,k*H,W]:rpn_cls_scole【预测的】_>rpn_cls_prob_reshape后的结果

输出[1,2,k*H,W]:得到所有anchor的二分类的概率。

6. prosal_layer_>2000个rpn_rois

首先需要softmax的结果,进行reshape[1,2,k*H,W]_>[1,2*k,H,W],这样与其他的输入是类似的。

输出:  rpn_rois [1,5]

  bottom: 'rpn_cls_prob_reshape'#[1,18,H,W]每个框经过softmax对应的概率
  bottom: 'rpn_bbox_pred'#[1,36,H,W]预测的框运算loss,反向传播,越来越准
  bottom: 'im_info'
  top: 'rpn_rois' #[1,5]
  • 对于每张图片,利用它的 feature map, 计算 (H/16)× (W/16)×9(大概 20000)个 anchor 属于前景的概率,以及对应的位置参数【softmax二分类概率】

  • rpn_cls_prob_reshape始终连存储的是每个anchor 的偏移。

  • 选取概率较大的 12000 个 anchor

  • 利用回归的位置参数修正这 12000 个 anchor 的位置,得到 rpn_rois

  • 利用非极大值((Non-maximum suppression, NMS)抑制,选出概率最大的 2000 个 rpn_rois

7. proposal_target_layer_> roi_data 128 个RoIs

  bottom: 'rpn_rois'[1,5]
  bottom: 'gt_boxes'[1,4]
  top: 'rois'[1,5,1,1]
  top: 'labels'[1,1,1,1]
  top: 'bbox_targets'[1,8,1,1]存储的是anchors和最高重叠的gt的(
   x*-xa)/wa,(y*-ya)/ha,log(w*/wa),log(h*/hg),*为gt。
  top: 'bbox_inside_weights'[1,8,1,1]被抽中的正类为1,其他为0;
  top: 'bbox_outside_weights[1,8,1,1]外部权重,目前负例的外部权重=正例的外部权重=np.ones((1, 4)) * 1.0 / 

RPN 会产生大约 2000 个 RoIs,这 2000 个 RoIs 不是都拿去训练,而是利用ProposalTargetCreator 选择 128 个 RoIs 用以训练。选择的规则如下:

  • RoIs 和 gt_bboxes 的 IoU 大于 0.5 的,选择一些(比如 32 个)

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

为了便于训练,对选择出的 128 个 RoIs,还对他们的gt_roi_loc 进行标准化处理(减去均值除以标准差)

对于分类问题, 直接利用交叉熵损失. 而对于位置的回归损失, 一样采用 Smooth_L1Loss, 只不过只对正样本计算损失. 而且是只对正样本中的这个类别 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 个数参与计算损失,其余的不参与计算损失。

 

其中prosal layer里的输入错了,rpn_bbox_pred是回归的偏移。不是预测的框。



RPN网络,RPN网络以一个3*3的卷积核,pad=1,stride=1的512个卷积核的卷积层开始,输入是res4f层的输出,res4f层的输出即conv4_x最后的输出。该rpn_conv/3*3层的输出是1*512*38*63。

这里写图片描述

然后是分类层和回归层,分类层采用1*1的卷积核,pad=0,stride=1的18(2(back ground/fore ground)*9(anchors))个卷积核的卷积层,分类层的输出是1*18*38*63。回归采用1*1的卷积核,pad=0,stride=1的36(4*9(anchors))个卷积核的卷积层,回归层的输出是1*36*38*63

这里写图片描述

Reshape层对分类层的结果做了一次维度调整,从1*18*38*63变成1*2*342*63,后面的342*63就代表该层所有anchor的数量。

这里写图片描述

anchor_target_layer

input:最开始读取的数据得到rpn的label和target。

输出:rpn_labels为1*1*342*63,rpn_bbox_targets为1*36*38*63,rpn_bbox_inside_weights为1*36*38*63,rpn_bbox_outside_weights为1*36*38*63

这里写图片描述

损失函数如下:分类的损失采用SoftmaxWithLoss,输入是reshape后的预测的类别score(1*2*342*63)和真实的label(1*1*342*63)。回归的损失采用SmoothL1Loss,输入是rpn_bbox_pred(1*36*38*63)即所有anchor的坐标相关的预测,rpn_bbox_targets(1*36*38*63),rpn_bbox_inside_weights(1*36*38*63),rpn_bbox_outside_weights(1*36*38*63)。

这里写图片描述

然后是ROI Proposal,先用一个softmax层算出概率(1*2*342*63),然后再reshape到1*18*38*63。

这里写图片描述

然后是生成proposal,维度是1*5。

这里写图片描述

这一层生成rois(1*5*1*1),labels(1*1*1*1),bbox_targets(1*8*1*1),bbox_inside_weights 
(1*8*1*1),bbox_outside_weights(1*8*1*1)。

这里写图片描述

至此RPN网络结束。

 


 

 

 

<think>好的,用户问的是用Keras实现的Faster R-CNN和普通Faster R-CNN之间的差异。我需要先理清楚两者的区别可能在哪里。根据提供的引用内容,用户提到的Keras实现可能有特定的代码结构和实现细节。 首先,从引用[1]来看,这个Keras实现是针对新手或小白的,可能简化了部分结构,比如网络定义。引用[2]提到定义网络时用了两个Dense,两个分支,这可能与原始论文的结构有所不同,可能更简化或者模块化。原始Faster R-CNN中的RPN和Fast R-CNN部分可能更复杂,而Keras实现可能用更简单的来替代。 然后,损失函数的处理,引用[3]中说明Keras实现的损失函数处理了正负样本的筛选,可能使用了自定义的损失函数,比如rpn_cls_loss,这里通过mask来过滤不参与训练的样本,这可能和原版实现中的处理方式是否致需要确认。原版可能也有类似的处理,但Keras实现可能更简化代码结构。 生成anchor的步骤,引用[4]中的代码生成训练用的anchor box,可能这里的实现方式和原版的Caffe或其他框架的实现有差异,比如stride的处理或者坐标计算是否致。比如原版的anchor生成可能涉及不同的参数设置,而Keras实现可能调整了某些步骤以适应Keras的API。 另外,数据预处理和训练流程可能在Keras中有不同的实现,比如数据增强、输入处理等。例如,Keras可能使用Generator或者特定的数据加载方式,而原版可能使用不同的工具。 还有,性能方面,Keras基于TensorFlow,可能在GPU加速、分布式训练上有不同的表现,或者代码执行效率不同。此外,模型的可定制性可能Keras更友好,方便调整结构或参数,而原版代码可能更复杂难以修改。 需要检查引用中的具体代码片段,比如RPN网络的结构、损失函数的实现、anchor生成的方法,是否与原论文致。例如,原版Faster R-CNN中的RPN使用3x3卷积后接两个1x1卷积进行分类和回归,而Keras实现是否同样如此,或者是否有简化。 总结可能的差异点:网络结构简化、损失函数实现方式、anchor生成的具体步骤、训练流程和数据处理的差异、框架特性带来的性能差异,以及可定制性和易用性方面。</think>### Keras实现的Faster R-CNN vs 普通Faster R-CNN 的区别 #### 1. **网络结构实现的简化** - **Keras实现**:通过模块化设计简化网络结构。例如,RPN(Region Proposal Network)的分类和回归分支可能直接使用全连接(`Dense`)实现[^2],而原始Faster R-CNN中RPN通过卷积(如3x3卷积+1x1卷积)生成建议区域。 - **普通实现**:更严格遵循原论文设计,例如使用特定卷积核的堆叠和参数初始化方式,可能涉及更复杂的间连接。 #### 2. **损失函数的定制化处理** - **Keras实现**:需显式处理正负样本的筛选。例如,通过掩码(`mask`)过滤不参与训练的样本(如中性样本),并自定义损失函数(如`rpn_cls_loss`)[^3]。 - **普通实现**:通常直接集成框架内置的损失函数(如PyTorch或Caffe中的Smooth L1 Loss),依赖框架的自动梯度计算。 #### 3. **Anchor生成逻辑的差异** - **Keras实现**:可能通过代码直接生成Anchor坐标,例如根据特征图尺寸和步长(`stride`)逐像素计算Anchor位置[^4],逻辑更透明但计算效率较低。 - **普通实现**:可能利用框架优化(如向量化操作或CUDA加速)提升Anchor生成效率,例如Caffe版本中的高效实现。 #### 4. **训练流程的灵活性** - **Keras实现**:依赖Keras的`fit`方法或自定义训练循环,数据预处理和增强可能通过`ImageDataGenerator`实现,适合快速实验[^1]。 - **普通实现**:通常使用多线程数据加载和分布式训练优化(如PyTorch的`DataLoader`),适合大规模数据集。 #### 5. **框架特性带来的性能差异** - **Keras实现**:基于TensorFlow后端,支持静态图(Graph)和动态图(Eager Execution),但默认配置可能未充分优化计算效率。 - **普通实现**:如PyTorch或原始Caffe版本,可能通过底优化(如显存复用、算子融合)提升推理速度。 #### 6. **可定制性与易用性** - **Keras实现**:代码结构更清晰,适合新手学习和修改(如调整网络或损失函数)[^1]。 - **普通实现**:通常与论文复现紧密对齐,但代码复杂度高,调试难度较大。 --- ### 表格总结 | 对比维度 | Keras实现 | 普通实现(如Caffe/PyTorch) | |------------------|--------------------------------------|-------------------------------------| | **网络结构** | 模块化设计,简化全连接[^2] | 严格遵循论文,复杂卷积操作 | | **损失函数** | 自定义掩码过滤样本[^3] | 框架内置函数,自动处理样本 | | **Anchor生成** | 逐像素计算,逻辑透明 | 向量化或CUDA加速,效率高 | | **训练流程** | 依赖Keras工具,适合快速实验[^1] | 分布式优化,适合工业级场景 | | **性能** | 受限于TensorFlow后端,中等效率 | 高度优化,推理速度更快 | | **适用人群** | 新手/研究者,注重可读性和可修改性 | 工程师/复现需求,注重性能和准确性 | ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值