R-CNN家族梳理:从R-CNN到Mask R-CNN

R-CNN家族梳理:从R-CNN到Mask R-CNN

本文打算对目标检测很火的算法R-CNN这一家族进行一个梳理。

一、R-CNN(2014)

目标检测领域的开篇之作,第一个能成功应用到工业上的目标检测算法,详见论文:Rich feature hierarchies for accurate oject detection and semantic segmentation

之前的目标检测领域,常见的传统算法采用SIFTHOG等方法取得了一定的进步,但是在2012年左右进展缓慢,直到AlexNet横空出世,才有了后面各种将深度学习应用到各个领域的算法的出现。

对于R-CNN,其含义为: Regions with CNN features,是two stage检测方法的代表,R-CNN这一家族的核心都是依赖region proposals进行检测定位,最后再去进行分类。

R-CNN主要由三个部分:

  1. 利用Selective Search生成region proposals,即前景的定位方框。
  2. 将各个proposal对应的图片区域抠出来,resize成固定大小,再送入CNN网络中提取特征。
  3. 通过全连接拉成一纬向量后,再利用SVM进行分类。

从现在(2020)回过头来看,R-CNN确实存在许多的缺陷,但不扣否认的是,他提出的two stage方法一直是目标检测算法的常青藤,以及首次将深度学习的办法应用到目标检测上的意义。

1.1 Selective Search:Region Proposals 最早的生成方法:

详见论文:Selective search for object recognition

要想生成捕捉不同尺度(Capture All Scales)、多样化(Diversification)、快速计算(Fast to Compute)

建议参考这篇知乎文章

1.2 NMS非极大值抑制(重要)

未完待续

1.3 Bounding Box Regression (重要)

Bounding Box (后面简称bbox) 可以理解为目标检测的那个定位框。但是为什么要进行一个Regression呢?这是由于直接通过Selective Search (在Faster R-CNN里面使用的是RPN生成),通过NMS筛选出的候选框,其实并不是完全地“框”住了目标,可能会存在长宽比例,以及中心位置的一个微小偏差,这样就需要对原有的候选框,通过回归进行一个修正。
在这里插入图片描述
比如这张图里面,红色框是我们得到的RegionProposal的一个框,但是实际的Ground Truth是绿色的,这个时候就需要对得到的红框进行一个修正。

而原来的候选框,他的数据格式长啥样呢?其实也就是一个四维的向量,即中心点的坐标 x , y x, y 以及方框的长和宽 h , w h, w ,总共四个参数。Bounding Box Regression其实也就是对这四个参数进行回归修正。

P i P^i 是第 i i 个检测框, G i G^i 是相应的Ground Truth。且 P i = ( P x i , P y i , P w i , P w i ) P^i=(P^i_x, P^i_y, P^i_w, P^i_w) G i = ( G x i , G y i , G w i , G w i ) G^i=(G^i_x, G^i_y, G^i_w, G^i_w) 。bbox回归就是希望找到一个映射关系 f f ,使得: f ( P i ) = G i ^ G i f(P^i)=\hat{G^i}\approx{G^i}

但实际上,这个 f f 可以分为如下两种:
平移变换: G x ^ = P w d x ( P ) + P x \hat{G_x}=P_wd_x(P)+P_x G y ^ = P h d y ( P ) + P y \hat{G_y}=P_hd_y(P)+P_y

尺度变换: G w ^ = P w   e x p ( d w ( P ) ) \hat{G_w}=P_w\ exp(d_w(P)) G h ^ = P h   e x p ( d h ( P ) ) \hat{G_h}=P_h\ exp(d_h(P))

在这关于 G x ^ , G y ^ , G w ^ , G h ^ \hat{G_x}, \hat{G_y}, \hat{G_w}, \hat{G_h} 的四个公式里面,输入 P x ^ , P y ^ , P w ^ , P h ^ \hat{P_x}, \hat{P_y}, \hat{P_w}, \hat{P_h} 是已知的,需要对 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P) 这几个函数进行一个学习,也就是回归。

对一个 d ( P ) d(P) 来说,输入并不是 P i = ( P x i , P y i , P w i , P w i ) P^i=(P^i_x, P^i_y, P^i_w, P^i_w) 的四个值,而是 P i P^i 对应那个区域,经过卷积提取到的特征,比如在AlexNet中,就是pool5的值(记为 x = ϕ 5 ( P ) x=\phi_5(P) ϕ 5 \phi_5 指经过CNN第五个pooling提取到的特征)。它的输出就是一个单值(记为 y y )。也就是说,可以把 d ( P ) d(P) 等价为 y = W x y=Wx ,其中, W W 可以通过多种办法得到,梯度下降,或者是最小二乘法。

因此就有了一个关于得到 W W 的损失函数: l o s s = i = 1 N ( t i W T ^ ϕ 5 ( P i ) ) 2 loss=\sum_{i=1}^{N}(t_*^i-\hat{W_*^T}\phi_5(P^i))^2 这里面新出现的符号 t t 表示: t x = ( G x P x ) / P w t_x=(G_x-P_x)/P_w t y = ( G y P y ) / P h t_y=(G_y-P_y)/P_h t w = l o g ( G w / P w ) t_w=log(G_w/P_w) t h = l o g ( G h / P h ) t_h=log(G_h/P_h)

1.4 R-CNN优缺点讨论

