RPN的功能实现(流程与理解)

前言:  

 

  笔者加入CSDN也快两年了,作为一个小白一直在看各位大佬的博客文章,从中学习到了很多,对此也抱着感激之心。这段时间在做和YOLO相关的项目,因此最近在研读目标检测相关的算法和理论。最近对Yolo和Faster-RCNN这两种框架进行了​研究。本篇文章内容主要讲解的是RPN的功能实现和构成原理。其余有关网络结构以及其他内容这里不做讲解。​​​​​​ 

  这也是笔者对这块内容的复习和回顾。

 

   1.RPN相关理论

     在介绍RPN之前需要先简单介绍一下Faster-RCNN,具体网络框架如下图所示。

 

              

     这张图是Faster-RCNN的具体示意图,创新点我们也可以理解成是RPN+Fast-RCNN,其结构比较简洁,是two-stage的一种网络结构。用简单的话来说就是它是有两部分组成。一部分是本次重点介绍的RPN(RegionProposal Network)区域生成网络,另一部分则是ROI pooling,这一部分是对RPN所生成的Proposal进行操作,就是进行目标的具体检测。

     我们可以理解为,第一级的RPN它的作用是生产相对应的ROI区域框,也就是我们本次需要研究的对象。因为RPN的本质是 “ 基于滑窗的无类别obejct检测器 ”。我们可以这么解释:RPN可以不管这具体的目标是什么,是狗?是猫?是人? 不 care这些好嘛~我们的RPN只需要区分一张图片的前景与后景,即能区分图片里的目标和背景就行。然后将预处理过的框图,代表目标所在位置的那块区域传递给下一级的ROI pooling,那么我们的RPN的工作就算完成了。至于目标到底是什么,就交给我们的下一级网络(ROI pooling)来解决吧~

 

  2.Anchor box

       

   在介绍Anchor box之前,先看一下这幅图。 这张图片真的很经典,我们的conv feature map(卷积后的特征图)是通过前面一系列的卷积操作后得到的最终feature map,需注意这里的特征图是公共特征图,两块网络的前级结构都需要经过这块feature map。这里可以理解为我输入的input image(原图)把它压缩成了特征图。举个例子就是Anchor box对于特征图的一个1×1的网格(这里假设通过下采样8倍得到)映射到原图中实际上是一块8×8的大网格。特征图就是主要提取到原图的特征信息,并把一些没用的信息给摒弃,最后得到的一张相对于比较精炼的map。

    接着我们通过Sliding window遍历整个map空间,也就是转换为256-d的形态。(转变成256维则是又使用了一个卷积,具体转变可以参考其他文章)我们假设这里处理后的intermediate layer的size是16×16,即我们要对其256块网格的每一块都进行建立Anchor boxes。

   Anchor box 这里可以理解成一个预先搭好的窗口。因为对于不同的目标来说,它的尺寸是不同的。比如说人,是高瘦的,但是车呢,就是宽矮的。所以我们提前用Anchor box对不同种类的目标先预设大致的形状box,这样在后续的预测中会增强其鲁棒性。一个1×1的网格里的Anchor boxes映射到input image 有一个很大的区域,这块区域的中心点这里称为锚点,所有的Anchor boxes都是以该锚点为中心展开做框。在论文里每一个锚点都会有9个大小尺寸不同的Anchor box。

    那我们这里好多的Anchor boxes的作用到底是什么呢?它们是需要提取一些特征信息,就是说这里的每一个Anchor box 我们都需要预测并输出一些值,它才完成了自己的使命。从256-d开始分别通过全连接层(这里是1×1的内核做卷积,我这里就理解成全连接层,其实最后的维度是一样的)产生两块layer。一块是cls layer,一块是reg layer。 cls(classify) layer 的作用是分类这块区域是前景还是后景,并分别打分,给出相应分数(也可以理解为相对概率)。而reg(regression) layer 则是预测出这个box的x,y,w,h的位置(注意这里是相对于原图坐标的偏移)


