R-CNN家族梳理:从R-CNN到Mask R-CNN
文章目录
本文打算对目标检测很火的算法R-CNN这一家族进行一个梳理。
一、R-CNN(2014)
目标检测领域的开篇之作,第一个能成功应用到工业上的目标检测算法,详见论文:Rich feature hierarchies for accurate oject detection and semantic segmentation
之前的目标检测领域,常见的传统算法采用SIFT 和 HOG等方法取得了一定的进步,但是在2012年左右进展缓慢,直到AlexNet横空出世,才有了后面各种将深度学习应用到各个领域的算法的出现。
对于R-CNN,其含义为: Regions with CNN features,是two stage检测方法的代表,R-CNN这一家族的核心都是依赖region proposals进行检测定位,最后再去进行分类。
R-CNN主要由三个部分:
- 利用Selective Search生成region proposals,即前景的定位方框。
- 将各个proposal对应的图片区域抠出来,resize成固定大小,再送入CNN网络中提取特征。
- 通过全连接拉成一纬向量后,再利用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是绿色的,这个时候就需要对得到的红框进行一个修正。
而原来的候选框,他的数据格式长啥样呢?其实也就是一个四维的向量,即中心点的坐标 以及方框的长和宽 ,总共四个参数。Bounding Box Regression其实也就是对这四个参数进行回归修正。
是第 个检测框, 是相应的Ground Truth。且 , 。bbox回归就是希望找到一个映射关系 ,使得:
但实际上,这个
可以分为如下两种:
平移变换:
尺度变换:
在这关于 的四个公式里面,输入 是已知的,需要对 这几个函数进行一个学习,也就是回归。
对一个 来说,输入并不是 的四个值,而是 对应那个区域,经过卷积提取到的特征,比如在AlexNet中,就是pool5的值(记为 , 指经过CNN第五个pooling提取到的特征)。它的输出就是一个单值(记为 )。也就是说,可以把 等价为 ,其中, 可以通过多种办法得到,梯度下降,或者是最小二乘法。
因此就有了一个关于得到 的损失函数: 这里面新出现的符号 表示:
1.4 R-CNN优缺点讨论
缺点:
- Selective Search 效率其实十分低下。
尽管在R-CNN的论文中提到这是一种“很快”的方法,但是 selective search当中并没有任何可学习的参数,它需要提取的特征也是事先给定的。 - Proposals送入网络的过程很耗时。
这个主要体现在,当根据不同的proposal,从图片上提取出送入CNN时,会出现重复计算的情况。整张图的特征并没有共享,这也就造成了计算上的开销。 - 最后采用SVM分类其实并不比全连接+softmax好。
SVM的训练也需要很多的空间,而分类准确率并不会有很明显的提升。 - 训练很麻烦,多个地方都是分开训练的。
二、Fast R-CNN(2015)
详情参考这篇论文:Fast R-CNN
相比较R-CNN,Fast R-CNN在性能上有了一些提升,但是它最大的缺点,还是没有用CNN的方法来生成proposal。而最大的贡献,是用softmax替换掉svm,从而实现了大部分pipeline的end to end训练。
简述一下整个流程:
- Selective Search得到候选框的坐标信息
- 将对应候选框的图像送入CNN
- 之后进行ROI Pooling
- 全连接层拉成一维向量
- 最后得到softmax分类和Bounding Box Regression
可以看到,其中所有的步骤,除了在开始要依赖Selective Search得到Proposals以外,其余的部分都由CNN完成,也就是更加方便了训练的步骤。
由于Bounding Box Regression前面叙述过了,这里不再重复,主要说一下ROI Pooling。
2.1 原始图片中的proposal如何映射到到feature map(重要)
这个主要源自SPP-net:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
SPP-net主要是在R-CNN的基础上进行改进的,但是它仍旧继承了R-CNN的多阶段的处理过程。但是这里讨论的主要是,如何将原始图片中的proposal如何映射到到feature map。
对于一个region proposal来说,它只包含四个信息中心点的坐标和矩形的长宽,要想知道这个原图到特征图的映射关系,也就是需要知道边的映射和点的映射。
- 点的映射(这里没有给出无规律网络的推到)
对于有规律的网络,如VGG16,统一使用3*3卷积和2*2池化,feature map之间的映射关系就是简单的倍数关系。 - 线的映射
的输出是 ,对于kernel size为 ,padding为 ,stride为 的下一层卷积层 而言,其输出为: 因此,两个卷积层之间边长的映射关系就是:
2.2 ROI Pooling: Region of Interest Pooling
一句话就是:对非均匀尺寸的输入执行最大池化以获得固定尺寸的特征图。比如输入是5*7的尺寸,可以池化成4*4。
少了几张图,未完待续
那么为什么要这样做呢?这是由于得到的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。对于一个长宽为
的特征图,总共会生成
个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对应大小的尺寸。最后的输出是
,其中
代表的是分类的类别数。因为这里,最后的Mask采用了分别对每一种类别都预测一个前景和背景,能够有效避免在一张图片上同时预测多个类别时可能出现的Competition。
4.2 ROI Align
在之前的ROI Pooling 中,存在这么一个问题:对特征图进行ROI Pooling下采样时的取整,会带来边框的一个误差,这也就是misalignments.
最后的解决办法是,通过ROI Align,用这么一种带有双线性插值的池化方法得到更为精细的池化。