基于深度学习的脑部肿瘤检测系统

news2024/9/19 10:42:21

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

1. 项目简介

        当大脑中形成异常细胞时,就会发生脑肿瘤。肿瘤主要有两种类型:癌性(恶性)肿瘤和良性肿瘤。恶性肿瘤可分为原发性肿瘤和继发性肿瘤,前者始于大脑,后者从其他地方扩散,称为脑转移瘤。所有类型的脑肿瘤都可能产生不同的症状,这取决于所涉及的大脑部分。这些症状可能包括头痛、癫痫发作、视力问题、呕吐和精神变化。头痛通常在早上更严重,并伴随呕吐而消失。其他症状可能包括走路、说话或感觉困难。随着疾病的发展,可能会出现无意识状态。

        本项目利用 TensorFlow、Keras 等深度学习工具包构建 VGG16、RestNet、InceptionV3 等神经网络,实现对脑部肿瘤 MRI 扫描影像的识别。首先在 Jupyter Notebook 平台实现模型的训练、验证和存储,利用 Flask + Bootrap + Ajax 搭建交互式分析框架,实现脑部 MRI 扫描影像上传和在线预测,模型给出是否包含脑部肿瘤及肿瘤类型,整体准确率达到93.9%

        B站详情及代码下载:基于深度学习的脑部肿瘤检测系统_哔哩哔哩_bilibili

基于深度学习的脑部肿瘤检测系统

2. 脑部肿瘤MRI扫描数据读取

        利用 ImageDataGenerator 从文件夹中加载脑部肿瘤MRI扫描图像数据,并利用图像的旋转、放大、剪切、对调等方式,实现对图像数据集的扩充。

data_dir = 'dataset'
class_map = {'无肿瘤': 0, '胶质瘤': 1, '垂体瘤': 2, '脑膜瘤': 3}
class_name_dict = {0: '无肿瘤', 1: '胶质瘤', 2: '垂体瘤', 3: '脑膜瘤'}

def image_generator(height,width):
    datagen = ImageDataGenerator(
            rescale=1./255.,
            validation_split=0.2,
            rotation_range=10,
            width_shift_range=0.05,
            height_shift_range=0.05,
            # shear_range=0.05,
            brightness_range=[0.5, 1.5],
            )
    train_ds = datagen.flow_from_directory(
            data_dir,
            batch_size=batch_size,
            subset="training",
            #color_mode = 'grayscale',
            shuffle=True,
            class_mode='categorical',
            target_size=(height, width),
            classes=class_map
            )
    val_ds = datagen.flow_from_directory(
              data_dir,
              subset="validation",
              #seed=123,
              #color_mode = 'grayscale',
              class_mode='categorical',
              target_size=(height, width),
              batch_size=batch_size,
            classes=class_map
            )
    return train_ds, val_ds

train_ds, val_ds = image_generator(height,width)

        数据集样例数据可视化:

3. 基于迁移学习的脑部肿瘤检测

3.1  VGG16 Base Model

        VGG(Visual Geometry Group)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG19最为著名。

        VGG16和VGG19网络架构非常相似,都由多个卷积层和池化层交替堆叠而成,最后使用全连接层进行分类。两者的区别在于网络的深度和参数量,VGG19相对于VGG16增加了3个卷积层和一个全连接层,参数量也更多。

        VGG网络被广泛应用于图像分类、目标检测、语义分割等计算机视觉任务中,并且其网络结构的简单性和易实现性使得VGG成为了深度学习领域的经典模型之一。

        利用 TensorFlow、Keras 深度学习工具包,构建基于 VGG16 基础 Base 模型的卷积神经网络:

input_shape = (height, width, 3)
base_model = tf.keras.applications.vgg16.VGG16(
    weights='./pretrained_models/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5', 
    include_top=False,
    input_shape=input_shape
)
base_model.trainable = False

model_vgg16 = tf.keras.Sequential()
model_vgg16.add(base_model)
model_vgg16.add(tf.keras.layers.Flatten())

model_vgg16.add(tf.keras.layers.Dense(4, activation='softmax'))

