Advertisement

VGG16模型实现新冠肺炎图片多分类

阅读量:

1. 项目简介

本项目的初衷在于利用深度学习技术中的VGG16模型来完成新冠肺炎医学影像的多类别分析任务。这项技术旨在辅助医疗专业人士对患者CT或X光影像进行高效且精确的诊断。自新冠疫情爆发以来,医学影像分析已逐渐成为疾病诊断的重要技术手段之一。随着医疗数据量的持续增长,在人工智能驱动下的图像解析方法展现出显著优势:它不仅能够显著提升检测效率而且有效降低误诊概率。本项目基于预训练好的VGG16模型框架,在肺部CT或X光影像数据上展开训练以实现各类肺部病变类型的有效识别过程。作为经典的深度卷积神经网络架构VGG16拥有16层神经网络结构能够在复杂图像中提取细微特征并为医学图像分析提供可靠支持。在此基础上我们采用迁移学习策略将VGG16模型的卷积层参数应用至新冠肺炎疾病分类任务中并通过微调优化使模型更加贴合特定医学影像数据集的需求最终目标是开发出一个高效可靠且可扩展性的深度学习系统以协助临床医生提高肺炎患者的诊断准确率同时最大限度地减轻医疗系统的负担

2.技术创新点摘要

迁移学习在本项目中的应用:该系统采用VGG16模型进行迁移学习。这是本项目的核心技术亮点。VGG16是一个经过大规模预训练的深度神经网络,在ImageNet这一大规模图像数据集上进行了预先的深度学习训练。通过将这些经过精心优化的特征提取模块被固定不变(即卷积层权重被固定),系统能够专注于针对新冠肺炎CT影像图进行分类的任务。这种设计使得无需重新从零开始构建网络结构(即无需从头开始构建新的卷积层),从而显著减少了计算资源消耗时间,并且能够在保证网络稳定性的同时实现了更高的分类准确率。

3. 数据集与预处理

本项目所采用的新冠肺炎医学图像数据集主要包含CT或X光图像,并涵盖正常、轻度感染及重度感染等多种肺部影像类型。这些高质量医学图像能够清晰展示患者的肺部病变情况。数据集中的分类标签对应不同的病理学特征,并用于训练深度学习模型进行多分类诊断任务。医学影像之所以具有显著复杂性,在于其丰富的细节特征需要经过专业的预处理流程才能有效提取关键特征信息

在数据预处理阶段中,在第一个步骤中对原始图像实施统一尺寸调整。所有图像经过尺寸归一化处理后统一缩放为大小为224x224像素,并通过transforms.ToTensor()函数转换为张量;随后将像素值从0-255的比例缩放到0-1范围内。基于ImageNet预训练均值和标准差执行图像归一化处理后将像素值调整到(-1,1)区间内。这一步骤旨在使输入数据分布与预训练模型期望的数据分布保持一致从而提升模型的整体性能水平

在数据增强领域中,项目采用了多样化的增强策略,这对提升训练数据的质量具有重要意义.这些增强操作包括随机裁剪和翻转等技术,这对提升训练数据的多样性具有重要意义.同时这些增强手段不仅能够有效防止模型出现过拟合现象,还能够模拟医学图像在不同条件下的变化情况.此外通过这样的强化学习机制,可以使模型在应对各种情况时表现得更加稳定和可靠.

4. 模型架构

本项目采用了VGG16架构,在深度学习领域是一种广泛使用的深度卷积神经网络(CNN)结构。该网络主要由多个功能模块构成,在具体实现中通常包括卷积层、池化层以及全连接层等关键组件。

  • 卷积层 :VGG16由多个卷积层构成,每一层卷积操作的公式为:

y_{i,j,k} = \sum_{m,n} w_{m,n,k} \cdot x_{i+m,j+n} + b_k

其中x代表输入图像,w代表卷积核权重,b代表偏置项,y代表输出的特征图.这些卷积操作主要用于提取图像中的局部特征信息,尤其适合复杂的医学图像.

池化层 :卷积后会经过最大池化层(Max Pooling),其公式为:

y_{i,j,k} = \max \{ x_{i+m,j+n,k} \}, \, (m,n) \in S

池化过程降低了特征图的空间维度,并非仅仅缩小尺寸;进而减小了模型的整体计算复杂度;另一方面确保了关键特征的信息得以保留。

经过卷积与池化处理后的输出最终会被整合到全连接层中进行处理,并将多维度特征转化为单一维度向量。

y = W \cdot x + b

在本层中,W被称为权重矩阵,x被视为输入向量,b被确定为偏置项,y则代表输出值。这一层负责处理图像数据,通过卷积操作将经过池化后的特征映射到具体的分类结果上。

Softmax层模块:位于网络模型的最后一层的Softmax层模块采用 Softmax 激活函数来计算并输出各个类别对应的概率分布。其数学表达式为:

P(y = k | x) = \frac{e^{z_k}}{\sum_{j} e^{z_j}}

其中 zk是分类k生成的结果, Softmax函数通过其特性确保输出结果是一个概率分布, 并广泛应用于多分类问题中.

模型层次概览

输入:224x224x3的医学影像

卷积层1-2(64个3x3卷积核)

最大池化层1

卷积层3-4(128个3x3卷积核)

最大池化层2

卷积层5-7(256个3x3卷积核)

最大池化层3

卷积层8-10(512个3x3卷积核)

最大池化层4

卷积层11-13(512个3x3卷积核)

最大池化层5

3个全连接层

最后通过Softmax层输出分类概率

模型的整体训练流程

训练流程如下:

数据加载:在实验过程中,默认的数据加载采用自定义的 MyDataset 类实现,并结合标准化处理以及数据增强等预处理步骤以提升训练效果。

模型初始化过程:导入预训练好的VGG16网络架构,并固定某些卷积核参数以保留其从ImageNet学习到的强大特征提取能力,在此基础上仅优化顶层几项参数完成微调。

前向传播

损失评估 :通过交叉熵损失函数(CrossEntropyLoss)评估预测结果与真实标签之间的差距: L = -\sum_{i} y_i \log(\hat{y}_i)

损失评估 :通过交叉熵损失函数(CrossEntropyLoss)评估预测结果与真实标签之间的差距: L = -\sum_{i} y_i \log(\hat{y}_i)

其中 yi是真实标签的概率分布,y^i是预测概率分布。

反向传播:为了计算损失函数的梯度而更新可训练参数;优化的目标是使损失函数最小化。

模型训练过程:通过Adam优化器实现参数更新过程,并通过融合动量机制和自适应学习率特性实现了高效的模型训练效果:\theta_{t+1} = \theta_t - \eta \cdot \frac{m_t}{\sqrt{v_t} + \epsilon}其中mt和vt分别代表一阶矩和二阶矩估计值,η表示学习率。

训练轮次 :设置训练周期(如20个周期),每个周期内经过前向传播、损失计算以及反向传播的过程来调整权重。

模型的评估过程 :基于测试集数据进行评估,并主要采用准确率(Accuracy)、召回率(Recall)等指标作为评价依据

  1. 准确率Accuracy = \frac{TP + TN}{TP + TN + FP + FN}

  2. 召回率Recall = \frac{TP}{TP + FN}

该模型在实际数据集上实现了对新冠肺炎图像的多分类任务的评估与优化。

5. 核心代码详细讲解

数据预处理与特征工程
复制代码
    pic_transform = transforms.Compose([
    transforms.Resize([224,224]),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])
    
    
      
      
      
      
      
    
    代码解释

解释

  1. transforms.Resize([224,224]):这行代码将输入图像的尺寸缩放到224x224像素,以确保输入图像大小一致,符合VGG16模型的输入要求。
  2. transforms.ToTensor():将PIL图像转换为PyTorch的Tensor类型,并将像素值从0-255的范围归一化为0-1。这是标准的PyTorch数据处理步骤。
  3. transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]):基于ImageNet的均值和标准差进行图像归一化,将像素值调整到(-1,1)的范围。该归一化策略是ImageNet预训练模型的标准配置,有助于提高模型性能。
