基于迁移学习实现肺炎X光片诊断分类

       大家好,我是带我去滑雪!

       肺炎是全球范围内致死率较高的疾病之一,尤其是在老年人、免疫系统较弱的患者群体中,更容易引发严重并发症。传统上,肺炎的诊断依赖于医生的临床经验以及影像学检查,尤其是X光片,它在肺炎的早期筛查和诊断中扮演了至关重要的角色。然而,X光片的读取不仅需要专业的放射科医生,而且受到经验和疲劳等因素的影响,导致诊断结果的准确性存在一定的偏差。近年来,人工智能(AI)技术,尤其是深度学习在医学影像领域取得了显著进展。通过深度学习模型,计算机能够高效地从大量影像数据中学习到复杂的模式,并实现对疾病的自动识别和分类,极大地提高了诊断的速度和准确性。迁移学习作为深度学习的一种重要方法,能够通过在已有的、大规模的医学图像数据上预训练模型,并迁移到肺炎X光片的分类任务上,减少对大量标注数据的需求,这对资源有限、标注困难的医学领域尤为重要。

        基于迁移学习的肺炎X光片诊断分类研究,不仅可以缓解医生在实际工作中因繁重工作负担导致的诊断错误问题,还能够通过高效、准确的自动化诊断方法,在早期筛查中提供帮助,尤其是在偏远地区或医疗资源匮乏的环境中,为患者提供及时的诊疗建议,极大地促进了医疗资源的合理分配。此外,该研究的成功实现还可以为其他疾病的X光片图像诊断提供借鉴,推动人工智能技术在医学领域的广泛应用。下面开始代码实战。

目录

(1)导入相关模块

(2)构建数据集

(3)加载训练的网络

(4)调整模型

(5)设置测试集加载参数


(1)导入相关模块

import os
from PIL import Image
from glob import globimport torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoaderfrom torchvision import transforms
from torchvision.models import resnet50, ResNet50_Weights

(2)构建数据集

class ChestXRayDataset(Dataset):def __init__(self,dataset_dir,transform=None) -> None:self.dataset_dir = dataset_dirself.transform = transform# 获取文件夹下所有图片路径self.dataset_images = glob(f"{self.dataset_dir}/**/*.jpeg", recursive=True)# 获取数据集大小def __len__(self):return len(self.dataset_images)# 读取图像,获取类别def __getitem__(self, idx):image_path = self.dataset_images[idx]image_name = os.path.basename(image_path)image = Image.open(image_path)if "NORMAL" in image_name:category = 0else:category = 1if self.transform:image = self.transform(image)return image, category

(3)加载训练的网络

def prepare_model():# 加载预训练的模型resnet50_weight = ResNet50_Weights.DEFAULTresnet50_mdl = resnet50(weights=resnet50_weight)# 替换模型最后的全连接层num_ftrs = resnet50_mdl.fc.in_featuresresnet50_mdl.fc = nn.Linear(num_ftrs, 2)return resnet50_mdldef train_model():# 确定使用CPU还是GPUif torch.cuda.is_available():device = "cuda:0"else:device = "cpu"# 加载模型model = prepare_model()model = model.to(device)model.train()# 设置loss函数和optimizercriterion = nn.CrossEntropyLoss()optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)# 设置训练集数据加载相关变量batch_size = 32chest_xray = r"E:\工作\硕士\博客\博客99-深度学习医学特征提取\deeplea test\deeplea test\archive\chest_xray"train_dataset_dir = os.path.join(chest_xray, "train")train_transforms = transforms.Compose([transforms.ToTensor(),transforms.Lambda(lambda x: x.repeat(3, 1, 1) if x.size(0) == 1 else x),transforms.Resize((224, 224)),transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])train_dataset = ChestXRayDataset(train_dataset_dir, train_transforms)train_dataloader = DataLoader(train_dataset,batch_size=batch_size,shuffle=True)

