昇思学习打卡营第33天|基于MindSpore的恶性皮肤肿瘤识别

1. 实验介绍

        本次实验的目标是基于MindSpore框架,训练一个ResNet50模型,用于恶性皮肤肿瘤的分类识别。本实验将使用包含四类皮肤肿瘤图片的数据集,针对ResNet50模型进行微调,训练出一个能够精准分类皮肤病的模型。主要过程包括数据处理、模型搭建与训练、性能评估以及模型推理。

1.1 实验目标
  • 掌握使用MindSpore进行深度学习模型训练的基本流程;
  • 了解ResNet50模型的结构及其在图像分类中的应用;
  • 学习如何针对特定数据集(皮肤病图片)进行模型微调和参数优化。
1.2 使用工具
  • MindSpore框架:开源的AI计算框架,适用于多场景应用,支持端、边、云等多种部署环境。
  • ResNet50模型:一种经典的深度残差网络,能够有效解决深层网络的梯度消失问题。
  • 昇思大模型平台:基于昇思MindSpore的深度学习平台,提供丰富的模型库和强大的计算资源。
1.3 实验步骤
  1. 数据准备:收集并处理皮肤病数据集,确保数据质量;
  2. 模型选择:使用MindSpore提供的ResNet50预训练模型进行微调;
  3. 模型训练:配置训练参数,启动模型训练;
  4. 模型评估:通过验证集评估模型性能,进行超参数调整;
  5. 模型推理:部署训练好的模型进行恶性皮肤肿瘤识别。

2. 数据集处理

2.1 数据集介绍

        该实验数据集包含四类皮肤病图片,分别为:

  • 基底细胞癌(Basal Cell Carcinoma):最常见的皮肤癌,通常不扩散但有局部侵袭性;
  • 黑色素瘤(Melanoma):最严重的皮肤癌,易扩散至其他部位,需早期发现治疗;
  • 色素性良性角化病(Pigmented Benign Keratosis):良性皮肤病变,表现为皮肤上的色素斑块;
  • (Nevus):通常为良性的色素痣,但某些情况下可能发生恶变。
2.2 数据集获取和整理

        数据集的下载链接为:https://xihe.mindspore.cn/datasets/knoka/pifudata_Maker/tree。数据集包含4个分类,每类有若干图片,且已划分为训练集和验证集。

        接下来,我们将通过代码下载并解压数据集,同时将数据集文件夹按编号进行重命名,方便后续的加载和使用。

# 重命名数据集文件夹,方便后续处理
import os# 定义疾病名称和编号的映射
diseases = {0: "basal_cell_carcinoma",1: "melanoma",2: "nevus",3: "pigmented_benign_keratosis",
}# 定义目标文件夹路径
target_directory = "pifudata_Maker/images/"# 重命名文件夹
for folder in ["train", "val"]:folder_path = os.path.join(target_directory, folder)for number, disease in diseases.items():old_folder_path = os.path.join(folder_path, disease)new_folder_path = os.path.join(folder_path, str(number))os.rename(old_folder_path, new_folder_path)
2.3 数据可视化

        

        数据集中的每个类别的图片数量如下:

  • 训练集:Nevus(357张)、Melanoma(438张)、Pigmented Benign Keratosis(462张)、Basal Cell Carcinoma(376张);
  • 验证集:每类均为16张。

        为了更直观地了解数据集分布,我们绘制了训练集和验证集的类别分布图。

