基于遷移學習實現肺炎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.pswp.cn/news/901845.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901845.shtml
英文地址,請注明出處:http://en.pswp.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))、向下一層遞歸…