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

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

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

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

目录

(1)导入相关模块

(2)构建数据集

(3)加载训练的网络

(4)调整模型

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


(1)导入相关模块

python 复制代码
import os
from PIL import Image
from glob import glob

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader

from torchvision import transforms
from torchvision.models import resnet50, ResNet50_Weights

(2)构建数据集

python 复制代码
class ChestXRayDataset(Dataset):
    def __init__(
            self,
            dataset_dir,
            transform=None) -> None:
        self.dataset_dir = dataset_dir
        self.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 = 0
        else:
            category = 1

        if self.transform:
            image = self.transform(image)

        return image, category

(3)加载训练的网络

python 复制代码
def prepare_model():
    # 加载预训练的模型
    resnet50_weight = ResNet50_Weights.DEFAULT
    resnet50_mdl = resnet50(weights=resnet50_weight)
    # 替换模型最后的全连接层
    num_ftrs = resnet50_mdl.fc.in_features
    resnet50_mdl.fc = nn.Linear(num_ftrs, 2)

    return resnet50_mdl


def train_model():
    # 确定使用CPU还是GPU
    if torch.cuda.is_available():
        device = "cuda:0"
    else:
        device = "cpu"
    # 加载模型
    model = prepare_model()
    model = model.to(device)
    model.train()
    # 设置loss函数和optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

    # 设置训练集数据加载相关变量
    batch_size = 32
    chest_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)调整模型

python 复制代码
   for epoch in range(5):
        print_batch = 50
        running_loss = 0
        running_corrects = 0
        for i, data in enumerate(train_dataloader):
            inputs, labels = data
            inputs = 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-batches
                accuracy = 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.0
                running_corrects = 0
        checkpoint_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)设置测试集加载参数

python 复制代码
    batch_size = 32
    chest_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 = data
            inputs = 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

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

相关推荐
测试员周周3 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
K姐研究社4 小时前
怎么用AI制作电商口播视频,开拍APP一键生成
人工智能·音视频
LaughingZhu5 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
传说故事5 小时前
【论文阅读】MotuBrain: An Advanced World Action Model for Robot Control
论文阅读·人工智能·具身智能·wam
北京耐用通信6 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
火山引擎开发者社区6 小时前
TRAE × 火山引擎 Supabase:为你的 AI 应用装上“数据引擎”
人工智能
小a彤6 小时前
GE 在 CANN 五层架构中的位置
人工智能·深度学习·transformer
前端若水6 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Upsy-Daisy6 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习
企学宝7 小时前
企学宝5月专题课程丨《OpenClaw AI 智能体实战营:从零基础部署到全场景自动化落地》
人工智能·ai·企业培训