mask-R-CNN论文问世好久了,但可用的代码好像也不多,至少我是没找到几个。归根结底还是这个算法比较难以实现,要满足论文里面提及的要求还是不太容易的。目前最好的公开代码应该是这个:
https://github.com/matterport/Mask_RCNN
论文地址:
http://xueshu.baidu.com/usercenter/paper/show?paperid=f26173dc2304c9132e5f26fd81484c1a&site=xueshu_se

这篇博客主要是用来记录如何使用自制的数据集在这个代码上测试。我的目的只是用来分割,并不用来分类
根据github文件中的 README.md的指引,用来指导我们利用自制数据集测试的方法在以下几个文件中
在这里插入图片描述
那么这里我以train_shape.ipynb文件里面的代码为讲解示范。首先来讲解以下数据集的数据结构。
首先我们要知道mask-r-cnn是用来干嘛的。它是用来做分割,分类的。所以我们的数据集要具备分割和分类两种信息。分割就是mask,分类就是ids。下面分开讲,看看两种信息需要在我们的数据集中如何提现。
分割
分割功能是在faster-r-cnn上增加的分支,用过mask实现。mask的原理也比较简单,这里我就不多说了,主要说明我们的数据集需要怎么准备。我以细胞核分割为例。
左边的是病理图,灰色的黑斑是细胞核,之所以是灰度图,是因为图片经过染色分离处理,提取出了CD3染色(具体查找染色分离算法),右边是0和255的mask
左边的是病理图(512512),灰色的黑斑是细胞核,之所以是灰度图,是因为图片经过染色分离处理,提取出了CD3染色(具体查找染色分离算法),右边是0和255的mask(512512)
首先,mask-r-cnn代码中默认使用的是三维的彩色图,所以当我们输入灰度图时,会转化成彩色图。
在这里插入图片描述
这个代码在mrcnn/utils.py里面。
因为这个代码本来是要实现分类的,所以必须把图片中的每个对象都创建一个mask。以我的细胞分割来说。上面的mask图中,每个白斑都代表一个细胞,那么就是一共有多少个白斑,我们就需要多少个mask,所以,右边的mask图要转化成下面这种形式
在这里插入图片描述
保持原来的尺寸不变,每个白斑独立一张mask
在这里插入图片描述
上面是用matlab代码实现的,mask一张变成多张。
数据集的制作就完成了,下面是数据结构。
数据结构
我们要注意的是class_ids这个变量。这个是描述每一个mask的类别的。前面说了mask要把一张完整的,弄成多张独立的,大小不变,只保留一个对象。那么这个class就是用来标记每个独立的mask是什么类别的。比如说,细胞图中有肿瘤细胞,免疫细胞两种,那么就是1和2
在这里插入图片描述
比如说一个完整的mask只有这两个细胞,第一个是肿瘤细胞,第二个是免疫细胞,那么我们的class_ids返回就应该是[1,2],具体的代码实现
在这里插入图片描述
因为我不做分类,那么我的label就全部都是1
好了,下面是具体的代码修改了
我们在train_shape.ipynb上面直接修改
在这里插入图片描述
我们首先要修改分类个数,原本是1+3,我改成了1+1.1+3表示,一个背景,加3中类别(原先的代码中是矩形,三角形和原型),我不需要分类,所以我的类别就是1.
在这里插入图片描述
我们要改写原本的load_shape函数,图中画红线的应该保留,我们同时记下image_path(图片路径)和mask_path(mask路径),方便后面的数据加载。
在这里插入图片描述
在这里插入图片描述
同时我们要改写load_image和load_mask函数。load_image函数其实不用怎么改,主要的是load_image函数。在train_shape.ipynb中的load_mask函数是用来画图的,可以直接不用,在mrcnn/untils.py中的load_mask函数坐着留给我们自己写。上面是我自己写的load_mask函数,就是要把跟image对应的所有单独的mask都打包起来,然后还要返回长度和mask数量一致的class_ids如果你需要分类class_ids就不能像我一样全部设置成1,每个类别对应自己的ids。
好了,我们的数据集准备就完成了,我用了120张256256的训练集和40个256256的验证集训练,epoch发现设置在15的时候效果不错
在这里插入图片描述
我说的效果不错仅仅是在这么多epoch中效果不错,跟我想要的效果还是相差甚远。分割的准确度远远低于unet。
这就是我的一个小测试,欢迎指正。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