Faster RCNN 算法_面试版

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Faster RCNN 算法_面试版相关的知识,希望对你有一定的参考价值。

参考技术A 参考链接:

Faster RCNN 学习笔记 :https://www.cnblogs.com/wangyong/p/8513563.html

总结faster r-cnn可能会问到的面试问题:https://blog.csdn.net/qq_43477550/article/details/105584364

快速理解RPN:https://zhuanlan.zhihu.com/p/138515680

RoIPooling和ROI Align以及双线性插值法:https://blog.csdn.net/ifreewolf_csdn/article/details/101352352

参考书本:

深度学习之pytorch物体检测实战,第二篇:物体检测经典框架,第四章:两阶经典检测器: Faster RCNN

1、Faster RCNN 是什么

Faster RCNN 是在 Fast RCNN 的基础上,引入了 RPN 网络来代替 Fast RCNN 中的选择性搜索算法来生成候选区域,使得目标检测速度大大提高。Faster RCNN 的网络结构是使用 VGG16 卷积阶段的网络层来提取特征,然后分别传入到 RoI 池化层和 RPN 网络中,RPN 网络得到 RoI 后跟特征图一起传入到 RoI 池化层,获得固定尺寸大小的输出,最后再传入到多层全连接层中,同时得到分类得分和边框坐标偏移量回归的预测结果

2、Faster RCNN 的网络结构图

3、Faster RCNN 的算法步骤

第一步:将原图除以缩放因子来变换图片的尺寸,图像短边不超过600,图像长边不超过1000。然后输入到 VGG16 卷积阶段的网络层来提取特征,生成特征图

第二步:将特征图分别输入到 RPN 网络中以及 RoI 池化层中,RPN 的过程

1、在特征图上滑动使用 3*3 卷积,通过融合周边特征,加强特征的鲁棒性,获得新的特征图

2、由于特征图上的每一个特征点都对应了 9 个 anchors ,所以可以使用 1*1 卷积来代替全连接层,预测每一个 anchor 的分类得分以及坐标偏移量

3、在训练 RPN 网络阶段,首先按照规则生成全部 anchors ,然后将超过图像边界的 anchors 剔除掉,然后计算 anchors 跟所有真值的 IoU,对于每个真值跟其有最大 IoU 的 anchor 标记为正样本,IoU > 0.7 的也标记为正样本, IoU < 0.3 的标记为负样本,然后从中随机抽取正负样本比例为 1:1,总数为 256 个 anchors 作为训练样本,而其余的 anchor 则不参与训练。然后将每个 anchor 跟它有最大 IoU 的真值标记为它的真值。然后计算 anchors 跟真值的坐标偏移量,然后用来训练 RPN 网络

4、在训练 Faster RCNN 网络阶段,首先按照规则生成全部 anchors,然后利用 2 中预测的坐标偏移量来校正 anchors 的坐标,然后将超过图像边界的 anchors 坐标修整到图像边界。然后按 anchors 的分类得分来进行降序排序,保留分类得分的前 12000 个 anchors,然后使用非极大值抑制。然后选取分类得分前 2000 个 anchors 作为候选框。然后计算所有的候选框跟真值的 IoU,对于任意一个候选框,如果它跟所有的真值的最大 IoU 大于等于 0.5,则标记为正样本,否则标记为负样本。然后从中随机抽取正负样本比例为 1:3,总数为 256 的 RoI 作为训练样本。然后将每个 RoI 跟它有最大 IoU的真值标记为它的真值,然后计算 RoI 跟真值的坐标偏移量。

第三步:RoI 池化层的过程:

1、将 RoI 跟特征图输入到 RoI 池化层中

2、将 RoI 的坐标除以 VGG16 网络的下采样率 16 ,并向下取整,得到它在特征图中的坐标

3、将 RoI 划分为 7*7 大小的网格,每个网格的宽和高分别由 RoI 区域的宽和高除以 7 并向下取整来得到

4、在每个网格里使用最大值池化,输出 7*7 大小的特征图

第四步:RoI 池化层后接多层全连接层,然后再接两个并行的预测分支,分别预测分类得分和边框坐标偏移量

4、Faster RCNN 的优点

