【Copy攻城狮日志】基于MindSpore Lite开发目标检测的安卓APP实战

举报
胡琦 发表于 2020/10/27 14:44:36 2020/10/27
【摘要】 “零”基础的Copy攻城狮居然敢实战MindSpore Lite开发目标检测的安卓APP,谁给的勇气?是梁静茹吗?

基于MindSpore Lite开发目标检测的安卓APP实战

“零”基础的Copy攻城狮居然敢实战MindSpore Lite开发目标检测的安卓APP,谁给的勇气?是梁静茹吗?

前言

大家好,我是Copy攻城狮胡琦,有幸参与华为业界首个全场景AI实战营,今天是第1天学习,也是从小白到大牛迈出的第一步,俗话说“万事难开头,只怕有心人”,但愿今天的实战能一把过。先说说我的基本情况,本人男,今年27岁,属猴,身高1米75,体重……不好意思,走错片场了。说正经的,我是一只前端猿,掐指一算这是我从业的第四个年头了,对于AI、Python完全是小白,更别说全场景深度学习框架MindSpore,在此之前,只完成了“Hello MindSpore”--在华为云虚拟主机上安装MindSpore的Docker镜像跑通了LeNet模型(视频链接:https://www.bilibili.com/video/BV1G***1L7kU ),实实在在的H(ello)W(orld)攻城狮。对于安卓开发,也是一知半解,尽管有丰富的React Native开发经验,但涉及到APP原生开发,思维逻辑基本靠蒙,实现代码基本靠抄。这次基于MindSpore Lite开发目标检测的安卓APP实战,我是十分有信心拿下的,要是不简单怎么可能放在第一课呢?不啰嗦,开始今日份的Copy学习吧!

准备

既然是端侧AI(On-Device AI),本次用到的端侧就是安卓设备啦。其他的我们按照实践操作的流程捋一捋(感谢MindSpores实战营助教的疼爱):

1️⃣模型训练导出与转换

2️⃣端侧推理框架编译

3️⃣APP编译与运行

直播地址:在B站搜索『MindSpore官方』账号,进直播间上课:https://live.bilibili.com/22127570

为了整这个GPU环境,一宿没睡,尝试了各种方案,终于采用了论坛大佬的windows安装wsl ubuntu的方案--在Win10游戏本中搭建MindSpore-GPU的深度学习环境。虽然我的机器不是游戏本,而且还是4年前的笔记本,为了信仰,值得冒险!当然整个过程也并不是顺利,最终环境搭建还是失败了,这次的确是硬件的问题。我那老人笔记本,在安装完Ubuntu之后,硬盘空间不到1G了,尽管能安装mindspore-gpu镜像,但由于一些nvida的依赖无法再安装,导致无法使用GPU。总体来说,社区大佬的指导是有意义的,如果想在windows上体验mindspore-gpu,按照他的教程指导做就行了,前提是硬件最好足够硬!虽然,本地搭建环境失败,离成功可能只有1%,正是这1%让我意识到:“有多大能耐,吃多少饭”,差点撑死了!当然,Copy攻城狮有个不服输的个性--屡败屡战,无论走多少弯路,我依旧还能勉强坚持,于是转战云环境,想通过ModelArts使用mindspore训练一个模型出来,再进行转换编译给到安卓App端能够调用,可惜,碍于自己的实力短缺,瞎折腾了几天,最后万念俱灰,只好悻悻离去,不经反问自己:小白学什么AI?

尽管对训练物体检测模型并转换编译为mindspore-lite可用的这次实践,最终以失败告终,但是没有浇灭我学习mindspore的热情,起码加持mindspore-lite的安卓应用我还是能跑起来的。对于从模型训练到模型转换再到编译整个过程,我也算是有一定的理解了,下面基于小白的理解,回顾并巩固一下Mindspore 21天训练营的第一天学习。

模型训练导出与转换

鉴于我本地环境没有搭建成功,我直接使用官网提供的预置终端模型--ssd.ms。访问https://download.mindspore.cn/model_zoo/official/lite/可以获取更多mindspore-lite模型,如googlenet、resnext50等。当然您还可以使用预置模型做迁移学习,以实现自己的模型,不过需要将模型导出为.mindir格式。然后使用MindSpore Lite模型转换工具将.mindir模型转换成.ms格式。Mindspore当前支持基于静态图,且不包含控制流语义的推理网络导出。导出.mindir格式的代码以resnet50为例:

from mindspore.train.serialization import exportimport numpy as np
resnet = ResNet50()# return a parameter dict for modelparam_dict = load_checkpoint("resnet50-2_32.ckpt")# load the parameter into netload_param_into_net(resnet, param_dict)input = np.random.uniform(0.0, 1.0, size=[32, 3, 224, 224]).astype(np.float32)export(resnet, Tensor(input), file_name='resnet50-2_32.mindir', file_format='MINDIR')

然后我们还需要将.mindir模型转换为端侧可用的.ms模型,也就一行代码的事:

./converter_lite --fmk=MINDIR --modelFile=ssd.mindir --outputFile=ssd.ms

不过这行代码能够正常的运行的基础离不开基础环境的搭建,由于我这边没有成功搭建环境,那就只能直接用官方提供的预置模型了。

端侧推理框架编译

转换模型后执行推理前,我们可以使用Benchmark工具对MindSpore Lite模型进行基准测试。它不仅可以对MindSpore Lite模型前向推理执行耗时进行定量分析(性能),还可以通过指定模型输出进行可对比的误差分析(精度)。本次实践由于环境受限,就没有实操基准测试部分,有兴趣的小伙伴请移步官方文档,有详细的指导。端侧推理部分可以使用C++的Runtime或者java的Runtime进行推理,本次实践采用MindSpore Lite C++ API(Android JNI)以及MindSpore Lite 目标检测模型完成端侧推理,代码来自MindSpore gitee仓库。大概涉及到以下几个步骤:

文件准备

文件准备这里我们配置MindSpore Lite依赖项和下载及部署模型文件。Android JNI层调用MIndSpore C++ API时需要引入相关的依赖,如MIndSpore Lite源码编译生成mindspore-lite-{version}-minddata-{os}-{device}.tar.gz库文件包并解压缩(包含libmindspore-lite.so库文件和相关头文件)。当然,源码中提供download.gradle自动下载MindSpore Lite 版本文件,并放置在app/src/main/cpp/目录下,如果您遇到自动下载失败的情况可手动下载解压并放置在对应的位置。此外还需在app/build.gradle文件中配置CMake编译支持,以及arm64-v8a的编译支持,最后还需在app/CMakeLists.txt文件中建立.so库文件链接。
同样的在download.gradle文件中会自动下载模型文件并放置在app/src/main/assets目录下,如自动下载失败可手动下载模型文件。
编译环境.png

读取模型及创建会话

在MindSpore Lite中,模型文件是从模型转换工具转换得到的.ms文件。进行模型推理时,需要从文件系统加载模型,并进行模型解析。使用MindSpore Lite执行推理时,Session是推理的主入口,通过Session我们可以进行图编译、图执行。尽管我是小白,不会写也看不懂代码,不过结合文档说明勉强能找到代码的注释,那么究竟要不要学C++呢?
加载模型及创建会话.png

图编译

在图执行前,需要调用LiteSession的CompileGraph接口进行图编译,进一步解析从文件中加载的Model实例,主要进行子图切分、算子选型调度。这部分会耗费较多时间,官方文档建议LiteSession创建一次,编译一次,多次执行。
图编译.png

输入数据

在图执行前,需要将输入数据拷贝到模型的输入Tensor。MindSpore Lite提供两种方法来获取模型的输入Tensor:使用GetInputsByTensorName方法,根据模型输入Tensor的名称来获取模型输入Tensor中连接到输入节点的Tensor;使用GetInputs方法,直接获取所有的模型输入Tensor的vector。本次实践采用的是后者。此外通过MutableData方法进行数据拷贝。
输入数据.png

图执行及获取输出

MindSpore Lite会话在进行图编译以后,即可使用LiteSession的RunGraph进行模型推理。MindSpore Lite在执行完推理后,就可以获取模型的推理结果,MindSpore Lite提供四种方法来获取模型的输出MSTensor。这里使用GetOutputByTensorName方法,根据模型输出Tensor的名称来获取对应的模型输出MSTensor。
图执行及获取输出.png

此外在src\main\cpp\ssd_util\ssd_util.cpp文件中我们还能进行设置输出矩形框、置信度筛选等操作。
额外操作.png

APP编译与运行

APP编译与运行不是本文的重点,鉴于本大狮有React Native的开发经验,跑通安卓APP还算不是很吃力,基本只要环境到位、网络到位,蹭蹭蹭一把梭!最后放上APP运行的结果吧,希望大家多多指点!最后希望参与MindSpore 21天实战营的小伙伴都有收获!
image.png

唯一的坑

坑,本地环境的安装对于我来说全是坑,直到最后弃坑!所以,但从APP的编译与安装来说,唯一的一个坑就是:电脑千万别开热点!我遇到的问题jh就是电脑开了热点运行APP就提示本机连接失败,导致Build进行直接死掉。不知道有没有遇到类似问题的小伙伴?关于AI学习,还请各位大佬多多指教!


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。