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

温馨提示:文末有 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 精品实战案例

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机STM32中断与事件的区别

【转】1-单片机STM32---中断与事件的区别 - Engraver - 博客园 (cnblogs.com) 路径不同,处理方式不同,是否有程序不同,是否有cpu参与不同。 事件是比中断更新的升级产物。

Golang | Leetcode Golang题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; func firstMissingPositive(nums []int) int {n : len(nums)for i : 0; i < n; i {for nums[i] > 0 && nums[i] < n && nums[nums[i]-1] ! nums[i] {nums[nums[i]-1], nums[i] nums[i], nums[nums[i]-1]}}for i …

JavaScript变量及数据类型

目录 概述&#xff1a; 变量&#xff1a; 前言&#xff1a; 变量的命名&#xff1a; 定义变量&#xff1a; 为变量赋值&#xff1a; 变量提升&#xff1a; let和const关键字&#xff1a; JS数据类型&#xff1a; 前言&#xff1a; typeof操作符&#xff1a; JS基本…

一二三应用开发平台使用手册——系统管理-用户组-使用说明

概述 在RBAC模型中&#xff0c;资源、角色、用户三个关键元素&#xff0c;构成权限体系。在平台设计和实现的时候&#xff0c;以下几个核心问题思考如下&#xff1a; 角色&#xff0c;单层平铺还是树形结构&#xff1f; 在小型应用中&#xff0c;角色数量有限的情况下&#x…

Gitea 简单介绍、用法以及使用注意事项!

Gitea 是一个轻量级的代码托管解决方案&#xff0c;它提供了一个简单而强大的平台&#xff0c;用于托管和协作开发项目。基于 Go 语言编写&#xff0c;与 GitLab 和 GitHub Enterprise 类似&#xff0c;但专为自托管而设计。以下是对 Gitea 的详细介绍&#xff0c;包括常用命令…

SpringBoot---------@Value,@ConfigurationProperyies以及多环境开发配置

application.yml server:port: 8080#logging: # level: # root: info(默认)array:name: zzlage: 18subject:- Java- Vue- SpringBoot Value注解的使用:从yml配置文件中获取数据&#xff0c;即可在类中使用 Value("${server.port}")private String port;Value(&q…

SpringBoot中Bean的创建过程及扩展操作点 @by_TWJ

目录 1. 类含义2. Bean创建过程 - 流程图3. 例子3.1. 可变属性注入到实体中3.2. 模拟Bean创建的例子 1. 类含义 BeanDefinition - 类定义&#xff0c;为Bean创建提供一些定义类的信息。实现类如下&#xff1a; RootBeanDefinition - 类定义信息&#xff0c;包含有父子关系的Be…

美国RAKSmart服务器性能科普

当我们谈论服务器性能时&#xff0c;无疑会涉及多个维度&#xff0c;包括存储能力、网络连接、稳定性、管理界面以及安全性等。在这篇科普文章中&#xff0c;我们将深入探讨美国RAKSmart服务器的性能特点。 首先&#xff0c;RAKSmart服务器在存储和扩展性方面表现出色。它们配备…

Git 工作原理

Git 工作原理 | CoderMast编程桅杆https://www.codermast.com/dev-tools/git/git-workspace-index-repo.html Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09;Remote&#xff1a;远程仓库 Git 一…

绿联 安装transmission

绿联 安装transmission及中文UI 1、镜像 linuxserver/transmission:latest 2、安装 2.1、创建容器 按需配置权重。 2.2、基础设置 2.3、网络 桥接即可。 注&#xff1a;如果使用IPV6&#xff0c;请选择"host"模式。 注&#xff1a;如果使用IPV6&#xff0c;请选…

网络数据包嗅探器工具

组织的网络非常庞大&#xff0c;包含服务器、交换机、路由器和接入点等众多节点&#xff0c;由于许多资源和流量不断通过这些节点&#xff0c;因此很难确定大量流量是真实的还是安全攻击的迹象&#xff0c;了解和了解组织的网络流量至关重要&#xff0c;一个有用的资源是网络数…

JAVA学习笔记31(IO流)

1.IO流 1.文件流 ​ *文件在程序中是以流的形式来操作的 2.常用文件操作 1.创建文件对象 1.new File(String pathname) //根据路径构建一个File对象 main() {}public void create01() {String filePath "e:\\news1.txt";File filePath new File(filePath);tr…

c++ 线性搜索与二分搜索

线性搜索 假设该项目以随机顺序存在于数组中&#xff0c;并且我们必须找到一个项目。那么搜索目标项目的唯一方法就是从第一个位置开始&#xff0c;并将其与目标进行比较。如果项目相同&#xff0c;我们将返回当前项目的位置。否则&#xff0c;我们将转移到下一个位置。…

HTML 中创建 WebSocket服务与接收webSocket发送内容

效果图 服务端 html客户端接受的消息 接下来开始实现服务端 创建server.js const WebSocket require(ws);const wss new WebSocket.Server({ port: 8877 });wss.on(connection, function connection(ws) {console.log(WebSocket connection opened.);// 每隔 5 秒发送一次…

NIO之ByteBuffer

NIO中的ByteBuffer是缓冲区&#xff0c;其中有几个比较重要的属性capacity&#xff0c;position和limit。 capacity&#xff1a; 其中&#xff0c;capacity是缓冲区的容量大小&#xff0c;在分配内存空间后不会改变。 limit&#xff1a; limit是限制位置&#xff0c;在读写模…

【MongoDB】数据的自动过期,TTL索引

文章目录 1. 前言2.概念与使用2.1.使用方式2.2.数组中包含日期字段2.3.设置具体的过期时间点2.4.额外的过滤条件 3.总结 1. 前言 在近期的工作中&#xff0c;使用了MongoDB来保存了一些日志数据&#xff0c;但是这些日志数据具有一定的时效性&#xff0c;也就是按照业务的需要…

活动回顾丨雀跃山城•2024重庆爱鸟周主题公益活动落地大坪大融城

重庆&#xff0c;这座美丽的山城&#xff0c;不仅有着独特的山水风光&#xff0c;更是众多鸟类栖息繁衍的家园。重庆将四月第一周定为“重庆爱鸟周”&#xff0c;为提高青少年珍稀动物保护意识&#xff0c;4月20日&#xff0c;大坪大融城携手传益千里开展雀跃山城?2024重庆爱鸟…

cox版本的Boruta+SHAP分析(心力衰竭数据集)

Cox版本的BorutaSHAP分析&#xff08;心力衰竭数据集&#xff09; Boruta算法是变量筛选的有力工具&#xff0c;而SHAP分析是观察预测变量与结局变量间关系的不错的方法&#xff0c;在传统的分析方法的基础上提供了一个全新的视角。Boruta算法SHAP分析&#xff0c;正在逐渐成为…

Python代码格式化工具Black介绍

Black 是一个 Python 代码格式化工具&#xff0c;以其简洁和一致的格式化风格而闻名。它被设计为一个“零妥协”的代码格式化程序&#xff0c;意味着它会自动地将代码格式化为一种统一的风格&#xff0c;而不需要用户进行任何配置。Black 严格遵循 PEP 8 -- Python 的官方编码风…

笔试狂刷--Day2(模拟高精度算法)

大家好,我是LvZi,今天带来笔试狂刷--Day2(模拟高精度算法) 一.二进制求和 题目链接:二进制求和 分析: 代码实现: class Solution {public String addBinary(String a, String b) {int c1 a.length() - 1, c2 b.length() - 1, t 0;StringBuffer ret new StringBuffer()…