写点什么

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

发布于: 2021 年 01 月 25 日

摘要:本次实践基于 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/simplepip 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.pystart 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_features    train_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_dataset    ds = 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_method    validate_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_value    check_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_workers    raise 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 2train total cost 4141.2663 sTraceback (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_mindir    export(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 export    Validator.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_regular    target, 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 successfullyf:\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 开发工程师》,原文作者:胡琦。


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


发布于: 2021 年 01 月 25 日阅读数: 26
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
想学AI开发很简单:只要你会复制粘贴