
运用昇思MindSpore框架成为垃圾分类小能手
本案例选择以垃圾分类实验为实例,并借助华为开发者空间提供的免费Notebook进行应用开发,使开发者可以轻松上手进行关于MindSpore框架的实战演练,加速开发者对昇腾MindSpore框架的理解。
1 概述
1.1 案例介绍
昇思MindSpore是一个面向全场景设计的AI计算框架,旨在为AI算法研究和生产部署提供一个统一、高效、安全的平台。MindSpore被设计用来弥合AI算法研究与生产部署之间的鸿沟,它支持端-边-云全场景部署,这意味着它可以运行在包括但不限于智能手机、loT设备、边缘服务器以及云端服务器等不同类型的硬件平台上。
本案例选择以垃圾分类实验为实例,并借助华为开发者空间提供的免费Notebook进行应用开发,使开发者可以轻松上手进行关于MindSpore框架的实战演练,加速开发者对昇腾MindSpore框架的理解。
通过实际操作,让开发者在MindSpore框架上实现垃圾分类,不仅能够促进环境保护,还能够展示AI技术如何解决现实世界中的问题。同时,也为开发者提供了一个实践深度学习的好机会。
1.2 适用对象
-
个人开发者
-
高校学生
1.3 案例时间
本案例总时长预计30分钟。
1.4 案例流程
说明:
① 用户进入华为云开发者空间,启动Notebook,并配置相应环境;
② 下载所需要的工具包;
③ 下载所需的数据集;
④ 进行代码编写,实现垃圾分类功能。
1.5 资源总览
本案例预计花费总计0元。
资源名称 |
规格 |
单价(元) |
时长(分钟) |
开发者空间-Notebook |
NPU basic · 1 * NPU 910B · 8v CPU · 16GB| |
0 |
30 |
2 环境准备
2.1 Notebook配置
本案例中,使用华为开发者空间中提供的Notebook,完成镜像选取、代码编写、代码检查、编译构建和部署的功能。华为云开发者空间提供云化版本的Notebook,基于NPU资源的云上开发体验,预装euler2.9-py38-torch2.1-notebook开发镜像,即开即用。
每日提供两小时免费NPU算力资源,轻松关联模型和数据集,仅用1-2分钟的启动时间,即可助力开发者快速完成模型训练与推理任务。
1. 在浏览器中输入华为云开发者空间网址:开发者空间-华为云进入华为云开发者空间首页。
2. 右侧我的开发工具中找到Notebook,点击立即前往。
3. 进入到Nodebook主页后,选择NPU环境,按照图中配置信息进行配置,这里关联模型和关联数据集不用进行选择。直接点击立即启动。
(AI Notebook环境参数参考“DeepSeek模型API调用及参数调试(开发者空间Notebook版)”案例的第2.2章节介绍)
点击查看Notebook,进入Notebook环境。
3 功能实现
3.1 打开Notebook
进入到Notebook主页后,点击笔记本,新建代码编写页。
3.2 下载相应的工具包
进入Notebook后将以下代码复制进去。
pip install --upgrade pip
这个命令的功能是将Python的包管理工具pip升级到最新版本,用于后续工具包的下载。
复制进去后点击上方三角符号运行。
运行完毕后效果如下:
运行完毕后会自动生成新的命令行,将命令复制进去。
pip install mindspore
此命令是通过Python的包管理工具pip,安装华为开源的深度学习框架MindSpore,此案例中使用到的垃圾分类模型是基于MindSpore框架进行开发的,所以需要提前下载MindSpore框架,MindSpore框架的核心功能有:
1.高效计算与自动并行:
-
自动微分:支持动态图和静态图混合编程(类似PyTorch和TensorFlow的优势结合);
-
自动并行:自动优化模型在分布式环境中的计算与通信,提升训练效率。
2.全场景部署:
-
支持模型在端侧(手机/loT设备)、边缘(服务器)和云(数据中心)的统一部署;
-
提供轻量化推理框架MindSpore Lite,适用于资源受限环境。
3.开源与生态:
-
开源社区提供丰富的模型库(如ModelZoo)、工具链和文档;
-
支持ONNX格式模型导入导出,兼容TensorFlow/PyTorch生态。
再次点击上方三角符号运行,效果如下:
运行完毕后,再将下面命令复制进去运行,效果如下:
pip install mindvision
此命令是用于安装MindVision。MindVision是华为MindSpore生态系统中一个计算机视觉工具库,专注于提供高效的图像处理、模型训练与推理功能。
MindVision的核心功能
MindVision基于MindSpore框架设计,主要面向计算机视觉任务,提供以下功能:
1.预训练模型库
包含常见CV模型(如ResNet、YOLO、MobileNet等),支持快速调用和微调。
2.数据集加载预处理
内置常用数据集(如CIFAR-10、ImageNet),支持一键加载。
3.高性能训练与推理
利用MindSpore的自动并行和混合精度功能,优化训练速度,并支持GPU和昇腾(Ascend)硬件加速。
运行完毕后点击上方内核 > 重启内核。
3.3 下载数据集
将以下命令复制到Notebook进行数据集下载:
!wget https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0015/Garbage_Data.zip
下载完毕后效果如下:
将以下命令复制到Notebook,进行压缩包解压:
!unzip Garbage_Data.zip
此数据集中包含六种垃圾的种类,包括cardboard、glass、metal、paper、plastic、trash。
解压完毕后效果如下。
3.4 垃圾分类代码
环境和数据集下载完毕后将以下代码复制到Notebook中。
由于代码过长且存在格式问题,请前往以下地址进行代码的获取:
https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0015/model_demo.txt
path= "/home/ma-user/work/Garbage_Data"
import mindspore.dataset as ds
import mindspore.dataset.vision as vision
def create_dataset(path, batch_size=50, train=True, image_size=224):
#dataset = ds.ImageFolderDataset(path, num_parallel_workers=8, class_indexing={"croissants": 0, "dog": 1})
dataset = ds.ImageFolderDataset(path, num_parallel_workers=8, class_indexing={"cardboard": 0, "glass": 1, "metal": 2, "paper": 3, "plastic": 4, "trash": 5})
# 图像增强操作
mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]
std = [0.229 * 255, 0.224 * 255, 0.225 * 255]
if train:
trans = [
vision.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)),
vision.RandomHorizontalFlip(prob=0.5),
vision.Normalize(mean=mean, std=std),
vision.HWC2CHW()
]
else:
trans = [
vision.Decode(),
vision.Resize(256),
vision.CenterCrop(image_size),
vision.Normalize(mean=mean, std=std),
vision.HWC2CHW()
]
dataset = dataset.map(operations=trans, input_columns="image", num_parallel_workers=8)
# 设置batch_size的大小,若最后一次抓取的样本数小于batch_size,则丢弃
dataset = dataset.batch(batch_size, drop_remainder=True)
return dataset
# 加载训练数据集和验证数据集用于后续的模型训练和验证。
# 加载训练数据集
train_path = "Garbage_Data/train"
dataset_train = create_dataset(train_path, train=True)
# 加载验证数据集
val_path = "Garbage_Data/val"
dataset_val = create_dataset(val_path, train=False)
from mindvision.dataset import DownLoad
models_url = "https://download.mindspore.cn/vision/classification/mobilenet_v2_1.0_224.ckpt"
dl = DownLoad()
# 下载预训练模型文件
dl.download_url(models_url)
# ### MobileNet V2模型微调
#
# 本章使用MobileNet V2的预训练模型进行微调,通过删除MobileNet V2预训练模型中最后一个用于分类的1x1的卷积层的参数,使用狗与牛角包数据集对模型进行重新训练以更新模型参数。
# In[5]:
import mindspore.nn as nn
import mindspore as ms
from mindvision.classification.models import mobilenet_v2
from mindvision.engine.loss import CrossEntropySmooth
# 创建模型,其中目标分类数为6,图像输入大小为(224,224)
network = mobilenet_v2(num_classes=6, resize=224)
# 模型参数存入到param_dict
param_dict = ms.load_checkpoint("./mobilenet_v2_1.0_224.ckpt")
# 获取mobilenet_v2网络最后一个卷积层的参数名
filter_list = [x.name for x in network.head.classifier.get_parameters()]
# 删除预训练模型的最后一个卷积层
def filter_ckpt_parameter(origin_dict, param_filter):
for key in list(origin_dict.keys()):
for name in param_filter:
if name in key:
print("Delete parameter from checkpoint: ", key)
del origin_dict[key]
break
filter_ckpt_parameter(param_dict, filter_list)
# 加载预训练模型参数作为网络初始化权重
ms.load_param_into_net(network, param_dict)
# 定义优化器
network_opt = nn.Momentum(params=network.trainable_params(), learning_rate=0.01, momentum=0.9)
# 定义损失函数
network_loss = CrossEntropySmooth(sparse=True, reduction="mean", smooth_factor=0.1, classes_num=2)
# 定义评价指标
metrics = {"Accuracy": nn.Accuracy()}
# 初始化模型
model = ms.Model(network, loss_fn=network_loss, optimizer=network_opt, metrics=metrics)
#
# ### 模型训练与评估
#
# 训练并评估网络,使用MindSpore Vision中的`mindvision.engine.callback.ValAccMonitor`接口打印训练的损失值和评估精度,且在训练完成后,保存评估精度最高的CKPT文件`best.ckpt`在当前目录下。
# In[6]:
from mindvision.engine.callback import ValAccMonitor
import mindspore as ms
num_epochs = 1
# 模型训练与验证,训练完成后保存验证精度最高的ckpt文件(best.ckpt)到当前目录下
model.train(num_epochs,
dataset_train,
callbacks=[ValAccMonitor(model, dataset_val, num_epochs), ms.TimeMonitor()])
# ### 可视化模型预测
#
# 定义 `visualize_model` 函数,使用上述验证精度最高的模型对输入图像进行预测,并将预测结果可视化。
# In[8]:
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import mindspore as ms
def visualize_model(path):
image = Image.open(path).convert("RGB")
image = image.resize((224, 224))
plt.imshow(image)
# 归一化处理
mean = np.array([0.485 * 255, 0.456 * 255, 0.406 * 255])
std = np.array([0.229 * 255, 0.224 * 255, 0.225 * 255])
image = np.array(image)
image = (image - mean) / std
image = image.astype(np.float32)
# 图像通道由(h, w, c)转换为(c, h, w)
image = np.transpose(image, (2, 0, 1))
# 扩展数据维数为(1, c, h, w)
image = np.expand_dims(image, axis=0)
# 定义并加载网络
net = mobilenet_v2(num_classes=6, resize=224)
param_dict = ms.load_checkpoint("./best.ckpt")
ms.load_param_into_net(net, param_dict)
model = ms.Model(net)
# 模型预测
pre = model.predict(ms.Tensor(image))
result = np.argmax(pre)
#class_name = {0: "Croissants", 1: "Dog"}
class_name = {0:"cardboard", 1:"glass", 2:"metal", 3:"paper", 4: "plastic", 5: "trash"}
plt.title(f"Predict: {class_name[result]}")
return result
image1 = "Garbage_Data/infer/cardboard1.jpg"
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 1)
visualize_model(image1)
image2 = "Garbage_Data/infer/glass1.jpg"
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 2)
visualize_model(image2)
image3 = "Garbage_Data/infer/metal1.jpg"
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 2)
visualize_model(image3)
image4 = "Garbage_Data/infer/paper1.jpg"
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 2)
visualize_model(image4)
image5 = "Garbage_Data/infer/plastic1.jpg"
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 2)
visualize_model(image5)
image6 = "Garbage_Data/infer/trash1.jpg"
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 2)
visualize_model(image6)
plt.show()
# ### 模型导出
#
# 在模型训练完后,训练完成后的网络模型(即CKPT文件)转换为MindIR格式,用于后续手机侧的推理。通过`export`接口会在当前目录下会生成`mobilenet_v2_1.0_224.mindir`文件。
# In[9]:
import mindspore as ms
# 定义并加载网络参数
net = mobilenet_v2(num_classes=6, resize=224)
param_dict = ms.load_checkpoint("best.ckpt")
ms.load_param_into_net(net, param_dict)
# 将模型由ckpt格式导出为MINDIR格式
input_np = np.random.uniform(0.0, 1.0, size=[1, 3, 224, 224]).astype(np.float32)
ms.export(net, ms.Tensor(input_np), file_name="mobilenet_v2_1.0_224", file_format="MINDIR")
复制进去后效果如下:
复制完毕后,点击上方三角符运行,运行过程比较慢,大概需要3-5分钟,请耐心等待片刻。
运行效果如下:
从数据集中获取不同种类的垃圾图片,经过模型的训练分类后,cardboard、glass、metal、paper、plastic、trash每一种类会反馈出一张作为代表垃圾种类的图片显示在页面上。
通过本案例,开发者可以成功地使用昇思MindSpore框架训练用于垃圾分类的模型,该模型在验证集上的精度高达95%,具有较好的分类性能。同时,通过优化训练流程和模型结构,解决了训练时间长和过拟合等问题。
至此,运用昇思MindSpore框架成为垃圾分类小能手体验到此结束。
更多推荐
所有评论(0)