VGG16模子实现新冠肺炎图片多分类
1. 项目简介本项目的目的是通过深度学习模子VGG16,实现对新冠肺炎图像的多分类任务,以资助医疗人员对患者的影像进行快速、准确的诊断。新冠肺炎自发作以来,使用医学影像如X光和CT扫描进行疾病诊断已成为紧张手段之一。随着数据量的增加,基于人工智能的图像分析方法渐渐显现出其上风,可以或许有效进步检测效率并减少误诊率。该项目基于预练习的VGG16模子,通过对肺部CT或X光影像进行分类,实现对不同范例的肺部病变的分类识别。VGG16模子是深度卷积神经网络中的经典网络,具有16层网络结构,可以或许捕捉图像中的渺小特征,适用于医学图像分析。本项目通过迁移学习,将VGG16的卷积层权重应用于新冠肺炎图片分类任务,并通过微调模子,使其适应于具体的医学影像数据集。最终目的是构建一个高效且稳定的深度学习模子,资助医疗人员对肺炎患者进行辅助诊断,进步诊断的准确性和效率,同时减轻医疗系统的负担。
2.技能创新点摘要
迁移学习的应用:该项目使用VGG16模子进行迁移学习,这是该项目的紧张创新之一。VGG16是一个预练习模子,已经在大规模图像数据集ImageNet上进行练习,具有强大的特征提取能力。通过冻结预练习模子的卷积层权重,模子可以专注于当前新冠肺炎图像的分类任务,避免重新开始练习,有效缩短了模子的练习时间,并提拔了练习的稳定性和准确性。
3. 数据集与预处理
本项目使用的新冠肺炎医学图像数据集紧张由CT或X光图像组成,数据集包含了正常、轻度感染及重度感染的肺部影像。这些医学图像具有高分辨率,可以或许反映患者肺部的病变环境。数据会合的标签对应不同的病理分类,这些标签用于练习模子进行多分类任务。医学影像的特征在于其复杂的结构和细节,因此需要经过严格的预处理,以确保模子可以或许从中学习到有效的特征。
在数据预处理阶段,起首对原始图像进行同一的尺寸调整。全部图像被缩放到224x224像素,以匹配VGG16模子的输入尺寸。此外,图像通过 transforms.ToTensor() 函数转换为张量,并将像素值从0-255的范围标准化为0-1之间。接着,使用预练习模子ImageNet的均值和标准差对图像进行归一化处理,将像素值调整到(-1,1)的区间。这一步可以或许确保输入数据的分布与预练习模子的输入分布相一致,进而进步模子的性能。
在数据增强方面,项目引入了多种增强策略,以增强模子的泛化能力。这些增强利用包罗随机裁剪、翻转等,这可以或许有效增加练习数据的多样性,从而防止模子过拟合。同时,这些增强手段可以或许模仿不同条件下的医学图像厘革,使模子更加稳健。
https://i-blog.csdnimg.cn/direct/20500da96ce24177a3838db2a7c688c7.png
4. 模子架构
本项目使用了VGG16模子,这是一种深度卷积神经网络,具有16个权重层。其模子结构包罗卷积层、池化层、全毗连层等,具体如下:
[*]卷积层:VGG16由多个卷积层构成,每一层卷积利用的公式为:
y i , j , k = ∑ m , n w m , n , k ⋅ x i + m , j + n + b k y_{i,j,k} = \sum_{m,n} w_{m,n,k} \cdot x_{i+m,j+n} + b_k yi,j,k=m,n∑wm,n,k⋅xi+m,j+n+bk
此中,x 是输入图像,w 是卷积核权重,b 是偏置项,y 是输出的特征图。这些卷积利用紧张用于提取图像中的局部特征,尤其得当复杂的医学图像。
池化层:卷积后会经过最大池化层(Max Pooling),其公式为:
y i , j , k = max { x i + m , j + n , k } , ( m , n ) ∈ S y_{i,j,k} = \max \{ x_{i+m,j+n,k} \}, \, (m,n) \in S yi,j,k=max{xi+m,j+n,k},(m,n)∈S
池化利用减少了特征图的大小,从而降低了模子的计算复杂度,同时保留了紧张的特征信息。
全毗连层:卷积和池化层的输出最终会通过全毗连层,该层将多维的特征映射为一维向量,公式为:
y = W ⋅ x + b y = W \cdot x + b y=W⋅x+b
此中 W是权重矩阵,x 是输入向量,b是偏置项,y 是输出。这一层用于完成分类任务,将卷积提取到的特征映射到具体的分类结果上。
Softmax层:在最后的输出层,使用Softmax激活函数生成每个种别的概率分布,公式为:
P ( y = k ∣ x ) = e z k ∑ j e z j P(y = k | x) = \frac{e^{z_k}}{\sum_{j} e^{z_j}} P(y=k∣x)=∑jezjezk
此中 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 = − ∑ i y i log ( y ^ i ) L = -\sum_{i} y_i \log(\hat{y}_i) L=−i∑yilog(y^i)
此中 yi是真实标签的概率分布,y^i是预测概率分布。
反向传播:通过计算丧失函数的梯度,更新可练习的参数,优化目的是最小化丧失函数。
优化器:使用Adam优化器进行梯度更新,该优化器结合了动量与自适应学习率的优点: θ t + 1 = θ t − η ⋅ m t v t + ϵ \theta_{t+1} = \theta_t - \eta \cdot \frac{m_t}{\sqrt{v_t} + \epsilon} θt+1=θt−η⋅vt +ϵmt此中 mt和 vt分别是一阶和二阶矩估计,η 是学习率。
练习轮次:设定练习轮次(例如20轮),在每一轮中通过前向传播、丧失计算、反向传播进行权重更新。
模子评估:在测试集上进行评估,紧张使用准确率(Accuracy)、召回率(Recall)等指标:
[*]准确率: A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy = \frac{TP + TN}{TP + TN + FP + FN} Accuracy=TP+TN+FP+FNTP+TN
[*]召回率: R e c a l l = T P T P + F N Recall = \frac{TP}{TP + FN} Recall=TP+FNTP
通过这些步调,模子可以或许高效完成新冠肺炎图像的多分类任务,并在实际数据集上进行评估与优化。
5. 核心代码详细讲解
数据预处理与特征工程
pic_transform = transforms.Compose([
transforms.Resize(),
transforms.ToTensor(),
transforms.Normalize(mean=, std=)
])
解释:
[*]transforms.Resize():这行代码将输入图像的尺寸缩放到224x224像素,以确保输入图像大小一致,符合VGG16模子的输入要求。
[*]transforms.ToTensor():将PIL图像转换为PyTorch的Tensor范例,并将像素值从0-255的范围归一化为0-1。这是标准的PyTorch数据处理步调。
[*]transforms.Normalize(mean=, std=):基于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
imgs = []
labels = []for row in range(0,rows):
imgs.append(os.path.join(self.root,df['image_path']))
labels.append(df['labels'])
self.img = imgs
self.label = labels
self.transform = transform
def len(self):return len(self.label)
def getitem(self, item):
img = self.img
label = self.label
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
解释:
[*]init(self, img_path, file_name ,transform=None):初始化方法,界说了数据集的路径和图像转换方法,并加载图像路径和标签。transform参数用于指定数据增强和预处理步调。
[*]df = pd.read_csv(self.csv_root):从指定的CSV文件中读取图像路径和标签,CSV文件包含图像的文件路径及其对应的标签。
[*]self.img = imgs 和 self.label = labels:将图像路径和标签分别存储在两个列表中,以供后续数据加载使用。
[*]len(self):返回数据会合样本的数目,这是PyTorch自界说数据集的标准实现。
[*]getitem(self, item):通过索引获取图像和标签。图像通过PIL库打开并转换为RGB格式,然后应用数据预处理(如果有),最终返回Tensor格式的图像和标签。
模子构建与练习
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 = nn.Linear(4096, 3)
model = model.to(device)
解释:
[*]device = torch.device('cuda' if torch.cuda.is_available() else 'cpu'):这行代码用于检测当前系统是否有可用的GPU,如果有则将计算设备设为GPU(CUDA),否则使用CPU。
[*]model = models.vgg16(pretrained=True):加载预练习的VGG16模子,这个模子已经在ImageNet上进行过练习,可以或许有效地提取图像的特征。
[*]for param in model.parameters(): param.requires_grad = False:冻结VGG16模子的全部卷积层权重,使它们在练习过程中不更新。这是典型的迁移学习策略,紧张目的是使用预练习模子的特征提取能力,同时减少练习时间和计算资源。
[*]model.classifier = nn.Linear(4096, 3):更换VGG16模子中的最后一层全毗连层,将输出从ImageNet的1000类修改为当前任务的3类(例如:正常、轻度感染、重度感染)。
[*]model = model.to(device):将模子移动到GPU或CPU上,以加速练习过程。
模子练习与评估
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('训练成功~')
解释:
[*]model.train():将模子设置为练习模式,这会启用诸如Dropout等正则化技能。
[*]optimizer = torch.optim.Adam(model.parameters(), lr=0.001):使用Adam优化器进行模子参数的更新,学习率设置为0.001。Adam优化器结合了动量和自适应学习率,可以或许加快练习过程并减少震荡。
[*]loss_fn = nn.CrossEntropyLoss():界说交织熵丧失函数,用于计算预测值与真实标签之间的偏差,适用于多分类任务。
[*]for epoch in range(epochs):开始模子的练习循环,每个epoch表现模子对整个数据集的完备遍历。
[*]x, y = x.to(device), y.to(device):将输入数据和标签移动到GPU(如果有)或CPU,以确保与模子在同一设备上进行计算。
[*]optimizer.zero_grad():清空优化器中的梯度缓存,避免上一次的梯度对本次计算的影响。
[*]pred = model(x):前向传播,模子对输入数据x进行预测。
[*]loss = loss_fn(pred, y):计算预测结果与真实标签之间的丧失。
[*]loss.backward():反向传播计算梯度,更新模子参数。
[*]optimizer.step():根据反向传播计算得到的梯度更新模子参数。
[*]if step % log_step_freq == 0:每隔log_step_freq步打印一次练习日记,包罗当前epoch、step和丧失值。
[*]print('练习成功~'):练习竣事后的提示信息。
评估指标
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])
解释:
[*]sns.set_theme(style='ticks'):使用Seaborn库设置画图主题,风格为ticks。
[*]sns.lineplot(x='epoch', y=metric, data=df, color='r'):绘制练习集的性能指标(例如准确率或丧失)的厘革曲线,x轴表现epoch,y轴表现指标值,曲线颜色为红色。
[*]sns.lineplot(x='epoch', y='val_'+metric, data=df, color='b'):绘制验证集的性能指标厘革曲线,颜色为蓝色。通过对比练习集和验证集的曲线厘革,可以观察到模子是否过拟合或欠拟合。
[*]plt.legend(['train_'+metric, 'val_'+metric]):为图形添加图例,区分练习集和验证集的曲线。
6. 模子优缺点评价
模子优点:
[*]迁移学习的有效应用:通过使用VGG16的预练习权重,模子在图像特征提取方面表现出色,同时减少了对大规模数据集的依靠,加速了练习过程。
[*]深度网络的特征提取能力强:VGG16的多层卷积结构可以或许提取复杂的图像特征,尤其得当医学图像中微小病变的检测。
[*]数据预处理与增强合理:项目接纳了图像归一化和标准化,以及图像尺寸调整等预处理步伐,有效进步了模子对不同分辨率图像的泛化能力。
[*]准确性高:通过使用交织熵丧失和Adam优化器,模子在分类任务中的表现稳定,可以或许较好地完成多分类任务。
模子缺点:
[*]计算资源需求大:VGG16网络较深,参数较多,只管特征提取结果好,但其计算复杂度较高,在推理时大概对计算资源要求较高,不得当实时应用场景。
[*]适应性有限:模子结构未针对医学图像中的特殊结构(如肺部CT的形态学特征)进行专门优化,大概导致在处理非典型病变时表现不佳。
[*]超参数未优化:项目中未对学习率、批量大小等超参数进行深入优化,大概存在进一步进步模子表现的空间。
改进方向:
[*]模子结构优化:可以尝试引入轻量化模子(如MobileNet、EfficientNet)或加入留意力机制,增强对医学图像中病变区域的聚焦能力,降低计算成本并提拔效率。
[*]超参数调整:对学习率、优化器、批量大小等超参数进行调优,通过网格搜索或随机搜索等方法找到最佳设置,进步模子性能。
[*]更多数据增强:可以引入更加丰富的数据增强方法,如随机裁剪、旋转、色彩调整等,以增加练习数据的多样性,提拔模子的泛化能力。
[*]检察更多项目案例/数据集/代码/视频教程:点击进入>>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]