EfficientNet-B6模型实现ISIC皮肤镜图像数据集分类

项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。

《------往期经典推荐------》

项目名称
1.【基于opencv答题卡识别判卷】
2.【卫星图像道路检测DeepLabV3Plus模型】
3.【GAN模型实现二次元头像生成】
4.【CNN模型实现mnist手写数字识别】
5.【fasterRCNN模型实现飞机类目标检测】
6.【CNN-LSTM住宅用电量预测】
7.【VGG16模型实现新冠肺炎图片多分类】
8.【AlexNet模型实现鸟类识别】
9.【DIN模型实现推荐算法】
10.【FiBiNET模型实现推荐算法】
11.【钢板表面缺陷检测基于HRNET模型】

1. 项目简介

项目A065的目标是使用EfficientNet-B6模型实现皮肤镜图像分类,帮助识别皮肤病变的类型。随着深度学习技术的快速发展,计算机辅助诊断(CAD)工具逐渐在医疗影像分析中得到广泛应用。该项目聚焦于皮肤镜图像的分类,通过训练模型自动识别不同类型的皮肤病变,如黑色素瘤(MEL)、痣(NV)、基底细胞癌(BCC)等,从而为临床诊断提供支持。

项目采用EfficientNet-B6模型,该模型通过复合缩放方法在保持较高性能的同时减少计算资源的消耗。数据集使用ISIC 2018挑战赛提供的皮肤镜图像,经过数据预处理后,输入EfficientNet-B6进行特征提取和分类。项目的核心目标是提升分类精度,降低漏诊和误诊率,从而为皮肤病变检测提供一个可靠的自动化工具。

2.技术创新点摘要

EfficientNet-B6模型的应用与优化: 该项目采用了EfficientNet-B6模型,这是一种高效的卷积神经网络结构。EfficientNet通过复合缩放方法,在提升模型精度的同时降低了计算成本,尤其适用于计算资源受限的环境。EfficientNet-B6相较于较小的模型具备更高的参数量和计算复杂度,因此在处理高分辨率皮肤镜图像时能够提取更多细节特征,提升分类精度。此外,模型的分类器部分进行了定制,原有的分类层被替换为适应特定分类任务的输出层,确保其与皮肤病变分类任务的需求相匹配。

自定义数据集类与高效数据预处理: 项目中引入了自定义数据集类CustomDataset,不仅将图像和标签进行了对应管理,还通过标签映射实现了多类别标签的高效处理。数据预处理中,项目对输入图像进行尺寸调整,使其适应EfficientNet-B6的输入要求(528x528像素)。这种预处理保证了不同分辨率的皮肤镜图像能够一致输入模型,避免了图像尺寸差异带来的影响。同时,标准化操作(mean和std)也确保了图像输入的像素值分布在一定范围内,有助于模型更快收敛。

高效的优化器与损失函数选择: 项目选择了Ranger优化器,这是一个结合了Rectified Adam(RAdam)和Lookahead的混合优化器。Ranger优化器不仅拥有自适应的学习率调整机制,还结合了Lookahead策略的长远步长搜索,确保在深度学习训练过程中能够获得更稳定且高效的收敛效果。相比传统的SGD或Adam优化器,Ranger在这种复杂的多类别分类任务中能够更好地平衡模型的精度和收敛速度。此外,项目选择了交叉熵损失函数(CrossEntropyLoss),这是多类别分类任务中常见且有效的损失函数。

集成性能评估与可视化分析: 项目中不仅实现了模型的训练和验证流程,还设计了评估函数evaluate_model,使用准确率、精确率、召回率和F1评分等多种指标对模型性能进行综合评价。这些指标的选择有助于在不平衡数据集下全面评估模型的表现。为了便于直观分析,项目还集成了Matplotlib绘图工具,通过柱状图的方式将训练集、验证集和测试集的模型性能可视化。这种方式可以帮助研究者快速发现模型在不同数据集上的表现差异,从而进行针对性的优化调整。

3. 数据集与预处理

该项目使用的数据集来源于ISIC 2018挑战赛,这是一个公开的皮肤镜图像数据集,专门用于皮肤病变的分类任务。该数据集包含数千张标注了皮肤病变的高分辨率皮肤镜图像,类别包括黑色素瘤(MEL)、痣(NV)、基底细胞癌(BCC)、鳞状细胞癌(AKIEC)、良性角化病(BKL)、皮肤纤维瘤(DF)和血管病变(VASC)等。每张图像都配有相应的类别标签,便于监督学习。

数据预处理流程:

  1. 图像尺寸调整: EfficientNet-B6模型要求输入图像的尺寸为528x528像素。因此,在预处理过程中,所有的图像都被统一调整为这个尺寸,以保证输入模型时的格式一致。这一步骤有助于避免不同分辨率的图像对模型性能产生影响。
  2. 图像归一化: 归一化是深度学习图像处理中的重要步骤,该项目对每张图像进行了标准化处理。通过使用ImageNet的预训练模型参数,项目分别使用均值([0.485, 0.456, 0.406])和标准差([0.229, 0.224, 0.225])对图像的RGB通道进行归一化。归一化能够确保输入图像的像素值分布在合理的范围内,避免特定通道的亮度差异对模型造成干扰,加快模型的训练收敛速度。
  3. 标签处理: 项目使用的标签格式为多类别分类,涉及到皮肤病变的七个类别。数据集中,标签通过字典映射被转换为整数标签,便于模型进行分类任务。此操作不仅使标签与模型输出格式相匹配,还为后续的损失函数计算提供了便利。

总体来说,该项目的数据预处理步骤充分考虑了图像的尺寸、色彩信息以及标签处理等问题,为EfficientNet-B6模型的训练和推理提供了高质量的输入数据。这些预处理步骤在医学图像分析中十分关键,有助于提升模型的精度和泛化能力。

在这里插入图片描述

4. 模型架构

1) 模型结构的逻辑

该项目的核心模型架构基于EfficientNet-B6,这是EfficientNet系列中的一种大型变体。EfficientNet通过一种称为复合缩放的技术优化了模型的宽度、深度和分辨率,从而在减少计算资源的同时提高了模型的准确性。EfficientNet-B6相较于其他版本(如B0-B5)具有更大的深度和更高的分辨率(528x528像素输入),使其在处理高分辨率图像(如皮肤镜图像)时表现更优。

模型架构的核心逻辑如下:

  • EfficientNet-B6预训练模型:该项目加载了预训练的EfficientNet-B6模型,并通过ImageNet进行初始权重加载。这有助于模型在新的任务上进行迁移学习,避免从头开始训练,提高了模型的效率和性能。
  • 分类器调整:EfficientNet-B6的原始分类器被替换为适应皮肤病变分类的输出层。在代码中,将EfficientNet-B6的分类器部分修改为5个输出节点,以匹配皮肤病变的类别数。这种方法确保了模型能够输出相应类别的概率分布,适应多类别分类任务。

整个模型架构的设计旨在利用EfficientNet的高效特征提取能力,结合医学图像的复杂性,帮助模型识别和区分细微的皮肤病变特征。

2) 模型的整体训练流程与评估指标

模型训练流程:
  1. 数据加载与准备:首先,通过自定义的CustomDataset类加载训练、验证和测试数据集。每个数据集都经过了统一的预处理,包括图像尺寸调整、归一化等。

  2. 模型初始化:加载EfficientNet-B6模型,并替换其分类器层。使用Ranger优化器(结合了RAdam和Lookahead的优势)和交叉熵损失函数(CrossEntropyLoss)来定义模型的优化策略和损失计算。

  3. 训练循环

    1. 模型训练过程中,数据通过DataLoader以批次的形式输入到EfficientNet-B6模型中。
    2. 对每个批次的数据,模型计算输出并与真实标签进行对比,通过交叉熵损失函数计算损失值。
    3. 使用Ranger优化器反向传播损失,更新模型的权重。
    4. 训练过程中输出每个epoch的累计损失,以跟踪训练进度。
  4. 模型评估:训练完成后,使用验证集和测试集对模型进行评估。评估流程包括在验证集和测试集上运行模型,获取预测结果,并与真实标签进行对比。

评估指标:
  • 准确率(Accuracy) :表示模型预测正确的样本占总样本的比例,反映了模型整体的正确性。
  • 精确率(Precision) :表示模型在所有预测为正类的样本中,实际为正类的比例,适合在关注模型预测的精度时使用。
  • 召回率(Recall) :表示模型在所有实际为正类的样本中,成功被模型预测为正类的比例,适合在不希望漏检时使用。
  • F1评分(F1 Score) :精确率和召回率的调和平均数,用于平衡精度和召回率之间的关系,特别适合不平衡数据集的评价。

5. 核心代码详细讲解

1. 数据预处理与特征工程

暂时无法在飞书文档外展示此内容

  • class CustomDataset(Dataset) :定义了一个自定义的数据集类,该类继承自torch.utils.data.Dataset,用于管理和处理输入的图像和标签。
  • self.img_paths = img_paths:存储传入的图像文件路径列表。
  • label_to_int:将字符串标签转换为整数标签的映射字典。每个类别(如’MEL’, 'NV’等)被映射为一个唯一的整数,便于模型进行分类任务。
  • self.labels = [label_to_int[label] for label in labels] :根据映射字典,将标签转换为对应的整数形式。
  • self.transform = transform:存储数据增强或预处理操作,用于后续对图像的处理。

暂时无法在飞书文档外展示此内容

  • getitem(self, index) :这是数据集类的核心方法,用于根据索引获取图像及其对应的标签。
  • Image.open(img_path).convert('RGB') :通过PIL库打开图像文件,并将其转换为RGB格式,以确保图像输入的颜色通道一致。
  • self.transform(image) :如果指定了预处理(如图像归一化或尺寸调整),则应用这些操作。
  • return image, label:返回处理后的图像及其对应的标签。

2. 模型架构的构建

暂时无法在飞书文档外展示此内容

  • efficientnet_b6(pretrained=True) :加载预训练的EfficientNet-B6模型。通过设置pretrained=True,模型使用在ImageNet上预训练的权重,这有助于在皮肤镜图像分类任务上进行迁移学习,提升模型的收敛速度和准确性。
  • model.classifier[1] = nn.Linear(model.classifier[1].in_features, 5) :EfficientNet-B6的原始分类器被替换。nn.Linear创建了一个线性层,将分类器的输出调整为5个节点,对应项目中的5个皮肤病变类别。model.classifier[1].in_features提取分类器的输入特征数量,以适应新任务。

3. 模型训练与优化

暂时无法在飞书文档外展示此内容

  • optimizer = Ranger(model.parameters(), lr=1e-3) :使用Ranger优化器,这是一种结合了RAdam和Lookahead的优化算法。它比传统的SGD或Adam更高效,能够在复杂的多类别分类任务中实现更快的收敛和更好的性能。lr=1e-3设置了学习率。
  • criterion = nn.CrossEntropyLoss() :使用交叉熵损失函数(CrossEntropyLoss),这是多类别分类任务中最常用的损失函数。它能够衡量模型输出的概率分布与真实标签之间的差异。

暂时无法在飞书文档外展示此内容

  • model.train() :将模型设置为训练模式。这一步很重要,因为它启用了诸如Dropout等训练时特有的操作。
  • for epoch in range(num_epochs) :定义训练的轮次。num_epochs参数控制模型将经过多少次完整的训练集迭代。
  • images, labels = data:从数据加载器中获取图像及其对应的标签。
  • images, labels = images.to(device), labels.to(device) :将图像和标签移动到GPU或CPU上,具体取决于设备配置。
  • optimizer.zero_grad() :每个训练步骤开始前,将优化器中的梯度清零,以避免梯度累积。
  • outputs = model(images) :将图像输入模型,获得预测结果。
  • loss = criterion(outputs, labels) :计算模型输出与真实标签之间的损失。
  • loss.backward() :进行反向传播,计算每个参数的梯度。
  • optimizer.step() :更新模型的参数,使得损失减少。
  • running_loss += loss.item() * images.size(0) :累计当前批次的损失值。
  • epoch_loss = running_loss / len(dataloader.dataset) :计算平均损失,输出每个epoch的损失值。

4. 模型评估与可视化

暂时无法在飞书文档外展示此内容

  • model.eval() :将模型设置为评估模式,停用Dropout等仅在训练时启用的操作。
  • with torch.no_grad() :在评估时禁用梯度计算,以减少内存开销并提高评估效率。
  • outputs = model(images) :将测试集的图像输入模型,获得输出。
  • _, predicted = torch.max(outputs, 1) :通过torch.max函数获取每个图像的预测类别。
  • accuracy_score, precision_score, recall_score, f1_score:计算多种评估指标,包括准确率、精确率、召回率和F1评分。这些指标帮助全面衡量模型的性能。

6. 模型优缺点评价

模型优点:

  1. 高效的特征提取能力:该项目使用EfficientNet-B6模型,该模型通过复合缩放技术在保证高精度的同时减少了计算开销。对于皮肤镜图像这种高分辨率且细节丰富的数据,EfficientNet-B6能够有效提取细微特征,帮助模型更好地区分类别。
  2. 迁移学习的应用:使用预训练的EfficientNet-B6模型,使得训练过程更加高效,并且在皮肤镜图像分类任务上能快速达到较好的精度。预训练的权重来自ImageNet大规模数据集,提供了很好的初始特征表示,减少了训练所需的数据量和时间。
  3. 创新的优化器选择:项目选择了Ranger优化器,这是结合了RAdam和Lookahead两种优化策略的混合优化器,能够在复杂的多类别分类任务中实现更快的收敛和更好的模型性能。
  4. 多种评估指标:模型不仅采用了准确率作为评估标准,还包括精确率、召回率和F1评分,确保模型在不平衡数据集下能够综合评估分类效果,全面衡量模型性能。

模型缺点:

  1. 数据增强不足:代码中未显示数据增强的详细实现。对于医学影像这种可能存在数据不均衡和有限的数据集,数据增强(如旋转、翻转、随机裁剪等)可以进一步提升模型的鲁棒性,减少过拟合。
  2. 分类器输出层较单一:虽然分类器输出被调整为适合皮肤病变的5个类别,但仍然可以考虑进一步调整分类器的结构,使得其更好适应特定的医学图像分类任务。
  3. 超参数调整有限:项目中使用的学习率为1e-3,但未进行其他超参数(如batch size、学习率衰减等)的探索,这可能导致模型在某些情况下无法充分发挥其潜力。

改进方向:

  1. 数据增强:可以增加数据增强方法,如旋转、随机裁剪、颜色抖动等,以提高模型对不同变形图像的鲁棒性,尤其在医学图像领域,这对小样本数据非常有帮助。
  2. 模型结构优化:可以尝试在EfficientNet的基础上增加特定的医学图像分类模块,如多分支网络或注意力机制,进一步提升模型的特征提取能力。
  3. 超参数调优:进行更多的超参数搜索,如学习率、优化器类型、batch size等,找到最优的组合以提升模型的训练速度和最终性能。
  4. 多任务学习:引入多任务学习,结合分类任务和分割任务,进一步提升模型的泛化能力。

👍感谢小伙伴们点赞、关注! 如有其他项目需求的,可以在评论区留言,抽空制作更新!
✌粉丝福利:点击下方名片↓↓↓
回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机完全学习——红外遥控

一、红外接收模块原理 红外接收头内部本身有一个反相,意思就是:平时发送方无信号时接收到的是1,发送方有发送载波时接收头引脚输出的是0,写代码的时候注意这一点。红外协议,你也可以理解成,他对0和1重新做…

Vue学习笔记(五)

Class绑定 数据绑定的一个常见需求场景式操纵元素的CSS class列表,因为class是attribute,我们可以和其他attribute一样使用v-bind将它们和动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且易出错的。因此&#xf…

【认知智能】编译器1

深度学习编译器是一种专门设计用来优化和加速深度学习模型在各种硬件平台上执行的工具。它们通过将高级深度学习框架(如TensorFlow, PyTorch等)中的计算图转换为针对特定硬件架构优化过的低级代码来实现这一目标。基础架构通常包括以下几个关键组件&…

C语言基础题(大合集2)

1. 时间转换 给定秒数 --> 输出秒数 转化成 时/分/秒 //时间转换 //给定秒数 --> 转换成 小时/分/秒 int main() {//输入int seconds 0;int h 0;//小时int m 0;//分钟int s 0;//秒scanf("%d", &seconds);//计算h seconds / 60 / 60;m seconds / 60…

ctfshow(171,172,173)--SQL注入--联合注入

Web171 进入靶场,是一个SQL查询界面: 审计: 查询语句如下: $sql "select username,password from user where username !flag and id ".$_GET[id]." limit 1;";语句功能从数据表user中查询username,pa…

Continue语句应用举例

在main.cpp里输入程序如下 #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(), //setprecision(),setiosflags()和resetiosflags(); using namespace std; //告诉编译器使用std标准程序库; int main() { i…

【AIGC】从CoT到BoT:AGI推理能力提升24%的技术变革如何驱动ChatGPT未来发展

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;迈向AGI的新跨越&#x1f4af;BoT与CoT的技术对比技术原理差异推理性能提升应用范围和通用性从错误中学习的能力总结 &#x1f4af;BoT的工作流程和机制初始化过程生成推…

在微信里怎么创建秒杀活动

在这个快节奏的时代&#xff0c;每个人都渴望以最优惠的价格购买到心仪的商品。为了满足广大消费者的这一需求&#xff0c;我们特别在微信平台推出了限时秒杀活动&#xff0c;让你在指尖轻松享受购物的乐趣与实惠。 工具/原料 微信小程序 飞多多网站 方法/步骤 一、秒杀活动…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25 0. 前言 大语言模型在很多领域都有成功的应用&#xff0c;在本期计算机前沿技术进展研究介绍中&#xff0c;我们将带来一篇用大语言模型进行诺贝尔文学作品分析的论文。虽然有一定趁最近诺贝尔奖热潮的意味&…

本地docker部署中间件和应用

Docker Desktop搭建 安装完成之后使用docker下载镜像&#xff0c;报以下错误&#xff1a; 解决办法&#xff1a; Docker Engine配置能访问的镜像地址&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled…

【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…

ARM学习(34) GDB 调试器详细了解

笔者来聊一下对于GDB的一些操作使用认识。 1、GDB的使用以及用途 GDB是GNU的一个项目&#xff0c;具体网站如下&#xff0c;网址&#xff1a;https://www.gnu.org/software/gdb/ 支持多种语言&#xff0c;常用的就是C/C/Python等等跨平台使用&#xff0c;Linux/windows/MacOS…

电机---3直流有刷减速电机

前言 在简单了解电机分类后&#xff0c;为了能够更深入学习了解电机、编码器、PID算法等内容&#xff0c;选择使用野火的直流减速有刷电机和其驱动板进行学习&#xff0c;单片机开发板选择野火的指南者开发板。 1直流有刷减速电机 直流有刷电机转速快&#xff0c;扭矩小&…

SQL Server 当前日期及其未来三天的日期

当前日期及其未来三天的日期&#xff0c;并分别以 YYYY-MM-DD 和 yyyyMMdd 的格式展示 1、当前日期及其未来三天的日期&#xff0c;以 YYYY-MM-DD的格式展示 WITH CurrentDate AS (SELECT GETDATE() AS 当前日期 ) -- 使用 CONVERT 函数 SELECTCONVERT(VARCHAR(10), 当前日期,…

【Android】ViewPager与ViewPager2之间的区别

ViewPager 和 ViewPager2 都是 Android 中用于实现滑动页面切换的控件&#xff0c;但 ViewPager2 是对 ViewPager 的改进和增强版本。 区别 实现方式 ViewPager 继承自 ViewGroup&#xff0c;内部并未使用已有的成熟控件&#xff0c;更多的是自定义的操作。ViewPager2 也继承…

【verilog】模十计数器

文章目录 前言代码 前言 进行 FPGA 模十计数器 实验 仿真结果 代码 主代码 // module module count(clk,rst_n,count,clk1,led);// def io input clk; input rst_n; output reg [3:0] count; output reg clk1; output reg [7:0] led;// always part, or main() always (pos…

【吐槽】豪斯医生之二:第 4-6 集

写在前面 5841 字 | 医学 | 吐槽 | 电视剧 正文 维基百科&#xff1a;   利巴韦林&#xff08;英语&#xff1a;Ribavirin&#xff0c;俗称病毒唑&#xff09;&#xff0c;是一种抗病毒药&#xff0c;属合成核苷类药&#xff0c;1970 年由 ICN 制药公司 Joseph T. Witkowsk…

景区导航地图怎么实现?基于LBS与3D GIS的智慧景区导航导览系统技术路线

随着经济的发展和人们物质生活水平改善,居民的旅游需求呈现多元化和个性化&#xff0c;自助旅游的人越来越多。许多游客在旅游行程中需要随时随地了解旅游景点有关的各类信息&#xff0c;如旅游景点介绍、推荐路线、地图导航等&#xff0c;合理规划和安排旅游线路。正是为了应对…

Docker | images镜像的常用命令总结

命令总结 1. 帮助启动类命令基本命令systemctl status dockerdocker infodocker --help 2. 镜像命令docker images删除镜像出现错误 docker searchdocker pull xxx[:TAG]docker images -adocker images -qdocker system dfdocker rmi -f xxxxxdocker rmi -f $(docker images -q…

Python量子生成对抗网络QGAN神经网络药物发现、多方法乳腺癌药物筛选应用

全文链接&#xff1a;https://tecdat.cn/?p37975 分析师&#xff1a;Chenhao Wu 在当今的医学领域&#xff0c;乳腺癌作为一种严重威胁女性健康的疾病&#xff0c;其治疗一直是科研工作者们关注的焦点。乳腺癌的发展与雌激素受体密切相关&#xff0c;其中 ERα 被视为治疗乳腺…