使用深度学习构建脑肿瘤分类器
本篇文章介绍了如何利用深度学习技术来检测脑肿瘤。通过使用卷积神经网络(CNN)对大脑图像进行分类,作者展示了如何从MRI图像中识别四种类型的脑肿瘤:胶质瘤、脑膜瘤、无肿瘤和垂体肿瘤。文章详细描述了数据集的构成(包含7022张标准化的MRI图像),并展示了如何通过数据增强技术提升模型性能。接着介绍了CNN的架构设计(包括卷积层、激活函数和池化操作),并使用Adam优化器进行训练。实验结果显示,在验证集上达到了86%的准确率,在测试集上表现同样出色(94.5%)。最终结论表明该模型能够有效地帮助医生判断患者的诊断结果,并为未来的研究提供了参考价值。
摘要
本文介绍了一种利用深度学习技术检测脑肿瘤的方法。通过对大脑MRI图像的数据预处理和增强,并结合卷积神经网络(CNN)进行分类,作者展示了如何识别四种类型的脑肿瘤:胶质瘤、脑膜瘤、无肿瘤和垂体瘤。实验表明该模型在验证集上的准确率达到86%,并在测试集上表现优异(94.5%)。该方法为医疗领域提供了高效且可靠的诊断工具,并具有广泛的应用前景。(100-200字)
介绍
在现代生活中,深度学习技术无处不在。社会生活方式发生显著变化,在过去几十年里发生了翻天覆地的变化。如智能驾驶汽车、Google Assistant、Netflix 推荐系统及垃圾邮件过滤器等都展现了这一趋势。同样,在医疗保健领域也取得了显著进展。我们看到,在这一领域应用广泛的技术包括基于核磁共振扫描的深度学习模型被用于检测脑肿瘤以及利用肺部 X 射线进行 Covid 病情诊断等技术手段。作为一种致命的癌症类型,在过去几年中报告了超过一百万例病例。
对于患有脑肿瘤的个体而言,核磁共振成像(MRI)是一种常用的检查手段。这类疾病可能涉及多种分类,并且对数百万人进行MRI扫描是为了诊断一个人是否患有这种疾病以及其分类情况如何。正是深度学习模型在发挥作用的地方:通过神经网络分析患者的MRI图像数据来判断是否存在脑肿瘤。
本研究将采用卷积神经网络架构来开发脑肿瘤识别系统。该系统基于其卓越的识别准确率和稳定性特征,在图像分析领域得到广泛应用。本研究中所涉及的开发工具和平台均基于Python编程语言。
数据集概述
目前我们正在采用一个基于脑肿瘤图像的分类器数据集。该数据集中包含了 7022 张来自人的大脑MRI图像,并被划分为训练集和测试集两部分。这些图像被划分为4个类别。
-
胶质瘤(Glioma)
-
脑膜瘤 (Meningioma )
-
无肿瘤 (No tumor)
-
垂体(Pituitary)

