Faster-rcnn学习笔记

写在前面:最近在学习Faster-rcnn,在阅读论文和代码的过程中花了许多功夫,以此来记录自己之前觉得困惑的一些地方。
论文传送门:Faster R-CNN: Towards Real-Time Object
Detection with Region Proposal Networks

代码地址:link1
理论讲解:link2
代码讲解:link3
(非常感谢这个up主的无私讲解以及他分享的资料)

框架如下:
在这里插入图片描述

代码流程图如下:
在这里插入图片描述

一、回归计算的细节

1、RPN部分

在这里插入图片描述在这里插入图片描述RPNHead部分预测的box_pred是生成Anchor的回归参数,对应上述公式中的t_i 。x_a系列参数对应生成Anchor的中心x坐标。
然后从生成的Anchor中挑选出正负样本(具体过程后面会讲到)和每个Anchor对应的GT Box
在这里插入图片描述
然后根据此公式算出GT Box的回归参数,其中x_*为Anchor对应GT Box的坐标,x_a为Anchor的坐标。
所以L_cls用正负样本的labels标签值(这里只分了前景还是背景,只有0和1)与RPN部分预测的cls_logits进行计算。
而L_reg只用正样本中的回归参数进行计算,目的是要让预测的box_pred很接近与GT Box的回归参数,从而使proposal坐标接近于GT Box的坐标。
在这里插入图片描述
利用上述公式可算出proposal的绝对坐标。

2、fast-rcnn部分

与RPN类似,不过FastRCNNPredictor部分预测的类别就对应到具体类别了,共有21个类别(20+1个背景),而且此时的回归参数为rpn生成的proposal的回归参数。
同理,从传入的proposal中选出正负样本和对应的GT Box,然后利用公式:
在这里插入图片描述
计算出正样本GT Box的回归参数与预测的proposal回归参数计算就得到了回归损失。利用正负样本的labels标签值与预测的类别值计算就得到了分类损失。

二、ROI Align

faster-rcnn原文中用的是ROI Pooling,就是把RPN生成的proposal映射在生成的feature map特征图上,将映射后的区域划分为相同大小的sections,然后对每个sections进行max pooling操作
比如,我们有一个8*8的feature map
在这里插入图片描述

将proposal映射上去后得到:
在这里插入图片描述

将如要求要将其划分为(2*2)个sections可以得到:
在这里插入图片描述

然后做max pooling得到:
在这里插入图片描述
但是大佬复现的代码中用到了ROI Align,这个是在mask-rcnn中提出的,解决了ROI Pooling中将候选框边界量化为整数点坐标值,并将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。这两个量化过程会使得候选框和之前得到的proposal出现一定的偏差。
ROI Align则直接利用浮点坐标,然后将候选区域分割成k x k个单元,每个单元的边界也不做量化。
在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。如下图所示:
在这里插入图片描述
最终会取得比ROI Pooling更好的效果。

三、正负样本的选择

1、为什么需要正负样本呢?我之前一直认为只需要正样本就足够了,但其实负样本是必须的。例如,我们要对一张图片进行分类,以确定其是否属于汽车,那么在训练的时候,汽车的图片则为正样本,如果我们不用负样本的话,训练出来的汽车分类网络会将一些非汽车的图片识别为汽车,因此我们需要将这些图片设置为负样本,使得网络训练时知道这个不是汽车。
2、样本选择过程
针对RPN来说,我们是要在Anchors中进行选择,比如我们有6个Anchors和4个GT Box
在这里插入图片描述
首先根据IOU匹配出每个Anchor对应最大IOU的GT Box,如图中所示就是(0.9,0.85,0.5,0.8,0.2,0.65),对应GT Box的索引就是(2,1,0,0,0,3),我们就得到了每个Anchor所对应的GT Box。
然后我们会设置一个阈值,比如说小于0.3的设置为-1,在0.3和0.7之间的设置为-2,我们就得到了(2,1,-2,0,-1,-2)
但是如果这个值恰好是每一行对应的最大值,那我们保持其不变,比如
在这里插入图片描述
我们看到GT3 和Anchor5为0.65是该行最大值,因此我们不应该将其设置为-2,而应该还是3,所以最终标签就是(2,1,-2,0,-1,3),至此大于等于1的都是正样本,为-1的是负样本,为-2的是我们丢弃的数据,就得到(2,1,0,-1,3),然后在这些正负样本中随机选择出我们需要个数的样本数量即可,同时记录索引。我们假设这里所有样本都用于损失计算。
同时我们将小于0的变为0,大于0的设置为1,于是就得到了用于RPN分类损失计算的labels(1,1,0,0,1)。
根据前面得到的正负样本索引,提取出对应正负样本的labels值,和对应正样本的GT Box坐标,然后利用损失函数进行计算。
对于fast-rcnn来说,基本没有区别。

  • 7
    点赞
  • 8
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页

打赏

哪来那么多热情^^

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值