MindSpore模型推理

如果想在应用中使用自定义的MindSpore Lite模型,需要告知推理器模型所在的位置。推理器加载模型的方式有以下三种:

  • 加载本地模型。
  • 加载远程模型。
  • 混合加载本地和远程模型。

加载模型

方式一:加载并初始化本地模型。

  1. 加载模型。
  • Assets目录
  1. MLCustomLocalModel localModel = new MLCustomLocalModel.Factory("yourmodelname")
  2. .setAssetPathFile("assetpathname")
  3. .create();
  • 自定义目录

.         MLCustomLocalModel localModel = new MLCustomLocalModel.Factory("yourmodelname")

  1. .setLocalFullPathFile("sdfullpathname")
  2. .create();
  3. 根据模型创建推理器。
  4. final MLModelExecutorSettings settings = new MLModelExecutorSettings.Factory(localModel).create();
  5. final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
  6. // 调用模型推理,实现细节见下节模型推理;Bitmap待处理的图片。
  7. executorImpl(modelExecutor, bitmap);

方式二:加载并初始化远程模型。

加载远程模型时需先判断远程模型是否已经下载完成:

  1. final MLCustomRemoteModel remoteModel =new MLCustomRemoteModel.Factory("yourmodelname")
  2. .create();
  3. MLLocalModelManager.getInstance()
  4. .isModelExist(remoteModel)
  5. .addOnSuccessListener(new OnSuccessListener<Boolean>() {
  6. @Override
  7. public void onSuccess(Boolean isDownload) {
  8. if (isDownload) {
  9. final MLModelExecutorSettings settings =
  10. 10.                             new MLModelExecutorSettings.Factory(remoteModel).create();
  11. 11.                     final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
  12. 12.                     executorImpl(modelExecutor, bitmap);
  13. 13.                 }
  14. 14.             }
  15. 15.         })
  16. 16.         .addOnFailureListener(new OnFailureListener() {
  17. 17.             @Override
  18. 18.             public void onFailure(Exception e) {
  19. 19.                 // 异常处理。
  20. 20.             }
  21. 21.         });

方式三:混合加载本地和远程模型。推荐使用这种方式,此方法可以确保当远程模型未下载时加载本地模型。

  1. localModel = new MLCustomLocalModel.Factory("localModelName")
  2. .setAssetPathFile("assetpathname")
  3. .create();
  4. remoteModel =new MLCustomRemoteModel.Factory("yourremotemodelname").create();
  5. MLLocalModelManager.getInstance()
  6. // 判断远程模型是否存在。
  7. .isModelExist(remoteModel)
  8. .addOnSuccessListener(new OnSuccessListener<Boolean>() {
  9. @Override
  10. 10.             public void onSuccess(Boolean isDownloaded) {
  11. 11.                 MLModelExecutorSettings settings;
  12. 12.                 // 如果远程模型存在,优先加载本地已有的远程模型,否则加载本地已有的本地模型。
  13. 13.                 if (isDownloaded) {
  14. 14.                     settings = new MLModelExecutorSettings.Factory(remoteModel).create();
  15. 15.                 } else {
  16. 16.                     settings = new MLModelExecutorSettings.Factory(localModel).create();
  17. 17.                 }
  18. 18.                 final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
  19. 19.                 executorImpl(modelExecutor, bitmap);
  20. 20.             }
  21. 21.         })
  22. 22.         .addOnFailureListener(new OnFailureListener() {
  23. 23.             @Override
  24. 24.             public void onFailure(Exception e) {
  25. 25.                 // 异常处理。
  26. 26.             }
  27. 27.         });

模型推理器进行推理

本章示例中的“executorImpl”方法为模型推理的详细流程,声明如下:

  1. void executorImpl(final MLModelExecutor modelExecutor, Bitmap bitmap)

以下示例会借助“executorImpl”方法详细演示推理器调用的自定义模型推理的整个过程,此方法内主要包含如下关键处理流程:

  1. 设置输入输出格式。

需要知道模型的输入输出格式。通过MLModelInputOutputSettings.Factory把输入输出格式设置到模型推理器。比如,一个图片分类模型的输入格式为一个float类型的1x224x224x3数组(表示只推理一张大小为224x224的三通道 (RGB)图片),输出格式为一个长度为1001的float型列表(每个值表示该图片经模型推理后1001个类别中各类别的可能性)。对于此模型,请按照以下方式设置输入输出格式:

  1. inOutSettings = new MLModelInputOutputSettings.Factory()
  2. .setInputFormat(0, MLModelDataType.FLOAT32, new int[] {1, 224, 224, 3})
  3. .setOutputFormat(0, MLModelDataType.FLOAT32, new int[] {1, 1001})
  4. .create();
  5. 把图片数据输入到推理器。

注意