这些图像的像素大小为 512 x 512,并且每个图像都有固定的标签。
让我们导入有助于我们对这些图像进行分类的基本库。
导入库
随后我们对数据集进行深入分析,并导入ImageDataGenerator对之进行预处理。接着我们将导入TensorFlow库。在该框架中,我们将利用Keras API进行开发。
import pandas as pd
import numpy as np
import tensorflow
from tensorflow import keras
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGenerator as Imgen
图像增强
在对任何图像数据集进行模型训练时, 有时这样的数据集可能导致预测结果不够精确, 这是因为这些图像通常会经过一些必要的预处理步骤, 如调整尺寸(resizing)、调整明暗(adjusting brightness)、调整色调(tuning tones)等, 这些操作有助于提升后续算法的效果
像二进制数据那样都需要经过一定的清理和预处理操作一样,在图像领域也需要完成相似的数据准备工作。为此,在本文中我们采用了Keras库中的图像数据生成器这一技术手段来实现对图像数据的高效管理与准备。
该系统利用实时数据增强技术生成一批量的张量图像数据。通过同时调整其尺寸、高度和宽度等参数设置, 使得输入的所有图像数据均具有统一性。
Args rescale**:(Rescaling Factor)。其缺省值为None。若无提供,则需将数据乘以指定的值进行调整。
-
Shear_range :剪切强度(以度为单位的逆时针方向的剪切角)
-
Zoom_range :随机缩放的范围
-
Height_shift_range : 总高度的分数, if < 1
-
Width_shift_range : 总宽度的分数, if < 1
-
Fill_mode :默认为“nearest”。根据给定的模式填充输入边界之外的点。
-
Validation_split: 保留用于验证的图像的一部分(在 0 和 1 之间)。
#Augmenting the training dataset
traingen = Imgen(
rescale=1./255,
shear_range= 0.2,
zoom_range = 0.3,
width_shift_range = 0.2,
height_shift_range =0.2,
fill_mode = "nearest",
validation_split=0.15)
#Augmenting the testing dataset
testgen = Imgen(# rescale the images to 1./255
rescale = 1./255
)
现在,我们将获取目录的路径并生成批量增强数据。
trainds = traingen.flow_from_directory("Training/",
target_size = (130,130),
seed=123,
batch_size = 16,
subset="training"
)
valds = traingen.flow_from_directory("Training",
target_size = (130,130),
seed=123,
batch_size = 16,
subset="validation"
)
testds = testgen.flow_from_directory("Validation",
target_size = (130,130),
seed=123,
batch_size = 16,
shuffle=False)
这里使用的一些参数是,
-
Target_size :整数元组(height, width),默认为 (512, 512)。将调整所有图像的尺寸。
-
nearest :用于打乱和转换的可选随机种子。
-
Batch_size :数据批次的大小(默认值:32)。
-
**Subset **:数据子集(“training” or “validation”)。
Shuffling : 是否进行数据重新排列(默认设置为True)设为False时,则按照字母和数字的顺序对数据进行排序。
在这一阶段,我们将预处理后的图像数据划分为三个子集:训练用例、验证集合与测试样本。其中我们将图像数据按80%用于训练与20%用于验证的方式进行了分配。具体而言,在这些分割中,用于验证的数据量占总图像数量的20%,而其中有80%被分配到该验证阶段。对于测试样本来说,则直接将整个数据目录划分为两个子目录:一个为所有训练用例另一个为所有测试样本。
验证数据集在搭建深度学习模型的过程中用于验证其[模型性能]时起到关键作用。这一系列步骤对于后续根据模型性能优化我们的系统至关重要。
识别我们数据集的类别:
c = trainds.class_indices
classes = list(c.keys())
classes

我们增加了数据量,并将其划分为训练集、验证集和测试集;同时我们已将图像数据集划分为四个类别。
现在让我们通过可视化我们的图像来观察图像增强是如何工作的,并通过使用我们的分类器来识别我们正在寻找的脑肿瘤类型。
x,y = next(trainds) #function returns the next item in an iterator.
def plotImages(x,y):
plt.figure(figsize=[15,11]) #size of the plot
for i in range(16): #16 images
plt.subplot(4,4,i+1) #4 by 4 plot
plt.imshow(x[i])#Imshow() is a function of matplotlib displays the image
plt.title(classes[np.argmax(y[i])]) # Class of the image will be it's title
plt.axis("off")
plt.show()
现在我们将通过调用我们定义的函数来绘制我们的图像。
#Call the plotImages function
plotImages(x,y)
它会给我们这样的输出,

