从数据结构到Python实现:如何利用深度学习分析医学图像

2024-10-30 07:40:06 | 作者: 匿名

机器之心合集

利用深度学习技术分析图像和视频并将其应用于自动驾驶汽车和无人机等各种应用场景已成为研究前沿。最近的论文(例如《A Neural Algorithm of Artistic Style》)展示了如何将艺术家的风格转移并应用于另一幅图像,从而产生新的图像。其他论文,例如《Generative Adversarial Networks》 (GAN) 和“Wasserstein GAN”,为开发可以学习生成与我们提供的数据类似的数据的模型铺平了道路。因此,他们打开了半监督学习领域新世界的大门,也为未来的无监督学习奠定了基础。

基础图像处理(使用python实现)

图像处理库有很多,但OpenCV(开放计算机视觉)由于其对C++、java 和python 的广泛支持和可用性而成为主流。而且我更喜欢使用jupyter笔记本导入OpenCV。

您可以使用pip install opencv-python 或直接从opencv.org 网站安装。

安装opencv

现在打开Jupyter笔记本并确认cv2可以导入。您还需要numpy 和matplotlib 库来查看笔记本中的图像。

现在,我们通过输入以下代码来检查是否可以在笔记本电脑上打开并查看图像。

通过OpenCV 加载图像的示例

基础人脸识别

让我们做一些有趣的事情,比如人脸识别。我们将使用最初由Rainer Lienhart 开发的正面人脸识别器,该识别器使用基于开源xml 树桩的20x20 软adaboost 算法。

Haar级联检测的详细示例:http://docs.opencv.org/trunk/d7/d8b/tutorial_py_face_detection.html

使用OpenCV 进行人脸识别

文档区域中有许多使用opencv 进行图像处理的示例。

我们已经了解了图像处理的基础知识,让我们了解一下医学图像格式。

医学图像数据格式

医学成像使用数字成像和通信(DICOM) 作为存储和交换医学图像数据的标准解决方案。该标准的第一版于1985 年发布,此后进行了少量修改;它使用以下文件格式和通信协议。

文件格式:所有患者医学图像均以DICOM 文件格式保存。这种格式不仅包含与图像相关的数据(例如用于捕获图像的设备和医疗处理上下文),还包含有关患者的PHI(受保护的健康信息),例如姓名、性别、年龄等。成像设备可以创建DICOM 文件,医生可以使用DICOM 查看器和显示DICOM 图像的计算机应用程序来读取和诊断从图像中获得的结果。

通信协议:DICOM 通信协议用于搜索档案中的影像研究并将影像研究恢复到工作站进行显示。连接到医院网络的所有医学成像应用程序都使用DICOM 协议来交换信息,其中大部分是DICOM 图像,但也包括患者和手术信息。还有更先进的网络命令,用于控制和跟踪治疗、调整进度、报告状态以及在医生和成像设备之间分担工作量。

有一篇现有的博客文章详细描述了DICOM 标准,以下是链接:http://dicomiseasy.blogspot.com/

分析DICOM 图像

Pydicom 是一个Python 包,非常适合分析DICOM 图像。本节介绍如何在Jupyter 笔记本上渲染DICOM 图像。

使用以下命令安装Pydicom:pip install pydicom。

安装pydicom包后,返回Jupyter笔记本进行操作。将dicom包和其他包导入到笔记本中,如下:

我们还可以使用pandas、scipy、skimage、mpl_toolkit等其他包进行数据处理和分析。

网上有许多免费的DICOM 数据集,但以下数据集肯定可以帮助您入门:

Kaggle 竞赛和数据集:这是我的最爱。查看肺癌竞赛和糖尿病视网膜病变的数据:https://www.kaggle.com/c/data-science-bowl-2017/data

Dicom Library:用于教育和科学的DICOM 图书馆,提供免费的在线医疗DICOM 图像或视频文件共享服务。

Osirix 数据集:提供通过各种成像方式获取的广泛人类数据集。

可见人类数据集:可见人类项目的部分数据在这里免费提供,这很奇怪,因为访问这些数据既不免费也不容易。

Zubal Phantom:该网站免费提供男性CT 和MRI 的多个数据集。

请下载dicom文件并将其加载到jupyter笔记本中。

现在将DICOM 图像加载到列表中。

步骤一:Jupyter中DICOM图像的基本查看操作