import os
import matplotlib.pyplot as plt# 数据集路径
data_path_train = "pifudata_Maker/images/train"
data_path_val = "pifudata_Maker/images/val"# 统计每个类别的图片数量
file_counts_train = {}
file_counts_val = {}# 获取训练集和验证集的数据分布
for folder_name in os.listdir(data_path_train):folder_path = os.path.join(data_path_train, folder_name)count = len(os.listdir(folder_path))file_counts_train[folder_name] = countfor folder_name in os.listdir(data_path_val):folder_path = os.path.join(data_path_val, folder_name)count = len(os.listdir(folder_path))file_counts_val[folder_name] = count# 绘制图像
categories = list(file_counts_train.keys())
plt.figure(figsize=(12, 8))# 绘制训练集和验证集的条形图
plt.bar(categories, file_counts_train.values(), width=0.4, color='blue', label='Train')
plt.bar([x + 0.4 for x in range(len(categories))], file_counts_val.values(), width=0.4, color='green', label='Validation')# 添加标签与图例
plt.xlabel('Category')
plt.ylabel('Number of Images')
plt.legend()
plt.show()
2.4 数据加载

        我们将通过MindSpore的ImageFolderDataset加载数据集,并定义数据增强操作来提高模型的泛化能力。训练集进行随机裁剪和翻转等增强操作,验证集只进行基本的归一化处理。

import mindspore.dataset as ds
import mindspore.dataset.vision as vision# 定义数据集加载函数
def create_dataset(dataset_path, usage):data_set = ds.ImageFolderDataset(dataset_path, shuffle=True)mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]std = [0.229 * 255, 0.224 * 255, 0.225 * 255]if usage == "train":trans = [vision.RandomCropDecodeResize(size=224, scale=(0.08, 1.0)),vision.RandomHorizontalFlip(prob=0.5),vision.Normalize(mean=mean, std=std),vision.HWC2CHW()]else:trans = [vision.Decode(),vision.Resize(224),vision.Normalize(mean=mean, std=std),vision.HWC2CHW()]data_set = data_set.map(operations=trans, input_columns="image")data_set = data_set.batch(64)return data_set# 创建训练集和验证集
train_dataset = create_dataset("pifudata_Maker/images/train", "train")
val_dataset = create_dataset("pifudata_Maker/images/val", "val")

3. 模型训练

3.1 模型定义

        我们将使用MindSpore自带的ResNet50预训练模型,并对其最后一层进行修改,使其适应四类皮肤病的分类任务。

from mindspore import nn
from mindspore import load_checkpoint, load_param_into_net# 定义ResNet50模型并加载预训练权重
def resnet50(num_classes=4, pretrained=True):net = nn.resnet50()in_channels = net.fc.in_channelsnet.fc = nn.Dense(in_channels, num_classes)return netnetwork = resnet50()
3.2 模型训练

        我们使用Momentum优化器和交叉熵损失函数进行模型训练。每个epoch结束后,会在验证集上进行评估,并保存最佳模型。

from mindspore import train# 定义损失函数和优化器
loss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=True)
opt = nn.Momentum(params=network.trainable_params(), learning_rate=0.001, momentum=0.9)# 实例化模型
model = train.Model(network, loss_fn, opt, metrics={'accuracy'})# 训练模型
num_epochs = 25
best_acc = 0
for epoch in range(num_epochs):model.train(epoch, train_dataset)acc = model.eval(val_dataset)['accuracy']print(f'Epoch {epoch+1}/{num_epochs}, Accuracy: {acc}')if acc > best_acc:best_acc = accmodel.save_checkpoint('best_model.ckpt')

4. 模型推理

        在模型推理部分,我们首先需要对输入的图像进行预处理,将其转换为适合模型输入的格式。预处理完成后,我们将调用训练好的模型进行预测,并展示最终的推理结果。

import matplotlib.pyplot as plt
import mindspore as ms# 定义图片预处理函数
def preprocess_image(image_path):from PIL import Imageimage = Image.open(image_path)image = image.convert('RGB')  # 确保图像为RGB格式image = image.resize((224, 224))  # 调整大小image = np.array(image) / 255.0  # 归一化image = np.transpose(image, (2, 0, 1))  # 调整维度image = np.expand_dims(image, axis=0)  # 增加batch维度return image.astype(np.float32)# 定义推理函数,加载模型并进行预测
def infer(image_path, checkpoint_path):# 加载预训练模型net = resnet50(num_classes=4)param_dict = ms.load_checkpoint(checkpoint_path)ms.load_param_into_net(net, param_dict)model = ms.Model(net)# 预处理输入图像image = preprocess_image(image_path)image_tensor = ms.Tensor(image)# 进行推理output = model.predict(image_tensor)predicted_class = np.argmax(output.asnumpy(), axis=1)[0]# 类别映射class_names = {0: "基底细胞癌",1: "黑色素瘤",2: "痣",3: "色素性良性角化病"}# 展示结果plt.imshow(np.transpose(image[0], (1, 2, 0)))plt.title(f"预测结果: {class_names[predicted_class]}")plt.axis('off')plt.show()# 调用推理函数,展示结果
infer('path/to/your/image.jpg', 'best_model.ckpt')

        该推理函数会加载已经训练好的模型,并将输入图像转换为合适的格式,最后通过模型预测输出类别。我们将使用Matplotlib库展示预测结果,并标记图像的分类情况。