现在,该项目最重要的一步是开始使用卷积神经网络创建深度学习模型。
构建深度学习模型
由于其卓越的准确性以及能够自动处理数据的特点,在深度学习领域中几乎无处不在的应用。
根据项目需求选择不同的神经网络类型;例如,在本项目中我们将采用人工神经网络 (ANN),以便处理整数数据。
Convolutional Neural Networks (CNNs) are extensively applied in image data classification tasks. One of the key strengths of CNNs is their ability to autonomously identify critical features within images without requiring manual intervention. Such remarkable capabilities have solidified CNNs as the go-to solution in both computer vision and image classification challenges. Achieving this level of effectiveness heavily relies on the process of feature extraction.
执行的特征提取包括三个基本操作:
-
针对特定特征过滤图像(卷积)
-
在过滤后的图像中检测该特征 (ReLU)
-
压缩图像以增强特征(最大池化)
让我们讨论一下CNN的每一个操作。
1. 卷积
卷积层通过滤波器执行特征提取任务。在训练过程中,ConvNet 模型的主要参数集中在其卷积核中。这些核心组件被称为卷积核,在图像处理过程中发挥着关键作用。每个卷积核通过滑动窗口扫描输入图像,并计算加权像素总和。

图片来源:https://imgur.com/j3lk26U
不同类型的核为每个图像产生不同的特征。

