今天将继续分享从网络结构上进行改进提出基于距离变换的多任务VNet模型来分割脑肿瘤。为了方便大家学习理解整个分割流程,我将整个流程步骤进行了整理,并给出每个步骤的结果,希望对大家有所帮助。
一、距离变换介绍
在论文《Psi-Net: Shape and boundary aware joint multi-task deep network formedical image segmentation 》中,作者提出使用同一个解码模块和三个并行的编码模块(分割Mask图像,轮廓图像和距离变换图像),并通过轮廓和距离变换的损失函数来对分割损失函数进行正则化保证分割图像边缘的平滑处理,论文网络结构如下图所示。
那就简单说一下距离变换的原理吧。二值图像距离变换的概念由Rosenfeld和Pfaltz于1966年在论文中提出,其主要思想是通过表识空间点(目标点与背景点)距离的过程,最终将二值图像转换为灰度图像。变换的结果是得到一张与输入图像类似的灰度图像,但是灰度值只出现在前景区域,并且越远离背景边缘的像素灰度值越大。具体可以参考原文链接。
这里给出一个简单的代码实现例子。
代码语言:javascript复制from scipy import ndimage
import cv2
img = cv2.imread("Real-DSA-01-Segmentation.png", cv2.IMREAD_GRAYSCALE)
distance_map = ndimage.distance_transform_edt(img)
distance_map = distance_map / distance_map.max() * 255.
cv2.imwrite("distance_map.png", distance_map)
二、脑肿瘤图像分析与预处理
(1)、多模态MR脑肿瘤图像分析。
分析的过程基本上跟上一篇一致,这里就不多言了,直接从数据处理开始。
(2)、准备脑肿瘤分割数据。
首先将4个模态序列的MR原始图像进行合并生成4个通道的三维图像,原始图像大小都是(240x240x155x1),合并后大小是(240x240x155x4);
其次对Mask图像进行one-hot操作,将原始图像大小都是(240x240x155x1),生成大小是(240x240x155x4):通道0中非零值区域是背景区域,通道1中非零值是坏疽区域,通道2中非零值是浮肿区域,通道3中非零值是增强肿瘤区域;
(3)、对图像和Mask进行分块——取Patch操作,生成若干个(128,128,64)大小的图像和Mask,判断并输出非零的Mask和对应的图像。
(4)、对Mask图像的每个非零像素值区域进行距离变换生成distancemap,并将每个distancemap按照通道方向进行合并生成3通道距离变换图像。
三、脑肿瘤分割
(1)、搭建MutilTask-VNet3d模型,与VNet3d模型不同之处在于增加了距离变换的编码模块,网络输入大小是(128x128x64)。
2)、loss函数:分割图像损失是多类Focalloss,距离变换图像损失是均方误差,优化器学习的损失函数是上述两者损失的系数加权求和。
(3)、训练的损失函数和精度如下图所示。
(4)、脑肿瘤分割推理过程:首先将原始flair,T1,T2,T1ce图像一起读取进来并进行z-score标准化操作,然后将四个模态图像合并成4通道三维图像(240x240x155x4),输入到网络中去,网络输入大小是(240x240x48x4),在z方向上分块输入并拼接最终得到(240x240x155)分割结果。
(5)、进行了结果测试,左边是金标准图像,右边是预测结果图像,如下所示。
大家更好的学习,我把MutilTask-VNet网络代码分享到github上:
https://github.com/junqiangchen/VNetFamily
如果大家觉得这个项目还不错,希望大家给个Star并Fork,可以让更多的人学习。如果碰到任何问题,随时留言,我会尽量去回答的。