在第一行,加载第一个DICOM 文件以提取元数据。该文件将被分配RefD,并且其文件名将列在lstFilesDCM 列表的顶部。

然后,我们计算3D NumPy 数组的总维度,它等于笛卡尔坐标轴中的(每个切片的像素行数* 每个切片的像素列数* 切片数)。最后,使用PixelSpacing 和SliceThickness 属性计算三个轴之间的像素间距。我们将数组维度存储在ConstPixelDims 中,空间存储在ConstPixelSpacing [1] 中。

步骤2:查看DICOM格式的详细信息

CT 扫描的测量单位是亨斯菲尔德单位(HU),它是辐射强度的测量单位。 CT 扫描仪经过高度校准,可实现精确测量。

每个像素都分配有一个数值(CT 数),该数值是相应体素中包含的所有衰减值的平均值。该数字与水的衰减值进行比较,并以任意单位的亨斯菲尔德单位(HU) 的比例显示。

该刻度将水衰减值(HU) 标记为0。CT 数字范围为2000HU,但某些现代扫描仪的HU 范围更高,高达4000。每个数字代表光谱一端的灰色阴影,+1000(白色) )和-1000(黑色)。

有些扫描仪具有圆柱形扫描范围,但其输出图像是矩形的。落在这些边界之外的像素的固定值为-2000。

第一步通常是将这些值设置为0。接下来,通过乘以重新调整的斜率并加上截距返回到Hounsfield 单位(斜率和截距都方便地存储在扫描的元数据中!)。

下一部分将使用Kaggle的肺癌数据集,并使用Keras卷积神经网络对其进行建模;它将基于上面提供的信息。

从数据结构到Python实现:如何利用深度学习分析医学图像

在文章的前一部分中,我们介绍了使用OpenCV 进行图像处理的一些基础知识,以及DICOM(医学数字成像和通信)图像基础知识。接下来我们将从卷积神经网络的角度来谈谈深度学习的基础知识。在文章的第三部分,我们将以Kaggle 的肺癌数据集为例,研究肺癌DICOM 图像中要找到的关键信息,并使用Kera 开发预测肺癌的模型。

卷积神经网络(CNN) 基础知识

为了了解卷积神经网络的基础知识,我们必须首先了解什么是卷积。

什么是卷积?

在泛函分析中,卷积是一种数学运算符,它从两个函数f和g生成第三个函数,代表函数f和g经过翻转平移后重叠部分的面积。因此,在简单的定义下,令f(x) 和g(x) 为R 上的两个可积函数,并进行积分:

它代表卷积。理解这个定义的一个简单方法是将其视为应用于矩阵的滑动窗口方程。

与33 滤波器进行卷积。

上图中,应用于矩阵的滑动窗口为绿色,滑动窗口矩阵为红色。输出是卷积特征矩阵。下图显示了两个矩形脉冲(蓝色和红色)的卷积运算及其结果。

Jeremy Howard 在他的MOOC 上用电子表格解释了卷积,这是理解基本原理的好方法。现在我们有两个矩阵,f 和g。 f和g之间的卷积运算的结果是第三个矩阵“Conv layer 1”,它由两个矩阵的点积给出。如下所示,这两个矩阵的点积是一个标量。

两个矩阵的点积。

现在让我们按照杰里米的建议使用电子表格来演示这一点。输入矩阵是函数f(),滑动窗口矩阵是滤波器方程g()。那么这两个矩阵元素的乘积之和就是我们需要的点积,如下所示。

让我们将其扩展到大写字母“A”的图片。我们知道图片是由像素组成的。所以我们的输入矩阵是“A”。我们选择的滑动窗口方程是一个随机矩阵g。下图展示了这个矩阵点积的卷积输出。

什么是卷积神经网络(CNN)?

在我看来,一个简单的卷积神经网络(CNN)是一系列神经网络层。每一层对应一个特定的功能。每个卷积层都是三维的(RGB),因此我们使用体积作为度量。此外,CNN 的每一层都通过微分方程向另一层传递一定量的激活。该微分方程称为激活函数或传递函数。

CNN有很多实体:输入、滤波器(或核函数)、卷积层、激活层、池化层和批量归一化层。这些层以不同的排列和不同的规则组合起来形成不同的深度学习算法。

输入层:通常CNN的输入是一个n维数组。对于图像来说,就是三维输入——长宽深(即颜色通道)。