图片来源:https://imgur.com/JxBwchH
2. 激活函数
在神经网络架构中占据核心地位的是激活函数机制。该机制根据接收到的输入判断是否激发特定神经元,并将信号传递给下一层。其中整流线性单元(ReLU)是最常用的一种激活函数。作为一种高效且实用的方法,在一定程度上克服了传统激活函数(如Sigmoid)所带来的诸多局限性。
在模型中采用了Softmax激活函数这一设计,并且由于其适用于多类数据集分类而被采用
3. 最大池化
Max Pooling 是一个卷积过程,在该过程中滤波器会提取其覆盖区域的最大值。类似于最大池化的过程,我们可以采用平均池化的方法进行处理。在函数映射中使用 ReLU 检测机制会导致产生较多的无效区域;因此为了更好地利用其作用域特性,我们可以通过压缩函数映射来保留其核心作用域。
要构建模型,让我们首先导入创建模型所需的必要库。
from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout, Conv2D, MaxPooling2D, Activation
from keras.metrics import categorical_crossentropy
from keras.optimizers import Adam
下面是CNN模型。
cnn = Sequential([
# first Layer
Conv2D(filters=16, kernel_size=(3, 3), padding = 'same', activation='relu', input_shape=(130, 130, 3)),
MaxPooling2D((2, 2)),
# second layer
Conv2D(filters=32, kernel_size=(3, 3), padding = 'same', activation='relu'),
MaxPooling2D((2, 2)),
Dropout(0.20),
Flatten(),
Dense(64, activation='relu'),
Dense(32, activation='relu'),
Dense(10, activation='relu'),
Dense(4, activation='softmax')
])
这里使用的一些基本术语是,
在深度学习模型中,Dropout 层被设计为一种防止过拟合的关键机制,并被应用于所有隐藏层节点的连接权值上(此处使用了公式D_{i,j}表示第 i 个样本在第 j 个神经元上的随机屏蔽)。值得注意的是,在当前模型架构中,并未对输出层引入 Dropout 机制(即D_{o,j}=0对于所有 o 属于输出层节点的情况),这一设计选择有助于保持模型在进行预测任务时的稳定性和可靠性。
Flatten 层:该层主要用于将多维输入转换为一维输出。
Dense 层:每个神经网络相互连接的简单神经元层。
考虑到我们的系统设计需要明确分类依据,在输出层中设置了四个独立的神经元以分别对应神经胶质瘤、脑膜瘤、无肿瘤和垂体四种情况
以下是创建模型的架构。
cnn.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output ShapeParam #
=================================================================
conv2d (Conv2D) (None, 130, 130, 16) 448
max_pooling2d (MaxPooling2D (None, 65, 65, 16) 0
)
conv2d_1 (Conv2D) (None, 65, 65, 32) 4640
max_pooling2d_1 (MaxPooling (None, 32, 32, 32) 0
2D)
dropout (Dropout) (None, 32, 32, 32) 0
flatten (Flatten) (None, 32768) 0
dense (Dense) (None, 64) 2097216
dense_1 (Dense) (None, 32) 2080
dense_2 (Dense) (None, 10) 330
dense_3 (Dense) (None, 4) 44
=================================================================
Total params: 2,104,758
Trainable params: 2,104,758
Non-trainable params: 0
_________________________________________________________________
编译借助以下参数创建的模型,
cnn.compile(loss="categorical_crossentropy",
optimizer = "Adam",metrics=["accuracy"])
我们采用的损失函数是分类交叉熵。在训练深度学习模型以衡量预测输出与实际输出之间的差异时,损失函数不可或缺。通过优化权重参数使模型能够提升预测精度。对于需要进行多类别分类的任务来说,在训练过程中使用分类交叉熵是一个合理的选择。
在神经网络训练过程中, 优化器的主要作用是通过调整各层权重参数来实现模型性能的提升. 在这一领域中, 增加模型的学习效率并降低训练损失是一个关键目标. Adam 作为最常用的一种优化算法, 在实践中表现出色.
让我们将数据拟合到我们创建的 CNN 模型中。
history = cnn.fit(trainds,validation_data=valds,epochs=10, batch_size=16, verbose=1)
Epoch 1/10
304/304 [==============================] - 126s 413ms/step - loss: 0.5149 - accuracy: 0.7813 - val_loss: 0.6445 - val_accuracy: 0.7801
Epoch 2/10
304/304 [==============================] - 122s 400ms/step - loss: 0.3672 - accuracy: 0.8526 - val_loss: 0.6240 - val_accuracy: 0.7591
Epoch 3/10
304/304 [==============================] - 122s 401ms/step - loss: 0.2541 - accuracy: 0.9004 - val_loss: 0.6677 - val_accuracy: 0.7953
Epoch 4/10
304/304 [==============================] - 122s 399ms/step - loss: 0.1783 - accuracy: 0.9343 - val_loss: 0.6279 - val_accuracy: 0.8187
Epoch 5/10
304/304 [==============================] - 122s 400ms/step - loss: 0.1309 - accuracy: 0.9502 - val_loss: 0.6373 - val_accuracy: 0.8292
Epoch 6/10
304/304 [==============================] - 121s 399ms/step - loss: 0.1069 - accuracy: 0.9613 - val_loss: 0.7103 - val_accuracy: 0.8444
Epoch 7/10
304/304 [==============================] - 121s 399ms/step - loss: 0.0768 - accuracy: 0.9712 - val_loss: 0.6353 - val_accuracy: 0.8409
Epoch 8/10
304/304 [==============================] - 122s 400ms/step - loss: 0.0540 - accuracy: 0.9827 - val_loss: 0.6694 - val_accuracy: 0.8456
Epoch 9/10
304/304 [==============================] - 121s 399ms/step - loss: 0.0530 - accuracy: 0.9813 - val_loss: 0.7373 - val_accuracy: 0.8374
Epoch 10/10
304/304 [==============================] - 122s 399ms/step - loss: 0.0304 - accuracy: 0.9872 - val_loss: 0.7529 - val_accuracy: 0.8655
从实验结果来看,在训练数据集上使用所提出的 CNN 模型时达到了 98% 的准确度;而在验证数据集中则获得了超过 86% 的准确率。接下来,在测试数据集上进行评估以验证其性能表现。
从实验结果来看,在训练数据集上使用所提出的 CNN 模型时达到了 98% 的准确度;而在验证数据集中则获得了超过 86% 的准确率。接下来,在测试数据集上进行评估以验证其性能表现。
cnn.evaluate(testds)
82/82 [==============================] - 9s 113ms/step - loss: 0.2257 - accuracy: 0.9458
正如我们观察到的那样,在测试集上我们的CNN模型展现出色的表现。在进行模型拟合时,在代码中我们将训练数据标记为'trainds'(或命名为'trainds'),并将epochs参数设定为10个周期(即总共进行十轮完整的训练)。这意味着该模型利用训练数据对神经网络进行十次完整的训练过程,并通过设置Verbose=1来实现每个epoch后实时监控模型的拟合进展。
现在让我们可视化我们的一些结果。
使用深度学习进行可视化
在我们模型达到的准确度与 epoch 数相匹配时,我们会生成图表以观察到模型在训练集和验证集上的准确度变化情况.
epochs = range(len(history.history['accuracy']))
plt.plot(epochs, history.history['accuracy'], 'green', label='Accuracy of Training Data')
plt.plot(epochs, history.history['val_accuracy'], 'red', label='Accuracy of Validation Data')
plt.xlabel('Total Epochs')
plt.ylabel('Accuracy achieved')
plt.title('Training and Validation Accuracy')
plt.legend(loc=0)
plt.figure()

