titile | Mask R-CNN |
---|---|
url | https://arxiv.org/pdf/1703.06870.pdf |
动机 | 目标检测和语义分割迅速发展,主要因为有Faster R-CNN和FCN这样的基础系统,所以开发一个简单、灵活、快速的实例分割模型。 FCN每像素多类分类,分割和分类同时进行,分割效果不佳,DeepMask先分割再识别,速度慢、准确率低。全卷积实例分割(FCIS)一组通道同时得到结果,重叠实例出现系统错误,产生虚假边缘。本文解耦mask and class prediction,mask分支只预测binary mask |
内容 | 在Faster R-CNN基础上加入segmentation masks预测分支(基于ROI,FCN网络,binary mask); 提出RoIAlign层,得到精确地空间位置,mask accuracy提高到10%至50%; 容易扩展到更复杂任务,框架灵活(人体姿势估计任务)。 多任务损失函数: L = Lcls + Lbox + Lmask 前两个与Faster R-CNN相同,Mask分支每个RoI的输出维度为Km2 ,表示K个分辨率为m × m的binary masks。每个类别一个分辨率为m × m的binary masks,K表示classes。每个像素采用sigmoid,并定义Lmask为平均二进制交叉熵损失。ground-truth为k的RoI,仅在第k个mask上计算Lmask(其他掩模输出不计入损失)。 优势:FCNs像素级softmax和multinomial交叉熵损失,masks跨类别竞争。Mask R-CNN,classification分支得到类别,像素级的sigmod和binary损失,不会垮类别竞争。这是改善实例分割结果的关键。 ![]() Mask Representation:mask编码输入物体空间布局,卷积保留空间维度,比fc参数少。 RoIAlign: ![]() 解决方案:选取每个RoI分块中(根据RoI尺寸分块)的四个常规位置,使用双线性插值计算每个位置的精确值,最大或平均池化得到结果。(选择四个常规位置,以便可以使用最大或平均池化。其实只在每个分块中心取一个值(没有池化)或多个值几乎同样有效。) ![]() ![]() 采用image-centric的训练,图像短边缩放到800像素。mini-batch每个GPU2个图像,每个图像有N个RoI,正负比例为1:3。C4网络N为64,FPN为512。使用8个GPU训练(有效mini-batch为16)160k次迭代,学习率为0.02,在120k次迭代时学习率除10。使用0.0001的权重衰减和0.9的动量。 RPN,5 scales and 3 aspect ratios(backbone为ResNet-101+FPN时,由5个尺度层,每个cell3个anchor,而不是每个cell5*3),为方便对照,RPN分开训练,不与Mask R-CNN共享特征。论文中,RPN和Mask R-CNN具有相同的主网络,是共享的。 Mask分支:输入为rpn_rois之后的box数(和分类、回归框分支相同2000),ROI得到14*14的feature map,再upsample到28*28,mask与gt_mask计算loss时,是计算预测box之中mask的真值,而不是gt_box中mask真值。 使用FPN时,RPN环节有P2-P6层用来训练(5个scale),在ROIAlign时只用P2-P5(4个),proposal坐标根据公式选择P2-P5层其中一层进行ROIAlign,框越小,level 越小,(目标小,level低的层保留信息较完善,所以crop level低的层)。 ![]() map_rois_to_fpn_levels 。测试:在测试时,C4网络proposal为300,FPN为1000。proposal边框预测,然后NMS,再将100个最高分的detection boxes用于Mask分支。 测试与训练不同,非并行计算,但扔加速测试并提高精度(RoIs更少更精确)。 Mask分支每个RoI得K个Mask,但只使用第k个Mask,k是classification预测类别。然后将m×m浮点数Mask resize为RoI大小,并使用阀值0.5将其二值化。 Mask分支:输入为回归框分支(输入1000个)筛选后的框(16个),这几个框经过二次ROIAlign得到14*14的feature map,再upsample到28*2。 |
实验 |
主要结果:
![]() Multinomial vs. Independent Masks:解耦的好处 RoIWarp采用双线性采样,仍量化RoI,与输入没有对齐。证明对齐的关键 ![]() Mask R-CNN高于Faster R-CNN:多任务训练的结果。 Mask R-CNN的Mask(Table1)和Bounding Box AP差距小,largely closes the gap between object detection and the more challenging instance segmentation task ![]() 测试:训练ResNet-101-FPN模型,RPN和Mask R-CNN共享特征,遵循Faster R-CNN四级训练。该模型在Nvidia Tesla M40 GPU上处理每个图像需要195ms(加上15ms的CPU时间,用于将输出的大小resize原始分辨率)。ResNet-101-C4 400ms,模型比较复杂。 优化速度:改变图像尺寸和proposal数量,。 训练:COCO trainval 35k上ResNet-50-FPN训练,8GPU实现(0.72s per 16-image mini-batch)需要32个小时,ResNet-101-FPN需要44个小时。 Mask R-CNN人体姿势估计: K类KeyPonits,m*m的one-hot代表一个KeyPoint a relatively high resolution output (compared to masks) is required for keypoint-level localization accuracy ![]() ![]() non-local:提取某处特征时利用其周围点的信息,可以是时间维度,也可以是空间维度,为了获取全局信息(卷积是local information)。论文链接 data distillation: (1) 用手动标注的数据训练模型A,(2) 用模型A去训练数据增广的未标注数据,(3) 将未标注数据的预测结果通过ensembling多个预测结果,转化为labels。(4) 在手动标注和自动标注的数据集重新训练模型论文链接 ![]() |
思考 | 5 fps 仍未实时 demo 图片大小900×600,时间0.2s左右,backbone:resnet101,514.3M 参考1参考2 |
def map_rois_to_fpn_levels(rois, k_min, k_max): # k_min=2, k_max=5
"""Determine which FPN level each RoI in a set of RoIs should map to based
on the heuristic in the FPN paper.
"""
# Compute level ids
s = np.sqrt(box_utils.boxes_area(rois))
s0 = cfg.FPN.ROI_CANONICAL_SCALE # default: 224
lvl0 = cfg.FPN.ROI_CANONICAL_LEVEL # default: 4
# Eqn.(1) in FPN paper
target_lvls = np.floor(lvl0 + np.log2(s / s0 + 1e-6))
target_lvls = np.clip(target_lvls, k_min, k_max)
return target_lvls
网友评论