涉及到的知识点补充:

FasterRCNN:https://www.cnblogs.com/wangyong/p/8513563.html

RoIPooling、RoIAlign:https://www.cnblogs.com/wangyong/p/8523814.html

FPN:https://www.cnblogs.com/wangyong/p/8535044.html

首先,先看两张图(第一张图来源于论文,第二张图来源于网络),如下:

(图1)

(图2)

图1:可以看出MaskRCNN在有效检测目标的同时输出高质量的实例分割mask

图2:可以看出MaskRCNN的网络结构,作为FasterRCNN的扩展

1):用RolAlign代替了RoIPooling,RoIPooling使用取整量化,导致特征图RoI映射回原图RoI时空间不对齐明显,造成误差;RolAlign不使用取整量化而是采用双线性插值,完成像素级的对齐;

2):FasterRcnn为每个候选对象ROI提供两个输出,一个类标签,一个边界框偏移量,为此,MaskRCNN并行添加了第三个分割mask的分支,mask分支是应用到每一个ROI上的一个小的FCN(Fully Convolutional Network),以pix2pix的方式预测分割mask。

MaskRCNN具有很好的泛化适应能力,可以和多种RCNN框架结合,比较常见的如:

1)FasterRCNN/ResNet;

2)FasterRCNN/FPN

在接下来的文章介绍中则主要结合FPN网络记录MaskRCNN的工作原理

如果要说清楚MaskRCNN的工作原理,先从数据标注开始,知道如何制作数据集,对理解网络有帮助

一)、数据标注

利用labelImg和labelme的源码,整合成一套新的标注工具,同时支持矩形和多边形的绘制,界面如下图(从上到下,从左到右依次是:菜单栏、工具箱、文件列表展示区、主图绘制区、标签展示区、状态栏):

绘制完成,点击保存后,会将图中绘制的点坐标信息保存到JSON文件中,JSON文件的格式如下:

每一张图片会产生一个与其同名的JSON文件,文件夹中的格式如下图所示:

注:一张图片只需对应一张JSON文件即可,而网络在训练的时候需要一个‘mask图片’,这个会在代码中利用JSON中坐标点临时生成

二)、网络原理

MaskRCNN作为FasterRCNN的扩展,产生RoI的RPN网络和FasterRCNN网络一样,如想详细了解这个过程,可以参看文章上述给出的FasterRCNN的博文,这里不太叙述RPN网络的原理,重点看下MaskRCNN其余部分的理解;

源码:https://github.com/matterport/Mask_RCNN

结构:ResNet101+FPN

代码:TensorFlow+ Keras(Python)

代码中将Resnet101网络,分成5个stage,记为[C1,C2,C3,C4,C5];如果了解FPN网络(也可以参看上面提供的FPN网络博文链接),知道这里的5个阶段分别对应着5中不同尺度的feature map输出,用来建立FPN网络的特征金字塔(feature pyramid).

先通过两张MaskRCNN整体网络结构图,再附带一张绘制了stage1和stage2的层次结构图(stage3到stage5的结构层次比较多,未绘制),来整体了解下MaskRCNN网络。

MaskRCNN网络结构泛化图:

MaskRCNN网络结构细化图(可放大看):

stage1和stage2层次结构图:

结合MaskRCNN网络结构图,注重点出以下几点:

1) 虽然事先将ResNet网络分为5个stage,但是,并没有利用其中的Stage1即P1的特征,官方的说法是因为P1对应的feature map比较大计算耗时所以弃用;相反,在Stage5即P5的基础上进行了下采样得到P6,故,利用了[P2 P3 P4 P5 P6]五个不同尺度的特征图输入到RPN网络,分别生成RoI.

2)[P2 P3 P4 P5 P6]五个不同尺度的特征图由RPN网络生成若干个anchor box,经过NMS非最大值抑制操作后保留将近共2000个RoI(2000为可更改参数),由于步长stride的不同,分开分别对[P2 P3 P4 P5]四个不同尺度的feature map对应的stride进行RoIAlign操作,将经过此操作产生的RoI进行Concat连接,随即网络分为三部分:全连接预测类别class、全连接预测矩形框box、     全卷积预测像素分割mask

3)损失函数:分类误差+检测误差+分割误差,即L=Lcls+Lbox+Lmask

Lcls、Lbox:利用全连接预测出每个RoI的所属类别及其矩形框坐标值,可以参看FasterRCNN网络中的介绍。

Lmask:

① mask分支采用FCN对每个RoI的分割输出维数为K*m*m(其中:m表示RoI Align特征图的大小),即K个类别的m*m的二值mask;保持m*m的空间布局,pixel-to-pixel操作需要保证RoI特征 映射到原图的对齐性,这也是使用RoIAlign解决对齐问题原因,减少像素级别对齐的误差。

K*m*m二值mask结构解释:最终的FCN输出一个K层的mask,每一层为一类,Log输出,用0.5作为阈值进行二值化,产生背景和前景的分割Mask