从这张图表可以看出, 我们推测出我们的机器学习模型与训练数据以及验证数据高度吻合. 现在, 我们将利用我们开发的机器学习模型来进行图像分类任务.
使用深度学习进行预测
为了通过我们的模型对一批样本图像进行预测,在开始分析之前我们需要做以下工作流程:首先将待预测的图像导入系统中;接着对这些图像应用归一化处理以便于后续分析;最后生成标准化的数据格式并基于这些预处理后的数据特征进行预测以提高其稳定性。
from matplotlib.pyplot import imshow
from PIL import Image, ImageOps
data = np.ndarray(shape=(1, 130, 130, 3), dtype=np.float32)
image = Image.open("image(2).jpg")
size = (130, 130)
image = ImageOps.fit(image, size, Image.ANTIALIAS)
image_array = np.asarray(image)
display(image)
normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1
data[0] = normalized_image_array

在其中,我们运用了 matplotlib 的 imshow 函数来呈现图像内容,并借助 Python Imaging Library (PIL) 来完成各类图像处理任务。该库中的 ImageOps 模块专门支持多种成像功能及相关的预处理操作。
现在我们将使用我们的 CNN 模型预测上述图像的类别,即肿瘤类型。
prediction = cnn.predict(data)
print(prediction)
predict_index = np.argmax(prediction)
print(predict_index)
1/1 [==============================] - 0s 142ms/step
[[0. 0. 1. 0.]]
2
经过分析, 我们确定归一化后得到的图像分类结果为第二类, 未发现肿瘤. 这与预期结果一致.
print("There's {:.2f} percent probability that the person has No Tumor".format(prediction[0][2]*100))
There's 100.00 percent probability that the person has No Tumor
借助这一方法,我们可以明确地表明我们的CNN模型能够达到最高准确度,并且在预测各种类型的脑肿瘤数据时表现最佳。因此,你可以将上述任何脑 tumor 数据集输入到基于该架构设计的 model 中进行分析。
结论
我们可以观察到技术对生活方式和文化产生了深远的影响。借助技术改进生活质量是一种理想的选择。在医疗领域中采用深度学习方法被视为最有效的解决方案之一。与之前用于脑肿瘤分类的深度学习模型类似,在其他领域我们也能够通过适当调整这些模型来实现其应用效果。
在本文中, 我们深入研究并探讨如何有效地应用Tensorflow和Keras这两种工具到深度学习模型中, 并结合多种技术手段以提升模型的准确率; 同时, 在实践过程中还对数据进行了可视化处理。
☆ END ☆
如果看到这里,请分享你的观点并给予鼓励。微信搜索「uncle_pn」后欢迎添加小编微信「 woshicver」, 每天与您分享一篇优质文章并及时传递最新资讯.
↓ 扫描二维码添加小编↓