1、相对于 Fast RCNN,Faster RCNN 使用 RPN 网络来取代了选择性搜索算法来生成候选区域,在训练和测试阶段的速度都大大地提高了,也节省了存储空间

2、相对于 Fast RCNN 不是端到端的形式,Faster RCNN 将生成候选区域阶段也融入到了神经网络中,使得 Faster RCNN 变成了端到端的形式

3、Faster RCNN 通过两阶段网络与 RPN,实现了精度较高的物体检测性能

4、Faster RCNN 是两阶段网络,相对于其他一阶段网络,两阶段网络更加精准,尤其是针对高精度、多尺度以及小物体问题上,两阶段网络的优势更明显

5、Faster RCNN 的缺点

1、卷积网络:卷积网络提取到的特征图是最后一个卷积阶段的特征,并没有融合多个阶段的特征,而且分辨率通常也较小,这些都不利于小物体及多尺度的物体检测

2、非极大值抑制:非极大值抑制本身的过滤对于遮挡物体不是特别友好,本身属于两个物体的候选框有可能因为非极大值抑制而被过滤为 1 个,造成漏检

3、RoI 池化层:RoI 池化层有两次对坐标进行向下取整的操作,会导致 RoI 的坐标跟在原图中的坐标产生偏差,使得网络回归的效果变差,特别是对于小物体检测的时候,影响更大。而且第二次的向下取整操作,会导致只提取了 RoI 部分区域的特征,会影响网络的学习效果

4、全连接网络:原始的 Faster RCNN 最后使用全连接网络,这部分全连接网络占据了网络的大部分参数,并且 RoI 池化层后每一个 RoI 都要经过一遍全连接网络,没有共享计算

5、正负样本数量:在 RPN 及 RCNN 部分,都是通过超参数来限制正负样本的数量,以保证正负样本的均衡。而对于不同任务与数据,这种正负样本均衡方法不一定是最有效的

6、两阶段网络:RPN 与 RCNN 两个阶段分工明确,带来了精度的提升,但速度相对较慢,实际实现上还没有达到实时

6、Faster RCNN 的损失函数

Faster RCNN 的损失分别由 RPN 的分类得分损失、RPN 的坐标偏移量回归、 RCNN 的分类得分损失和 RCNN 的边框回归损失,总共四部分组成,其中 RPN 的分类得分损失函数和 RCNN 的分类得分损失函数使用交叉熵,而 RPN 的坐标偏移量回归损失函数和 RCNN 的边框回归损失则使用 smooth_L1 

具体表达式为:

假设   为其预测值,带 * 号的则是其真值,  则是多任务平衡系数,  表示只选取 u 大于 1 的部分,因此

注:RPN 中是二分类,而 RCNN 中则是类别数 + 1

RPN 回归中的正样本数量为 128,而 RCNN 中的正样本数量为 64

7、RPN 的步骤(面试重点)

RPN 是一个全卷积网络,可以输入任意尺寸的图像,然后生成候选区域,它的具体过程是:

1、在特征图上使用 3*3 卷积,通过融合周边特征,加强特征的鲁棒性,获得新的特征图

2、由于特征图上的每一个特征点都对应了 9 个 anchors ,所以可以使用 1*1 卷积来预测每一个 anchor 的分类得分以及坐标偏移量

3、首先按照规则生成全部 anchors ,然后将超过图像边界的 anchor 剔除掉,然后计算保留下来的 anchors 跟所有真值的 IoU,对于每个真值跟其有最大的 IoU 的 anchor 标记为正样本,IoU > 0.7 的也标记为正样本, IoU < 0.3 的标记为负样本,然后从中随机抽取正负样本比例为 1:1,总数为 256 个 anchors 作为训练样本,而其余的 anchor 则不参与训练。然后计算作为训练样本的 anchors 跟真值的坐标偏移量

4、首先按照规则生成全部 anchors,然后利用 2 中预测的坐标偏移量来更新 anchors 的坐标,然后将超过图像边界的 anchors 坐标修整到图像边界,得到最初的候选框。然后按 anchors 的分类概率来进行降序排序,保留概率大的前 12000 个 anchors,然后使用非极大值抑制。然后选取前 2000 个 anchors 作为候选框

