摘要:本次实践基于 mobilenetV2 实现猫狗图像分类,贯穿了数据集获取及处理、预训练模型微调及迁移、端侧部署及推理等环节和知识点,体会到了 MindSpore 简单的开发体验和全场景快速部署的魅力。

  • startTime: 2021年1月23日00:43:22
  • endTime: 2021年1月23日11:34:44

(包含学习、睡觉、吃饭、爬坑、水文……的时间)

了解MindSpore开源生态

发现一个小秘密。 github 上多三个仓库,是什么呢?

此处应是 github 过滤的 bug ,实际上mindspore-ai 有 15 个仓库, 比 gitee 多出来的三个是:mindspore-21-days-tutorials、 mail_templates、 infrastructure

别看这 3 个不起眼的仓库,在社区建设方面却大有作为。比如,mindspore-21-days-tutorials 是我们之前参加 21 天实战营的参考代码和指导文档,多么宝贵的学习资料;另外两个是 MindSpore 的开源基础建设,其中 infrastructure 包含了用于配置 Mindspore 社区的所有必需 Dockerfile 和 YAML 文件,并借助 Github 的 Action 定时自动同步 Gitee 的代码到 Github 。

训练时长截图

手机识别截图

学习总结

在学习之前我以为我会了,但真正实践起来还是磕磕碰碰,所有的代码似曾相识,都是 26 个字母加一些符号组成,但真正去理解还是发现基本功不够:一是不知道怎么写,二是不知道为什么要这么写。尽管如此,我大概理顺了整个实践流程:训练猫狗图像分类模型(云端) --> 手机端推理及应用 --> 从 “1” 开始 Fine Tune 模型(本地) --> 手机端验证 ,当然作为学渣,整个操作过程肯定不止一个小时, 深刻体会到“眼睛:学会了,脑子:学废了!”,因此必须借此帖记录一下“学废了”的过程:

目的

本次实践基于 mobilenetV2 实现猫狗图像分类,贯穿了数据集获取及处理、预训练模型微调及迁移、端侧部署及推理等环节和知识点,体会到了 MindSpore 简单的开发体验和全场景快速部署的魅力。

项目目录

MindSporePetClassification
├─ ADB                          // 支持手机与电脑传递文件工具
│  ├─ adb.exe
│  ├─ AdbWinApi.dll
│  ├─ AdbWinUsbApi.dll
│  └─ fastboot.exe
├─ code                         // Fine tune训练代码及数据集
│  ├─ dataset
│  │  ├─ PetImages
│  │  │  ├─ eval
│  │  │  │  ├─ Cat
│  │  │  │  └─ Dog
│  │  │  ├─ train
│  │  │  │  ├─ Cat
│  │  │  │  └─ Dog
│  │  ├─ MSR-LA - 3467.docx
│  │  └─ readme[1].txt
│  ├─ src
│  │  ├─ __pycache__
│  │  │  ├─ args.cpython-37.pyc
│  │  │  ├─ config.cpython-37.pyc
│  │  │  ├─ dataset.cpython-37.pyc
│  │  │  ├─ lr_generator.cpython-37.pyc
│  │  │  ├─ mobilenetV2.cpython-37.pyc
│  │  │  ├─ models.cpython-37.pyc
│  │  │  └─ utils.cpython-37.pyc
│  │  ├─ args.py
│  │  ├─ config.py
│  │  ├─ dataset.py
│  │  ├─ lr_generator.py
│  │  ├─ mobilenetV2.py
│  │  ├─ models.py
│  │  └─ utils.py
│  ├─ mobilenetV2.ckpt                    // 预训练模型文件
│  ├─ preprocessing_dataset.py            // 预先处理数据集脚本
│  └─ train.py                            // 主训练脚本
├─ converter                              // 转换工具MindSpore Lite Converter
│  ├─ converter_lite.exe
│  ├─ libgcc_s_seh-1.dll
│  ├─ libglog.dll
│  ├─ libmindspore_gvar.dll
│  ├─ libssp-0.dll
│  ├─ libstdc++-6.dll
│  └─ libwinpthread-1.dll
└─ kagglecatsanddogs_3367a.zip

依赖安装

本次实践依赖opencv-python 和 matplotlib,一个用来处理图形比如打印图片和嵌入文字,一个用来将数据集以可视化图片的形式展现出来。

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

数据预处理

主要删除一些不符合要求(如非JPEG格式)的图片并分割 train 和 eval 数据集,默认9:1:

python preprocessing_dataset.py 您的路径\kagglecatsaData to Dragnddogs_3367a.zip

Fine tune

执行Fine tune脚本train.py,并生成模型文件:

python train.py

此时会弹窗提示6张图片,这是因为脚本会在正式训练前从数据集中抽取6张图片载入当前模型文件,需要手动关闭才能继续,这是 AI 很傻,全都识别成了 Dog 。