(4)调整模型

   for epoch in range(5):print_batch = 50running_loss = 0running_corrects = 0for i, data in enumerate(train_dataloader):inputs, labels = datainputs = inputs.to(device)labels = labels.to(device)optimizer.zero_grad()outputs = model(inputs)_, preds = torch.max(outputs, 1)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += (loss.item() * batch_size)running_corrects += torch.sum(preds == labels.data)if i % print_batch == (print_batch - 1):  # print every 100 mini-batchesaccuracy = running_corrects / (print_batch * batch_size)print(f'Epoch: {epoch + 1}, Batch: {i + 1:5d} Running Loss: {running_loss / 50:.3f} Accuracy: {accuracy:.3f}')running_loss = 0.0running_corrects = 0checkpoint_name = f"epoch_{epoch}.pth"torch.save(model.state_dict(), checkpoint_name)def test_model():if torch.cuda.is_available():device = "cuda:0"else:device = "cpu"# 加载模型checkpoint_name = "epoch_4.pth"model = prepare_model()model.load_state_dict(torch.load(checkpoint_name, map_location=device))model = model.to(device)model.eval()

(5)设置测试集加载参数

    batch_size = 32chest_xray = r"E:\工作\硕士\博客\博客99-深度学习医学特征提取\deeplea test\deeplea test\archive\chest_xray"test_dataset_dir = os.path.join(chest_xray, "test")test_transforms = transforms.Compose([transforms.ToTensor(),transforms.Lambda(lambda x: x.repeat(3, 1, 1) if x.size(0) == 1 else x),transforms.Resize((224, 224)),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])test_dataset = ChestXRayDataset(test_dataset_dir, test_transforms)test_dataloader = DataLoader(test_dataset,batch_size=batch_size,shuffle=False)# 在测试集测试模型with torch.no_grad():preds_list = []labels_list = []for i, data in enumerate(test_dataloader):inputs, labels = datainputs = inputs.to(device)labels = labels.to(device)outputs = model(inputs)_, preds = torch.max(outputs, 1)preds_list.append(preds)labels_list.append(labels)preds = torch.cat(preds_list)labels = torch.cat(labels_list)# 计算评价指标corrects_num = torch.sum(preds == labels.data)accuracy = corrects_num / labels.shape[0]# 输出评价指标print(f"Accuracy on test dataset: {accuracy:.2%}")if __name__ == "__main__":train_model()test_model()

输出结果:


更多优质内容持续发布中,请移步主页查看。

 若有问题可邮箱联系:1736732074@qq.com 

博主的WeChat:TCB1736732074

   点赞+关注,下次不迷路!

 

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

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

相关文章

工业数据治理范式革新:时序数据库 TDengine虚拟表技术解析

小T导读:在工业数字化过程中,数据如何从设备采集顺利“爬坡”到上层应用,一直是个难题。传统“单列模型”虽贴合设备协议,却让上层分析举步维艰。TDengine 用一种更聪明的方法打通了这条数据通路:不强求建模、不手动转…

Redis面试——日志

一、RDB(Redis DataBase) RDB 全程是 Redis DataBase,它是一种将 Redis 在某一时刻内存中的数据以快照形式保存到磁盘的机制 ,相当于给执行save/bgsave命令时刻的内存数据库数据拍了一张快照我们如果通过save命令来执行快照&…

【Android】常用参数实践 用户界面UI 布局文件XML

本文将系统总结 Android XML 布局的通用参数和常用布局类型的专属规则 一、通用布局参数 这些参数适用于所有 View 和 ViewGroup,是布局设计的基石。 1. 尺寸控制 android:layout_width 与 android:layout_height 定义视图的宽度和高度,可选值&#xf…

解决 VSCode 中 NVM 配置后无法识别 Node 和 NPM 的问题

在开发中,我们经常需要使用 Node.js 和 NPM 来管理 JavaScript 项目依赖,而 NVM(Node Version Manager)是开发者在本地环境中管理多个 Node.js 版本的得力工具。不过,有时候在 VSCode 中配置完 NVM 后,可能…

BGP分解实验·23——BGP选路原则之路由器标识

在选路原则需要用到Router-ID做选路决策时,其对等体Router-ID较小的路由将被优选;其中,当路由被反射时,包含起源器ID属性时,该属性将代替router-id做比较。 实验拓扑如下: 实验通过调整路由器R1和R2的rout…

Linux: 线程同步

目录 一 前言 二 线程饥饿 三 线程同步 四 条件变量 1. cond ( condition) 2. pthread_cond_wait() : 3. pthread_cond_signal() 五 条件变量的使用 一 前言 在上篇文章Linux : 多线程互斥-CSDN博客我们讲解了线程互斥的概念&#xff…

MyBatisPlus-QueryWrapper的exists方法拼接SQL中的EXISTS子句

在 MyBatis-Plus 中,QueryWrapper 的 exists 方法用于拼接 SQL 中的 EXISTS 子句,通常用于构 建子查询条件。以下是具体用法和示例: ​​1. 基本语法​​ // 判断是否存在符合条件的记录 queryWrapper.exists(String existsSql); queryWrapper.notExists(String existsSq…

[数据结构]哈希表

目录 1、哈希表 1.1、概念 1.2、冲突 2、哈希函数设计 3、负载因子调节 4、闭散列 5、开散列/哈希桶(重点掌握) 6、实现哈希桶 6.1、put方法 6.2、HashMap的扩容机制 6.3、get方法 7、HashMap 8、HashSet 8.1、哈希表性能分析 9、hashcod…

VS-Code创建Vue3项目

1 创建工程文件 创建一个做工程项目的文件夹 如:h5vue 2 cmd 进入文件 h5vue 3 输入如下命令 npm create vuelatest 也可以输入 npm create vitelatest 4 输入项目名称 项目名称:自已输入 回车 可以按键盘 a (全选) 回车: Playwright…

linux休眠唤醒流程

1、框架 2、休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态,给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr, …

Mysql--基础知识点--93--两阶段提交

1 两阶段提交 以update语句的具体执行过程为例: 具体更新一条记录 UPDATE t_user SET name ‘xiaolin’ WHERE id 1;的流程如下: 1.执行器负责具体执行,会调用存储引擎的接口,通过主键索引树搜索获取 id 1 这一行记录&#…

Windows 环境下 Apache 配置 WebSocket 支持

目录 前言1. 基本知识2. 实战前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 原先写过apache的http配置:Apache httpd-vhosts.conf 配置详解(附Demo) 1. 基本知识 🔁 WebSocket 是 HTTP 的升级协议 客户…

UMAEA论文阅读

Preliminaries MMKG为一个五元组G{E, R, A, V, T},其中E、R、A和V分别表示实体集、关系集、属性集和图像集。 T⊆ERE是关系三元组集。 给定两个MMKG G1 {E1, R1, A1, V1, T1} 和 G2 {E2, R2, A2, V2, T2}, MMEA旨在识别每个实体对(e1…

AIGC-十款知识付费类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

Qt界面卡住变慢的解决方法

本质原因: 当Qt界面出现卡顿或无响应时,通常是因为主线程(GUI线程)被耗时操作阻塞。 完全忘了。。。 Qt Creater解决方法 1. 定位耗时操作 目标:找到阻塞主线程的代码段。 方法: 使用QElapsedTimer测量代码执行时间…

【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战!| 附源码

【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战! 前言:当Java遇上大模型 在AI浪潮席卷全球的今天,Java开发者如何快速拥抱大语言模型?LangChain4j作为专为Java打造的AI开发框架&#xff0c…

Vue 3 reactive 和 ref 区别及 失去响应性问题

在 Vue 3 中,reactive 和 ref 是实现响应式数据的两个核心 API,它们的设计目标和使用场景有所不同。以下是两者的详细对比: 1. 基本定义与核心功能 特性reactiveref作用创建对象类型的响应式代理(对象、数组、Map 等&#xff09…

第一节:Vben Admin 最新 v5.0初体验

系列文章目录 基础篇 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权…

Nginx部署spa单页面的小bug

没部署过,都是给后端干的,自己尝试部署了一个下午终于成功了 我遇到的最大的bug是进入后只有首页正常显示 其他页面全是404,于是问问问才知道,需要这个 location / { try_files $uri $uri/ /index.html; } 让…

面试算法高频08-动态规划-01

动态规划 递归知识要点 递归代码模板:提供递归代码的标准形式public void recur(int level, int param) ,包含终止条件(if (level> MAX_LEVEL))、当前层逻辑处理(process(level, param))、向下一层递归…