医学影像处理--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

相关文章

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont