Mask RCNN

来源:互联网 发布:java破解单机游戏大全 编辑:程序博客网 时间:2024/05/18 03:04

本文概览

  • 简单灵活且效果好的用于分割和关键点检测的算法;

  • 在Faster RCNN上进行简单的扩展使其能够完成物体分割或关键点检测等任务;

  • 没有使用任何额外的技巧,可以在多个物体分割和关键点检测数据集上获得最好的实验效果;

  • 相比传统复杂的物体分割方法,本文提出的方法非常灵活简单并且效果好;

  • 主要是在Faster RCNN中的RPN网络后面增加一个和预测物品类别并行的分支,用于预测分割mask;

  • 新增加的分支是一个小的全卷积结构,对每一个需要进行类别预测的RoI都进行分割mask预测;

  • 本文方法仅仅在原Faster RCNN基础上增加了小的计算量,训练和测试速度快;

  • 由于分割任务和检测任务对像素对齐的要求不同,本文将RoI Pooling改进为RoIAlign;

  • RoIAlign相对RoI Pooling在分割任务中可以大大提升预测精度;

  • 本文作者指出对类别预测和mask预测进行解耦和操作是至关重要的,即为每一个类别单独预测mask并且不同类别之间的mask是不会相互竞争的,有多少个类别就有多少个mask,针对每个类别单独训练其mask;

  • 在进行关键点预测任务中,目标位K个one-shot二进制响应图;

  • 训练成本:COCO分割数据集需要8-GPU训练2天,测试成本:单GPU,200ms处理一张图片;

  • 可以在本文的思想方法基础上做其他的基于已知物体检测模型的拓展工作;

Mask RCNN算法核心

  • 两阶段过程,第一阶段为RPN提取RoI,第二阶段为每个RoI并行预测物体类别,bbox回归框,二进制mask;

  • 对每个RoI定义多任务损失:L=Lcls+Lbox+LmaskLclsLbox定义参考Fast RCNN;

  • Lmask:mask分支损失,每个ROI经过mask分支预测Km2个mask图,对mask图中每个像素做sigmoid操作。定义Lmask为平均交叉熵损失,且对于第k个类别的RoI,Lmask仅在第k个响应图上进行计算,其他的mask输出对损失函数没有贡献;

  • 通过上述mask loss的定义方式达到每个类别的mask单独预测,不同类别之间不相互影响的目的;

  • 在测试过程中,先通过分类分支预测物品类别,再通过mask分支选择相应输出响应图;

  • 新增加的mask分支采用全卷积结构,参数少性能好;

RoIAlign

  • 代替RoI Pooling,弥补RoI Pooling在分割任务中的不足;

  • RoI Pooling缺陷:RoI Pooling计算过程中的量化会引入RoI和所提取特征之间的不对齐现象,这种现象在分类中不会有很大影响,因为分类问题对小的位移拥有强鲁棒性,但是这种现象在分割这种像素级别分类的任务中有很大的不良影响;

  • RoIAlign特点:计算过程中去掉RoI Pooling的量化过程,使得RoI和所提取的特征之间对齐;

  • RoIAlign计算:使用双线性插值计算输入特征的每个RoI Bin的四个常规采样位置的精确的值,并最后通过max 或者 average Pooling得到最终计算结果;

网络结构

  • 对每一个RoI都进行分类预测,回归预测以及mask预测;

  • 主体结构采用ResNet-50-C4,ResNet-101-C4,ResNeXt-50-C4和ResNeXt-101-C4;

  • 为进一步提升性能,在原始的Faster RCNN主体框架中引入FPN,即从不同分辨率的层通过RoIAlign提取特征并进行整合,用以更好的预测结果,同时参与反传;

网络结构图

  • 除最后一层输出外,所有卷积层都是3*3卷积核,最后一个输出层采用1*1卷积核,反卷积层采用2*2卷积核以及步长为2,使用RELU作为激活函数,在ResNet中将C5的第一个卷基层的stride由2改为1;

分割训练实现细节

  • 和ground truth之间的IoU大于0.5的RoI被认为是正样本,否则为负样本;

  • 当且仅当RoI为正样本时才考虑计算mask loss;

  • mask target为RoI和mask ground truth相交的部分;

  • 图片的短边缩放到800;

  • 每个mini-batch包含2张图片,使用8GPU训练,即batch size为16;

  • coco上迭代16W次,初始学习率为0.02,12W次迭代后降低为0.002,weight decay为0.0001;

  • RPN后样本数为64(Faster RCNN)或512(FPN),的正负样本比例为1:3;

  • RPN(5 scales,3 ratios)单独训练,不和Mask RCNN共享特征,但是共用一个统一的主干网络;

分割测试实现细节

  • RPN提供300个(Faster RCNN)或1000个(FPN)候选框;

  • 对RPN的候选框进行类别预测得到类别k,

  • 预测得分前100的进入分割分支进行mask预测,取第k个mask即为mask预测结果;

  • 对mask预测结果缩放到RoI尺度,最后进行以0.5为阈值的二值化操作;

  • 测试速度比Faster RCNN慢20%;

分割实验结果

  • 80k训练样本,35k验证样本,5k测试样本;

  • ResNeXt-101-FPN效果最好;

人体关键点检测训练实现细节

  • K个关键点,K个mask,每个mask大小为m2负责一个关键点,为one-shot二进制图;

  • 仅可见的关键点会对损失函数有贡献;

  • 不同于分割任务中对每个点做sigmoid后的平均交叉熵损失,关键点检测任务中采取对一个mask中的m2个元素进行softmax后,最小化可见关键点的平均交叉熵损失,其他的点均ignore;

  • 使用ResNet-FPN主干结构,mask分支部分为8个3*3*512的卷积层+1个反卷积层+2个双线性插值层进行上采样,最后输出mask分辨率为56*56,高分辨率输出有利于关键点检测;

  • 训练数据集同分割任务相同,迭代90k次,学习率参数同分割任务相同,在迭代60k和80k时分别降低一次学习率;

个人思考

  • 在分割任务中,对类别预测和mask预测进行解耦和操作是合理的,但是关键点预测任务中这么做不一定合理;

  • 正如作者所说,希望可以将人体关键点检测领域的知识,即对关键点结构进行建模,可以补充到Mask RCNN用于关键点检测的问题中;

代码实现

  • 未完待续;