过滤器或核函数:如下图所示,来自RiverTrail,过滤器或核函数会滑过图像中的每个位置,并使用其经过的像素值计算新像素。所有像素的加权和。在上面的电子表格示例中,我们的过滤器是g,它通过f 的输入矩阵。

卷积层:输入矩阵与滤波器的点积形成的新矩阵称为卷积矩阵或卷积层。

下面的URL 有一个很好的可视化图表,解释了填充、跨步和转置如何工作。

激活层:

激活函数根据是否饱和可以分为两种类型。

饱和激活函数都是双曲和双曲正切类型,而非饱和激活函数都是修正线性单元(ReLU)及其变体函数。使用非饱和激活函数有两个优点:

首先是它可以解决所谓的“梯度爆炸/消失”。

二是可以加快函数的收敛速度。

双曲函数:将一个实值输入压缩到区间[0, 1] 中

(x)=1/(1 + exp(x))

双曲正切函数:将实值输入压缩到(-1, 1) 区间

tanh(x)=2(2x) 1

ReLU

ReLU 代表修正线性单元。它是输入为x的最有价值的函数(x,0),例如卷积图像的矩阵。然后,ReLU 将矩阵x 中的所有负值设置为零,并保持所有其他值不变。 ReLU是在卷积之后计算的,因此出现了非线性激活函数,例如双曲正切或双曲函数。 Geoff Hinton 在他的自然论文中首次讨论了这个问题。

ELU

指数线性单元试图使平均激活值接近于零,从而加快学习速度。 ELU 还可以通过断言正值来避免梯度消失。研究表明,ELU 比ReLU 具有更高的分类精度。

泄漏ReLU

与ReLU 中完全丢弃的负部分相反,leaky ReLU 为负部分分配非零斜率。泄漏校正线性激活首次在声子模型中引入(Maas 等人,2013)。从数学上来说,我们有

其中ai 是区间内的固定参数(1,正无穷大)。

参数修正线性单元(PReLU)

随机泄漏校正线性单元(RReLU)

随机泄漏单调线性单元(RReLU)也是泄漏ReLU 的变体。在RReLU中,负部分的斜率是在给定的训练范围内随机选择的,然后在测试中固定。 RReLU最显着的特点是在训练过程中,aji是从一致分布U(l,u)中采样的随机数。正式的数学表达式如下:

ReLU、leaky ReLU、PReLU 和ReLU 的比较如下所示。

噪声激活函数

这些是扩展为包含高斯噪声的激活函数。

池化层

池化层的目标是逐渐减小矩阵的大小,以减少网络中的参数数量和计算量,从而控制过拟合。池化层在输入的每个深度切片上独立运行,并使用最大化和平均操作来重置其空间维度。在其最常见的形式中,具有步幅为2、大小为2x2 滤波器的池化层将输入中的每个深度切片沿宽度和高度降低幅度为2,丢弃75% 的激活。在这种情况下,每个max 操作取4 个数字的最大值(某个深度切片中的一个小2x2 区域)。深度尺寸保持不变。更一般地,池化层是:

从数据结构到Python实现:如何利用深度学习分析医学图像

注意:这里我们将2 x 2 窗口滑动两个单元格(也称为步幅)并取每个区域的最大值。

批量归一化层:

批量归一化是对每个中间层的权重和激活函数进行归一化的有效方法。批量归一化有两个主要好处:

1. 在模型中添加批量归一化可以将训练速度提高10 倍或更多

2. 由于归一化大大降低了远程输入的小数过度影响训练的能力,因此也可以减少过度拟合。

全连接层:

全连接层是传统的多层感知器,在输出层使用Softmax 函数。术语“全连接”是指上一层和下一层的每个神经元都是连接的。 Softmax函数是对数函数(逻辑函数)的推广。它将一个取值范围为任意实数的K维向量“压缩”为一个取值范围在(0, 1)以内且和为1的K维向量。

Sofxmax激活一般用在最后的全连接层,随着其值在0和1之间变化,得到概率。

现在我们对CNN 中的不同层有了一个了解。利用这些知识,我能够开发肺癌检测所需的深度学习算法。

第三部分

