如何用mask-R-CNN公开代码测试自制数据集

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。
这就是我的一个小测试,欢迎指正。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
R-CNN(Region-based Convolutional Neural Networks)是一种目标检测算法,它通过两个阶段来检测图像中的目标物体。首先,R-CNN使用选择性搜索(Selective Search)算法生成一系列候选区域,然后对每个候选区域进行卷积神经网络(CNN)特征提取和分类。R-CNN的主要缺点是速度较慢,因为每个候选区域都需要独立地进行CNN特征提取和分类。 Fast R-CNN是对R-CNN的改进,它通过引入RoI池化层(Region of Interest pooling)来解决R-CNN中重复计算的问题。RoI池化层可以将不同大小的候选区域映射为固定大小的特征图,从而使得所有候选区域可以共享相同的特征提取过程。这样一来,Fast R-CNN相比于R-CNN具有更快的速度。 Faster R-CNN是对Fast R-CNN的进一步改进,它引入了一个称为Region Proposal Network(RPN)的子网络来生成候选区域。RPN通过滑动窗口在特征图上提取候选区域,并为每个候选区域分配一个得分,然后根据得分进行筛选和排序。这种端到端的训练方式使得Faster R-CNN在目标检测任务上具有更高的准确性和更快的速度。 Mask R-CNN是在Faster R-CNN的基础上进一步发展的,它不仅可以进行目标检测,还可以进行实例分割。Mask R-CNN在Faster R-CNN的基础上增加了一个分支网络,用于预测每个候选区域中目标物体的像素级掩码。这使得Mask R-CNN能够同时获得目标的位置信息和像素级别的语义信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值