缺点:

  1. Selective Search 效率其实十分低下。
    尽管在R-CNN的论文中提到这是一种“很快”的方法,但是 selective search当中并没有任何可学习的参数,它需要提取的特征也是事先给定的。
  2. Proposals送入网络的过程很耗时。
    这个主要体现在,当根据不同的proposal,从图片上提取出送入CNN时,会出现重复计算的情况。整张图的特征并没有共享,这也就造成了计算上的开销。
  3. 最后采用SVM分类其实并不比全连接+softmax好。
    SVM的训练也需要很多的空间,而分类准确率并不会有很明显的提升。
  4. 训练很麻烦,多个地方都是分开训练的。

二、Fast R-CNN(2015)

详情参考这篇论文:Fast R-CNN
相比较R-CNN,Fast R-CNN在性能上有了一些提升,但是它最大的缺点,还是没有用CNN的方法来生成proposal。而最大的贡献,是用softmax替换掉svm,从而实现了大部分pipeline的end to end训练。

简述一下整个流程:

  1. Selective Search得到候选框的坐标信息
  2. 将对应候选框的图像送入CNN
  3. 之后进行ROI Pooling
  4. 全连接层拉成一维向量
  5. 最后得到softmax分类和Bounding Box Regression

可以看到,其中所有的步骤,除了在开始要依赖Selective Search得到Proposals以外,其余的部分都由CNN完成,也就是更加方便了训练的步骤。

由于Bounding Box Regression前面叙述过了,这里不再重复,主要说一下ROI Pooling。

2.1 原始图片中的proposal如何映射到到feature map(重要)

这个主要源自SPP-netSpatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
SPP-net主要是在R-CNN的基础上进行改进的,但是它仍旧继承了R-CNN的多阶段的处理过程。但是这里讨论的主要是,如何将原始图片中的proposal如何映射到到feature map。
对于一个region proposal来说,它只包含四个信息中心点的坐标和矩形的长宽,要想知道这个原图到特征图的映射关系,也就是需要知道边的映射和点的映射。

  1. 点的映射(这里没有给出无规律网络的推到)
    对于有规律的网络,如VGG16,统一使用3*3卷积和2*2池化,feature map之间的映射关系就是简单的倍数关系。
  2. 线的映射
    c o n v i conv_i 的输出是 c i c i c_i*c_i ,对于kernel size为 k i k_i ,padding为 p p ,stride为 s s 的下一层卷积层 c o n v i + 1 conv_{i+1} 而言,其输出为: c i + 1 = c i k i + 2 p s + 1 c_{i+1}=\frac{{c_i-k_i+2p}}{s}+1 因此,两个卷积层之间边长的映射关系就是: c i + 1 c i \frac{{c_{i+1}}}{c_i}

2.2 ROI Pooling: Region of Interest Pooling

一句话就是:对非均匀尺寸的输入执行最大池化以获得固定尺寸的特征图。比如输入是5*7的尺寸,可以池化成4*4。

ROI Pooling
少了几张图,未完待续

那么为什么要这样做呢?这是由于得到的Bounding Box大小不一,然而送到后续的全连接层又需要有固定的大小,因此就采用这样的办法来进行pooling。

它的优点是,这样的操作计算很快,但在精细度上还是太粗糙了,尤其是在分割任务里面是不够精确的,这点直到在Mask R-CNN中才得到改善,升级成了ROI Align。

三、Faster R-CNN(2015)

详见论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

Faster R-CNN,见名知义,基于fast R-CNN在速度上有了更好的提升。前面提到了,Fast R-CNN还不够end to end,并且Selective Search的效率很低,这点是严重限制他性能的瓶颈。而到了Faster这里,通过RPN网络结构,用CNN的办法来生成region proposals,并且整个网络共享卷积层提取到的特征,这又在计算上带来了节省。在当年的目标检测比赛中,拿到了最高的mAP,几乎做到了实时目标检测,仅在FPS上面略输给YOLO一点。

图来自知乎大佬在这里插入图片描述

3.1 RPN结构(重要)

RPN特指这一部分
在这里插入图片描述
他是接在前面的CNN后面,用于产生Region Proposals。可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。

3.1.1 Anchor

我理解的Anchor,就是要在特征图上,先生成一堆候选框,再通过各种方法进行筛选,将筛选出来的送入网络进行训练。
在这里插入图片描述
论文中选取了三种长宽比和三种尺度,排列组合一下就是9种anchor。对于一个长宽为 W H W*H 的特征图,总共会生成 9 W H 9*W*H 个anchor。

四、Mask R-CNN(2016)

详见论文:Mask R-CNN

为了能够做到更加精细的分割,这里成功的把全卷积网络FCN与Faster R-CNN结合在一起,实现了实例分割。由于引入了检测定位框的“先验”,Mask R-CNN的分割结果相比较FCN会更加精细。
在这里插入图片描述

4.1 从ROI到Mask

在FCN中,输入图片先通过CNN得到特征图,之后特征图又经过transposed convolution 恢复成原图尺寸大小的分割Mask。
同样的,这里是将经过ROI Pooling后的特征图,又再恢复成原region proposal对应大小的尺寸。最后的输出是 K H W K*H*W ,其中 K K 代表的是分类的类别数。因为这里,最后的Mask采用了分别对每一种类别都预测一个前景和背景,能够有效避免在一张图片上同时预测多个类别时可能出现的Competition。

4.2 ROI Align

在之前的ROI Pooling 中,存在这么一个问题:对特征图进行ROI Pooling下采样时的取整,会带来边框的一个误差,这也就是misalignments.
最后的解决办法是,通过ROI Align,用这么一种带有双线性插值的池化方法得到更为精细的池化。
在这里插入图片描述

发布了5 篇原创文章 · 获赞 2 · 访问量 3791

猜你喜欢

转载自blog.csdn.net/Taited/article/details/104247244