我已经意识到这个主题的广度和深度,并且需要更多的文章来解开。在以后的文章中,我们将讨论医学成像格式中处理DICOM 和NIFTI 的差异,进一步扩大我们的研究范围,并讨论如何使用深度学习进行二维肺部分割分析。然后继续进行3D 肺部分割。我们还将讨论医学图像分析如何先于深度学习以及我们现在如何做到这一点。我非常高兴也非常感谢我的新合作伙伴——Flavio Trolese(4Quant 的合作伙伴)、Kevin Mader(4Quant 的联合创始人)和Cyriac Joshy(瑞士苏黎世联邦理工学院讲师)将这一切整合在一起。

什么是Keras?

Keras 网站是这样介绍的:—— Keras 是Theano 和TensorFlow 的深度学习库。

Keras API 运行在Theano 和TensorFlow 之上。

Keras 是用Python 编写的高级神经网络API,在TensorFlow 和Theano 之上运行。它的开发是为了实现快速实验。

Theano 和TensorFlow 是什么?

Theano由James Bergstra博士等人在Scipy 2010上发布,是一个CPU和GPU数学表达式编译器。它是一个Python 库,可让您有效地定义、优化和评估涉及多维数组的数学表达式。 Theano 由Yoshua Bengio 和蒙特利尔学习算法研究所(MILA) 等高级研究人员开发。 Scipy 2010 上的一篇很棒的Theano 教程。下图显示了截至2010 年,Theano 在GPU 和CPU 上与其他工具的比较。该结果最初发表在文章《Theano: A CPU and GPU Math Compiler in Python》 中。

还有其他构建在Theano 之上的库,包括Pylearn2 和GroundHog(也是由MILA 开发)、Lasagne、Blocks 和Fuel。

TensorFlow 由Google Brain 团队的研究人员和工程师开发。它是为机器学习和深度神经网络研究而开发的,但该系统也适用于其他领域。正如其网站所述,TensorFlow 是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,图的边表示它们之间传递的多维数据数组(张量)。代码的可视化如下所示。

TensorFlow:异构分布式系统上的大规模机器学习

使用Keras 的预测分析示例

在此示例中,我们将使用UCI 网站的声纳数据集构建一个简单的预测模型。在下面的代码中,我们将直接从UCI 网站获取数据,并将其按60:40 的比例分为训练集和测试集。我们使用Keras 进行预测模型,使用sklearn 进行标签编码。

在下一段代码中,我们读取数据集并使用上面定义的函数查看数据。我们打印数据集并找出哪些因变量需要编码。

我们使用scikit-learn 中的LabelEncoder 进行标签编码,将R 和M 隐藏到数字0 和1 中。这样的操作称为one-hot 编码。 One-hot 编码将分类特征转换为一种算法更友好的格式。在此示例中,我们使用“R”值和“M”值对Y 变量进行分类。使用标签编码器,它们分别转换为“1”和“0”。

scikit-learn 中的LabelEncoder

然后使用Keras 创建模型:

未经预处理的简单模型准确率为81.64%

使用Keras 的图像分析示例

