HarmonyOS:使用MindSpore Lite引擎进行模型推理

场景介绍

MindSpore Lite 是一款 AI 引擎,它提供了面向不同硬件设备 AI 模型推理的功能,目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。

本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。

基本概念

在进行开发前,请先了解以下概念。

张量 :它与数组和矩阵非常相似,是 MindSpore Lite 网络运算中的基本数据结构。

Float16 推理模式 : Float16 又称半精度,它使用 16 比特表示一个数。Float16 推理模式表示推理的时候用半精度进行推理。

接口说明

这里给出 MindSpore Lite 推理的通用开发流程中涉及的一些接口,具体请见下列表格。

Context 相关接口

Model 相关接口

Tensor 相关接口

开发步骤

使用 MindSpore Lite 进行模型推理的开发流程如下图所示。**图 1 **使用 MindSpore Lite 进行模型推理的开发流程

进入主要流程之前需要先引用相关的头文件,并编写函数生成随机的输入,具体如下:

#include <stdlib.h>
#include <stdio.h>
#include "mindspore/model.h"

//生成随机的输入
int GenerateInputDataWithRandom(OH_AI_TensorHandleArray inputs) {
  for (size_t i = 0; i < inputs.handle_num; ++i) {
    float *input_data = (float *)OH_AI_TensorGetMutableData(inputs.handle_list[i]);
    if (input_data == NULL) {
      printf("MSTensorGetMutableData failed.\n");
      return OH_AI_STATUS_LITE_ERROR;
    }
    int64_t num = OH_AI_TensorGetElementNum(inputs.handle_list[i]);
    const int divisor = 10;
    for (size_t j = 0; j < num; j++) {
      input_data[j] = (float)(rand() % divisor) / divisor;  // 0--0.9f
    }
  }
  return OH_AI_STATUS_SUCCESS;
}

然后进入主要的开发步骤,具括包括模型的准备、读取、编译、推理和释放,具体开发过程及细节请见下文的开发步骤及示例。

  1. 模型准备。

需要的模型可以直接下载,也可以通过模型转换工具获得。

a. 下载模型的格式若为.ms,则可以直接使用。本文以 mobilenetv2.ms 为例。

b. 如果是第三方框架的模型,比如 TensorFlow、TensorFlow Lite、Caffe、ONNX 等,可以使用 模型转换工具转换为.ms 格式的模型文件。

  1. 创建上下文,设置线程数、设备类型等参数。
// 创建并配置上下文,设置运行时的线程数量为2,绑核策略为大核优先
OH_AI_ContextHandle context = OH_AI_ContextCreate();
if (context == NULL) {
  printf("OH_AI_ContextCreate failed.\n");
  return OH_AI_STATUS_LITE_ERROR;
}
const int thread_num = 2;
OH_AI_ContextSetThreadNum(context, thread_num);
OH_AI_ContextSetThreadAffinityMode(context, 1);
//设置运行设备为CPU,不使用Float16推理
OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
if (cpu_device_info == NULL) {
  printf("OH_AI_DeviceInfoCreate failed.\n");
  OH_AI_ContextDestroy(&context);
  return OH_AI_STATUS_LITE_ERROR;
}
OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, false);
OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
  1. 创建、加载与编译模型。

调用 OH_AI_ModelBuildFromFile 加载并编译模型。

本例中传入 OH_AI_ModelBuildFromFile 的 argv[1]参数是从控制台中输入的模型文件路径。

// 创建模型
OH_AI_ModelHandle model = OH_AI_ModelCreate();
if (model == NULL) {
  printf("OH_AI_ModelCreate failed.\n");
  OH_AI_ContextDestroy(&context);
  return OH_AI_STATUS_LITE_ERROR;
}

// 加载与编译模型,模型的类型为OH_AI_MODELTYPE_MINDIR
int ret = OH_AI_ModelBuildFromFile(model, argv[1], OH_AI_MODELTYPE_MINDIR, context);
if (ret != OH_AI_STATUS_SUCCESS) {
  printf("OH_AI_ModelBuildFromFile failed, ret: %d.\n", ret);
  OH_AI_ModelDestroy(&model);
  return ret;
}
  1. 输入数据。

模型执行之前需要向输入的张量中填充数据。本例使用随机的数据对模型进行填充。

// 获得输入张量
OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
if (inputs.handle_list == NULL) {
  printf("OH_AI_ModelGetInputs failed, ret: %d.\n", ret);
  OH_AI_ModelDestroy(&model);
  return ret;
}
// 使用随机数据填充张量
ret = GenerateInputDataWithRandom(inputs);
if (ret != OH_AI_STATUS_SUCCESS) {
  printf("GenerateInputDataWithRandom failed, ret: %d.\n", ret);
  OH_AI_ModelDestroy(&model);
  return ret;
}
  1. 执行推理。

使用 OH_AI_ModelPredict 接口进行模型推理。

// 执行模型推理
OH_AI_TensorHandleArray outputs;
ret = OH_AI_ModelPredict(model, inputs, &outputs, NULL, NULL);
if (ret != OH_AI_STATUS_SUCCESS) {
  printf("OH_AI_ModelPredict failed, ret: %d.\n", ret);
  OH_AI_ModelDestroy(&model);
  return ret;
}
  1. 获取输出。

模型推理结束之后,可以通过输出张量得到推理结果。

// 获取模型的输出张量,并打印
for (size_t i = 0; i < outputs.handle_num; ++i) {
  OH_AI_TensorHandle tensor = outputs.handle_list[i];
  int64_t element_num = OH_AI_TensorGetElementNum(tensor);
  printf("Tensor name: %s, tensor size is %zu ,elements num: %lld.\n", OH_AI_TensorGetName(tensor),
        OH_AI_TensorGetDataSize(tensor), element_num);
  const float *data = (const float *)OH_AI_TensorGetData(tensor);
  printf("output data is:\n");
  const int max_print_num = 50;
  for (int j = 0; j < element_num && j <= max_print_num; ++j) {
    printf("%f ", data[j]);
  }
  printf("\n");
}
  1. 释放模型。

不再使用 MindSpore Lite 推理框架时,需要释放已经创建的模型。

// 释放模型
OH_AI_ModelDestroy(&model);

调测验证

  1. 编写 CMakeLists.txt。
cmake_minimum_required(VERSION 3.14)
project(Demo)

add_executable(demo main.c)

target_link_libraries(
        demo
        mindspore-lite.huawei
        pthread
        dl
)

● 使用 ohos-sdk 交叉编译,需要对 CMake 设置 native 工具链路径,即:-DCMAKE_TOOLCHAIN_FILE=“/xxx/native/build/cmake/ohos.toolchain.camke”。

● 工具链默认编译 64 位的程序,如果要编译 32 位,需要添加:-DOHOS_ARCH=“armeabi-v7a”。

  1. 运行。

● 使用 hdc_std 连接设备,并将 demo 和 mobilenetv2.ms 推送到设备中的相同目录。

● 使用 hdc_std shell 进入设备,并进入 demo 所在的目录执行如下命令,即可得到结果。

./demo mobilenetv2.ms

得到如下输出:

# ./QuickStart ./mobilenetv2.ms                                            
Tensor name: Softmax-65, tensor size is 4004 ,elements num: 1001.
output data is:
0.000018 0.000012 0.000026 0.000194 0.000156 0.001501 0.000240 0.000825 0.000016 0.000006 0.000007 0.000004 0.000004 0.000004 0.000015 0.000099 0.000011 0.000013 0.000005 0.000023 0.000004 0.000008 0.000003 0.000003 0.000008 0.000014 0.000012 0.000006 0.000019 0.000006 0.000018 0.000024 0.000010 0.000002 0.000028 0.000372 0.000010 0.000017 0.000008 0.000004 0.000007 0.000010 0.000007 0.000012 0.000005 0.000015 0.000007 0.000040 0.000004 0.000085 0.000023 

为了能让大家更好的学习鸿蒙 (Harmony OS) 开发技术,这边特意整理了《鸿蒙 (Harmony OS)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (Harmony OS)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. 应用开发导读(Java)

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/252486.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【elementui笔记:el-table表格的输入校验】

之前做得比较多的校验是在el-form表单里做的&#xff0c;但有时也遇到&#xff0c;需要在table内输入数据&#xff0c;然后校验输入的数据是否符合要求的情况。因此记录一下。 思路&#xff1a; 1.需要借助el-form的校验&#xff0c;el-table外层嵌套一层el-form&#xff0c;使…

Java数组(1)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

离线无网络环境下配置Python/Anaconda环境踩过的坑

一、前言 如果你同样需要在无网络环境下安装Python环境&#xff0c;这篇博客是一个很好的参考&#xff0c;由于内网没有网络&#xff0c;因此不能使用conda install/pip install等在线下载安装方式&#xff0c;经过个人尝试&#xff0c;推荐以下两种方法。 二、离线安装python…

2023年陕西省安全员C证证考试题库及陕西省安全员C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年陕西省安全员C证证考试题库及陕西省安全员C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

MIT6.S081-实验准备

实验全程在Vmware虚拟机 (镜像&#xff1a;Ubuntu-20.04-beta-desktop-amd64) 中进行 一、版本控制 1.1 将mit的实验代码克隆到本地 git clone git://g.csail.mit.edu/xv6-labs-2020 1.2 修改本地git配置文件 创建github仓库&#xff0c;记录仓库地址 我的仓库地址就是htt…

基于AT89C51单片机的LED点阵显示屏设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; [[https://download.csdn.net/download/qq_64505944/88637464?spm1001.2014.3001.5503]] **[源码获取] B 源码仿真图课程设计50 工程实训&#xff08;三&#xff09;课题设计 班级&#xff1a; …

【面试】Java最新面试题资深开发-Java中的垃圾回收机制

问题七&#xff1a;Java中的垃圾回收机制 请简要解释Java中的垃圾回收机制是如何工作的&#xff0c;以及它的优缺点。如果可能&#xff0c;请提供一些垃圾回收器的例子&#xff0c;以及它们在不同场景中的适用性。 Java垃圾回收机制 工作原理&#xff1a; Java垃圾回收机制…

linux(centos7)离线安装mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar

1. 卸载mariadb相关rpm # 查找 rpm -qa|grep mariadb rpm -qa|grep mysql# 卸载 rpm -e --nodeps mariadb... rpm -e --nodeps mysql...2. 删除mysql相关文件 # 查找 find / -name mysql# 删除 rm -rf /var/lib/mysql...3. 查看是否有相关依赖&#xff0c;没有需安装 rpm -q…

考虑用序列化代理代替序列化实例

import java.io.*;// 用户类 class User implements Serializable {private String username;private String password;private String email;public User(String username, String password, String email) {this.username username;this.password password;this.email ema…

CentOS 7 部署 Nacos-2.3.0 (单机版)

CentOS 7 部署 Nacos-2.3.0 &#xff08;单机版&#xff09; 1. 下载 Nacos 安装包 历史版本&#xff1a;https://github.com/alibaba/nacos/releases/ 我选的是 2.3.0 版本&#xff0c;https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.g…

从传统型数据库到非关系型数据库

一 什么是数据库 数据库顾名思义保存数据的仓库&#xff0c;其本质是一个具有数据存储功能的复杂系统软件&#xff0c;数据库最终把数据保存在计算机硬盘&#xff0c;但数据库并不是直接读写数据在硬盘&#xff0c;而是中间隔了一层操作系统&#xff0c;通过文件系统把数据保存…

2023年12月5日,北京elastic Meetup 腾讯分享的搜索优化经验

1、减少长文本模糊匹配&#xff0c;降低 CPU 大量分词上的开销 长文本全文查询由于在查询时需要进行分词处理&#xff0c;因此在查询并发较大的情况下&#xff0c; cpu会先于IO被打满&#xff0c;从而出现大量的查询拒绝。 2、设置多副本提高并发和均衡单节点压力 Search查询请…

机器学习 | 线性算法 —— 大禹治水

Machine-Learning: 《机器学习必修课&#xff1a;经典算法与Python实战》配套代码 - Gitee.com 如果说KNN算法体现了人们对空间距离的理解&#xff0c; 那么线性算法则体现了人们对事物趋势上的认识。 注意图中横纵坐标的不同。 线性回归、多项式回归多用于预测&#xff0c;逻辑…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(四)linux安装Mysql

1.切换到你需要安装mysql的路径 cd /root/usr/ 2.在线安装 安装网上的安装方式都有很多&#xff0c;可以自己百度一下 我们这里是自己搭建测试环境&#xff0c;可以直接选择在线安装&#xff0c;命令如下&#xff1a;yum install mysql-server&#xff0c; 但是我失败了 ┭┮…

蜂鸣器的工作原理

电路原理图使用SH69P43为控制芯片&#xff0c;使用4MHz晶振作为主振荡器。 PORTC.3/T0作为I/O口通过三极管Q2来驱动蜂鸣器LS1&#xff0c;而PORTC.2/PWM0则作为PWM输出口通过三极管Q1来驱动蜂鸣器LS2。另外在PORTA.3和PORTA.2分别接了两个按键&#xff0c;一个是PWM按键&#x…

使用 Wired XDisplay 连接失败的原因

使用 Wired XDisplay 连接扩展屏&#xff0c;有时候会连接不上 &#xff0c;记下解决方法&#xff0c;以备后用&#xff1a; 1、扩展屏和主屏 一直在连接中&#xff0c;可能是其中一端没有提供数据访问权限 ps. 水果用户需要 打开 iTunes 并登陆 &#xff0c;安卓用户 可能是 …

Mistral MOE架构全面解析

从代码角度理解Mistral架构 Mistral架构全面解析前言Mistral 架构分析分词网络主干MixtralDecoderLayerAttentionMOEMLP 下游任务因果推理文本分类 Mistral架构全面解析 前言 Mixtral-8x7B 大型语言模型 (LLM) 是一种预训练的生成式稀疏专家混合模型。在大多数基准测试中&…

1.Mybtis-Plus框架基本使用

Mybatis-plus是一个mybatis的增强工具,在mybatis的基础上只做增加不做改变,简化开发 提供通用的`mapper和service` 可以在不编写任何SQL语句的情况下快速实现对单表CRUD、批量、逻辑删除、分页操作 Mybatis-plus提供优秀插件,并对idea中快速开发插件mybatisX也进行功能使用。…

甜酷女孩穿搭 I 时尚与保暖都兼具的羽绒服

这款工装风羽绒服 酷酷的中性风 清新温柔的杏紫两色 采用定制复合面料 顺滑平整硬朗的材质 具有防水功能 下雪下雨天也不用担心哦 90白鹅绒&#xff0c;立领连帽设计 帽子做的是可拆卸 可以切换两种风格 袖口采用可调节魔术贴设计 下摆可调节抽绳设计 处处透着细节…

网络安全——SSH密码攻击实验

一、实验目的要求&#xff1a; 二、实验设备与环境&#xff1a; 三、实验原理&#xff1a; 四、实验步骤&#xff1a;​ 五、实验现象、结果记录及整理&#xff1a; 六、分析讨论与思考题解答&#xff1a; 网络安全-SSH密码攻击实验效果截图&#xff1a; https://downloa…