目标检测(Object Detection)3--Faster R-CNN

Fast R-CNN的问题

相较于R-CNN, Fast R-CNN已经在性能上有了大幅的提高,但是依然没有解决Selective Search的计算过于费时这个问题,那么在这篇文章中,我会来说明Faster R-CNN的结构以及它是如何解决Fast R-CNN这个遗留的问题的。

Faster R-CNN

还是一样,先上一张图让大家对Faster R-CNN有一个直观印象
在这里插入图片描述
那么总的来说,Faster R-CNN主要的流程分为3部。
1.将原始图像经过一个CNN骨干网络(backbone)得到对应的特征图。
2.使用RPN网络生成候选框,然后将生成的候选框投影到特征图上得到对应的特征矩阵。可以说使用RPN网络也是Faster R-CNN相较与Fast R-CNN的一个最重要变化了,下文会详细讲述究竟什么是RPN网络。
3.将候选框对应的特征矩阵通过ROI pooling层缩放到统一的7*7的大小,然后经过flattening展平操作送到后续的全联接层,用于后续的分类和回归器的训练,这一步可以说是和Fast R-CNN完全一致,所以下文就不具体说明了,读者们可以看我这个系列的上一篇介绍Fast R-CNN的文章。

所以总结来说,Faster R-CNN就是RPN+Fast R-CNN。所以下文会将主要篇幅放在RPN(Regional Proposal Network) 的讲述上,关于Fast R-CNN,就不再重复了。

OK,我们开始。首先我们先来从下面这张图看一下RPN的总体架构。(拷贝自原paper)
在这里插入图片描述
最下面的conv feature map就是我们使用backbone得到的原图的特征图,它包含多个channel,比如在VGG网络中总共是512个channel,而在ZF网络中总共是256个channel。然后我们以特征图上的每一点作为中心,生成nn大小的滑动窗口(原文中作者使用的n=3),然后根据每个滑动窗口的中心点,对应到原始图片上的位置,再以这个位置坐标为中心生成大小比例不同的k个anchor box(锚框)作为可能的候选框。这里说明一下锚框,在设定锚框的尺寸和比例时,共选取三种尺度(128128,256256,512512),以及三种比例(1:1,1:2,2:1),那么也就是说每个位置(中心点)都对应着9个不同的锚框(3x3=9),至于为什么这么选择锚框的尺寸以及比例,作者的解释是基于经验所得。当我们对于特征图的每个位置都得到一系列对应的锚框之后,我们通过一层中间层(intermediate layer)将每一个滑动窗口映射到一个低维空间的特征向量,具体的维度取决于前面feature map的深度,也就是channel的个数,如果对于ZF网络,那就是256维的特征向量。然后我们就把得到的特征向量喂给后面的分类器和回归器。(我个人对于这块描述其实是有点疑惑的,我认为这里需要的是对每个生成的锚框都映射成一个特征向量,而不是每一个滑动窗口,不知道是我的理解有误还是作者的描述不够准确)在这里插入图片描述
这里解释一下,为什么分类器和回归器output为什么是2k和4k。首先对于分类任务而言,我们对于每个位置的k个锚框都是去判断是否包含物体,而不去考虑具体的类别,因为在RPN中我们的任务只是去得到候选框而不是对候选框进行具体的分类,所以我们这里只是进行而分类问题,原文中作者使用的是2类别的softmax进行分类,因此对于每个锚框,都会输出两个概率值,一个表示该锚框包含物体的概率,另一个则为不包含的概率,两者之和为1。所以对于一个位置,总共会有2k个输出。但是实际上,我们也会使用逻辑回归,或者说用sigmoid函数作为激活函数,那么这种情况下每个锚框对应一个输出p,表示的是包含物体的概率,总共只有1k个输出。这一点是需要明确的。然后来看分类器,因为我们需要4个要素确定一个框,(x,y,w,h)分别表示中心点x,以及宽和高,因此回归的调整任务自然对应4个参数,总共4*k。

接下来,我们再来看一下RPN具体是如何训练的。总结来说,RPN使用的依然是端到端的训练方式。使用反向传播以及随机梯度下降的方式不断迭代更新网络权重。我们在随机梯度下降的时候,选择的batch size=256,同时保证选取的正样本的anchor数和负样本的anchor数比例大致为1:1,但是如果图片中的正样本数小于128,那么我们就用负样本填充至256。这样做的原因是由于正样本的相对稀缺,如果直接随机抽样,很有可能负样本占据大部分,导致优化过程会存在朝向负样本的bias,这也是unbalanced data训练集的普遍问题。

上面介绍了RPN的结构以及训练过程,下面我们再来思考一下通过使用滑动窗口生成的一系列锚框,究竟应该如何生成最后的候选框呢?
假设对于一张1000x63x3的图像,特征图上的区块总共大约60x40,每个区块包含9个锚框,那么总计会有60x40x9=21600个锚框,当然部分锚框因为超出原本图像的边界而应该剔除,那么剩下大约6000个。同时这些候选框之间还存在大量的重叠,因此这里我们根据每个锚框的分类得分(分类器),使用非极大值抑制的方法(具体可以看我那篇讨论R-CNN的文章),同时将IOU设置为0.7,经过上述的筛选,我们最终选出2000个锚框作为RPN最后输出的2000个候选框。

OK,以上就是RPN的全部内容,这里我并没有介绍RPN训练的损失函数,原因是它和Fast R-CNN中的损失函数形式是极为相似的,因此我就不再展开说了。大家可以参考我上一篇介绍Fast R-CNN损失函数那里的内容。当然,对于Faster R-CNN而言,同样在完成候选框的提取之后还要做分类和回归,也就是最后的步骤,那么这里和Fast R-CNN也是完全一样的。但是还有一个问题就是对于Faster R-CNN而言,不仅需要训练RPN还要训练Fast R-CNN,那么两者之间具体是怎样联合训练的呢?当然你可以说,直接把两块loss加起来联合训练就OK了呗,这当然是可以的,但是还有其他选择吗?原论文中,作者采用的是分别训练RPN以及Fast R-CNN的方法。
在这里插入图片描述
OK,以上就是Faster R-CNN的全部内容了,关于Fast R-CNN我没有重复讨论,主要focus在RPN这个创新的结构上,下面我再通过下图来总结一下。
在这里插入图片描述
也就是说在Faster R-CNN,我们终于实现将各部分融合到一个CNN网络中里了,也就是终于实现了端到端的模型结构。
参考:1.https://arxiv.org/pdf/1506.01497.pdf
2.https://www.bilibili.com/video/BV1af4y1m7iL?p=3

猜你喜欢

转载自blog.csdn.net/weixin_44607838/article/details/109471372