昇思MindSpore是一款华为公司独立开发的深度学习框架,它是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标。其中,易开发表现为API友好、调试难度低;高效执行包括计算效率、数据预处理效率和分布式训练效率;全场景则指框架同时支持云、边缘以及端侧场景。本篇博客旨在使用MindSpore框架体验AI从开发到部署的全流程。
官方网址
狗与牛角包分类数据集,该数据集有狗和牛角包两个类别,每个类有大约150张训练图像、20张验证图像和1张推理图像。具体数据集如下所示:
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的卷积进行升维。
详细内容可参见MobileNet V2论文
本次实验使用MindSpore Vision中的mobilenet_v2
网络微调的方法来开发一个AI应用(狗和牛角包分类),并将训练好的网络模型部署到Android手机上,执行推理和部署功能。通过实验希望大家能有如下收获:
实验所需所有材料,这里我通过百度网盘将实验所需的所有材料给出,大家可以直接下载使用,大家也可以按照下面给出的连接手动下载:
首先在选择一个目录,最好不要包含中文, 先新建一个文件夹并命名为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")
目录情况如下:
这里以Windows系统下,Anaconda的虚拟环境为例,进入Anaconda Prompt。
执行下面命令安装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 list
查看是否安装成功
详细安装教程可以去官网查看
本实验使用MobileNet V2的预训练模型进行微调,通过删除MobileNet V2预训练模型中最后一个用于分类的1x1的卷积层的参数,使用狗与牛角包数据集对模型进行重新训练以更新模型参数。
运行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
强制退出。
训练完成后会输出一张推理预测图:
关闭这张推理图之后会生成一个
mobilenet_v2_1.0_224.mindir
的文件,用于后面的部署。
为实现模型文件在手机侧的推理功能,步骤如下:
转换文件格式:将MindIR文件格式,转换成Android手机上MindSpore Lite可识别的MS文件;
应用部署:在手机侧部署应用APK,即下载一个MindSpore Vision套件Android APK;
应用体验:最后将ms模型文件导入到手机侧后,体验狗与牛角包的识别功能。
转换工具需要用到一些动态库,我们需要将这些库导入环境变量中。这里我们需要得到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
# 下载解压后设置软件包的路径,{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}
# 下载解压后设置软件包的路径,{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%
上面我们讲过,转换的目的是:将MindIR文件格式,转换成Android手机上MindSpore Lite可识别的MS文件。这里我们需要得到mobilenet_v2_1.0_224.mindir
的地址{experiment_path}
,比如我的地址是
那么我这里{experimnet_path}=C:\Users\STZZ\Desktop\dog_and_bread
# 在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
# 在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
转换成功后打印CONVERT RESULT SUCCESS:0
,且在当前目录下生成mobilenet_v2_1.0_224.ms
文件。
其他环境下载MindSpore Lite Converter参见下载MindSpore Lite。
目前本实验部署只是支持安卓手机,下载MindSpore Vision套件的Android端应用APK,并在手机上安装该APK,其应用名称显示为MindSpore Vision
。
或者微信扫描下方二维码然后用浏览器打开:
MindSpore Vision APK主要是作为视觉开发工具的示例所用,提供拍照、选择图片等基础UI功能,并且提供分类、检测、人脸识别等AI应用DEMO。
打开APP后,在首页点击分类
模块后,即可点击中间按钮进行拍照获取图片,或者点击上侧栏的图像按钮选择进行图片相册用于图像分类功能。
在默认情况下,MindSpore Vision分类
模块内置了一个通用的AI网络模型对图像进行识别分类。
最后将上述训练的自定义网络模型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。
通过本次实验我们能够体验基于MindSpore框架开发的AI模型,从训练到部署到应用这一整个AI开发流程,对MindSpore的易用性有了一个很直观的感受。