医学影像处理--Unet在Multimodal Brain Tumor Segmentation Challenge 2019上的应用

本文主要是介绍医学影像处理--Unet在Multimodal Brain Tumor Segmentation Challenge 2019上的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

Multimodal Brain Tumor Segmentation Challenge 2019 http://braintumorsegmentation.org/ 是一个脑部肿瘤分割的比赛,主要是利用病人的核磁共振的图像,预测病人脑部胶质瘤的位置,预测病人的生存期,这两部分会有一个排名,这是属于图像的语义分割的问题。

数据分析

原始的数据需要在这个网站上注册下载,分成两部分,train和validation,validation是没有标签的,需要预测出标签然后上传到网站上,最后会给你一个成绩。

数据总共有335个样本,加上127个validation(需要自己做预测的),335个样本里面有259个HGG(高级别胶质瘤)和76个LGG(低级别胶质瘤),数据格式是nifti文件(.nii.gz),需要专门的软件才能打开,这里推荐MITK,下载地址在这http://mitk.org/wiki/Downloads,打开之后应该和下面的样子是差不多的。
在这里插入图片描述
github上有一些医疗影像的常用的操作库,这里推荐SimpleITK,是一个专门的医疗影像的python库,也是我们后面要用的一个库,可以从这个网址上https://github.com/SimpleITK/SimpleITK下载,熟悉一下基本操作。还有一个notebookhttps://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks,就和教程一样,也可以跑一下看看每个操作都会有什么样的效果。

要分析的数据是病人脑部的核磁共振图像,这个图像是三维的,图像大小为240 × \times × 240 × \times × 155,它的成像原理比较复杂,有想更清楚的了解的可以去b站上看看https://www.bilibili.com/video/av19579047,为了简单起见,我就不仔细描述了。只要知道核磁共振图像会产生如下四种模态的三维图像:
(1)原始的T1
(2)T1加权(t1ce)
(3)T2加权
(4)T2的flair
每个样本都包括上面的四个文件,另外还有一个标签,这个标签也是三维的,是在相应的位置上标记为0,1,2,4。具体含义是
0–正常组织
1–坏死和非增强肿瘤核心
2–肿瘤周围水肿
4–GD增强肿瘤
具体的含义也是可以不用深究,只要知道不同的标签是不一样的肿瘤组织就行。

数据预处理

脑部核磁共振影像的值和图片的像素值不太一样,它表示的是一种强度,数值范围在0到2000都是很正常的,所以数据预处理部分是很有必要做的,在数据预处理之前,再来理解医学影像上的一个概念,偏置矫正,可以看看这篇文章http://www.pianshen.com/article/6998420061/。然后就可以对影像进行归一化的处理。

模型搭建

对于医学影响的处理,Unet是一种很有效的模型,在理解Unet
之前,我们先看一下FCN(全卷积网络,https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf),其具体的模型结构可以用下面这张图表示。这是一种通用的模型结构,可以在这个基础上根据自己的需要自由发挥。
在这里插入图片描述
上面这幅图就是全卷积网络的一个代表,没有全连接层,前面几层网络和一般的cnn是一样的,在最后一层采用了一个上采样,直接恢复成了原图像的大小,关于上采样其实就是卷积的反过程,也叫反卷积,是图像从小变大的一个过程。也可以看成是encoder-decoder结构。但是这种结构直接从最后一层恢复成原始图像的大小,中间丢失了很多信息,所以就有了借助于中间过程的下面这种网络。
在这里插入图片描述
上面这种网络不仅仅是借助于最后一层恢复成原始图像的大小,还借助于中间生成的图像。比如,在pool4之后,把图像暂存,和resize之后的cov7相加,这时候再恢复成原始图像的大小,是比cov7之后恢复成原始图像的大小要精细的多的。
原论文中也给出了这几个图像上采样的结果,可以看出FCN32s其实是比较模糊的,FCN8s恢复的很好。
在这里插入图片描述
有了上面的概念之后,我们再来看一下Unet,Unet论文的下载链接在这https://arxiv.org/abs/1505.04597,Unet的典型结构如下。
在这里插入图片描述
先来解释一下。先总体的看一下,左半部分是特征提取部分,右半部分是上采样,这也是一种模型架构,可以根据自己的需要随便修改,比如加大深度之类的。
先看左半部分。横着的蓝色箭头表示卷积,经过两次卷积之后,一部分向右,一部分向下,向下的是池化层,向右的是crop,也就是从568 × \times × 568大小的图像随机裁剪392 × \times × 392的图像,然后concat到右边。左边就是多层的一个卷积->(pool+crop)的结构。
右半部分是一个上采样的结构,就是从小图像变成大图像,蓝色和白色是concat(拼接)到一起的,应该没有做其他的类似加法、平均之类的处理。