当然,我这边由于机器的原因,没少踩坑,这不“出师未捷身先死”,突然的报错把我整蒙了,将所有num_parallel_workers参数设置为4之后,继续训练!

$ python train.py
start cache feature!
Traceback (most recent call last):File "train.py", line 52, in <module>data, step_size = extract_features(backbone_net, args_opt.dataset_path, config)File "F:\dosomethings\serverless\ModelArts\MIndSpore\MindSporePetClassification\MindSporePetClassification\code\src\dataset.py",
line 84, in extract_featurestrain_dataset = create_dataset(dataset_path=os.path.join(dataset_path, "train"), do_train=True, config=config)File "F:\dosomethings\serverless\ModelArts\MIndSpore\MindSporePetClassification\MindSporePetClassification\code\src\dataset.py",
line 41, in create_datasetds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True)File "C:\Users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\dataset\engine\validators.py", line 51, in new_methodvalidate_dataset_param_value(nreq_param_int, param_dict, int)File "C:\Users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\dataset\core\validator_helpers.py", line 352, in validate_dataset_param_valuecheck_num_parallel_workers(param_dict.get(param_name))File "C:\Users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\dataset\core\validator_helpers.py", line 340, in check_num_parallel_workersraise ValueError("num_parallel_workers exceeds the boundary between 1 and {}!".format(cpu_count()))
ValueError: num_parallel_workers exceeds the boundary between 1 and 4!

这一步耗时就和本地机器的性能有关了,我的粗粮渣渣机大概跑废了。趁着训练的空档,学习了一些代码。作为新晋调参学徒,我大概知道参数和配置在code\src\args.py和code\src\config.py这两个文件,而数据的加载在code\src\dataset.py这个文件处理,code\src\mobilenetV2.py定义了模型,code\src\models.py这个文件读取和保存模型并打印输出训练日志。

训练完成会,又会调用predict_from_net方法来显示预测的图片和标签,这回我们发现 AI 挺棒的,全部识别正确! 当我满怀信心点击关闭的时候,以为程序立马会给我一个mobilenetv2.mindir,结果我又蒙了,返回了一串错误日志!!!

early stop! the best epoch is 2
train total cost 4141.2663 s
Traceback (most recent call last):File "train.py", line 81, in <module>export_mindir(net, "mobilenetv2")File "F:\dosomethings\serverless\ModelArts\MIndSpore\MindSporePetClassification\MindSporePetClassification\code\src\utils.py", line 93, in export_mindirexport(net, Tensor(input_np), file_name=path, file_format='MINDIR')File "C:\Users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\train\serialization.py", line 535, in exportValidator.check_file_name_by_regular(file_name)File "C:\Users\huqi\AppData\Local\Programs\Python\Python37\lib\site-packages\mindspore\_checkparam.py", line 438, in check_file_name_by_regulartarget, prim_name, reg, flag))
ValueError: 'F:\dosomethings\serverless\ModelArts\MIndSpore\MindSporePetClassification\MindSporePetClassification\code\mobilenetv2.mindir'  is illegal, it should be match regular'^[0-9a-zA-Z\_\-\.\/\\]+$' by flags'256'

一开始我以为是文件层级太深了,将文件目录迁移到盘的根目录,重来重来!好在不需要再次加载数据集了,不然又得漫长的等待。 满怀信心结果又被“啪啪啪”打脸,之后群里请教一遍之后,王辉老师建议我把路径改成文件名再试试,果然立马奏效~

- path = os.path.abspath(f"{name}.mindir")
+ path = name

终于如愿以偿,code\mobilenetv2.mindir她来了!

手机端推理及应用

  • 训练模型转换
    将.mindir模型文件转换成.ms文件,.ms文件可以导入端侧设备并基于MindSpore端侧框架训练。
F:\MindSporePetClassification\converter>call converter_lite --fmk=MINDIR --modelFile=f:\MindSporePetClassification\code\mobilenetv2.mindir --outputFile=pet

我们可以下载 MindSpore 官方提供的 Android APP 源码: https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/lite/pet_classification

或者直接下载打包好的 APP 安装到手机: https://download.mindspore.cn/model_zoo/official/lite/apk/pet/petclassification.apk

先体验下预训练模型的识别效果:

接着我们把转换好的模型移动到手机端的/sdcard/PetClassification,这里用到的是 ADB 工具:需要确保手机已开启开发者模式并打开文件传输

F:\MindSporePetClassification\converter>adb push f:\MindSporePetClassification\converter\pet.ms /sdcard/PetClassification
* daemon not running; starting now at tcp:5037
* daemon started successfully
f:\MindSporePetClassification\converter\pet.ms: 1 file pushed, 0 skipped. 43.4 MB/s (8900552 bytes in 0.196s)

