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. springboot 配置将info、error、debug 分别输出到不同文件

    在resource下创建名为 logback-spring.xml 的配置文件,内容如下: <?xml version="1.0" encoding="UTF-8& ...

  2. Android敲诈者病毒“安卓性能激活”分析(2015年9月版)

    一.情况简介 前几天分析了论坛里的一个Android敲诈者病毒,感觉还是很有收获,后面有空多研究研究Android病毒.说句题外话, 根据前面分析的Android敲诈者病毒的隐藏手法,应该可以实现&q ...

  3. Python中Scapy网络嗅探模块的使用

    目录 Scapy scapy的安装和使用 发包 发包和收包 抓包 将抓取到的数据包保存 查看抓取到的数据包 格式化输出 过滤抓包 Scapy scapy是python中一个可用于网络嗅探的非常强大的第 ...

  4. C++基础:模板的声明实现分离

    模板的声明和实现为什么不能分离我不想废话了,我只是在想一种能够分离的方式. 文件 test.h 1 #pragma once 2 3 template<typename TC> 4 cla ...

  5. 内存回收导致关键业务抖动案例分析-论云原生OS内存QoS保障

    蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 云原生场景,相比于传统的IDC场景,业务更加复杂 ...

  6. Java常用类详解

    目录 1. String类 1.1 String的特性 1.2 String字面量赋值的内存理解 1.3 String new方式赋值的内存理解 1.4 String 拼接字面量和变量的方式赋值 1. ...

  7. 【Azure Redis 缓存】Azure Cache for Redis服务中,除开放端口6379,6380外,对13000,13001,15000,15001 为什么也是开放的呢?

    问题描述 在使用安全检测工具对Azure Redis服务端口进行扫描时,发现Redis对外开放了13001, 13000,15000,15001端口.非常不理解的是,在门户上只开放了6379,6380 ...

  8. [BUAA2021软工]结对第一阶段博客作业小结

    作业链接 结对项目-第一阶段 优秀作业推荐 本次博客作业虽然是简单总结,但是以下作业中都不乏有思考.有亮点的精彩内容,推荐给同学们阅读学习. 山鸣谷应,相得益彰--杰对项目-第一阶段总结 该组对于可能 ...

  9. 【BUAA软工】软件案例分析

    项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:BUAA软件工程结对编程项目作业 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 个 ...

  10. 分析型CRM系统都分析什么?

    在之前的文章中我们曾经讲过,目前市面上常见的CRM系统大概可以分为通用型.协助型和分析型三种类型.由于每个企业的类型.业务的不同,就需要选择一款适合的CRM客户关系管理系统.今天我们就来说一说,分析型 ...