为了解释Keras 的图像处理,我们将使用来自Kaggle 竞赛—— Dogs and Cats (https://www.kaggle.com/c/dogs-vs-cats) 的数据。竞赛的目标是开发一种算法来区分图像中是否包含狗或猫。这个任务对于人类、狗和猫来说很容易,但对于计算机来说却非常困难。在本次挑战中,有25,000 张标记的狗和猫的照片可用于训练,而在测试集中,我们必须尝试在挑战中标记12,500 张照片。据Kaggle 网站介绍,比赛开始时(2013 年末):

当前最佳:当前文献表明机器分类器在此任务上可以达到80% 以上的准确率。所以如果我们能达到80%以上,我们2013年就会走在前列。”

第1 步:设置

基本设置

Jeremy Howard 在他的类中提供了一个有用的Python 文件,有助于封装基本功能。首先我们将使用这个实用程序文件。点击下载:https://github.com/fastai/courses/blob/master/deeplearning1/nbs/utils.py。当我们深入了解更多细节时,我们将解压缩该文件并查看其背后的内容。

第2步:使用VGG

我们的第一步只是使用一个已经为我们创建的模型,它可以识别许多类别(1,000 种)的图像。我们将使用“VGG”,它赢得了2014 年ImageNet 竞赛,是一个非常简单的用于创建理解的模型。 VGG ImageNet 团队创建了一个更大、更慢的模型,但精度略有提高(VGG 19) 和一个更小、更快的模型(VGG 16)。我们将使用VGG 16,因为VGG 19 的性能过慢与其精度的小幅提升不相称。

我们创建了一个Python 类Vgg16,这使得使用VGG 16 模型变得非常简单。 Vgg 16 也可以从fast.ai 的GitHub 上获取:https://github.com/fastai/courses/blob/master/deeplearning1/nbs/vgg16.py

第3步:实例化VGG

Vgg16 基于Keras(我们稍后将详细了解)构建,这是一个基于Theano 或Tensorflow 的灵活且易于使用的深度学习库。 Keras 使用固定的目录结构来批量读取多组图像和标签,并且每个类别的图像必须放置在单独的文件夹中。

我们从训练文件夹中获取批次数据:

第四步:预测狗与猫

第五步:总结并编码文档

总结这篇文章,我推荐的狗和猫的分类方法是:

用户评论

秘密

哇,这个主题太前沿了!我一直对医学图像处理很感兴趣,深度学习分析听起来好酷!期待学习到更多细节。

    有13位网友表示赞同!

小清晰的声音

深度学习在医学图像分析中的应用太有潜力了,不过Python实现起来是不是有点复杂啊?能简单介绍一下吗?

    有11位网友表示赞同!

娇眉恨

我已经开始学习Python了,这篇文章正好给了我一个很好的方向。希望能从中学到如何更好地处理医学图像。

    有13位网友表示赞同!

莫名的青春

深度学习在医学领域的应用越来越广泛,这篇博文真的太及时了!希望能看到更多这样的实用教程。

    有17位网友表示赞同!

心亡则人忘

我之前尝试过使用Python进行图像处理,但效果不是很理想。这篇文章提到的深度学习技术能不能解决我的问题呢?

    有17位网友表示赞同!

陌上蔷薇

深度学习分析医学图像,这个话题太吸引我了!我是一名医生,希望能通过学习这些技术来提高诊断准确率。

    有6位网友表示赞同!

汐颜兮梦ヘ

Python实现深度学习分析医学图像,这个听起来好高大上,但是我担心自己可能跟不上了。有基础的朋友能帮忙科普一下吗?

    有19位网友表示赞同!

恰十年

医学图像分析对医疗行业发展至关重要,这篇文章让我对深度学习有了更深的认识。希望更多人能关注这个领域。

    有12位网友表示赞同!

∞◆暯小萱◆

深度学习在医学图像领域的应用前景广阔,不过实现起来真的不容易。这篇文章给了我一些灵感,谢谢分享!

    有15位网友表示赞同!

疯人疯语疯人愿

我已经读过一些关于深度学习的书籍,但还不知道如何将其应用于医学图像分析。这篇文章正好解答了我的疑惑。

    有14位网友表示赞同!

拥抱

我对医学图像处理不太懂,但是这篇文章让我对深度学习产生了浓厚的兴趣。希望能一步步跟上来。

    有19位网友表示赞同!

一生只盼一人

深度学习分析医学图像,听起来好高级,但是对普通人来说难度太大了吧?有没有什么适合初学者的教程呢?

    有8位网友表示赞同!

£烟消云散

这篇文章写得真好,深入浅出地介绍了深度学习在医学图像分析中的应用。我打算深入学习一下。

    有18位网友表示赞同!

纯真ブ已不复存在

Python实现深度学习分析医学图像,这个话题好实用!我是一名工程师,希望能通过这篇文章提高自己的技能。

    有14位网友表示赞同!

浅嫣婉语

深度学习在医学领域的应用让我感到惊讶,这篇文章让我对Python和深度学习有了新的认识。

    有9位网友表示赞同!

拉扯

医学图像分析对提高诊断效率有很大帮助,这篇文章提到的深度学习技术是不是可以推广到其他领域呢?

    有17位网友表示赞同!

杰克

深度学习在医学图像分析中的应用越来越普遍,这篇文章让我对这个领域有了更深的了解。感谢作者的分享!

    有11位网友表示赞同!

屌国女农

我是一名医学专业的学生,这篇文章让我对深度学习有了新的认识。希望能将所学知识应用到实际工作中。

    有7位网友表示赞同!

闲肆

深度学习分析医学图像,这个话题太有意义了!希望作者能继续分享更多相关内容,让我们共同进步。

    有5位网友表示赞同!

太易動情也是罪名

这篇文章让我对Python和深度学习有了更深的认识,也让我对医学图像处理产生了浓厚的兴趣。谢谢作者!

    有11位网友表示赞同!