5、筛选候选框得到 RoI,首先计算所有的候选框跟真值的 IoU,对于任意一个候选框,如果它跟所有的真值的最大 IoU 大于等于 0.5,则标记为正样本,否则标记为负样本。然后从中随机抽取正负样本比例为 1:3,总数为 256 的 RoI 作为训练样本。同时计算每个 RoI 所对应的类别,以及真值的偏移量。

8、RoI 池化是什么(面试重点)

RoI 池化是输入任意尺寸的图像,然后得到固定尺寸大小的输出。它的具体过程是:

1、将 RoI 跟特征图输入到 RoI 池化层中

2、将 RoI 的坐标除以 VGG16 网络的下采样率 16 ,并向下取整,得到它在特征图中的坐标

3、将 RoI 划分为 7*7 大小的网格,每个网格的宽和高分别由 RoI 区域的宽和高除以 7 并向下取整来得到

4、在每个网格里使用最大值池化

5、输出 7*7 大小的特征图

9、ROI Align 是什么(面试重点)

RoI Align 是对 ROI 池化的改进,主要是在于取消了计算坐标时的向下取整操作,以及避免了只对 ROI 部分区域选取特征的缺点,它的具体过程是:

1、将 RoI 跟特征图输入到 RoI 池化层中

2、将 RoI 的坐标除以 VGG16 网络的下采样率 16 ,但是不进行向下取整的操作,得到它在特征图中的坐标

3、将 RoI 划分为 7*7 大小的网格,每个网格的宽和高分别由 RoI 区域的宽和高除以 7 得到,但是不进行向下取整的操作

4:将每个网格划分为大小相同的 4 个小方格,每个小方格内各取一个点,该点的坐标则为小方格的中心点,而该点的像素点,则由特征图上相邻的 4 个特征点使用双线性插值来得到。然后对每个网格都使用最大值池化

5:输出尺寸大小为 7*7 的特征图

10、1*1 卷积的作用

1*1 卷积的作用是按特征图的跨通道来融合特征,同时保持特征图的平面结构,以及可以改变通道数,实现升维和降维。而且它还可以输入任意尺寸的特征图,所以也可以用来取代全连接层,保持特征图的平面结构。

11、坐标偏移量的计算公式

假设真值的坐标中心点为  ,宽和高分别为  ,而 anchor 的坐标中心点为  ,宽和高分别为 



其中 除以   的目的是为了进一步限制偏移量的范围,便于预测

12、Faster RCNN 的优化点

13、非极大值抑制(NMS)的具体过程

非极大值抑制是将标记为同一个类别的候选框中,只保留概率大的候选框

第一步:对于同一个类别的候选框,取概率最大的候选框为 A

第二步:计算 A 跟其他候选框之间的 IoU,如果 IoU 超过阈值则剔除掉,反之则保留

第三步:在保留下来的候选框中选择概率最大的候选框为 B,重复第二步

第四步:重复第三步,直到所有的候选框都不可再被剔除

14、SoftNMS 的具体过程

faster-rcnn算法总结

faster-rcnn的整体流程比较复杂,尤其是数据的预处理部分,流程比较繁琐。我写faster-rcnn系列文章的目的是对该算法的原始版本有个整体的把握,如果需要使用该算法做一些具体的任务,推荐使用mmdetection框架,该框架使用PyTorch写成,相比于原始的基于caffe python接口的版本就简洁优雅多了。下面对改算法的整体过程做一个梳理,分为训练过程(端到端的训练)和测试过程两部分。本文注重算法原理,因此直接从如下的数据输入开始:

layer 
  name: ‘input-data‘
  type: ‘Python‘
  top: ‘data‘
  top: ‘im_info‘
  top: ‘gt_boxes‘
  python_param 
    module: ‘roi_data_layer.layer‘
    layer: ‘RoIDataLayer‘
    param_str: "‘num_classes‘: 2"
  

一、训练过程

1、输入数据经过一个ConvNet得到一个feature map(backbone的输出),记为bk_feat;

2、

以上是关于Faster RCNN 算法_面试版的主要内容,如果未能解决你的问题,请参考以下文章

caffe版faster-RCNN环境搭建

Faster RCNN算法训练代码解析

2021 计算机视觉CV算法岗面试问题及其答案总结

菜品识别系统(Faster-RCNN目标检测算法)

Faster RCNN算法代码解析

faster-rcnn算法总结