Faster R-CNN代码详细解读

目录

论文
论文翻译
代码pytorch
知乎大神简易版代码pytorch

  1. 发展简史 RCNN->Fast RCNN->Faster RCNN
  2. 算法原理
  3. 详细内容及源码
    a. RPN
    b. ROI pooling
    c. classification and regression
    d. 训练
  4. 源码流程梳理
  5. 相关面试题
  6. 目前基于Faster Rcnn的改进
  7. 参考链接

正文

  1. todo:发展简史
    R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
    paper
    目标检测

  2. 算法原理:

    faster rcnn网络框架大体分为4个部分:

    1. Conv layers(feature extraction)。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
    2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
    3. RoI Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
    4. Classification and regression。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
      在这里插入图片描述
  3. 详细内容及源码
    a. RPN
    在这里插入图片描述
    上图中展示了RPN网络的具体结构,可以看到,feature map 经过一个3×3卷积核卷积后分成了两条线,上面一条通过softmax对anchors分类获得foreground和background(检测目标是foregrounnd),因为是2分类,所以它的维度是2k scores。下面那条线是用于计算anchors的bounding box regression的偏移量,以获得精确的proposal。它的维度是4k coordinates。而最后的proposcal层则负责综合foreground anchors和bounding box regression偏移量获取proposal,同时剔除太小和超出边界的propocals,其实网络到这个Proposal Layer这里,就完成了目标定位的功能

    b. ROI pooling
    RoI Pooling 是一种特殊的Pooling操作,给定一张图片的Feature map (512×H/16×W/16) ,和128个候选区域的座标(128×4),RoI Pooling将这些区域统一下采样到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一个batch-size=128,通道数为512,7×7的feature map。

    为什么要pooling成7×7的尺度?是为了能够共享权重。在之前讲过,除了用到VGG前几层的卷积之外,最后的全连接层也可以继续利用。当所有的RoIs都被pooling成(512×7×7)的feature map后,将它reshape 成一个一维的向量,就可以利用VGG16预训练的权重,初始化前两层全连接。最后再接两个全连接层,分别是:

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

    c. classification and regression
    虽然原始论文中用的4-Step Alternating Training 即四步交替迭代训练。然而现在github上开源的实现大多是采用近似联合训练(Approximate joint training),端到端,一步到位,速度更快。
    在训练Faster RCNN的时候有四个损失:
    RPN 分类损失:anchor是否为前景(二分类)
    RPN位置回归损失:anchor位置微调
    RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)
    RoI位置回归损失:继续对RoI位置微调
    四个损失相加作为最后的损失,反向传播,更新参数。
    d. 训练在这里插入图片描述
    四步交替训练。在论文中中,采用实用的四步训练算法,通过交替优化学习共享特征。在第一步中,按照之前的描述训练RPN。该网络使用ImageNet的预训练模型进行初始化,并针对区域提议任务进行了端到端的微调。在第二步中,用由第一步RPN生成的提议,由Fast R-CNN训练单独的检测网络。该检测网络也由ImageNet的预训练模型进行初始化。此时两个网络不共享卷积层。在第三步中,我们使用检测器网络来初始化RPN训练,但是我们修正共享的卷积层,并且只对RPN特有的层进行微调。现在这两个网络共享卷积层。最后,保持共享卷积层的固定,我们对Fast R-CNN的独有层进行微调。因此,两个网络共享相同的卷积层并形成统一的网络。类似的交替训练可以运行更多的迭代,但是我们只观察到可以忽略的改进。

4. 源码解读
强烈推荐一个知乎,对于源码的解读很详细,尤其是RPN训练部分:https://zhuanlan.zhihu.com/p/32404424
这里截取部分文字和图片:
在这里插入图片描述
尤其是蓝色和红色部分rpn训练。

i) RPN训练:RPN做的事情就是利用(AnchorTargetCreator)将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。

ii) RPN生成ROIs:
RPN在自身训练的同时,还会提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本。RPN生成RoIs的过程(ProposalCreator)如下:
对于每张图片,利用它的feature map, 计算 **(H/16)× (W/16)×9(大概20000)**个anchor属于前景的概率,以及对应的位置参数。
选取概率较大的12000个anchor
利用回归的位置参数,修正这12000个anchor的位置,得到RoIs
利用非极大值((Non-maximum suppression, **NMS**)抑制,选出概率最大的**2000**个RoIs
注意:在inference的时候,为了提高处理速度,12000和2000分别变为6000和300.

注意:这部分的操作不需要进行反向传播,因此可以利用numpy/tensor实现。
RPN的输出:RoIs(形如2000×4或者300×4的tensor)
  1. 相关面试题
  2. 关于fast rcnn的改进
    关于iou的改进: giou
    关于nms的改进:soft rms, softer rms
    其它:
  3. 参考链接
    https://blog.csdn.net/Lin_xiaoyi/article/details/78214874
    https://zhuanlan.zhihu.com/p/32404424
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值