今天将继续分享从网络结构上进行改进提出PEVNet模型来分割脑肿瘤。为了方便大家学习理解整个分割流程,我将整个流程步骤进行了整理,并给出每个步骤的结果,希望对大家有所帮助。
一、Project&Excite模块介绍
在前面的文章中已经介绍过SE模块,详细请阅读BraTS18——多模态MR图像脑肿瘤分割挑战赛续4。Project&Excite模块是对SE模块的改进,SE模块将输入特征图的空间信息压缩为每个通道为一个标量值,论文作者指出大尺寸输入特征会保留相关的空间信息,而SE模块的全局池化操作可能无法正确捕获这些空间信息,Project&Excite模块通过从三个不同维度进行池化操作,学习到了跨不同通道映射之间的相互依赖性,将上下文空间和通道进行结合来重新标定输入特征。Project&Excite模块结构如下所示。
复现的tensorflow实现代码如下所示。
def project_excitation_layer(x, out_dim, ratio=4, height=None, width=None, image_z=None, scope=None):
with tf.name_scope(scope):
_, Z, H, W, C = x.get_shape().as_list()
if H == None and W == None and Z == None:
Z, H, W, C = image_z, height, width, out_dim
# Global_Average_Pooling,whz_squeeze
squeezew = tf.reduce_mean(x, axis=(1, 2), name=scope + 'squeezew')
squeezeh = tf.reduce_mean(x, axis=(1, 3), name=scope + 'squeezeh')
squeezez = tf.reduce_mean(x, axis=(2, 3), name=scope + 'squeezez')
squeezew = tf.reshape(squeezew, (-1, 1, 1, W, C))
squeezeh = tf.reshape(squeezeh, (-1, 1, H, 1, C))
squeezez = tf.reshape(squeezez, (-1, Z, 1, 1, C))
final_squeeze = tf.add(squeezew, squeezeh)
final_squeeze = tf.add(final_squeeze, squeezez)
# full_connect
excitation = conv_relu(final_squeeze, kernal=(1, 1, 1, out_dim, out_dim // ratio),
scope=scope + 'excitation1')
excitation = conv_sigomd(excitation, kernal=(1, 1, 1, out_dim // ratio, out_dim),
scope=scope + 'excitation2')
# scale the x
scale = tf.multiply(x, excitation)
return scale
二、脑肿瘤图像分析与预处理
(1)、多模态MR脑肿瘤图像分析。
分析的过程基本上跟上一篇一致,这里就不多言了,直接从数据处理开始。
(2)、准备脑肿瘤分割数据。
首先将4个模态序列的MR原始图像进行合并生成4个通道的三维图像,原始图像大小都是(240x240x155x1),合并后大小是(240x240x155x4);
其次对Mask图像进行one-hot操作,将原始图像大小都是(240x240x155x1),生成大小是(240x240x155x4):通道0中非零值区域是背景区域,通道1中非零值是坏疽区域,通道2中非零值是浮肿区域,通道3中非零值是增强肿瘤区域;
最后对图像和Mask进行分块——取Patch操作,生成若干个(128,128,64)大小的图像和Mask,判断并输出非零的Mask和对应的图像。
三、脑肿瘤分割
(1)、搭建PEVNet3d模型,与VNet3d模型不同之处在于增加了多个PENet模块,网络输入大小是(128x128x64)。
(2)、loss采用的是多类Focalloss,具体实现可以点击原文链接查看具体代码。
(3)、训练的损失函数和精度如下图所示。
(4)、脑肿瘤分割推理过程:首先将原始flair,T1,T2,T1ce图像一起读取进来并进行z-score标准化操作,然后将四个模态图像合并成4通道三维图像(240x240x155x4),输入到网络中去,网络输入大小是(240x240x48x4),在z方向上分块输入并拼接最终得到(240x240x155)分割结果。
(5)、进行了结果测试,左边是金标准图像,右边是预测结果图像,如下所示。
了大家更好的学习,我把PEVNet网络代码分享到github上:
https://github.com/junqiangchen/VNetFamily
如果大家觉得这个项目还不错,希望大家给个Star并Fork,可以让更多的人学习。如果碰到任何问题,随时留言,我会尽量去回答的。