model_vgg16.compile(loss='categorical_crossentropy', 
              optimizer=tf.keras.optimizers.Adam(0.001),
              metrics=['acc'])
model_vgg16.summary()

        模型训练:

Epoch 1/25
88/88 [==============================] - ETA: 0s - loss: 0.6459 - acc: 0.7654
Epoch 1: acc improved from -inf to 0.76544, saving model to save_models\vgg16_best.h5
88/88 [==============================] - 789s 9s/step - loss: 0.6459 - acc: 0.7654 - val_loss: 0.4368 - val_acc: 0.8355

......

Epoch 25: acc improved from 0.98754 to 0.98950, saving model to save_models\vgg16_best.h5
88/88 [==============================] - 1244s 14s/step - loss: 0.0384 - acc: 0.9895 - val_loss: 0.1704 - val_acc: 0.9338

        训练 Loss 和 Acc 结果可视化:

        模型评估:

train_result = model_vgg16.evaluate(train_ds)
val_result = model_vgg16.evaluate(val_ds)

vgg16_eval_result = pd.DataFrame(zip(train_result,val_result),columns=['Train','Val'],index=['Loss','Acc'])

ypred_val = model_vgg16.predict(val_ds[0][0])
ypred_val = np.argmax(ypred_val, axis=1)

true_val = np.argmax(val_ds[0][-1], axis=1)

print("混淆矩阵:")
print(confusion_matrix(true_val, ypred_val))
print("详细评估指标:")
print('\n',classification_report(ypred_val, true_val))
TrainVal
Loss0.0619260.161204
Acc0.9754400.939459

3.2 InceptionV3 Base Model

        深度神经网络(Deep Neural Networks, DNN)或深度卷积网络中的Inception模块是由Google的Christian Szegedy等人提出,包括Inception-v1、Inception-v2、Inception-v3、Inception-v4及Inception-ResNet系列。

参考文章:经典神经网络 | 从Inception v1到Inception v4全解析

        以 InceptionV3 为 Base model 构建脑部肿瘤识别模型

        模型训练:

checkpoint = tf.keras.callbacks.ModelCheckpoint('save_models/inceptionv3_best.h5', monitor='acc', verbose=1, mode='max',save_best_only=True)
early = tf.keras.callbacks.EarlyStopping(monitor="acc", mode="max",restore_best_weights=True, patience=5)
callbacks_list = [checkpoint,early]

history = model_inceptionv3.fit(
        train_ds,
        validation_data=val_ds,
        epochs=25, 
        shuffle=True, 
        verbose=True,
        callbacks=callbacks_list)

        可以看出,InceptionV3模型训练的验证集 Loss 与准确率变化曲线抖动较大,性能不是很稳定。

        模型评估:

TrainVal
Loss0.6382191.358395
Acc0.9248980.888889

3.3 模型性能对比

labels = ['LOSS', 'ACC']
vgg16_evals = [vgg16_eval_result['Loss'], vgg16_eval_result['Acc']]
inceptionv3_evals = [inceptionv3_eval_result['Loss'], inceptionv3_eval_result['Acc']]

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots(figsize=(8, 6), dpi=100)
rects1 = ax.bar(x - width/2, vgg16_evals, width, label='VGG16')
rects2 = ax.bar(x + width/2, inceptionv3_evals, width, label='Inception-V3')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Loss/Acc')
ax.set_title('VGG16 与 Inception-V3 的脑部肿瘤检测性能对比')
ax.set_xticks(x, labels)
ax.legend()

ax.bar_label(rects1, padding=3)
ax.bar_label(rects2, padding=3)

fig.tight_layout()
 
plt.show()

        可以看出,在脑部肿瘤检测任务上,VGG16 的性能相比 Inception-V3 的预测准确率较高,性能较好,但预测推理时间较长,时效性不如 Inception-V3。

4. 基于深度学习的脑部肿瘤检测系统

4.1 首页简介与注册登录

4.2 脑部肿瘤在线检测

        通过上传待测试脑部MRI扫描影像,选择预测模型 VGG16 或 Inception-V3 不同模型,点击提交预测,后台模型加载图像,进行预测,给出是否包含脑部肿瘤及肿瘤类型:

5. 总结

        本项目利用 TensorFlow、Keras 等深度学习工具包构建 VGG16、RestNet、InceptionV3 等神经网络,实现对脑部肿瘤 MRI 扫描影像的识别。首先在 Jupyter Notebook 平台实现模型的训练、验证和存储,利用 Flask + Bootrap + Ajax 搭建交互式分析框架,实现脑部 MRI 扫描影像上传和在线预测,模型给出是否包含脑部肿瘤及肿瘤类型,整体准确率达到93.9%。

 欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

1. Python数据挖掘精品实战案例

2. 计算机视觉 CV 精品实战案例

3. 自然语言处理 NLP 精品实战案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1613279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis中的慢查询日志(一)

慢查询日志 概述 Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来 监视和优化查询速度。服务器配置有两个和慢查询日志相关的选项: 1.slowlog-log-slower-than选项指定执行时间超过多少微妙(1秒1000 000微妙)的命…

The C programming language (second edition,KR) exercise(CHAPTER 4)

E x c e r c i s e 4 − 1 Excercise\quad 4-1 Excercise4−1&#xff1a; #include <stdlib.h> #include <stdio.h> #include <string.h> int strindex(char s[],char t[]); int strrindex(char s[],char t[]);int main(void) {char s[100]"qwoulddf…

【Linux驱动层】iTOP-RK3568学习之路(四):杂项设备驱动框架

一、杂项设备驱动简介 在 Linux 中&#xff0c;把无法归类的五花八门的设备定义成杂项设备。相较于字符设备&#xff0c;杂项设备有以下两个优点: (1)节省主设备号:杂项设备的主设备号固定为 10&#xff0c;而字符设备不管是动态分配还是静态分配设备号&#xff0c;都会消耗一…

AlDente Pro for mac最新激活版:电池长续航软件

AlDente Pro是一款专为Mac用户设计的电池管理工具&#xff0c;旨在提供电池安全和健康管理的一站式解决方案。它具备实时监控电池状态的功能&#xff0c;让用户随时了解电池的电量、充电次数、健康状态等信息。 AlDente Pro for mac最新激活版下载 同时&#xff0c;AlDente Pro…

【蓝桥杯2025备赛】集合求和

集合求和 题目描述 给定一个集合 s s s&#xff08;集合元素数量 ≤ 30 \le 30 ≤30&#xff09;&#xff0c;求出此集合所有子集元素之和。 输入格式 集合中的元素&#xff08;元素 ≤ 1000 \le 1000 ≤1000&#xff09; 输出格式 s s s 所有子集元素之和。 样例 #1 …

Docker搭建项目管理软件禅道

文章目录 一、简介二、部署三、使用 一、简介 禅道是以项目管理为核心的协作平台&#xff0c;旨在帮助团队高效地进行项目管理和协作。 禅道提供了项目管理、任务管理、团队协作、文档管理、报告统计等功能。 禅道官网 二、部署 操作系统&#xff1a;22.04.4 创建文件夹 …

ARM与单片机有啥区别?

初学者必知&#xff1a;ARM与单片机到底有啥区别&#xff1f;1、软件方面这应该是最大的区别了。引入了操作系统。为什么引入操作系统&#xff1f;有什么好处嘛&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教…

【OpenHarmony-NDK技术】简单将cJson移植到OpenHarmony中,并在c层修改参数值再返回json

1、cJson的简单介绍 cJson - github网址 概述 一般使用cJson是&#xff0c;需要将json文本转化为json对象–编码&#xff0c;将json对象转化为json文本–解析。 git clone https://github.com/DaveGamble/cJSON.git 后留意cJSON.h和cJSON.h两个文件。 1、cJson的介绍 cJso…

使用FPGA实现比较器

介绍 比较器就是通过比较输入的大小&#xff0c;然后输出给出判断。 在这个比较器中&#xff0c;有两个输入&#xff0c;三个输出。根据输出就可以判断出哪个输入值大了。 设计文件 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity compa…

JAVA----Thread

