目标检测之Faster RCNN详解

导读:Faster-RCNN发表于NIPS 2015上的一篇论文《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》。该算法最大的创新点是提出了RPN(Region Proposal Network)网络,利用Anchor机制将区域生成与卷积网络联系到一起,将检测速度一举提升到17 FPS,而且在VOC 2012测试集上实现了70.4%的检测效果,在当时可谓是以一己之力将目标检测推向了实时的高潮。后面的内容我们主要从算法流程、网络结构、创新点、数据流等几个方面来分析Faster-RCNN它为何这么NB。

Faster-RCNN算法流程

从功能模块来讲,Faster-RCNN包括四部分:特征提取Backbone,RPN网络、ROI Pooling、RCNN模块。从名字不难看出,其延续了RCNN的思想,即现在图片上生成ROI,然后再对ROI进行分类,最后完成目标的检测。其中ROI的生成便是由RPN网络完成的,分类交由RCNN模块负责。算法整体框架如图1所示。
图1
在训练阶段,前向计算的时候就是输入一个batch的图像,经过特征提取网络得到特征图,特征图作为RPN模块的输入,经过RPN卷积网络得到先验Anchors相对于groundtruth的偏移量,并计算损失。由于此时生成的proposal数量很多,会造成很大的计算量,所以需要进一步筛选得到更可靠的ROI。因为得到的ROI尺寸不一,不利于后续统一分类,需要将特征图进行ROI Pooling得到大小相同的特征图,最后送入RCNN预测网络得到分类结果,并计算分类损失。反向传播便是根据得到的目标框的偏移损失和分类损失反向求导,使得网络收敛。而在预测推理阶段,RPN模块是被冻住的,我们输入图片之后得到ROI,ROI经过ROI Pooling之后送入RCNN预测网络得到ROI的类别。

网络结构
特征提取网络

感谢神经网络强大的特征提取能力,原始图片经过特征提取Backbone之后,输出的特征图表示了图片的高级语义信息。在此以VGGNet为例,假设输入图像的维度为3×600×800,由于VGGNet 包含4个Pooling层(物体检测使用VGGNet时,通常不使用第5个Pooling层),下采样率为16,因此输出的feature map的维度512×37×50。
#####RPN模块
Faster RCNN巧妙地在RPN网络里,通过利用Anchors机制将卷积网络与区域生成联系在了一起,从而使得整个网络可以进行端到端的训练,并提升了检测速度。RPN模块主要包括Anchor生成、RPN卷积网络,RPN loss计算、Proposal的生成、Proposal的筛选、ROI Pooling这6部分。
######Anchor生成
Anchor其实是在特征图的每个像素点上生成的矩形方框,根据下采样率计算,其对应了原图上按比例放大的方框。因为图片上的物体位置标签是用矩形框表示的,所以引入Anchor就为我们提供了很强的先验知识。有了Anchor,我们只需要在其基础上预测Anchor相对于GroundTruth的偏移量即可,而无需从零开始拟合物体的边框信息。为了适应不同尺度的物体,作者以特征图的每个像素点为中心分别设置了9个长宽比和大小不同的Anchors。根据上边特征提取网络中的例子,由于得到的特征图尺寸为512×37×50,因此生成的Anchor有37×50×9=16650个。通过RPN卷积网络我们可以得到每个Anchor的分类(前景 or 背景)结果和回归(Anchor相对于真实物体的偏移)结果。

RPN卷积网络

512×37×50的特征图作为输入进入RPN卷积网络,其网络结构如图2所示:
在这里插入图片描述
特征图先经过了一个卷积核尺寸为3×3,卷积核个数为512的卷积层,用以提取更高一层的语义特征。之后网络分为两路:左边这一支路通过softmax用以预测Anchor的分类结果,右边支路通过1×1的卷积层预测Anchor的偏移量。分类网络最终输出尺寸为18×37×50,因为特征图上每个点对应9个Anchors,每个Anchor有两个类别:前景和背景。这里只是要生成包含物体的ROI,而且生成的ROI还要送入RCNN模块进行分类,所以我们只需预测前景和背景这两个概率就可以。判断前景背景的方法是利用Anchor和目标物体的IOU和设定的阈值来判定的。回归网络最终输出尺寸为36×37×50,因为每个Anchor有4个关于位置的与测量 t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th。假设Anchor A的中心坐标为 x a , y a x_a, y_a xa,ya,高宽分别为 h a , w a h_a, w_a ha,wa,则对应的 t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th计算公式为:
在这里插入图片描述
可以看到公式中对预测的偏移量进行了关于宽高的归一化,这样做的目的是为了限制偏移量的范围,方便预测。

RPN模块loss计算

有了RPN卷积网络关于分类和回归的预测值,我们还需要真实值用来计算loss。
怎么得到真实值呢?

  1. 生成Anchor之后,我们会发现很多边缘的Anchor是超出图像范围的,这些便可以过滤掉不参与后续计算。
  2. 过滤之后的Anchor,通过计算其与目标物体的IOU判定是正样本还是负样本,判定标准如下:
    * 对于任何一个Anchor,与所有标签的最大IOU小于0.3,判定为负样本;
    * 对于任何一个标签,与其有最大IOU的Anchor视为正样本;
    * 对于任何一个Anchor,其与所有标签的最大IOU大于0.7,视为正样本
    注意:需要注意的是,上述三者的顺序不能随意变动,要保证一个Anchor 既符合正样本,也符合负样本时,赋予正样本。并且为了保证这一阶段 的召回率,允许多个Anchors对应一个标签,而不允许一个标签对应多 个Anchors。
    3.正负样本判定完之后,根据Anchor的预测值计算偏移量的真值
    总体流程见图3:
    在这里插入图片描述
    因为图片中目标的数量是有限的,而Anchor有近两万个,所以众多Anchor中大部分都为背景,为了计算loss时正负样本均衡,我们选取固定数量的Anchor进行loss计算。这里需要注意的是,回归损失我们只需要考虑正样本,而无需考虑负样本。还要设置一个超参数用以平衡分类损失和回归损失。
    因为分类为2分类,所以使用交叉熵损失;回归损失采用Smooth- L 1 L_1 L1损失,这里说一下Smooth- L 1 L_1 L1损失,其函数公式为:
    在这里插入图片描述
    可以看到,它结合了1阶函数和2阶函数,当预测值与真值的差距较大时,采用1阶函数计算;当预测值与真值的差距较小时,采用2阶函数计算。这在一定程度上加速了收敛,并且预防了梯度爆炸。