(注意:这里预测的值都是通过模型不断训练得到的,接下来将会讲解训练过程


 3.训练RPN(分类与回归) 

      在训练过程中首先要引入一个概念,它是Ground Truth(GT),可以理解成真实值,如下图飞机绿框所示。这里是我们通过人为做标记形成的框。它在训练分类问题时派上了很大的用途。这里的红框(Region Proposal)下面会讲到。

 

                 

 

 3.1分类问题

      首先是分类问题,也就是前面的cls layer。我们需要不断地训练模型,让reg layer更好的区分谁是前景,谁是远景。在训练之初我们先对前景和远景分别用正样本(1)和负样本(0)进行标签工作。

      正样本标签: 1.与某一个GT有最高的IOU重叠的Anchor box

                             2.与任意一个GT的IOU重叠部分大于0.7的Anchor box 

      负样本标签: 1.给与所有GT包围盒的IOU重叠部分都小于0.3的Anchor box

     那么还会有读者问了,那么有一些Anchor box 既不满足正样本也不满足负样本怎么办?

     对于这些谁都不是的Anchor box 我们就不管它们了,它们爱干嘛干嘛去,我们的损失计算只管给标签的正负样本。

      然后通过损失函数softmax loss(cross entropy loss)进行疯狂计算,这里的监督标签就是GT(1,0),它不断告诉训练出的结果对还是不对。就这样训练到最后我们的RPN分类就基本搞定。

3.2回归问题

     然后是回归问题,也就是后面的reg layer。我们通过不断训练它,让其得到的四个值,x,y,w,h能与真实的GT坐标不断靠拢,能更接近真实目标的坐标。

     大家再看上面那个飞机图,Gegion Porposal 是我们RPN最后得到的区域。如果说我们就把上面红色框图的信息给下一次ROI Pooling,它是识别不出这个是飞机的。为什么呢?因为虽然我们的Anchor box的确识别出来它是一个前景,但是我们通过图片可以发现,它仅仅框住了机身部分,并没有包括机翼部分。所以在下一级的ROI Pooling里面它由于没有飞机机翼这一特征信息,所以无法准确识别出是飞机。也许就认为是一根棍子也有可能(滑稽)

    所以我们在训练的时候,就需要尽可能的使我们的Anchor box的框与真实的GT的框接近。但是我们知道想让A-box=GT,是不太现实的,因为我们没法做到100%。

 

                              

     所以如上图所示,我们的目标就是希望从现有的原始红色的Proposal最终得到蓝色的预测GT,而这个蓝色GT其实与绿色的真实的标定GT非常接近了已经。总而言之,我们如果得到了预测GT,那么目标就达成了。


接下来关于回归的坐标具体损失计算,以及坐标的平移和缩放可以参考这位博主的文章,里面都写的非常详细了,我上面的图也是从他那边转来的https://blog.csdn.net/qq_36269513/article/details/80421990   

 


 4.Proposal 的整理与筛选

    通过上面一系列的分类和回归操作以后,我们的Anchor box通过不断的努力终于变成了Proposal,就是RPN给出的建议框。RPN辛勤工作了一波以后觉得,嗯,这些框应该还不错,误差不会很大了,然后打算把这些proposal给下一级的ROI Pooling。

    但是这里还存在一个问题。就是虽然我们的Anchor box已经做过了处理,但是它的数量还是太多太多了,对于后续的计算量实在是太可怕了。所以我们这里还要继续整理框框。再选出更好的Proposal。

  一般通过以下三种方法进行整理和筛选

  1.我们通过映射,再回到原图input image。如果发现有Proposal它的边界已经超出了原图的范围,即这个框有一部分不在原图上了,那么我们就剔除严重超出边界的Proposal

  2.我们再对剩下的这些边框进行softmax打分。还记得上面我们给每一个Anchor box进行前景后景的打分吗?其实就是让每一个Anchor box有一个前景分数。我们再根据前景的Anchor box按照分数从高到低排序。在这一步的时候Anchor box已经摇身一变成Proposal了,所以再筛选出2000个分数最高的Proposal。

  3.这里就是最后一步了,我们将这2000个Proposal最后进行NMS(非极大值抑制),再次进行排序。最终选取分数最高的300个Proposal作为最终的结果。这里可以称为Finally Proposal。

 

   终于,经过了上面的所有操作后,我们的RPN最终得到了300个分数最高的目标Proposal,然后通过ROI pooling进行size的归一化。再之后的操作这里就不讲啦


 

    引用https://blog.csdn.net/JNingWei/article/details/78847696这篇文章的一句话:

    只有在train时,cls+reg才能得到强监督信息(来源于ground truth)。即ground truth会告诉cls+reg结构,哪些才是真的前景,从而引导cls+reg结构学得正确区分前后景的能力;在reference阶段,就要靠cls+reg自力更生了。


   我在接触RPN的时候,一直对其train和reference的过程分不太清楚。后面自己理解的是,我们上述的部分其实都是train的过程,因为需要GT的不断指正和监督。当我们的模型训练的差不多了,才可以去测试。但是测试的时候就没有GT的帮助,这一切都要看cls和reg自己的表现了。

 

心得和感想:

   这是笔者的第一篇文章,我也知道有一些地方会有瑕疵或者是错误。但这篇文章更多的是对我所学的一个总结和整理,也方便我以后复习的时候看。同时也希望可以尽自己所能,就像平台上的各位大佬一样,可以帮助到大家。哪怕起到了一点点的帮助我也很开心了。

   当然也欢迎大家多多交流讨论,如果可以的话呜呜呜不要喷我。人家也是第一次写这种东东,肯定有不足之处,求轻喷。希望大家能够用平和温柔的语气一起交流,也祝愿大家能够早日达到梦想的彼岸!

 

    

 

 

  • 23
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值