2D模型

脑部核磁共振的数据是三维数据,但是其实也可以当成二维数据来做。原始数据的大小为240 × \times × 240 × \times × 155,可以按照155的方向切片,但是要注意的是,可用的切片只有存在肿瘤的切片,因为不存在肿瘤的话,输入进去损失是0,对于训练没有用处。这个地方需要事先处理一下。

2.5D模型

2.5D模型可以看成是一种特殊的2D模型,具体做法是将三个切片合成一个,作为一个输入,这里的3片合成1片不是(123,456)这种形式,而是(123,234,345,456)这种形式,就可以看成是一个3通道的2D卷积了,也是要注意,只要肿瘤存在的切片就好。

3D模型

重点来看一下3D的模型,3D模型的输入是一个240 × \times × 240 × \times × 155的三维矩阵,那么3D的Unet是如何操作的呢?先做几个假设,3D卷积核为3 × \times × 3 × \times × 3,一共有n个,步长为1,则输出的大小为(240-3+1) × \times × (240-3+1) × \times × (155-3+1) × \times × n = 238 × \times × 238 × \times × 153 × \times × n。也可以选择其他的卷积方式,比如same卷积。

确定好卷积的方式之后,就能按照上面的方式搭建一个Unet网络了。

生存期预测

生存期预测是指病人在确诊患了高级别胶质瘤(HGG)之后,做过手术,还能存活多长时间,因为低级别胶质瘤(LGG)是不会致死的,所以实际的样本只有259个,在259个HGG里面,官方给的有一个csv文件,里面记录着病人的年龄,做的哪种手术,以及手术后存活了多长时间。我们把它看成一个回归问题,即预测存活时间,但比赛中还有一个指标,将存活时间分类成短期(10个月以内),中期(10-15个月),长期(15个月以上)。

剔除掉未知存活天数的样本,剩余有210个,实际上患HGG的也有痊愈的,不过只有2个,也是直接剔除掉了。用年龄简单的做了一下和存活天数的相关性,为-0.3,相关性可以看做是负相关,即年龄越大,生存的天数就越短。

我们想到了两个方案,但是只实现了其中的一个,先把这两个方案记录下来。

  • 采用和人脸年龄预测的方式去作比较,可以看成是图像的回归问题
    输入是去黑边的3维原始图像,resize到统一大小后,用3维卷积的方式,中间卷积,池化,最后得到一个值,loss函数定义成均方误差的形式。
  • 从肿瘤三维图像里面手工设计特征,这就是采用传统的机器学习的方式来做,包括强度,位置,纹理等特征,然后再采用回归的方式做。

我们实现的是上面第二种方式,这里推荐一个提取特征的库https://pyradiomics.readthedocs.io/en/latest/index.html,非常强大的一个库,要是让我们当时自己写,估计得写好一阵子,最后用的是一个线性模型回归,顺便看了一下相关性,正相关最大的是距脑部中间的距离,也就是肿瘤的中心越靠近脑袋的中心,生存期就越短,年龄是最大的负相关,即年龄越大,生存期越短。这也符合人的一般的观念。

这篇关于医学影像处理--Unet在Multimodal Brain Tumor Segmentation Challenge 2019上的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626046

相关文章

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验