本周组会讲Mask R-CNN,借此机会把目标检测R-CNN系列的论文都整理了一遍,除了paper外,主要参考网上的一些博客,如有侵权,请告知,在此十分感谢。
文中如有错误,请积极指出,一起学习,共同进步。
相关论文链接:
R-CNN → SPP Net → Fast R-CNN → Faster R-CNN → Mask R-CNN
关于YOLO可参考本人另一篇博客2016-CVPR-YOLO
github代码:
Introduction
Ross Girshick大神:
从DPM,R-CNN,fast R-CNN,faster R-CNN,到mask R-CNN,垄断object detection近10年。
Kaiming He大神:
ResNet系列基本搞定了Image classification。
现在两人联手,开始攻克Instance Segmentation。
Mask R-CNN在不加任何 trick 的情况下超过各种数据增强加持下的 COCO 2016 分割挑战的冠军 FCIS。
Mask R-CNN ICCV 2017 best paper
Scene understanding
Image classification:图像分类,识别出图中的物体类别
Object detection:目标检测,既要识别出图中的物体,又要知道物体的位置,即图像分类+定位
Semantic segmentation:语义分割,除了识别物体类别与位置外,还要标注每个目标的边界,但不区分同类物体,将物体进行像素级别的分割提取
Instance segmentation:实例分割,除了识别物体类别与位置外,还要标注每个目标的边界,且区分同类物体,将物体进行像素级别的分割提取
Mask R-CNN: Motivation and goals
Mask R-CNN的三个目标:
- 视觉场景理解的多任务模型的状态: 同时满足目标检测、分类及实例分割的要求
- 高度模块化,训练简单,相对于Faster R-CNN仅增加一个小的overhead,可以跑到5FPS
- 可以方便的扩展到其他任务,比如人体姿态估计等
R-CNN
步骤:
- 训练(或下载)一个分类模型(比如AlexNet)
- 对模型进行fine-tuning:
- 将分类数1000改为21(有一个类别是背景)
- 去掉最后一个全连接层
- 特征提取:
- 利用selective search算法在图像中从上到下提取约2k个候选区域
- 将每个候选区域wrap成 224∗224 的大小以适合CNN的输入,做一次前向传播,将CNN的fc7层的输出作为特征,保存到硬盘
- 训练一个SVM分类器来判断这个候选框里物体的类别,每个类别对应一个SVM,判断是否属于这个类别,是就是positive,反之就是nagative
- 使用SVM分好类的候选区域做边框回归,用bounding box 回归值校正
该方法在VOC 2011 test数据集上取得了71.8%的检测精度。
Selective search:
这个策略借助了层次聚类的思想,应用到区域的合并上面。
- 假设现在图像上有n个预分割的区域(Efficient Gragh-Based Image Segment),表示为 R=R1,R2,…,Rn
- 计算每个region与它相邻region的相似度,这样会得到一个 n∗n 的相似度矩阵(同一个区域之间和不相邻区域之间的相似度可设为NaN),从矩阵中找出最大相似度值对应的两个区域,将这两个区域合二为一,这时图像上还剩下n-1个区域
- 重复上述过程(只需计算新的区域与它相邻区域的新相似度,其他的不用重复计算),重复一次,区域的总数目就少1,直到最后所有的区域都合并成为了同一个区域
缺点:
- 训练和测试过程分为多个阶段,步骤繁琐:微调网络,得到候选区域,CNN提取特征,SVM分类,SVM边界框回归
- 训练耗时,占用磁盘空间大,5000张图像产生几百G的特征文件
- 测试过程中,每一个候选区域都要提取一遍特征,这些区域有一定重叠度,各个区域的特征提取独立计算,效率不高,使测试一幅图像非常慢
- SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新
因此,把R-CNN的缺点改掉,就成了Fast R-CNN。
Fast R-CNN
Fast R-CNN在R-CNN的基础上采纳了SPP Net方法,对R-CNN作了改进。使用VGG-19网络架构比R-CNN在训练和测试时分别快了9倍和213倍。
步骤:
- 输入测试图像
- 利用selective search算法在图像上从上到下提取约2k个候选区域
- 将整张图片输入CNN,进行特征提取,得到feature map
- 把候选区域映射到CNN的最后一层卷积feature map上
- 通过RoI pooling层使每个候选区域生成固定尺寸的feature map
- 利用Softmax loss(探测分类概率)和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练
相比R-CNN,两处改进:
- CNN最后一层卷积层后加了一个RoI pooling层,可以看做单层SPP Net的网络层,可以把不同大小的输入映射到一个固定尺寸的特征向量。
- 在R-CNN中是先用SVM分类器,再做bbox regression,而在Fast R-CNN中,损失函数使用了multi-task loss,将bbox regression直接加入到CNN网络中训练,并且实验证明这两个任务能够共享卷积特征,相互促进。
Faster R-CNN
步骤:
- 输入测试图像
- 将整张图片输入CNN,进行特征提取
- 用RPN生成候选区域,每张图片生成300个候选区域
- 把候选区域映射到CNN的最后一层卷积feature map上
- 通过RoI pooling层使每个RoI生成固定尺寸的feature map
- 利用Softmax loss(探测分类概率)和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练
相比Fast R-CNN,两处改进:
- 使用RPN(Region Proposal Network)代替原来的Selective Search方法产生候选区域,使得检测速度大幅提高
- 产生候选区域的CNN和目标检测的CNN共享,候选区域的质量也有本质的提高
Mask R-CNN
Mask R-CNN实际上就是Faster R-CNN + Mask branch,RoIAlign的结果。
相比Faster R-CNN,两处改进:
- 把Faster R-CNN里的RoIPool layer改为RoIAlign layer
- 最后多了一个mask branch
RPN
RPN是一个全卷积网络,由于没有全连接层,所以可以输入任意分辨率的图像,经过网络后就得到一个feature map,然后利用这个feature map得到物体的位置和类别。
那么,怎么利用这个feature map得到物体的位置和类别呢?
在conv5-3的卷积feature map上用一个 n∗n(n=3) 的滑动窗口(sliding window)生成一个256维(ZFNet)或512维(VGGNet)长度的全连接特征,然后在这个特征后产生两个分支的全连接层:
- Reg-layer,用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h
- cls-layer,用于判定该proposal是前景还是背景
Anchor:
- 把得到的feature map上的每一个点映射回原图,得到原图上这些点的坐标
- 在这些点周围取一些提前设定好的区域用来训练RPN,这些区域就叫做Anchor boxes
anchor(锚点),位于 n∗n 的滑动窗口的中心处,对于一个滑动窗口,可以同时预测k个候选区域,即k个anchor boxes,每个anchor box可以用一个scale,一个aspect_ratio和滑动窗口中的anchor唯一确定。论文中定义k=9,即3种scales(比如 1282,2562,5122 )和3种aspect_ratio(比如 1:1,1:2,2:1 )确定出当前滑动窗口处对应的9个anchor boxes, 2∗k 个cls-layer的输出和 4∗k 个reg-layer的输出。对于一幅 W∗