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|
euler2.9-py38-torch2.1.0-notebook

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框架成为垃圾分类小能手体验到此结束。

点击关注,第一时间了解华为云新鲜技术~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