再试试识别效果:

对本次实践 APP 端代码感兴趣的小伙伴可以直接去阅读源码: https://gitee.com/mindspore/mindspore/blob/master/model_zoo/official/lite/pet_classification/app/src/main/java/com/mindspore/classificationforpet/widget/MainActivity.java

本文分享自华为云社区《Copy攻城狮1小时入门AI开发工程师》,原文作者:胡琦。

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

想学AI开发很简单:只要你会复制粘贴相关推荐

  1. OA开发很简单 OA实施很复杂

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 很多人对 ...

  2. 想学软件开发怎么入手

    很多初学者或者零基础想转行的朋友会产生这样的疑惑:"想学软件开发怎么入手?",作为零基础的新人想要从头学习软件开发并非易事,找到合适的学习方法对于学习效果更有帮助,接下来小课就带大 ...

  3. 云图说|ModelArts Pro:让AI开发更简单

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: ModelArt ...

  4. 想学Java开发,有什么方式可以选择?

    想学习软件开发Java高级编程语言的小伙伴看过来,这里有多年Java职业教育经验总结以及学习技巧分享,不容错过的精彩内容! 一年之计在于春,阳春三月是学习的好时光.万物复苏,一切都可以重新开始,如果你 ...

  5. 不是说学会了51再学STM32会很简单吗?

    通常来说学会了51以后再去学STM32就不会很吃力,假如你发现你学会了51,但是在学32的时候非常困难,感觉无从下手.那是因为你对于学会51这件事有所误解,你学习51的程度在我们看来就属于马马虎虎的水 ...

  6. 铁道部改制:大伙儿想知道的其实很简单

    在新一轮"大部制"改革中,屡屡传出分拆.改制传闻,却一次次最终岿然不动的"铁老大"--铁道部终于被分拆了:原铁道部的行政职责.拟定铁路技术标准.监督铁路安全生产 ...

  7. Redis该怎么学?其实很简单,这份学习路线+资料+书单我全部贡献出来了!

    前言 这绝对不是一篇水文,进来的兄弟们千万不要白嫖,真香警告⚠️.(点赞!!!) 这篇文章很早前就打算写了,特地留到现在是因为我想把Redis系列的文章全部更完,能让需要的小伙伴们有个系统的栏目学习, ...

  8. 想学 AI,先搞懂这件小事!

    作者 | 老衲 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 近年来,随着人工智能技术的普及,特别是大规模人脸识别技术的应用,市场对于大规模向量高性能检索的需求越来越急迫.本文主要阐 ...

  9. 腾讯说:云上移动开发很简单(这不是P的)!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 前几天,腾讯掌门人 Pony 惨遭被 P,被人"代表"了一把.不过,腾讯 ...

最新文章

  1. 隔空操控iPhone!苹果新获悬停手势专利
  2. Java读写二进制数据
  3. Leetcode-199二叉树的右视图(二叉树左视图)
  4. 借助钉钉宜搭,奶茶店开始用黑科技管理门店了
  5. linux 不知道root密码怎么办,linux下忘记root密码怎么办
  6. elasticsearch中的优先级线程池
  7. 推荐系统实战-概念理解入门篇
  8. STM32 RCC时钟配置
  9. Win10一键修复所有dll缺失的方法
  10. Python实现文字合成音频文件
  11. XJOI一级二段题解(g++,即C++),也可视作C++算法竞赛教程
  12. 5G商用牌照发放,“以竞争促落地”,日常5G服务可期
  13. python 导入自定义包
  14. Audio Hijack for Mac(音频录制软件)
  15. 布同:如何循序渐进学习Python语言(转载)
  16. 裸片IC的简单介绍以及裸片IC的封装设计
  17. Jquery实现遮罩
  18. 荣耀6plus android6.0,旧瓶装新酒,大妈助我把级升 — 荣耀6Plus升级安卓6.0体验分享...
  19. Unity限制旋转角度
  20. gensim-fast2vec改造、灵活使用大规模外部词向量(具备OOV查询能力)

热门文章

  1. CSS3 多列布局的跨列
  2. C语言集合的排序方法,排序集合 c语言.doc
  3. react跳转到网络异常页面_React错误边界处理
  4. python repair修复功能_详解Python修复遥感影像条带的两种方式
  5. 树莓派能做什么_使用树莓派做两轮自平衡车(一)
  6. echart的关系图高亮_Echarts 环形图 默认高亮展示某个数据
  7. 4,GIL全局解释器锁,event事件,信号量
  8. tomcat,Jboss,weblogic区别与比较
  9. [BZOJ]3926 诸神眷顾的幻想乡(ZJOI2015)
  10. 算法不归路之最大子序列(C++版)