结语

        在本次实验中,我们一起学习了如何使用MindSpore框架进行皮肤肿瘤识别的任务。通过数据预处理、ResNet50模型的搭建与微调,以及模型训练与推理,逐步构建了一个能够对皮肤病进行分类的模型。虽然深度学习在医学图像识别领域具有广泛的应用前景,但在实际操作中,我们仍需要不断调整和优化模型的各项参数,以获得更好的性能。

        相信在实践的过程中,我们都能更加深入地理解这些技术背后的原理,并在今后的学习和项目中继续探索和应用。也希望我们在未来的研究中,能通过更多的尝试和合作,共同提升我们的技能和知识水平。学习是一个不断积累的过程,期待和大家一起继续进步!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java项目实战II基于Java+Spring Boot+MySQL的房产销售系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着房地产市场的蓬勃发展,房产销售业务日益复杂,传统的手工管理方式已难以满…

指针赋值or常数赋值

int main (){int a 10;int b ;b a;int *c &a;int *d c; } 常数 a,b赋值: 都是将存储的值(10)赋值给别人。 指针赋值也是类似的: 指针存储的值(&a)为地址,就是把c指向的地址赋值给…

SaaS 应用如何助长网络犯罪

过去十年,软件即服务 (SaaS)的采用呈爆炸式增长,彻底改变了我们的工作方式。 从电子邮件平台到通信和协作应用程序,再到文件存储和共享服务,这些工具有望为我们的日常工作生活带来更大的灵活性和效率,尤其是在当今的远…

2.创建第一个MySQL存储过程(2/10)

引言 在现代数据库管理中,存储过程扮演着至关重要的角色。它们是一组为了执行特定任务而编写的SQL语句集合,这些语句被保存在数据库中,并且可以被多次调用执行。存储过程不仅可以提高数据库操作的效率,还能增强数据的安全性和一致…

unity 2d 近战攻击判定的三种方式

1. 给攻击帧添加碰撞盒 优点:配置直观,无需事件触发 缺点:无法定制,效率低 检测放在子物体,可以控制旋转 添加触发器事件 注意OnTriggerEnter2D只会在挂载了collider的组件上触发 protected virtual void OnTrigge…

降压芯片TPS54821

降压芯片TPS54821 介绍 价格低廉,只需1.5元。是一个同步整流降压BUCK电路。MOS管内置。输入电压为4.5V至17V,输出电压为0.6V到15V,输出电流最大到8A。是QFN封装,焊接时有些许困难。得益于QFN封装,其引线电感非常的小…

【深入理解SpringCloud微服务】手写实现断路器算法

【深入理解SpringCloud微服务】手写实现断路器算法 断路器状态切换断路器接口断路器算法实现相关属性failed()success()canPass() 断路器状态切换 在分析断路器算法前,我们先复习一下断路器的状态转换。 断路器一般有三个状态:关闭、打开、半开。 断路…

PP-Structure 快速入门

PP-Structure 快速入门 1. 环境准备2.快速使用2.1 命令行使用2.1.1 图像定位布局分析表格识别2.1.2 布局分析表格识别2.1.3 布局分析2.1.4 表格识别2.1.5 关键信息提取2.1.6 布局恢复2.2 python 脚本使用2.2.1 图像方向布局分析表格识别2.2.2 布局分析表格识别2.2.3 布局分析2…

正则表达式匹配英文字符