自定义数据集加载
复制代码
    class MyDataset(Dataset):def init(self, img_path, file_name ,transform=None):
        self.root = img_path
        self.file_name = file_name
        self.csv_root = self.root + '//' + self.file_name
        df = pd.read_csv(self.csv_root)
        rows = df.shape[0]
        imgs = []
        labels = []for row in range(0,rows):
            imgs.append(os.path.join(self.root,df['image_path'][row]))
            labels.append(df['labels'][row])
        self.img = imgs
        self.label = labels
        self.transform = transform
    def len(self):return len(self.label)
    def getitem(self, item):
        img = self.img[item]
        label = self.label[item]
        img = Image.open(img).convert('RGB')if self.transform is not None:
            img = self.transform(img)
        label = np.array(label).astype(np.int64)
        label = torch.from_numpy(label)return img, label
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

解释

  1. init(self, img_path, file_name ,transform=None):初始化过程明确了图像文件的位置及对应的分类信息,并实现了对图片位置信息与类别数据的有序存储。该参数transform指定了后续的数据增强与预处理操作方案。
  2. df = pd.read_csv(self.csv_root):通过读取指定CSV文件获取了大量图片位置信息及其相关类别信息。
  3. self.img = imgsself.label = labels:实现了对图片位置信息与类别数据的有序存储,并在此基础上完成了特征提取相关的中间变量初始化工作。
  4. len(self):提供了计算数据集规模的基本功能。
  5. getitem(self, item):根据索引号获取对应的图片与分类结果。其中会先通过PIL库将原始图片打开并转换为RGB格式,并在此基础上执行相应的预处理操作(如归一化等),最终输出符合模型输入规范的数据表示形式。
模型构建与训练
复制代码
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model = models.vgg16(pretrained=True)
    for param in model.parameters():
    param.requires_grad = False
    model.classifier[6] = nn.Linear(4096, 3)
    model = model.to(device)
    
    
      
      
      
      
      
      
    
    代码解释

解释

该段代码通过torch.device函数判断当前系统是否支持使用GPU进行计算,并根据结果动态配置计算设备为'cuda'(即GPU)或'cpu'(即中央处理器)。当系统检测到可用的GPU时,默认将其设为计算设备;若无可用GPU,则默认使用CPU作为运算核心来完成任务处理流程。
该段代码从预训练模型库中加载了经过ImageNet大规模图像分类任务预训练的VGG-16网络结构模型实例,并将其应用在当前数据集上进行特征提取工作。
这段代码利用循环遍历网络参数的方式,在整个网络的所有可训练参数上设置了梯度不可更新的状态(即requires_grad属性设为False),从而实现了对模型中所有卷积层权重系数进行固定不变的学习过程操作策略设定。
该段代码对预训练好的VGG-16网络进行了针对性修改,在原有设计基础上将最后一层全连接层(classifier)替换成一个具有3个输出神经元的新线性层结构(nn.Linear)。这一操作旨在将原本针对ImageNet数据集分类的任务目标调整为适应当前特定应用场景下的多分类任务目标设定方案实施过程。
这段代码实现了对前向传播过程中使用的深度学习模型实例进行计算资源适配性的配置操作,在特定计算设备上执行相应的前向传播运算步骤以完成预期的任务目标实现方案设定流程。

模型训练与评估
复制代码
    def vgg_train(model, epochs, train_loader, test_loader, log_step_freq):
    model.train()
    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
    loss_fn = nn.CrossEntropyLoss()for epoch in range(epochs):for step, (x, y) in enumerate(train_loader):
            x, y = x.to(device), y.to(device)
            optimizer.zero_grad()
            pred = model(x)
            loss = loss_fn(pred, y)
            loss.backward()
            optimizer.step()if step % log_step_freq == 0:print(f"[{epoch+1}/{epochs}] Step: {step}, Loss: {loss.item()}")print('训练成功~')
    
    
      
      
      
      
      
      
      
      
      
      
    
    代码解释

