0 引言
目标检测包含2个基本问题:分类和定位。 分类比较好做, 分类任务是深度学习解决的最好的一类任务。 定位则要困难一些,最简单的方式是通过滑窗, 窗口滑动到某个位置也就完成了定位, 然后通过分类判断窗口内有无目标以及是什么目标即可。 但这个方法显然太简单粗暴, 会存在2个问题:
1)滑窗要想覆盖所有目标, 窗口必须足够密, 这就导致计算量非常大, 且大多数窗口是不包含目标的, 计算非常浪费;
2)窗口的尺度很难确定, 不同目标具有不同的尺度, 要想覆盖的全,窗口尺度也必须足够丰富。
总之, 滑动窗口的做法理论上是可行的, 但是由于计算量太大, 是不实用的。
更加高级一点的做法是选择性搜索(Seletect search)。它的思想是只选择有潜在目标的区域, 抛弃掉大部分没有目标的区域。 因此极大地减少了无用功, 提高了检测的效率。 常用的方法是利用图像中的颜色, 纹理, 形状等特征对图像进行分割。
RPN最早在Faster-RCNN 中被提出, 在此之前, 包括RCNN, Fast-RCNN, 以及其他基于传统机器学习的检测网络, 都有一个单独的Seletect search的过程, 这个过程一般是离线进行的, 并且是独立于检测网络的。
Select search有一个明显的问题是, 它一般都是采用传统的方法去做的, 并且是独立于检测网络的。 这有2个问题: 1)传统的方法不可学习, 且效果比较依赖于经验; 2) 无法和检测网络端到端的优化,很难保证全局最优。
RPN就是为解决select search的上述问题而设计的。 RPN模块也采用了CNN的结构, 并且和检测网络结合在一起, 可以端到端的优化。
1 RPN的原理
通俗点讲,RPN就是用神经网络(一般就是CNN)的方法提取出目标的候选区域, 给后续检测网络进行精细的微调。 在2D检测的场景下, 确定一个目标的框需要4个量,确定一个框里有没有目标需要2个量(二分类)。 有了这些信息, 就能挑选出有目标的潜在区域, 并且完成了初步的定位, RPN的使命也就完成了。
实际上, 检测框的4个量一般不是直接回归得到的,因为直接预测真值的难度大,预测的很不准, 实际中一般都是预测相对某个基准的偏移量, 在偏移量较小的时候, 这个偏移近似线性, 预测的难度大大降低, 预测的也就更准。 那么问题来了, 参考的基准是什么呢?这个基准就是, RPN是在特征图上去做的, 对特征图上的每一个点, 映射到原图对应一个区域(比如8x8, 16x16, 取决于CNN提取特征图时下采样的倍数, 我们以这个区域的中心点为锚点, 预先放置一些框(比如Faster-RCNN 就设置了不同尺度以及不同宽高比的9个框), 这些框就是所谓的anchor, 以这些anchor作为参考的基准。 再把预测的偏移量作用在这些基准框上, 就得到了预测的候选框。
RPN的图示如下, 首先原始图像经过特征提取网络得到feataure map, 在每个feature map上, 我们可以预测一个框的4个坐标值(偏移量),以及是不是目标; feature map上每个点对应原图的一个区域, 以原图区域的中心点为锚点, 可以放置4个预选框,这些预选框是规整的放置的, 跟目标没有任何关系。把这些框与预测值进行结合, 就得到了真实的预选框。可以看出, RPN的预测量就是为了对预先设置的框进行一些移位和缩放的操作, 让这些框更贴近真实目标。
注: 图中为了清晰起见, 只画出了feature map中一个点的信息。 实际上每个feature map点都对应这样的一个信息。
2 Faster-RCNN 中的RPN
Faster RCNN的网络结构如下图所示, 红色虚线框内的就是RPN模块。 原始图像首先经过卷积层进行特征提取, 得到特征图, 然后经过RPN模块进行区域提取。 RPN的模块包含2个分支, 上面一个分支通过softmax预测某一个框是背景还是目标, 下面的分支预测框的4个偏移量,因为Faster RCNN 在每个锚点上预设了9个先验框, 所以在特征图的每个点上, 对应18个分类概率和36个框的偏移量。
得到Proposal后, 把这些框的信息在映射到特征图上, 由于框的大小不一样, 所以需要ROIPooling的操作, 把候选区域的特征图整成一样的大小, 以便进入后续的fc层进行进一步的微调。
3 RPN之后的处理
得到预测的候选框之后, RPN就完成了, 后续的处理其实跟RPN没有关系了, 但是为了方便理解,这里把后处理放在跟RPN一起介绍。 在训练和推理阶段, 后处理的操作不同。
3.1 训练
对训练来说,得到预测的候选框之后,需要跟真实的框计算loss。那么首先就需要确定参与loss计算的正负样本。通常, 预测框的数量(实际上就是anchor的数量)非常多(一般在几千到几十万的量级), 而真实框ground truth(GT)非常少(一般也就几个到几十个), 因此大部分预测框其实都是负样本, 正负样本极不均衡,一般都采样对负样本进行采样的方式降低负样本的数量, 比如通常把正负样本控制在1:3的比例。
正负样本的确定一般是通过检测框与GT的IoU来衡量的, 检测框与GT的IoU大于一定阈值的, 就认为是正样本, 小于一定阈值的, 认为是负样本, 中间的就是无效样本, 直接丢弃。但是有一点需要注意, 一个GT 可以匹配多个检测框, 但是一个检测框只能匹配一个GT(也很好理解, 毕竟一个框只能是一个目标), 因此当一个检测框与多个GT的IoU都大于阈值的话, 只保留IoU最大的那一个检测框。
总结一下, 在训练阶段, 核心的就是预测框如何与真实框的匹配, 以及匹配之后的正负样本确定。这里一般涉及到IoU的计算。
3.2 推理
对推理来说,RPN预测的候选框直接全部输出给第二阶段进行微调。
(微调之后的框跟RPN输出的框是一样多的, 但显然很多都是无效框和重复的框, 所以一般会首先根据置信度的阈值进行一个过滤, 然后进行非极大值抑制(NMS)。 关于NMS, 可以详细参考我的另一篇博客 NMS理解。 NMS中实际上也涉及到IoU的计算。)