本周组会讲Mask R-CNN,借此机会把目标检测R-CNN系列的论文都整理了一遍,除了paper外,主要参考网上的一些博客,如有侵权,请告知,在此十分感谢。
文中如有错误,请积极指出,一起学习,共同进步。
相关论文链接:
R-CNN → SPP Net → Fast R-CNN → Faster R-CNN → Mask R-CNN
YOLO、SSD
FCN、FPN、MNC、FCIS
关于YOLO可参考本人另一篇博客2016-CVPR-YOLO
github代码:
pytorch-faster-rcnn
tensorflow-mask-rcnn
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
Image classification:图像分类,识别出图中的物体类别
Object detection:目标检测,既要识别出图中的物体,又要知道物体的位置,即图像分类+定位
Semantic segmentation:语义分割,除了识别物体类别与位置外,还要标注每个目标的边界,但不区分同类物体,将物体进行像素级别的分割提取
Instance segmentation:实例分割,除了识别物体类别与位置外,还要标注每个目标的边界,且区分同类物体,将物体进行像素级别的分割提取
Mask R-CNN的三个目标:
步骤:
该方法在VOC 2011 test数据集上取得了71.8%的检测精度。
Selective search:
这个策略借助了层次聚类的思想,应用到区域的合并上面。
缺点:
因此,把R-CNN的缺点改掉,就成了Fast R-CNN。
Fast R-CNN在R-CNN的基础上采纳了SPP Net方法,对R-CNN作了改进。使用VGG-19网络架构比R-CNN在训练和测试时分别快了9倍和213倍。
步骤:
相比R-CNN,两处改进:
步骤:
相比Fast R-CNN,两处改进:
Mask R-CNN实际上就是Faster R-CNN + Mask branch,RoIAlign的结果。
相比Faster R-CNN,两处改进:
RPN是一个全卷积网络,由于没有全连接层,所以可以输入任意分辨率的图像,经过网络后就得到一个feature map,然后利用这个feature map得到物体的位置和类别。
那么,怎么利用这个feature map得到物体的位置和类别呢?
在conv5-3的卷积feature map上用一个 n∗n(n=3) 的滑动窗口(sliding window)生成一个256维(ZFNet)或512维(VGGNet)长度的全连接特征,然后在这个特征后产生两个分支的全连接层:
Anchor:
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∗H 的feature map,对应 W∗H∗k 个anchor boxes。所有的anchors都具有尺度不变性。
IoU:
在计算Loss值之前,作者设置了anchors的标定规则:
Loss functions:
计算softmax loss需要的是anchors对应的groudtruth标定结果和预测结果,计算regression loss需要三组信息:
因此,计算regression loss和总loss算法如下:
缺点:
RPN关键在于选取了一些anchor进行pixel-wise的学习,但问题就是对小物体的检测效果很差,假设输入为 512∗512 ,经过网络后得到的feature map是 32∗32 ,那么每一个feature map上的一个点都要负责周围至少是 16∗16 的一个区域的特征表达,那对于在原图上很小的物体它的特征就难以得到充分的表示,因此检测效果比较差。
在Fast R-CNN和Faster R-CNN中用到的RoI pooling层,其实是借鉴了SPP Net中的思想,所以在介绍RoIPool前,先了解一下SPP Net。
SPP Net:(Spatial Pyramid Pooling,空间金字塔池化)
结合空间金字塔方法实现CNNs的多尺度输入:
R-CNN提取候选框后需要进行crop和wrap来修正尺寸,这样会造成数据的丢失或几何的失真。SPP Net将金字塔思想加入到CNN,在卷积层和全连接层之间加入SPP layer,SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。
如果原图输入是 224∗224 ,对于conv5出来后的输出,是 13∗13∗256 ,即256个filter,每个filter对应一张 13∗13 的activation map。如果像上图那样将activate map pooling成 4∗4,2∗2,1∗1 三张子图,做max pooling后,出来的特征就是固定长度的 (16+4+1)∗256 那么多维度了。如果原图的输入不是 224∗224 ,出来的特征依然是 (16+4+1)∗256 ;可以理解成将原来固定大小为 3∗3 窗口的pool5改成了自适应窗口大小,窗口的大小和activation map成比例,保证了经过pooling后出来的feature的长度是一致的。
只对原图提取一次卷积特征:
在R-CNN中,每个候选框resize后都要独立经过CNN,这样很低效。SPP Net只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层,这样节省了大量时间,比R-CNN快了100倍左右。
RoI Pool:
Fast R-CNN中使用RoIPool将不同大小的候选区域的特征转化为固定大小的特征图像,其做法是:假设候选区域RoI大小为 h∗w ,要输出的大小为 H∗W ,那么就将RoI分成 (h/H)∗(w/W) ,然后对每一个格子使用max-pooling得到目标大小的特征图像。
RoI pooling layer实际上是SPP Net的一个精简版,SPP Net对每个proposal使用了不同大小的金字塔映射,而RoI pooling layer只需要下采样到一个 7∗7 的特征图。对于VGG-16的网络conv5_3有512个特征图,这样所有region proposal对应了一个 7∗7∗512 维度的特征向量作为全连接层的输入
RoI Pooling就是实现从原图区域映射到conv5区域最后pooling到固定大小的功能。
对于每个RoI使用一个FCN来预测 m∗m mask。 m∗m 是一个小的特征图尺寸,如何将这个小的特征图很好的映射到原始图像上?Faster R-CNN不是为网络输入和输出之间的像素到像素对齐而设计的,应用到目标上的核心操作的是粗略的空间量化特征提取,RoIPool不适用于图像分割任务,为了修正错位,Mask R-CNN提出了一个简单的,量化无关的层,称为RoIAlign,可以保留精确的空间位置。
RoIAlign:
RoIPool是从每个RoI提取小特征图(例如, 7∗7 )的标准操作,RoIPool首先将浮点数值的RoI量化成离散颗粒的特征图,然后将量化的RoI分成几个空间的小块(spatial bins),最后汇总每个块覆盖的区域的特征值(通常使用最大池化)。例如,对在连续坐标系上的 x 计算 [x/16] ,其中 16 是feature map的stride, [.] 表示四舍五入。同样地,当对RoI分块时(例如 7∗7 )时也执行同样的计算。这样的计算让RoI与提取的特征错位。虽然这可能不会影响分类,因为分类对小幅度的变换具有一定的鲁棒性,但它对预测像素级精确的掩码有很大的负面影响。
为了解决RoIPool量化引入的问题,提出RoIAlign层,将提取的特征和输入准确对齐。改进:避免对RoI的边界或bins进行量化(避免四舍五入,取 x/16 )。使用双线性插值精确计算每个位置的精确值,并将结果汇总(使用最大池化或平均池化)。
双线性插值:
如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,这个很简单,然后根据R1和R2对P点进行插值,这就是所谓的双线性插值。
解耦掩码和分类至关重要:
定义 Lmask 方式使得网络生成每个类别的mask不会受到类别竞争影响,解耦了mask和类别预测。这与通常FCN应用于像素级Softmax和多重交叉熵损失的语义分段的做法不同。在这种情况下,掩码将在不同类别之间竞争。而在mask R-CNN中,使用了其他方法没有的像素级的Sigmoid和二进制损失。
Dataset & metrics
Related methods: MNC
MNC:
Multi Network Cascade 多任务网络级联,COCO 2015分割挑战的冠军
一个复杂的多级级联模型,从候选框中预测候选分割,然后进行分类。
Related methods: FCIS
FCIS:
fully convolutional instance segmentation 全卷积实例分割,COCO 2016分割挑战的冠军
用全卷积得到一组位置敏感的输出通道候选。这些通道同时处理目标分类,目标检测和掩码,这使系统速度变得更快。但FCIS在重叠实例上出现系统错误,并产生虚假边缘。
以下实验部分请参考论文。
Segmentation results
Detection results
Ablation experiments
Human pose estimation
网络架构:
为了证明这个方法的普适性,论文中构造了多种不同的Mask R-CNN。
对于上层网络,扩展了ResNet和FPN中提出的Faster R-CNN上层网络,分别添加了一个掩码分支。图中数字表示分辨率和通道数,箭头表示卷积、反卷积或全连接层,其中卷积减小维度,反卷积增加维度,所有卷积都是 3∗3 ,除了输出层是 1∗1 的,反卷积是 2∗2 ,stride为2,隐藏层使用ReLU。res5表示ResNet的第五阶段,图中修改了第一个卷积操作,使用 7∗7 ,步长为1的RoI代替 14∗14 ,步长为2的RoI。下图中的” ×4 ”表示堆叠的4个连续的卷积。
ResNet-C4的上层网络包括ResNet的第五阶段(即9层的“res5”),对于FPN,下层网络已经包含了res5,因此可以使上层网络包含更少的卷积核而变的更高效。
FPN:
Feature Pyramid Network 特征金字塔网络
FPN使用具有横旁路连接的自顶向下架构,以从单尺度输入构建网络中的特征金字塔。使用FPN的Faster R-CNN根据其尺度提取不同级别的金字塔的RoI特征,不过其他部分和平常的ResNet类似。使用ResNet-FPN进行特征提取的Mask R-CNN可以在精度和速度方面获得极大的提升。
参考博客(如有侵权请告知)
基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
目标检测方法简介:RPN(Region Proposal Network) and SSD(Single Shot MultiBox Detector)
CNN目标检测(一):Faster RCNN详解
深度卷积神经网络在目标检测中的进展
faster-rcnn原理及相应概念解释
目标检测分割–Mask R-CNN
Mask R-CNN论文翻译
三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法
文中插图来源:
maskrcnn_slides.pdf