Thread 这里写目录标题 Thread线程Thread 第 1 种写法此外, t.start()的作用 Thread 第 2 种写法Thread 第 3 种写法Thread 第 4 种写法Thread 第 5 种写法 线程 本身是操作系统提供的, 操作系统提供了 API 以让我们操作线程, JVM 就对操作系统 API 进行了封装. 线程这里, 则提…

verilog变量类型wire、reg和Memory的介绍和用法

目录 wire型 reg型 Memory型 wire型 wire 类型变量&#xff0c;也叫网络类型变量&#xff0c;用于结构实体之间的物理连接&#xff0c;如门与门之间&#xff0c;不能储存值&#xff0c;用连续赋值语句 assign 赋值&#xff0c;定义为 wire [n-1:0] a ; 其中 n 代表位宽&…

OCT2Former: A retinal OCT-angiography vessel segmentationtransformer论文总结

论文(COMPUT METH PROG BIO)&#xff1a;OCT2Former: A retinal OCT-angiography vessel segmentation transformer 源码&#xff1a;https://github.com/coreeey/OCT2Former 一、摘要 背景与目的&#xff1a;视网膜血管分割在视网膜疾病自动筛查与诊断中起着重要作用。如何分…

面试高频:HTTPS 通信流程

更多大厂面试内容可见 -> http://11come.cn 面试高频&#xff1a;HTTPS 通信流程 HTTPS 的加密流程 接下来说一下 HTTPS 协议是如何进行通信的&#xff1a; HTTPS 通信使用的 对称加密 非对称加密 两者结合的算法 HTTPS 通信时&#xff0c;会先使用 非对称加密 让通信双…

大sql mysql执行

先把sql 拆分 太大的执行失败 使用 SQLDumpSplitter3 拆分sql 执行拆分的sql 拆分的sql 打开发现很多 ; 开头的空行 替换掉 正则 ^; 修改数据库 my.cnf my,ini 执行可能会提示 [ERR] 2006 - Server has gone away 错误 在 [mysqld] 添加以下几行 wait_timeout2880000 inter…

Qt基础之四十六:Qt界面中嵌入第三方程序的一点心得

本文主要讲解QWidget和QWindow的区别,以及如何在QWidget中嵌入第三方程序,并完美解决在QWidget中嵌入某些程序(比如Qt程序)时出现的白边问题。 下面是嵌入QQ音乐的样子,这首歌还不错。 先用spy++查看QQ音乐的窗口信息,如果安装了Visual Studio,工具菜单里自带spy++ 然后…

【1471】java项目进度管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 项目进度管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

【Linux】自定义协议——实现网络序列化和反序列化

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;承接上文内容【Linux】应用层协议序列化和反序列化 目录 &#x1f449;&#x1f3fb;代码实现如下Calculate.hp…

企业常用Linux三剑客awk及案例/awk底层剖析/淘宝网cdn缓存对象分级存储策略案例/磁盘知识/awk统计与计算-7055字

高薪思维&#xff1a; 不愿意做的事情:加班&#xff0c;先例自己在利他 生活中先利他人在利自己 感恩&#xff0c;假设别人帮助过你&#xff0c;先帮助别人&#xff0c;感恩境界 awk三剑客老大 find其实也算是一种新的第四剑客 find 查找文件 查找文件&#xff0c;与其他命令…

【UnityShader】图片圆角

1.需求 我们在开发的时候&#xff0c;有时候一些按钮或者菜单栏的边角是直角的需要改成圆角&#xff0c;但是让美术重新绘制耽误时间不说也确实没必要&#xff0c;这个时候我们不妨使用一个简单的shader去解决这个问题&#xff0c;下面我们就讲讲这个shader要如何实现。 需求1…

设计模式之观察者模式(优先使用对象组合的原则)的C++实现

观察者模式又称订阅者发布者模式&#xff0c;本篇介绍主要是利用对象组合大于类继承的设计模式原则实现订阅发布模式&#xff0c;这种设计的优点是想订阅数据的类不需要继承订阅者类的抽象类&#xff0c;减少了一层类的继承&#xff1b;当然&#xff0c;具体情况需要可根据需求…