paper:https://arxiv.org/abs/1703.06870

code:https://github.com/matterport/Mask_RCNN

mask rcnn是基于faster rcnn的改进的一种实例分割算法(得到目标实例同时也生成bbox,检测结果也刷出新高),由目标检测算法直接引申到实例分割领域,典型的top-down,也叫做 detect-then-segment,顾名思义,先检测后分割。在实例分割上一度领先独领风骚,即便是放在现在,mask rcnn的效果也是各个SOTA算法发表的必备比对数据,本文主要描述我对mask rcnn的理解。

mask-rcnn是基于faster-rcnn的改进,faster-rcnn此篇文章就不回顾了,需要了解的话去看我前2篇文章。

模型总体结构:

先上结构图(来源:https://www.cnblogs.com/haimingv/p/12490957.html)

结构与faster rcnn一脉相承,利用backbone获取feature_map后,第一阶段利用RPN获取propossals,第二阶段基于proposals利用mask rcnn独有的Roi Align将proposals映射回原图,再对这些proposals进行bobx regression、classcification、instance segmentation。

与faster rcnn的区别:

1、将faster rcnn的Roi Pooling模块修改为Roi Align模块,修复了像素级的映射损失

2、将faster rcnn的cls+reg任务增加为cls+reg+instance_seg的3个任务

3、backbone:增加了fpn结构(当年的sota结构)

4、引入mask loss:稍后细节一下讨论

整体模型架构图(相当详细,图片来源:https://www.cnblogs.com/haimingv/p/12490957.html-后续的模块分析基于本张图进行):

详细模块解读:

1、backbone+fpn:

上图为基于resnet101的fpn的结构,renet中的基础shortcut block应该是bottleneck,由backbone得到c1-c5后:

将c5进行1*1的卷积减少通道数至256生成p5,p5进行3*3的卷积生成256通道数p5;

p5上采样*2 + c4进行1*1卷积减少通道数至256生成p4,p4进行3*3卷积生成256通道数p4,

p4上采样*2 + c3进行1*1卷积减少通道数至256生成p3,p3进行3*3卷积生成256通道数p3,

p3上采样*2 + c2进行1*1卷积减少通道数至256生成p2,p2进行3*3卷积生成256通道数p2,

p5还要进行一次最大池化尺寸/2生成p6(仅rpn使用);

即[p2,p3,p4,p5,p6] -> RPN, [p2,p3,p4,p5] -> mask rcnn

2、anchors机制和proposals机制

RPN利用[p2,p3,p4,p5,p6]这5个尺度,每个尺度上的特征图生成3个anchors,比例是[0.5, 1, 2],然后将5个尺度上的anchors叠加成为RPN所使用的anchors;

RPN在5个尺度上的每个特征图经过RPN网络生成两部分结果,第一部分是rpn_class_logits(每个anchors对应的BG/FG类别logits)和rpn_class_prob(每个anchors的类别置信度),第二部分是rpn_box(每个anchors的偏移量[dy, dx, log(dh), log(dw)]),得到每个尺度的类别和偏移,然后将五个尺度叠加合成RPN网络输出的类别和偏移;

接下来判定需要生成的预选框(proposals),将RPN网络生成的偏移量更新给anchors,并生成经过细化/nms(非极大抑制)后的归一化预选框,为之后的训练(2000个)/预测(1000个)使用;

3、RoiAlign模块

Rol Align很好的解决了 RoI Pooling操作中两次量化造成的像素级的误差问题(mis-alignment),此处先简单分析一下RoI Pooling的原理:

3.1、RoI Pooling

在faster rcnn中,anchors经过proposals layer成为proposal,经过RoI Pooling进行size的归一化然后进入固定input-size的全连接网络,步骤如下:

1、将proposal映射到feature map对应位置

2、将映射后的区域划分为相同到校的sections

3、对每个sections进行max pooling操作

3.2、RoI Pooling的问题所在

RoI pooling的作用时根据proposal(初步bbox)的位置坐标在特征图中将相应区域池化为固定size(7*7)的feature-map,然后进行后续的分类和bbox回归工作。

从上文的颜色对误差来源进行分析:

1、将候选边界框边界量化为整数点的feature-map坐标值。假定gt为[665*665],下采样32倍,则RoI Pooling将其变为665/32=20.78后-四舍五入等于20,则gt在32倍feature-map上的值为[20,20](此例见下图的第一部分)。

2、将量化后的边界区域(feature-map坐标值-proposal)平均分成k*k(固定size)个单元(固定feature-map)。假定gt在32被feature-map上的坐标为[20,20],池化为7*7时,则量化后的边界区域平均分割为7*7个矩形区域,每个矩形区域边缘为2.86,但是池化时只能将其量化为2,2*7=14,还有6个单位的feature被直接忽略掉了,则候选区域在最终做分类和回归任务时明显出现了极大的偏差,如下图的绿色feature为真正使用到的,绿色框之外的全部被忽视掉了。

简单来说,整形坐标在映射到整形feature-map,会出现第一次误差,在做固定尺寸的max-pool时,会出现第二次误差。

图片来源:https://blog.csdn.net/wangdongwei0/article/details/85268965

3.3、Roi Align的主要思想和方法

取消量化操作。

1、遍历每一个候选区域,保持浮点边界,不做量化

2、将候选区域分割为k*k个单元,每个单元的边界也不做量化

3、将每个单元中固定规则固定四个坐标位置,用双线性插值的方法计算出这4个位置的值,然后进行最大池化操作(详细理解见下文)。

如上图所示,固定的4个坐标位置指的是每一个矩形单元(bin)中按照固定规则确定的位置,比如采样点是1,则就是单元的中心点,如果采样点是4,就是把这个单元平均分割成4个小方块以后它们分别的中心点,如上图所示,显然这些采样点通常为浮点型数,因此利用插值的方法得到他们的像素而不是之前的直接量化后读取,在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。

Roi Pooling是直接全部取整,则第一步获得到的proposal自然就是整形坐标,也可以直接读取到对应位置的特征,划分成bins以后,然后roi pooling直接利用这些划分bins的特征进行最大池化得到固定尺寸的feature。

RoI Align是全部使用浮点,然后使用浮点划分位置,得到位置后,划分好bins,对每个bins进行4个点的采样,每个点都使用距离最近的四个像素点(feature点)进行双线性插值得到,依次对4个点完成操作后,在对这4个值进行max-pool得到固定尺寸的feature。

具体形象化流程如下:https://blog.csdn.net/qinghuaci666/article/details/80900882(以下的Roi Align为摘自该链接的理解,侵删,该链接进一步的给出了旷视针对只采样4个点进行插值的精度进一步改进方法)

从左至右依次顺序执行:

更进一步的,给出一个7*7的执行实例:

输出7*7的fix featrue:

1、划分7*7的bin(我们可以直接精确的映射到feature map来划分bin,不用第一次量化)

2、每个bin中采样4个点,双线性插值

3、对每个bin4个点做max或average pooling

# pytorch
# 这是pytorch做法先采样到14*14,然后max pooling到7*7
pre_pool_size = cfg.POOLING_SIZE * 2
grid = F.affine_grid(theta, torch.Size((rois.size(0), 1, pre_pool_size, pre_pool_size)))
crops = F.grid_sample(bottom.expand(rois.size(0), bottom.size(1), bottom.size(2), bottom.size(3)), grid, mode=mode)
crops = F.max_pool2d(crops, 2, 2)
# tensorflow
pooled.append(tf.image.crop_and_resize(
                feature_maps[i], level_boxes, box_indices, self.pool_shape,
                method="bilinear"))

4、head部分

总体框架图如上,将生成的rois放入head网络,网络分为两部分,

第一部分是fc层的生成2个结果,一个是类别(class+bg)-class-prob,一个是坐标回归(每个rois的坐标偏移量[dy, dx, log(dh), log(dw)]);

第二部分是全卷积分割网络生成mask结果,大小为28*28*channels(class_num)的mask图,通道数为分类数。

训练的时候然后开始进行loss函数的计算,而推理阶段forward过程结束。

模型损失函数:

mask分支对于每个RoI有K*m*m 维度的输出。K个(类别数)分辨率为m*m的二值mask。
因此作者利用了a per-pixel sigmoid,并且定义 Lmask 为平均二值交叉熵损失(the average binary cross-entropy loss).
对于一个属于第k个类别的RoI, Lmask 仅仅考虑第k个mask(其他的掩模输入不会贡献到损失函数中)。这样的定义会允许对每个类别都会生成掩模,并且不会存在类间竞争

参考:

https://blog.csdn.net/qinghuaci666/article/details/80900882

two-stage-anchor-based-faster-rcnn进阶-mask rcnn:Mask R-CNN相关推荐

  1. ResNet、Faster RCNN、Mask RCNN是专利算法吗?盘点何恺明参与发明的专利

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前段时间OpenCV正式将SIFT算法的实现从Non-free模块移到主库,因SIFT专利到期了(专利 ...

  2. # 经典目标检测识别方法概述RCNN/FAST/FASTER RCNN/MASK RCNN/SSD/DSSD/YOLO V1/YOLO V2等

    经典目标检测识别方法概述@陈子逸 经典目标检测识别方法概述 由于水硕期间自学了一些目标探测的方法,这里做一个概述,肯定有不完美的地方,还请指正一起进步. 综述 1.分别简单描述一下RCNN系列: 在我 ...

  3. 完整代码+实操!手把手教你操作Faster R-CNN和Mask R-CNN

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 机器视觉领域的核心问题之一就是目标检测(Object Detection),它的任务是找出图像当中所有感 ...

  4. 实例分割的进阶三级跳:从 Mask R-CNN 到 Hybrid Task Cascade

    本文转载自知乎,介绍的Hybrid Task Cascade为ECCV 2020 大规模实例分割挑战赛LVIS Challenge冠军方案(成员来自同济.清华.商汤科技)的基线模型.已获作者授权转载. ...

  5. ResNet、Faster RCNN、Mask RCNN 是专利算法吗?盘点何恺明参与发明的专利!

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:我爱计算机视觉,52CV君 AI博士笔记系列推荐 周志华&l ...

  6. 实例分割模型Mask R-CNN详解——从R-CNN,Fast R-CNN,Faster R-CNN再到Mask R-CNN

    转载自 jiongnima 原文链接 https://blog.csdn.net/jiongnima/article/details/79094159 Mask R-CNN是ICCV 2017的bes ...

  7. CNN:RCNN、SPPNet、Fast RCNN、Faster RCNN、YOLO V1 V2 V3、SSD、FCN、SegNet、U-Net、DeepLab V1 V2 V3、Mask RCNN

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CNN: 目标检测: RCNN SPPNet Fast RCN ...

  8. 动手学深度学习——目标检测 SSD R-CNN Fast R-CNN Faster R-CNN Mask R-CNN

    来源:13.4. 锚框 - 动手学深度学习 2.0.0-beta1 documentation 目标检测:锚框算法原理与实现.SSD.R-CNN_神洛华的博客 目录 目标检测简介 目标检测模型 ​编辑 ...

  9. 实例分割模型Mask R-CNN详解:从R-CNN,Fast R-CNN,Faster R-CNN再到Mask R-CNN

    Mask R-CNN是ICCV 2017的best paper,彰显了机器学习计算机视觉领域在2017年的最新成果.在机器学习2017年的最新发展中,单任务的网络结构已经逐渐不再引人瞩目,取而代之的是 ...

  10. faster rcnn接口_源码解析faster rcnn (mask rcnn)全过程

    1. 总领过程--官方faster cnnn 调用过程 import torchvision, torch # 导入官方faster rcnn 模型 model = torchvision.model ...

最新文章

  1. iPhone用户状告App厂商手脚不干净,偷窥我电脑剪切板干什么
  2. 武大计算机学院推免清北,南大2020年推免生来自哪儿?山大73,武大41,清北5人...
  3. Springboot使用Log4j2的配置详解
  4. 杂谈:项目管理的是与非[转贴]
  5. UE4学习-设置地图,创建材质
  6. python ftp下载文件_文件上传下载Python
  7. MongoDB 官方C#驱动 封装 DbHelper
  8. 除了汪峰,还有哪些明星跨界做智能硬件
  9. es基于completion suggest实现搜索提示
  10. Unity3D学习笔记(二十五):文件操作
  11. sharelatex在centos 6.7 64位上的部署(1)
  12. Origin绘图快速上手指南
  13. 互联网晚报 | 7月6日 星期三 |​ 微信内测一个手机可注册俩号;度小满回应村镇银行储户存款变理财;市监局回应钟薛高雪糕烧不化...
  14. Ubuntu20.04下opencv的安装
  15. BP神经网络的应用—分析
  16. 从oracle临时表理解会话与链接
  17. 【电赛练习】手写绘图板 2013电赛G题
  18. 微软并购雅虎案:世界商业三巨头的财智较量
  19. python sasl_Pyhive、SASL和Python 3.5
  20. 有人晒出程序员聚餐照片,网友:根据头发量能看出技术水平高低!

热门文章

  1. 递归和循环优劣以及对递归理解
  2. 【图文教程】监控系统命令
  3. 游戏工作室换IP与挂机的基础知识
  4. ROG 双系统安装+系统切换
  5. Eclipse ADT常用快捷键
  6. eclipse包含jdk吗_eclipse安装教程jdk
  7. 基于PaddlePaddle实现声音分类
  8. python文件切割
  9. html进度条实现原理,HTML5 progress进度条详解
  10. 表格 列与列之间的间距