正则表达式匹配英文 20 个字符,包括大写,小写。 根据搜索结果,看到 honeymoose 分享过一个正则表达式的要求是: 匹配 20 个英文字符(大写、小写都包括)。 那么这个正则表达式可以写成: ^[a-zA-Z]{20}$解释一下: ^ 表示匹配字符串的开始[a-z…

pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)

靶机介绍 来自 vulnhub 主机发现 ┌──(kali㉿kali)-[~/testPwnos1.0] …

EtherCAT 转 EtherNet/IP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899协议转换通信网关 EtherCAT 转 EtherNet/IP GW系列型号 MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关,为用户提供两…

基于Vue的汽车维修配件综合管理系统设计与实现SpringBoot后端源码

目录 1. 系统背景 2. 系统目标 3. 功能模块 4. 技术选型 5. 关键技术点 6. 实现步骤 7. 项目意义 8. 后期展望 1. 系统背景 市场需求分析:随着汽车保有量的不断增加,汽车维修和保养的需求日益增长。车主对维修质量和配件质量的要求也越来越高。汽…

安全防护检测数据集 3500张 PPE 动火 带标注 voc yolo 12类

安全防护检测数据集 3500张 PPE 动火 带标注 voc yolo 分类名: (图片张数, 标注个数) he Imet: (3649,10494) no_ goggles: (2197,4545) no_ mask: (2986, 6918) no_ vest: (2602, 7462) boots: (1802, 765…

VirtualBox虚拟机连接宿主机并能够上网(小白向)

现存问题 windows系统主要使用vmare和virtualbox两种虚拟机,virtualbox相对于vmare更加轻便,但少有博客能够详细说明使用virtualbox的教程。踩了网上的坑后,决定写一篇文章介绍virtualbox虚拟机上网的流程。 需求 1. virtualbox虚拟机与宿主机…

一篇文章搞懂Android 刷卡器对接:RS232 DB9串口通讯,通讯设置,刷卡器API介绍;代码示例;MDB协议;

目录 前言 在一些国家,还没有普及扫码支付的时候,消费者会纸币、硬币或者刷卡进行支付,这里我们讲解一下刷卡支付。 在市面上,有哪家刷卡器公司可以说的上是开通了很多国家的支付银行,那么Nayax和Pax可以说的上是名列前茅,他们适配了很多国家,对接其他国家的银行,让我…

ChatGPT 更新 Canvas 深度测评:论文写作这样用它!

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 ChatGPT又又更新了:基于ChatGPT 4o模型的Canvas 写作和代码功能。目前,仅针对Plus和Team用户。是一个独立的模块,如下所示: 官方…

ISO IEC 18004 2024/2015 Chinese 下载

ISO_IEC 18004 2024.pdf - 蓝奏云文件大小:40.3 M|https://610402220623.lanzouq.com/iqZ122bnx0yjISO IEC 18004-2015 zh-CN.pdf - 蓝奏云文件大小:34.1 M|https://610402220623.lanzouq.com/iEXSB2bnx0hc

G. Gears (2022 ICPC Southeastern Europe Regional Contest. )

G. Gears 思路: 本身这个题并不难,奈何卡了很久后看了题解才做出来,感觉自己好笨。 很容易想到的是,只要确定了一个齿轮的位置,其他齿轮的位置都可以直接推出来。所以当前目标是如何确定第一个齿轮的位置。 令 x [ i …

系统守护者:使用PyCharm与Python实现关键硬件状态的实时监控

目录 前言 系统准备 软件下载与安装 安装相关库 程序准备 主体程序 更改后的程序: 编写.NET程序 前言 在现代生活中,电脑作为核心工具,其性能和稳定性的维护至关重要。为确保电脑高效运行,我们不仅需关注软件优化&#xf…

Koa2项目实战2(路由管理、项目结构优化)

添加路由(处理不同的URL请求) 路由:根据不同的URL,调用对应的处理函数。 每一个接口服务,最核心的功能是:根据不同的URL请求,返回不同的数据。也就是调用不同的接口返回不同的数据。 在 Node…