解释

  1. 设置模型为训练模式时,默认开启包括Dropout在内的正则化机制。
  2. 采用Adam优化器对模型参数进行更新操作。Adam优化器结合了动量加速技术和自适应学习率策略,在提升收敛速度的同时有助于减少优化过程中的振荡现象。
  3. 设定交叉熵损失函数作为评估预测结果与真实标签之间差异的标准,在多分类问题中具有广泛的应用价值。
  4. 启动模型的训练循环,在每个完整的数据集遍历周期内执行一系列核心操作。
  5. 将输入数据和标签转移至可用的GPU或保持在CPU上以满足设备一致性要求。
  6. 清除优化器中的梯度缓存步骤以确保当前迭代不会受到上一步骤残留的影响。
  7. 执行前向传播过程以生成网络预测输出结果。
  8. 计算预测输出与真实标签之间的损失值并记录关键指标如准确率等性能评估量。
  9. 通过反向传播计算出各层梯度信息并据此更新网络权重参数。
  10. 应用计算出的梯度信息对网络权重进行系统性更新以实现目标函数最小化。
  11. 每当达到指定步数时记录当前训练状态包括当前epoch、step及其对应的损失值等关键指标信息。
  12. 输出训练完成提示信息以表明整个算法运行完毕并等待测试阶段的到来。
评估指标
复制代码
    def line_plotling(df, metric):import seaborn as snsimport matplotlib.pyplot as plt
    sns.set_theme(style='ticks')
    sns.lineplot(x='epoch', y=metric, data=df, color='r')
    sns.lineplot(x='epoch', y='val_'+metric, data=df, color='b')
    plt.legend(['train_'+metric, 'val_'+metric])
    
    
      
      
      
      
      
    
    代码解释

解释

通过调用Seaborn库的set_theme方法来设定绘图样式,并将主题风格配置为ticks样式。
生成训练数据集的关键性能指标(如准确率或损失函数值)随训练进度的变化趋势图表。
并生成对应的验证数据集性能指标变化趋势图表。
通过调用plt.legend方法来标识两条不同的曲线:一条表示训练数据集的表现(以某种颜色标注),另一条表示验证数据集的表现(以另一种颜色标注)。

6. 模型优缺点评价

模型优点:

迁移学习的应用:基于VGG16网络的预训练权重,在图像特征提取方面取得了显著成效,并成功降低了对大规模数据集的需求量的同时缩短了训练时间。
深度网络的能力:VGG16架构凭借其多层卷积层设计,在复杂图像特征提取方面展现出显著优势,并特别适用于医学影像中细微病变检测场景。
数据处理的有效性:项目实施了标准化归一化和尺寸调节等科学预处理措施,在提升模型对不同分辨率影像概括能力方面成效明显。
模型精度高:借助交叉熵损失函数配合Adam优化算法,在分类任务中展现出了稳定的性能表现,并可可靠地完成多项分类工作。

模型缺点:
  1. 计算资源消耗高:VGG16网络深度较大导致其参数数量显著增加,在特征提取方面表现优异但这一特性也带来了较高的计算复杂度,在推理过程中可能对计算资源的需求较高从而影响其在实时应用中的适用性
  2. 适应性不足:由于模型架构并未针对医学图像中存在的独特结构(例如肺部CT扫描所特有的形态学特征)进行专门设计因此可能导致对于某些非典型病变情况处理效果欠佳
  3. 超参数优化缺失:项目研究中对于学习率批量大小等关键超参数的调节工作尚未得到充分重视存在进一步提升模型性能潜力的空间
改进方向:
  1. 模型架构优化:探索采用轻量级模型(如MobileNet、EfficientNet)或引入注意力机制来改善网络性能,在医学图像分析中更加关注病变区域特征提取的同时兼顾计算效率与分类精度。
  2. 超参数优化:系统性地对学习率调节、优化算法选择以及批量大小设置进行微调优化工作,在网格搜索框架下完成最佳配置寻优任务以实现分类性能的最大化。
  3. 数据多样性提升:通过设计与实施随机裁剪变换、旋转操作以及色彩空间调整等方式来丰富训练样本库内容,在保证样本真实性的基础之上显著提高模型泛化能力。
  4. 查看更多项目案例/数据集/代码/视频教程:点击进入>>

全部评论 (0)

还没有任何评论哟~