proposal生成

在RPN模块中,完成了损失计算,便要开始proposal的生成了。首先生成全部的Anchor,然后通过计算损失并回归调整Anchor使其逼近目标物体,并且修剪掉超出图像范围的Anchor,再通过前景得分排序取排在前12000的Anchor,对这些Anchor计算IOU。由于一个物体可能对应多个Anchor,再通过NMS去掉低于阈值的Anchor,最后取RPN预测得分排在前2000的Anchor作为Proposal。

筛选Proposal得到ROI

经过上边层层筛选之后,由于Anchor的数量太多所以还是会有很多背景,背景送到RCNN中进行分类没有意义,因此还需通过计算IOU对proposal进一步筛选得到ROI,此次筛选的目的是要得到256个正负样本。这一轮筛选的好处有3点:
* 经过筛选,使得更贴近真实物体的IOU,并且正负样本的数量更加均衡;
* 筛选的时候利用标签,为每一个ROI赋予了正、负标签,并可以计算能得到ROI对应标签的偏移量(RCNN模块的真值);
* 减少了ROI的数量,减小了计算量。

ROI Pooling 和 ROI Align

因为最初生成的Anchor是大小不一的,经过上述调整和筛选之后得到的ROI也是大小不一(有的甚至带浮点数)的,这不利于我们把ROI送入RCNN进行分类(RCNN是全连接神经网络的设计)。所以在论文中,作者使用了ROI Pooling将得到的ROI变为统一大小。
ROI Pooling是怎么工作的呢?他是如何把大小不同的ROI给池化到相同大小的?
假设我们现在有一个332×332的ROI,以使用VGGNet的全连接层为例,其所需的特征向量维度为512×7×7。因为VGGNet的下采样率为16,所以ROI对应的特征图区域为20.75×20.75,我们要考虑的就是如何将20.75×20.75的特征图变为7×7大小。
ROI Pooling的做法是量化取整,将20.75×20.75的特征图近似为20×20。然后20/7约等于2.875,再次出现了浮点数,ROI Pooling的做法是量化取整,将2.875近似为2。由此,便可以在ROI的特征图的左上角开始以步长为2选取7×7的区域,这样每个小方格在特征图上的大小为2×2。在每个小方格中取最大值作为输出,便得到7×7的区域。流程如图4所示。
在这里插入图片描述

这样做虽然完成了目标,但是两次近似取整会造成精度上的损失,特别是在检测框回归的时候,因为特征图上的一点小误差对应到原图上就会造成很大的偏差。因此ROI Align便出现了。
ROI Align的思想是使用双线性插值获得坐标为浮点数的点的值。前边和ROI Pooling一样,将ROI的坐标对应到特征图上,但是坐标和大小都保留浮点数不取整,而是对ROI进行均分为4份(2×2),此时仍然保留浮点数。然后在均分得到的2×2区域的每一个小格里的特定位置采样四个点,选择这四个点中的最大值作为输出。那么如何获取这四个采样点的位置和对应的值呢?
ROI Align是将每一个小格子再次均分成4份,以每一份的中心点作为采样点的位置。每个采样点的周围会有四个特征点,利用这4个特征点进行双线性插值得到该采样点的值。流程如图5所示。
在这里插入图片描述
因为ROI Align没有进行粗略取整的操作,利用原来特征图的信息信息得到池化后的特征,这在一定程度上保留了原始图片信息,使得检测精度得到提升(尤其是对于本身特征区域较小的物体改善更为明显)。

RCNN模块

经过ROI Pooling之后我们得到了256个大小相同的ROI的特征图,这些特征图送入RCNN模块进行分类和回归。RCNN的结构是一个全连接网络,如图6所示。
在这里插入图片描述
从图中我们可以看到256个特征图经过两个全连接层延展为256×4096的特征向量,然后分为两个分支,左分支维度为256×21用于分类,21是默认的分类类别数;右分支维度为256×84,对应21个类别每个类别的4个偏移量,用以回归检测框。在这里256个ROI的特征图虽然放在了一起运算,但是没有共享参数,所以造成了较大的计算量

总结

Faster-RCNN创新性地设计出RPN网络,利用Anchor的强先验知识将ROI的生成与卷积神经网路联系在一起。首先在特征图上的每个像素点生成若干个大小不一的矩形框,Backbone生成的特征图经过RPN卷积网络预测出每个矩形框的类别和相对于标签的偏移量,经过反向优化调整使得Anchor尽可能地逼近标签。由于判为负样本的标签过多,需要经过筛选得到最终生成的ROI。ROI经过ROI Pooling输入RCNN模块进行细分类和回归,完成检测目标。虽然Faster-RCNN做出了创新,但其仍然是一个两阶的目标检测框架,因为在RPN模块和RCNN模块分别进行了loss计算和反向优化。后边又涌现出了SSD,YOLO等性能更加优异的一阶模型,带动了目标检测落地应用。

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值