MindSpore模型推理
MindSpore模型推理
如果想在应用中使用自定义的MindSpore Lite模型,需要告知推理器模型所在的位置。推理器加载模型的方式有以下三种:
- 加载本地模型。
- 加载远程模型。
- 混合加载本地和远程模型。
加载模型
方式一:加载并初始化本地模型。
- 加载模型。
- Assets目录
- MLCustomLocalModel localModel = new MLCustomLocalModel.Factory("yourmodelname")
- .setAssetPathFile("assetpathname")
- .create();
- 自定义目录
. MLCustomLocalModel localModel = new MLCustomLocalModel.Factory("yourmodelname")
- .setLocalFullPathFile("sdfullpathname")
- .create();
- 根据模型创建推理器。
- final MLModelExecutorSettings settings = new MLModelExecutorSettings.Factory(localModel).create();
- final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
- // 调用模型推理,实现细节见下节模型推理;Bitmap待处理的图片。
- executorImpl(modelExecutor, bitmap);
方式二:加载并初始化远程模型。
加载远程模型时需先判断远程模型是否已经下载完成:
- final MLCustomRemoteModel remoteModel =new MLCustomRemoteModel.Factory("yourmodelname")
- .create();
- MLLocalModelManager.getInstance()
- .isModelExist(remoteModel)
- .addOnSuccessListener(new OnSuccessListener<Boolean>() {
- @Override
- public void onSuccess(Boolean isDownload) {
- if (isDownload) {
- final MLModelExecutorSettings settings =
- 10. new MLModelExecutorSettings.Factory(remoteModel).create();
- 11. final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
- 12. executorImpl(modelExecutor, bitmap);
- 13. }
- 14. }
- 15. })
- 16. .addOnFailureListener(new OnFailureListener() {
- 17. @Override
- 18. public void onFailure(Exception e) {
- 19. // 异常处理。
- 20. }
- 21. });
方式三:混合加载本地和远程模型。推荐使用这种方式,此方法可以确保当远程模型未下载时加载本地模型。
- localModel = new MLCustomLocalModel.Factory("localModelName")
- .setAssetPathFile("assetpathname")
- .create();
- remoteModel =new MLCustomRemoteModel.Factory("yourremotemodelname").create();
- MLLocalModelManager.getInstance()
- // 判断远程模型是否存在。
- .isModelExist(remoteModel)
- .addOnSuccessListener(new OnSuccessListener<Boolean>() {
- @Override
- 10. public void onSuccess(Boolean isDownloaded) {
- 11. MLModelExecutorSettings settings;
- 12. // 如果远程模型存在,优先加载本地已有的远程模型,否则加载本地已有的本地模型。
- 13. if (isDownloaded) {
- 14. settings = new MLModelExecutorSettings.Factory(remoteModel).create();
- 15. } else {
- 16. settings = new MLModelExecutorSettings.Factory(localModel).create();
- 17. }
- 18. final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
- 19. executorImpl(modelExecutor, bitmap);
- 20. }
- 21. })
- 22. .addOnFailureListener(new OnFailureListener() {
- 23. @Override
- 24. public void onFailure(Exception e) {
- 25. // 异常处理。
- 26. }
- 27. });
模型推理器进行推理
本章示例中的“executorImpl”方法为模型推理的详细流程,声明如下:
- void executorImpl(final MLModelExecutor modelExecutor, Bitmap bitmap)
以下示例会借助“executorImpl”方法详细演示推理器调用的自定义模型推理的整个过程,此方法内主要包含如下关键处理流程:
- 设置输入输出格式。
需要知道模型的输入输出格式。通过MLModelInputOutputSettings.Factory把输入输出格式设置到模型推理器。比如,一个图片分类模型的输入格式为一个float类型的1x224x224x3数组(表示只推理一张大小为224x224的三通道 (RGB)图片),输出格式为一个长度为1001的float型列表(每个值表示该图片经模型推理后1001个类别中各类别的可能性)。对于此模型,请按照以下方式设置输入输出格式:
- inOutSettings = new MLModelInputOutputSettings.Factory()
- .setInputFormat(0, MLModelDataType.FLOAT32, new int[] {1, 224, 224, 3})
- .setOutputFormat(0, MLModelDataType.FLOAT32, new int[] {1, 1001})
- .create();
- 把图片数据输入到推理器。
注意
当前版本MindSpore生成的模型使用的数据格式与tflite类型的模型使用的数据格式相同,均为NHWC,caffe类型的模型使用的数据格式为NCHW。若需要将模型由caffe转换到MindSpore,请设置为NHWC格式。如下NHWC示例:1*224*224*3表示一张(batch N),大小为224(height H)*224(width W),3通道(channels C)的图片。
- private void executorImpl(final MLModelExecutor modelExecutor, Bitmap bitmap){
- // 准备输入数据。
- final Bitmap inputBitmap = Bitmap.createScaledBitmap(srcBitmap, 224, 224, true);
- final float[][][][] input = new float[1][224][224][3];
- for (int i = 0; i < 224; i++) {
- for (int j = 0; j < 224; j++) {
- int pixel = inputBitmap.getPixel(i, j);
- input[batchNum][j][i][0] = (Color.red(pixel) - 127) / 128.0f;
- input[batchNum][j][i][1] = (Color.green(pixel) - 127) / 128.0f;
- 10. input[batchNum][j][i][2] = (Color.blue(pixel) - 127) / 128.0f;
- 11. }
- 12. }
- 13. MLModelInputs inputs = null;
- 14. try {
- 15. inputs = new MLModelInputs.Factory().add(input).create();
- 16. // 若模型需要多路输入,需要多次调用add()以便图片数据能够一次输入到推理器。
- 17. } catch (MLException e) {
- 18. // 处理输入数据格式化异常。
- 19. }
- 20.
21. // 执行推理。可以通过“addOnSuccessListener”来监听推理成功,在“onSuccess”回调中处理推理成功。同时,可以通过“addOnFailureListener”来监听推理失败,在“onFailure”中处理推理失败。
- 22. modelExecutor.exec(inputs, inOutSettings).addOnSuccessListener(new OnSuccessListener<MLModelOutputs>() {
- 23. @Override
- 24. public void onSuccess(MLModelOutputs mlModelOutputs) {
- 25. float[][] output = mlModelOutputs.getOutput(0);
- 26. // 这里推理的返回结果在output数组里,可以进一步处理。
- 27. }
- 28. }).addOnFailureListener(new OnFailureListener() {
- 29. @Override
- 30. public void onFailure(Exception e) {
- 31. // 推理异常。
- 32. }
- 33. });
34. }
MindSpore模型推理的更多相关文章
- MindSpore模型精度调优实战:如何更快定位精度问题
摘要:为大家梳理了针对常见精度问题的调试调优指南,将以"MindSpore模型精度调优实战"系列文章的形式分享出来,帮助大家轻松定位精度问题,快速优化模型精度. 本文分享自华为云社 ...
- MindSpore模型精度调优实战:常用的定位精度调试调优思路
摘要:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight. 本文分享自华为云社区<技 ...
- 天猫精灵业务如何使用机器学习PAI进行模型推理优化
引言 天猫精灵(TmallGenie)是阿里巴巴人工智能实验室(Alibaba A.I.Labs)于2017年7月5日发布的AI智能语音终端设备.天猫精灵目前是全球销量第三.中国销量第一的智能音箱品牌 ...
- 【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化
本文翻译自 Yizhi Liu, Yao Wang, Ruofei Yu.. 的 "Optimizing CNN Model Inference on CPUs" 原文链接: h ...
- MindSpore模型精度调优实践
MindSpore模型精度调优实践 引论:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,为MindSpore量身定做了可视化调试调优组件:MindInsight. ...
- 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解
用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...
- 【模型推理】Tengine 模型转换及量化
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 本文介绍一下 Tengine 模型转换 ...
- 【模型推理】量化实现分享一:详解 min-max 对称量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下 m ...
- 【模型推理】量化实现分享二:详解 KL 对称量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下 K ...
随机推荐
- 浅谈程序设计和C语言
学前必备知识 程序:一组计算机能识别和执行的指令. 计算机语言:计算机工作基于二进制,计算机只能识别和接受由0和1组成的指令. 计算机能直接识别和接受的二进制代码称为机器指令.机器指令的集合就是该计算 ...
- PAT 乙级 -- 1003 -- 我要通过!
题目简述 "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正 ...
- LA3415保守的老师
题意: 有n个学生,老师要带他们出去玩,但是老师比较保守,怕他们之间萌生爱意,所以带出去的所有同学必须至少满足四个条件中的一组,问最多能带多少人出去玩. 思路: 比较简单二分 ...
- POJ2239简单二分匹配
题意: 一周有7天,每天可以上12节课,现在给你每科课的上课时间,问你一周最多可以上几科课,一科课只要上一节就行了. 思路: 简单题目,直接二分就行了,好久没写二分匹配了,练习 ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-中
3.2 例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...
- 什么?这么精髓的View的Measure流程源码全解析,你确定不看看?
前言 Android开发中我们平时接触最多的是各种View, View是一个比较大的体系,包含了绘制流程.事件分发.各种动画.自定义View 等等.前几天我写了一篇事件分发源码解析的文章, 今天我们来 ...
- Spring的配置文件 (SSM maven项目)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 基于RestAssured实现接口自动化
RestAssured是一款强大的接口自动化框架, 旨在使用方便的DSL,简化的接口自动化. 下面是基于RestAssured扩展的一个简单框架示例, 先看看用例的风格: package testca ...
- Redis6.x学习笔记(二)持久化之RDB
前言 最近学习Redis6.x,特做笔记以备忘,与大家共学.课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值 ...
- Codeforces Round #712 (Div. 2)
A. Déjà Vu 题意:就是问能否加上字母a,使得字符串不中心对称 思路:只有一种情况不能加入,就是全部是a,剩下的都可以满足,找a的位置就找哪个字母不是a,然后让它的对称位置是新加的这个a 代码 ...