MindSpore入门体验实验
0. 前言
昇思MindSpore是一款华为公司独立开发的深度学习框架,它是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标。其中,易开发表现为API友好、调试难度低;高效执行包括计算效率、数据预处理效率和分布式训练效率;全场景则指框架同时支持云、边缘以及端侧场景。本篇博客旨在使用MindSpore框架体验AI从开发到部署的全流程。
1. 实验介绍
1.1 数据集介绍
狗与牛角包分类数据集,该数据集有狗和牛角包两个类别,每个类有大约150张训练图像、20张验证图像和1张推理图像。具体数据集如下所示:
1.2 MobileNet V2模型
MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络,相比于传统的卷积神经网络,MobileNet网络使用深度可分离卷积(Depthwise Separable Convolution)的思想在准确率小幅度降低的前提下,大大减小了模型参数与运算量。并引入宽度系数 α \alpha α 和分辨率系数 β \beta β 使模型满足不同应用场景的需求。
由于MobileNet网络中Relu激活函数处理低维特征信息时会存在大量的丢失,所以MobileNetV2网络提出使用倒残差结构(Inverted residual block)和Linear Bottlenecks来设计网络,以提高模型的准确率,且优化后的模型更小。
图中Inverted residual block结构是先使用1x1卷积进行升维,然后使用3x3的DepthWise卷积,最后使用1x1的卷积进行降维。与Residual block结构相反,Residual block是先使用1x1的卷积进行降维,然后使用3x3的卷积,最后使用1x1的卷积进行升维。
1.3 实验目的
本次实验使用MindSpore Vision中的mobilenet_v2
网络微调的方法来开发一个AI应用(狗和牛角包分类),并将训练好的网络模型部署到Android手机上,执行推理和部署功能。通过实验希望大家能有如下收获:
- 对AI开发流程有初步的概念
- 对MindSpore框架有良好的体验
- 对AI应用的部署有初步的概念
1.4 实验总体设计
2. 实验过程
2.1 准备实验材料
2.1.1 下载已准备好的材料
实验所需所有材料,这里我通过百度网盘将实验所需的所有材料给出,大家可以直接下载使用,大家也可以按照下面给出的连接手动下载:
2.1.2 手动逐项下载实验材料
-
首先在选择一个目录,最好不要包含中文, 先新建一个文件夹并命名为
dog_and_bread
,进入dog_and_bread
文件夹。 -
在
dog_and_bread
文件夹下新建一个datasets
文件夹,下载狗与牛角包分类数据集,并解压到datasets
中。 -
下载预训练好的模型,放到
dog_and_bread
中。 -
下载Windows-x64模型转换工具或者Linux-x86_64模型转换工具,放到
dog_and_bread
中; -
下载实验python脚本,放到
dog_and_bread
中然后:-
用记事本打开代码文件,注释掉“# 下载并解压数据集”和“# 下载预训练模型文件”这两行下面的代码,如下(在行首加上#代表注释这行代码,这样的话它就不会运行了):
# 下载并解压数据集
# dl.download_and_extract_archive(dataset_url, path)
# 下载预训练模型文件
# dl.download_url(models_url)
-
-
新建一个python脚本conv.py,将下面的内容添加进去
-
from mindspore import export, Tensor from mindspore import load_checkpoint, load_param_into_net from mindvision.classification.models import mobilenet_v2 import numpy as np # 定义并加载网络参数 net = mobilenet_v2(num_classes=2, resize=224) param_dict = load_checkpoint("best.ckpt") 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) export(net, Tensor(input_np), file_name="mobilenet_v2_1.0_224", file_format="MINDIR")
-
-
目录情况如下:
2.2 实验环境环境搭建
2.2.1 环境要求
- python=3.7.5
- mindspore=1.6.1
- mindvision
- matplotlib
- numpy
- PIL(pillow)
2.2.2 具体搭建步骤
这里以Windows系统下,Anaconda的虚拟环境为例,进入Anaconda Prompt。
步骤一:创建新的虚拟环境,安装python3.7.5
- 执行
conda create -n exp python==3.7.5 -y
- 激活环境
conda activate exp
步骤二:安装mindspore和mindvision
-
执行下面命令安装cpu版本的mindspore-1.6.1
-
pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.6.1/MindSpore/cpu/x86_64/mindspore-1.6.1-cp37-cp37m-win_amd64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple
-
-
执行下面命令安装mindvision
- pip install mindvision -i https://pypi.tuna.tsinghua.edu.cn/simple
-
执行
pip list
查看是否安装成功
详细安装教程可以去官网查看
步骤三:验证是否能正常运行
-
依次执行以下命令,观察是否报错,无报错即安装成功。
-
python import mindspore import mindvision # 确认安装成功后退出python环境 exit()
2.3 MobileNet V2模型微调
本实验使用MobileNet V2的预训练模型进行微调,通过删除MobileNet V2预训练模型中最后一个用于分类的1x1的卷积层的参数,使用狗与牛角包数据集对模型进行重新训练以更新模型参数。
2.3.1 具体步骤
步骤一:进入实验路径
- 进入2.1节创建的
dog_and_bread
路径:
步骤二:进行微调训练与评估
-
运行mindspore_infer.py脚本,执行
python mindspore_infer.py
执行十轮微调训练。-
训练过程图
-
模型评估内容
Epoch: [ 1 / 10], Train Loss: [0.362], Accuracy: 0.975 epoch time: 40297.560 ms, per step time: 1389.571 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:20:51.120.006 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 2 / 10], Train Loss: [0.421], Accuracy: 1.000 epoch time: 33285.182 ms, per step time: 1147.765 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:21:22.687.854 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 3 / 10], Train Loss: [0.395], Accuracy: 1.000 epoch time: 31615.851 ms, per step time: 1090.202 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:21:53.611.95 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 4 / 10], Train Loss: [0.343], Accuracy: 1.000 epoch time: 30412.341 ms, per step time: 1048.701 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:22:24.652.200 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 5 / 10], Train Loss: [0.461], Accuracy: 1.000 epoch time: 31595.999 ms, per step time: 1089.517 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:22:55.253.750 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 6 / 10], Train Loss: [0.378], Accuracy: 1.000 epoch time: 30743.555 ms, per step time: 1060.123 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:23:26.843.271 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 7 / 10], Train Loss: [0.392], Accuracy: 1.000 epoch time: 31550.518 ms, per step time: 1087.949 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:23:59.384.269 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 8 / 10], Train Loss: [0.357], Accuracy: 1.000 epoch time: 32361.001 ms, per step time: 1115.897 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:24:32.989.804 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 9 / 10], Train Loss: [0.328], Accuracy: 1.000 epoch time: 33875.533 ms, per step time: 1168.122 ms [WARNING] ME(6504:20768,MainProcess):2022-06-02-16:25:05.507.399 [mindspore\train\model.py:954] CPU cannot support dataset sink mode currently.So the evaluating process will be performed with dataset non-sink mode. -------------------- Epoch: [ 10 / 10], Train Loss: [0.360], Accuracy: 1.000 epoch time: 32197.596 ms, per step time: 1110.262 ms ================================================================================ End of validation the best Accuracy is: 1.000, save the best ckpt file in ./best.ckpt
-
训练结束后会出处一个best.ckpt的模型,此时不要按
ctrl+C
强制退出。
2.3.2 可视化模型预测
训练完成后会输出一张推理预测图:
关闭这张推理图之后会生成一个
mobilenet_v2_1.0_224.mindir
的文件,用于后面的部署。
2.4 模型格式转换
为实现模型文件在手机侧的推理功能,步骤如下:
-
转换文件格式:将MindIR文件格式,转换成Android手机上MindSpore Lite可识别的MS文件;
-
应用部署:在手机侧部署应用APK,即下载一个MindSpore Vision套件Android APK;
-
应用体验:最后将ms模型文件导入到手机侧后,体验狗与牛角包的识别功能。
2.4.1 设置环境变量
转换工具需要用到一些动态库,我们需要将这些库导入环境变量中。这里我们需要得到mindspore-lite-1.6.1-win-x64
的地址{converter_path}
,比如我的地址C:\Users\STZZ\Desktop\dog_and_bread\mindspore-lite-1.6.1-win-x64
那么我这里{converter_path}=C:\Users\STZZ\Desktop\dog_and_bread\mindspore-lite-1.6.1-win-x64
- Linux下使用MindSpore Lite Converter转换文件格式。
# 下载解压后设置软件包的路径,{converter_path}为解压后工具包的路径,PACKAGE_ROOT_PATH为设置的环境变量
export PACKAGE_ROOT_PATH={converter_path}
# 将转换工具需要的动态链接库加入到环境变量LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${PACKAGE_ROOT_PATH}/tools/converter/lib:${LD_LIBRARY_PATH}
- Windows下使用MindSpore Lite Converter转换文件格式。
# 下载解压后设置软件包的路径,{converter_path}为解压后工具包的路径,PACKAGE_ROOT_PATH为设置的环境变量
set PACKAGE_ROOT_PATH={converter_path}
# 如set PACKAGE_ROOT_PATH=C:\Users\STZZ\Desktop\dog_and_bread
# 将转换工具需要的动态链接库加入到环境变量PATH
set PATH=%PACKAGE_ROOT_PATH%\tools\converter\lib;%PATH%
2.4.2 执行模型转换
上面我们讲过,转换的目的是:将MindIR文件格式,转换成Android手机上MindSpore Lite可识别的MS文件。这里我们需要得到mobilenet_v2_1.0_224.mindir
的地址{experiment_path}
,比如我的地址是
那么我这里{experimnet_path}=C:\Users\STZZ\Desktop\dog_and_bread
- Linux下执行转化
# 在mindspore-lite-1.6.1-linux-x64/tools/converter/converter执行转换命令
./converter_lite --fmk=MINDIR --modelFile={experiment_path}/mobilenet_v2_1.0_224.mindir --outputFile={experiment_path}/mobilenet_v2_1.0_224
- WIndows下执行转化
# 在mindspore-lite-1.6.1-win-x64\tools\converter\converter路径下执行转换命令
call converter_lite --fmk=MINDIR --modelFile={experiment_path}\mobilenet_v2_1.0_224.mindir --outputFile={experiment_path}\mobilenet_v2_1.0_224
2.4.3 转换结果
转换成功后打印CONVERT RESULT SUCCESS:0
,且在当前目录下生成mobilenet_v2_1.0_224.ms
文件。
其他环境下载MindSpore Lite Converter参见下载MindSpore Lite。
2.5 应用部署
2.5.1 APK应用下载
目前本实验部署只是支持安卓手机,下载MindSpore Vision套件的Android端应用APK,并在手机上安装,其应用名称显示为MindSpore Vision
。
MindSpore Vision APK主要是作为视觉开发工具的示例所用,提供拍照、选择图片等基础UI功能,并且提供分类、检测、人脸识别等AI应用DEMO。
打开APP后,在首页点击分类
模块后,即可点击中间按钮进行拍照获取图片,或者点击上侧栏的图像按钮选择进行图片相册用于图像分类功能。
在默认情况下,MindSpore Vision分类
模块内置了一个通用的AI网络模型对图像进行识别分类。
2.5.2 模型部署
最后将上述训练的自定义网络模型mobilenet_v2_1.0_224.ms
部署到Android手机侧,体验狗与牛角包的识别功能。
步骤一:创建配置文件
定义模型部署需要按照如下格式定义网络模型需要用到的信息,即自定义标签文件,并在本地电脑端侧创建一个必须以custom.json
命名的json格式标签文件。
{
"title": '狗和牛角包',
"file": 'mobilenet_v2_1.0_224.ms',
"label": ['牛角包', '狗']
}
Json标签文件中需包含title
,file
,label
三个Key值字段,其含义如下:
-
title :自定义模块标题(狗和牛角包);
-
file :上文转换好的模型文件名称;
-
label :自定义标签label的
数组
信息。
步骤二:标签与模型文件部署到手机
在MindSpore Vision APK
的首页上长按分类
按钮,可以进入自定义分类模式,并且选择需要部署的标签和模型文件。
为实现手机端狗与牛角包的识别功能,需将标签文件custom.json
文件和模型文件mobilenet_v2_1.0_224.ms
一起放置到手机上指定目录下。这里以Android/data/Download/
文件夹为例,首先把标签文件和模型文件同时放在上述手机地址,如图所示,点击自定义按钮,然后会弹出系统文件功能,点击左上角的打开文件,然后找到Json标签文件和模型文件存放的目录地址,并选择对应的Json文件。
标签与模型文件部署到手机后,即可点击中间按钮进行拍照获取图片,或者点击上侧栏的图像按钮选择图片相册用于图像,就可以进行狗与牛角包的分类识别。
本实验仅包含手机侧简单的部署过程,想要了解推理更多内容请参考MindSpore Lite。
2.6 实验总结
通过本次实验我们能够体验基于MindSpore框架开发的AI模型,从训练到部署到应用这一整个AI开发流程,对MindSpore的易用性有了一个很直观的感受。