当前版本MindSpore生成的模型使用的数据格式与tflite类型的模型使用的数据格式相同,均为NHWC,caffe类型的模型使用的数据格式为NCHW。若需要将模型由caffe转换到MindSpore,请设置为NHWC格式。如下NHWC示例:1*224*224*3表示一张(batch N),大小为224(height H)*224(width W),3通道(channels C)的图片。

  1. private void executorImpl(final MLModelExecutor modelExecutor, Bitmap bitmap){
  2. // 准备输入数据。
  3. final Bitmap inputBitmap = Bitmap.createScaledBitmap(srcBitmap, 224, 224, true);
  4. final float[][][][] input = new float[1][224][224][3];
  5. for (int i = 0; i < 224; i++) {
  6. for (int j = 0; j < 224; j++) {
  7. int pixel = inputBitmap.getPixel(i, j);
  8. input[batchNum][j][i][0] = (Color.red(pixel) - 127) / 128.0f;
  9. input[batchNum][j][i][1] = (Color.green(pixel) - 127) / 128.0f;
  10. 10.             input[batchNum][j][i][2] = (Color.blue(pixel) - 127) / 128.0f;
  11. 11.         }
  12. 12.     }
  13. 13.     MLModelInputs inputs = null;
  14. 14.     try {
  15. 15.         inputs = new MLModelInputs.Factory().add(input).create();
  16. 16.         // 若模型需要多路输入,需要多次调用add()以便图片数据能够一次输入到推理器。
  17. 17.     } catch (MLException e) {
  18. 18.         // 处理输入数据格式化异常。
  19. 19.     }
  20. 20.

21. // 执行推理。可以通过“addOnSuccessListener”来监听推理成功,在“onSuccess”回调中处理推理成功。同时,可以通过“addOnFailureListener”来监听推理失败,在“onFailure”中处理推理失败。

  1. 22.     modelExecutor.exec(inputs, inOutSettings).addOnSuccessListener(new OnSuccessListener<MLModelOutputs>() {
  2. 23.         @Override
  3. 24.         public void onSuccess(MLModelOutputs mlModelOutputs) {
  4. 25.             float[][] output = mlModelOutputs.getOutput(0);
  5. 26.                 // 这里推理的返回结果在output数组里,可以进一步处理。
  6. 27.                 }
  7. 28.         }).addOnFailureListener(new OnFailureListener() {
  8. 29.         @Override
  9. 30.         public void onFailure(Exception e) {
  10. 31.             // 推理异常。
  11. 32.         }
  12. 33.     });

34. }

MindSpore模型推理的更多相关文章

  1. MindSpore模型精度调优实战:如何更快定位精度问题

    摘要:为大家梳理了针对常见精度问题的调试调优指南,将以"MindSpore模型精度调优实战"系列文章的形式分享出来,帮助大家轻松定位精度问题,快速优化模型精度. 本文分享自华为云社 ...

  2. MindSpore模型精度调优实战:常用的定位精度调试调优思路

    摘要:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight. 本文分享自华为云社区<技 ...

  3. 天猫精灵业务如何使用机器学习PAI进行模型推理优化

    引言 天猫精灵(TmallGenie)是阿里巴巴人工智能实验室(Alibaba A.I.Labs)于2017年7月5日发布的AI智能语音终端设备.天猫精灵目前是全球销量第三.中国销量第一的智能音箱品牌 ...

  4. 【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化

    本文翻译自 Yizhi Liu, Yao Wang, Ruofei Yu.. 的  "Optimizing CNN Model Inference on CPUs" 原文链接: h ...

  5. MindSpore模型精度调优实践

    MindSpore模型精度调优实践 引论:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,为MindSpore量身定做了可视化调试调优组件:MindInsight. ...

  6. 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解

    用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...

  7. 【模型推理】Tengine 模型转换及量化

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   本文介绍一下 Tengine 模型转换 ...

  8. 【模型推理】量化实现分享一:详解 min-max 对称量化算法实现

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下 m ...

  9. 【模型推理】量化实现分享二:详解 KL 对称量化算法实现

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下 K ...

随机推荐

  1. php 日志处理工具 SeasLog 的使用

    首先附上seaslog github地址: https://github.com/Neeke/SeasLog/blob/master/README_zh.md php官方文档地址: https://w ...

  2. hdu2371 矩阵乘法(求序列位置改变m次后的序列)

    题意:       给你一个字符串,然后让你执行m次操作,每次操作把当前的字符串映射到他给你的位置序列的位置,比如给的是 3 1 2,第一步就是把原来的3的位置的字母变到1的位置,1的变到2的位置,2 ...

  3. 双非硕士的辛酸求职回忆录:第 2 篇 谈谈我是如何同时找到Java、Python、Go等开发岗和国企银行的科技岗位Offer(上篇)

    1. 双非硕士的辛酸求职之旅--谈谈我是如何同时找到Java.Python.Go等开发岗和国企银行的offer 1.1. 秋招最终情况 本人情况:双非硕,意向工作城市广深,Java和Python技术栈 ...

  4. 插入排序——Python实现

    插入排序Python实现 # -*- coding: utf-8 -*- # @Time : 2019/10/28 20:47 # @Author : yuzhou_1shu # @Email : y ...

  5. 每天一道面试题LeetCode 80--删除排序数组中的重复项 II(python实现)

    LeetCode 80--删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输 ...

  6. aspnetcore 应用 接入Keycloak快速上手指南

    登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...

  7. 引言:CTF新世界

    1. CTF的昨天和今天 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客 ...

  8. CF1487 Cat Cycle

    一个规律题目要多做多积累 , 脑子不太灵活 CF1487 Cat Cycle 题目大意: 两只猫A,B, A猫从n -> n-1 -> n-2 ... -> 1 -> 2 .. ...

  9. java的"\\s+"什么意思?

    例如:String[] tt=addr.split("\\s+");\\s ==\s 表示转义字符 ,\s表示匹配任意空格(包括空格,制表符,换页符)\\s+中的'+'表示多次匹配

  10. [bug] Authentication failed for token submission (认证失败)异常

    原因 gitee上下的项目,启动后能访问首页,但登录报错.原因是根据用户名上数据库查密码没有得到结果,中间任何环节有问题都可能导致,我的是因为mapper.xml中的<mapper namesp ...