这样,Lmask 使得网络能够输出每一类的 mask,且不会有不同类别 mask 间的竞争. 分类网络分支预测 object 类别标签,以选择输出 mask,对每一个ROI,如果检测得到ROI属于哪一个分 类,就只使用哪一个分支的相对熵误差作为误差值进行计算。(举例说明:分类有3类(猫,狗,人),检测得到当前ROI属于“人”这一类,那么所使用的Lmask为“人”这一分支的mask,即,每个class类别对应一个mask可以有效避免类间竞争(其他class不贡献Loss)

② 对每一个像素应用sigmoid,然后取RoI上所有像素的交叉熵的平均值作为Lmask。

由于MaskRCNN网络包含了很多之前介绍过的知识点,例如RPN,FPN,RoIPooling,RoIAlign,故这遍文章看上去显得比较‘单薄’,如果想弄清楚MaskRCNN网络,还是可以需要结合文章一开头提到的几遍博文一起阅读…

文章开头的时候,利用自己的标注工具,对细胞图片进行标注,每个图片产生一个JSON文件,通过训练后,测试效果如下(标注的图片不是很多,效果还行):

     

作为一枚技术小白,写这篇笔记的时候参考了很多博客论文,在这里表示感谢,同时,转载请注明出处......

如有疑问,欢迎留言...

Mask RCNN 简单使用的更多相关文章

  1. 论文笔记:Mask R-CNN

    之前在一次组会上,师弟诉苦说他用 UNet 处理一个病灶分割的任务,但效果极差,我看了他的数据后发现,那些病灶区域比起整张图而言非常的小,而 UNet 采用的损失函数通常是逐像素的分类损失,如此一来, ...

  2. 论文阅读笔记三十六:Mask R-CNN(CVPR2017)

    论文源址:https://arxiv.org/pdf/1703.06870.pdf 开源代码:https://github.com/matterport/Mask_RCNN 摘要 Mask R-CNN ...

  3. Mask RCNN 源码阅读(update)

    之前看了Google官网的object_dectect 的源码,感觉Google大神写的还不错.最近想玩下Mask RCNN,就看了下源码,这里刚好当做总结和梳理.链接如下: Google官网的obj ...

  4. 目标检测网络之 Mask R-CNN

    Mask R-CNN 论文Mask R-CNN(ICCV 2017, Kaiming He,Georgia Gkioxari,Piotr Dollár,Ross Girshick, arXiv:170 ...

  5. Mask RCNN 学习笔记

    下面会介绍基于ResNet50的Mask RCNN网络,其中会涉及到RPN.FPN.ROIAlign以及分类.回归使用的损失函数等 介绍时所采用的MaskRCNN源码(python版本)来源于GitH ...

  6. 物体检测之FPN及Mask R-CNN

    对比目前科研届普遍喜欢把问题搞复杂,通过复杂的算法尽量把审稿人搞蒙从而提高论文的接受率的思想,无论是著名的残差网络还是这篇Mask R-CNN,大神的论文尽量遵循著名的奥卡姆剃刀原理:即在所有能解决问 ...

  7. Mask RCNN 原理

    转自:https://blog.csdn.net/ghw15221836342/article/details/80084861 https://blog.csdn.net/ghw1522183634 ...

  8. Mask R-CNN论文理解

    摘要: Mask RCNN可以看做是一个通用实例分割架构. Mask RCNN以Faster RCNN原型,增加了一个分支用于分割任务. Mask RCNN比Faster RCNN速度慢一些,达到了5 ...

  9. [代码解析]Mask R-CNN介绍与实现(转)

    文章来源 DFann 版权声明:如果你觉得写的还可以,可以考虑打赏一下.转载请联系. https://blog.csdn.net/u011974639/article/details/78483779 ...

随机推荐

  1. android 面试准备基础题

    1.    请描述下Activity的生命周期. 必调用的三个方法:onCreate() --> onStart() --> onResume(),用AAA表示 )父Activity启动子 ...

  2. 【洛谷P1972】HH的项链 离线+树状数组

    题目大意:静态查询序列区间颜色数. 题解:对于一个查询区间 [l , r] ,若有两个相同颜色的点在这个区间中,则总是取下标靠近端点 r 的颜色计入答案贡献.对于每个下标,记录下在这个下标之前,且距离 ...

  3. 03-body标签中相关标签

    今日主要内容: 列表标签 <ul>.<ol>.<dl> 表格标签 <table> 表单标签 <fom> 一.列表标签 列表标签分为三种. 1 ...

  4. (reverse) Text Reverse hdu1062

    Text Reverse Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  5. 【hihocoder】 Magic Box

    题目1 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. When ...

  6. shell 备份代码

    #!/bin/sh # 备份代码 basedir=/data/backup www_src=$basedir/$(date +%F_$H) [ ! -d "$www_src" ] ...

  7. if语句和case语句用法展示

    if语句和case语句用法展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单分支if条件语句 1>.语法格式一 if [ 条件判断式 ];then 源代码 fi 2& ...

  8. nginx 301 302跳转配置总结

    首先看简单的代码示例,关于nginx 301 302跳转的. 301跳转设置: server { listen 80; server_name 123.com; rewrite ^/(.*) http ...

  9. 网络编程基础【day09】:解决socket粘包之大数据(七)

    本节内容 概述 linux下运行效果 sleep解决粘包 服务端插入交互解决粘包问题 一.概述 刚刚我们在window的操作系统上,很完美的解决了,大数据量的数据传输出现的问题,但是在Linux环境下 ...

  10. python---redis缓存页面实现

    import tornado.web from controllers.BaseController import BaseRequestHandler import redis pool = red ...