涉及到的知识点补充:html
FasterRCNN:http://www.javashuo.com/article/p-vesnskjk-ch.htmlgit
RoIPooling、RoIAlign:http://www.javashuo.com/article/p-xslffnvr-cu.htmlgithub
FPN:http://www.javashuo.com/article/p-ocgsnlhz-bk.html网络
首先,先看两张图(第一张图来源于论文,第二张图来源于网络),以下:框架
(图1)ide
(图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
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文件,经过训练后,测试效果以下(标注的图片不是不少,效果还行):
做为一枚技术小白,写这篇笔记的时候参考了不少博客论文,在这里表示感谢,同时,转载请注明出处......
若有疑问,欢迎留言...