HiAI Foundation开发平台,加速端侧AI应用的智能革命

如果您是一名开发者,正在寻找一种高效、灵活且易于使用的端侧AI开发框架,那么HarmonyOS SDKHiAI Foundation服务(HiAI Foundation Kit)就是您的理想选择。

作为一款AI开发框架,HiAI Foundation不仅提供强大的NPU计算能力和丰富的开发工具,还提供完善的技术支持和社区资源,帮助您快速构建高质量的AI应用程序。以图像分类这种常见的AI应用为例,使用HiAI Foundation可以帮助开发者们快速实现高效的图像分类应用。HiAI Foundation面向自定义AI算法的开发者们,可以灵活地支持自有的算法,给应用带来更好的性能功耗收益。

功能演示

如果开发者对实现方式感兴趣,可以下载Demo体验,基于具体的应用场景优化。Demo支持加载离线模型,对图片中的物体进行分类。

图像分类开发步骤

1.创建项目

本章以Caffe SqueezeNet模型集成为例,说明App集成操作过程。

2.配置项目NAPI

编译HAP时,NAPI层的so需要编译依赖NDK中的libneural_network_core.so和libhiai_foundation.so。

3.头文件引用

按需引用头文件。

#include "neural_network_runtime/neural_network_core.h"
#include "hiai_foundation/hiai_options.h"

4.编写CMakeLists.txt

CMakeLists.txt中的关键代码如下:

include_directories(${HMOS_SDK_NATIVE}/sysroot/usr/lib)
FIND_LIBRARY(hiai_foundation-lib hiai_foundation)
add_library(entry SHARED Classification.cpp HIAIModelManager.cpp)
target_link_libraries(entry PUBLIC libace_napi.z.solibhilog_ndk.z.solibrawfile.z.so${hiai_foundation-lib}libneural_network_core.so)

5.集成模型

模型的加载、编译和推理主要是在native层实现,应用层主要作为数据传递和展示作用。

模型推理之前需要对输入数据进行预处理以匹配模型的输入,同样对于模型的输出也需要做处理获取自己期望的结果。另外SDK中提供了设置模型编译和运行时的配置接口,开发者可根据实际需求选择使用接口。

本节阐述同步模式下单模型的使用,从流程上分别阐述每个步骤在应用层和Native层的实现和调用,接口请参见API参考。

6.预置模型

为了让App运行时能够读取到模型文件和处理推理结果,需要先把离线模型和模型对应的结果标签文件预置到工程的"entry/src/main/resources/rawfile"目录中。

本示例所使用的离线模型转换和生成可参考Caffe模型转换,当前支持Caffe 1.0版本。

命令行中的参数说明请参见OMG参数,转换命令:

./omg --model xxx.prototxt --weight yyy.caffemodel --framework 0 --
output ./modelname

转换示例:

./omg --model deploy.prototxt --weight squeezenet_v1.1.caffemodel --framework
0 --output ./squeezenet

当看到OMG generate offline model success时,则说明转换成功,会在当前目录下生成squeezenet.om。

7.加载离线模型

在App应用创建时加载模型和读取结果标签文件。

1)调用NAPI层的"LoadModel"函数,读取模型的buffer。

2)把模型buffer传递给HIAIModelManager类的"HIAIModelManager::LoadModelFromBuffer"接口,该接口调用

OH_NNCompilation_ConstructWithOfflineModelBuffer创建模型的编译实例。

3)获取并设置模型的deviceID。

size_t deviceID = 0;
const size_t *allDevicesID = nullptr;
uint32_t deviceCount = 0;
OH_NN_ReturnCode ret = OH_NNDevice_GetAllDevicesID(&allDevicesID, &deviceCount);
if (ret != OH_NN_SUCCESS || allDevicesID == nullptr) {OH_LOG_ERROR(LOG_APP, "OH_NNDevice_GetAllDevicesID failed");return OH_NN_FAILED;
}
for (uint32_t i = 0; i < deviceCount; i++) {const char *name = nullptr;ret = OH_NNDevice_GetName(allDevicesID[i], &name);if (ret != OH_NN_SUCCESS || name == nullptr) {OH_LOG_ERROR(LOG_APP, "OH_NNDevice_GetName failed");return OH_NN_FAILED;}if (std::string(name) == "HIAI_F") {deviceID = allDevicesID[i];break;}
}
// modelData和modelSize为模型的内存地址和大小
OH_NNCompilation *compilation = OH_NNCompilation_ConstructWithOfflineModelBuffer(modelData, modelSize); 
ret = OH_NNCompilation_SetDevice(compilation, deviceID); 
if (ret != OH_NN_SUCCESS) {OH_LOG_ERROR(LOG_APP, "OH_NNCompilation_SetDevice failed");return OH_NN_FAILED;
}

4)调用OH_NNCompilation_Build,执行模型编译。

5)调用OH_NNExecutor_Construct,创建模型执行器。

6)调用OH_NNCompilation_Destroy,释放模型编译实例。

上述流程可参见Demo中"entry/src/main/cpp/Classification.cpp"文件中的"LoadModel"函数和"entry/src/main/cpp/HiAiModelManager.cpp"中的"HIAIModelManager::LoadModelFromBuffer"函数。

8.准备输入输出

1)准备输入输出

2)处理模型的输入,例如示例中模型的输入为13227*227格式Float类型的数据,需要把输入的图片转成该格式后传递到NAPI层。

3)创建模型的输入和输出Tensor,并把应用层传递的数据填充到输入的Tensor中。

// 创建输入数据
size_t inputCount = 0;
std::vector<NN_Tensor*> inputTensors;
OH_NN_ReturnCode ret = OH_NNExecutor_GetInputCount(executor, &inputCount); 
if (ret != OH_NN_SUCCESS || inputCount != inputData.size()) { // inputData为开发者构造的输入数据OH_LOG_ERROR(LOG_APP, "OH_NNExecutor_GetInputCount failed, size mismatch");return OH_NN_FAILED;
}
for (size_t i = 0; i < inputCount; ++i) {NN_TensorDesc *tensorDesc = OH_NNExecutor_CreateInputTensorDesc(executor, i); NN_Tensor *tensor = OH_NNTensor_Create(deviceID, tensorDesc); // deviceID的获取方式可参考"加载离线模型"的步骤3if (tensor != nullptr) {inputTensors.push_back(tensor);}OH_NNTensorDesc_Destroy(&tensorDesc);
}
if (inputTensors.size() != inputCount) {OH_LOG_ERROR(LOG_APP, "input size mismatch");DestroyTensors(inputTensors); // DestroyTensors为释放tensor内存操作函数return OH_NN_FAILED;
}
// 初始化输入数据
for (size_t i = 0; i < inputTensors.size(); ++i) {void *data = OH_NNTensor_GetDataBuffer(inputTensors[i]);size_t dataSize = 0;OH_NNTensor_GetSize(inputTensors[i], &dataSize);if (data == nullptr || dataSize != inputData[i].size()) { // inputData为模型的输入数据OH_LOG_ERROR(LOG_APP, "invalid data or dataSize");return OH_NN_FAILED;}memcpy(data, inputData[i].data(), inputData[i].size()); // inputData为模型的输入数据
}
// 创建输出数据,与输入数据的创建方式类似
size_t outputCount = 0;
std::vector<NN_Tensor*> outputTensors;
ret = OH_NNExecutor_GetOutputCount(executor, &outputCount); 
if (ret != OH_NN_SUCCESS) {OH_LOG_ERROR(LOG_APP, "OH_NNExecutor_GetOutputCount failed");DestroyTensors(inputTensors); // DestroyTensors为释放tensor内存操作函数return OH_NN_FAILED;
}
for (size_t i = 0; i < outputCount; i++) {NN_TensorDesc *tensorDesc = OH_NNExecutor_CreateOutputTensorDesc(executor, i); NN_Tensor *tensor = OH_NNTensor_Create(deviceID, tensorDesc); // deviceID的获取方式可参考"加载离线模型"的步骤3if (tensor != nullptr) {outputTensors.push_back(tensor);}OH_NNTensorDesc_Destroy(&tensorDesc);
}
if (outputTensors.size() != outputCount) {DestroyTensors(inputTensors); // DestroyTensors为释放tensor内存操作函数DestroyTensors(outputTensors); // DestroyTensors为释放tensor内存操作函数OH_LOG_ERROR(LOG_APP, "output size mismatch");return OH_NN_FAILED;
}

上述流程可参见Demo中"entry/src/main/cpp/Classification.cpp"文件中的"InitIOTensors"函数和"entry/src/main/cpp/HiAiModelManager.cpp"中的"HIAIModelManager::InitIOTensors"函数。

9.同步推理离线模型

调用OH_NNExecutor_RunSync,完成模型的同步推理。

可参见Demo中"entry/src/main/cpp/Classification.cpp"文件中的"RunModel"函数和"entry/src/main/cpp/HiAiModelManager.cpp"中的"HIAIModelManager::RunModel"函数。

说明:如果不更换模型,则首次编译加载完成后可多次推理,即一次编译加载,多次推理。

10.模型输出后处理

1)调用OH_NNTensor_GetDataBuffer,获取输出的Tensor,在输出Tensor中会得到模型的输出数据。

2)对输出数据进行相应的处理可得到期望的结果。

3)例如本示例demo中模型的输出是1000个label的概率,期望得到这1000个结果中概率最大的三个标签。

4)销毁实例。

调用OH_NNExecutor_Destroy,销毁创建的模型执行器实例。

调用OH_NNTensor_Destroy,销毁创建的输入输出Tensor。

上述流程可参见Demo中"entry/src/main/cpp/Classification.cpp"文件中的"GetResult"、“UnloadModel"函数和"entry/src/main/cpp/HiAiModelManager.cpp"中的"HIAIModelManager::GetResult”、"HIAIModelManager::UnloadModel"函数。

了解更多详情>>

访问HiAI Foundation服务联盟官网

获取HiAI Foundation服务开发指导文档

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(二)增加基本的发起人审批与多用户多实例

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、AssigneeNode 增加approvalText public abstract class AssigneeNode extends Node {// 审批对象private AssigneeTypeEnum assigneeType;// 表单内人员private String formUser;// 表…

5款文案自动生成器,快速创作高质量文案

随着科技的发展&#xff0c;市面上出现了许多文案自动生成器&#xff0c;为我们的创作过程提供了极大的便利。无论是为了社交媒体内容创作&#xff0c;还是产品的文案的宣传&#xff0c;文案自动生成器就能为我们快速且高效地生成高质量的文案。以下将为大家分享5款备受赞誉的文…

Redis和PHP的Bitmap于二进制串的相互转换

Redis和PHP的Bitmap于二进制串的相互转换 场景 错题集的存储&#xff0c;需要有正确的题号id集合&#xff0c;错误的题号id集合&#xff0c;两者并集后在全量题的集合中取反就是未答题号id 选型 基于场景的数据结构设计&#xff0c;有试过列表等&#xff0c;测试结果&#xff1…

Oracle EBS PO采购订单预审批状态处理

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 采购订单状态:预审批 采购订单流程报错如下: po.plsql.PO_DOCUMENT_ACTION_AUTH.approve:90:archive_po not successful - po.plsql.PO_DOCUMENT_ACTION_PVT.do_action:110:unexpected error in acti…

【最详细】PhotoScan(MetaShape)全流程教程

愿天下心诚士子&#xff0c;人人会PhotoScan&#xff01; 愿天下惊艳后辈&#xff0c;人人可剑开天门&#xff01; 本教程由CSDN用户CV_X.Wang撰写&#xff0c;所用数据均来自山东科技大学视觉测量研究团队&#xff0c;特此鸣谢&#xff01;盗版必究&#xff01; 一、引子 Ph…

MySQL高级-MVCC- readview介绍

文章目录 1、介绍2、ReadView中包含了四个核心字段&#xff1a;3、版本链数据的访问规则&#xff1a;4、不同的隔离级别&#xff0c;生成ReadView的时机不同&#xff1a; 1、介绍 ReadView&#xff08;读视图&#xff09;是 快照读 SQL执行时MVCC提取数据的依据&#xff0c;记录…

Vue 常用指令详细介绍

Vue 常用指令 1.Vue 常用指令介绍 内容讲解 【1】Vue 指令介绍 在vue中指令是作用在视图中的即html标签&#xff0c;可以在视图中增加一些指令来设置html标签的某些属性和文本。 指令都是以带有 v- 前缀的特殊属性。 【2】使用Vue指令 使用指令时&#xff0c;通常编写在…

【C++】 解决 C++ 语言报错:Memory Leak

文章目录 引言 内存泄漏&#xff08;Memory Leak&#xff09;是 C 编程中常见且严重的内存管理问题之一。当程序分配了内存而没有正确释放&#xff0c;导致内存无法被重新利用时&#xff0c;就会发生内存泄漏。这种错误会导致程序占用越来越多的内存&#xff0c;最终可能导致系…

vscode 生成项目目录结构 directory-tree 实用教程

1. 安装插件 directory-tree 有中文介绍&#xff0c;极其友好&#xff01; 2. 用 vscode 打开目标项目 3. 快捷键 Ctrl Shift p&#xff0c;输入 Directory Tree 后回车 会在 README.md 文件的底部生成项目目录&#xff08;若项目中没有 README.md 文件&#xff0c;则会自动创…

恢复机制-数据库系统中的故障(事务故障、系统故障、介质故障)、一致性错误、窃取但不强制的缓冲区管理策略

一、引言 数据库管理系统DBMS的事务处理技术实现的一个主要功能部分就是恢复机制&#xff0c;恢复机制完成的功能就是对发生故障后系统中事务的更新结果进行数据恢复&#xff0c;保证事务的原子性和持久性&#xff0c;从而进一步保证数据库的一致性。 数据库系统与其他计算机系…

Pytest--安装与入门

pytest是一个能够简化成测试系统构建、方便测试规模扩展的框架&#xff0c;它让测试变得更具表现力和可读性–模版代码不再是必需的。只需要几分钟的时间&#xff0c;就可以对你的应用开始一个简单的单元测试或者复杂的功能测试。 1. 安装pytest pip install -U pytest检查版…

MaxKB开源知识库问答系统发布v1.3.0版本,新增强大的工作流引擎

2024年4月12日&#xff0c;1Panel开源项目组正式发布官方开源子项目——MaxKB开源知识库问答系统&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB开源项目发布后迅速获得了社区用户的认可&#xff0c;成功登顶GitHub Trending趋势榜主榜。 截至2024年7月4日&…

【Mathematica14.0】快速从下载安装到使用

目录 1.简介 2.下载安装 下载 安装 3.一小时掌握mathematica使用 单元模式 内置函数 符号表达式 迭代器 赋值 通配符及查找替换 函数定义 匿名函数&#xff08;拉姆达表达式&#xff09; 函数映射 函数式与运算符 函数自定义选项 图形可视化 交互式界面 数值…

【ROS2】Ubuntu 24.04 源码编译安装 Jazzy Jalisco

目录 系统要求 系统设置 设置区域启用所需的存储库安装开发工具 构建 ROS 2 获取 ROS 2 代码使用 rosdep 安装依赖项安装额外的 RMW 实现&#xff08;可选&#xff09;在工作区构建代码 设置环境 尝试一些例子 下一步 备用编译器 Clang保持最新状态 故障排除 卸载 系统要求 当前…

长沙(市场调研公司)源点 企业如何决定是否需要开展市场调研?

长沙源点调研咨询认为&#xff1a;对于一个特定问题&#xff0c;管理者在面临几种解决问题的方案时&#xff0c;不应该凭直觉草率开展应用性市场调研。事实上&#xff0c;首先需要做的决策是是否需要开展调研。在下述情况下&#xff0c;最好不要做调研&#xff1a; *缺乏资源。…

查询工资级别的个数>20的个数,并且按工贷级别降序

SELECT COUNT(*), grade_level FROM employees e JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal GROUP BY grade_level HAVING COUNT(*) > 20 ORDER BY grade_level DESC; 为什么需要GROUP BY而不是仅仅ORDER BY&#xff1f; 聚合数据&#xff1a…

【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC Enable 1 of N Wakeup Function基本原理工作机制配置方式应用场景小结GIC Enable 1 of N Wakeup Function 在ARM GICv3(Generic Interrupt Controller第三代)规范中,引入了一个名为"Enable 1 of N Wakeup"的功能。…

SQLyog脚本无限试用重置脚本

文章目录 引言脚本(win)必要操作、说明 引言 SQLyog 需要po jie&#xff0c;但是网上的没看到很好使的&#xff0c;直接下的官方。能处理14天试用也是很ok的。 脚本(win) echo offREM SQLyog注册表key&#xff0c;可能跟你的不一样&#xff0c;如果不一样&#xff0c;请替换…

Another Redis Desktop Manager工具自定义解析数据

自定义解析数据,支持多种程序终端输出 /Users/admin/go/src/baobao_all/ws_server/baobao/main_test/encipher_tool_redis/redis_tool {VALUE}/bin/bash -c "/Users/admin/Downloads/redis_tool {VALUE}"写个go程序解析数据 package mainimport ("encoding/jso…

鸿蒙:1.入门

概述 简介 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司发布的一款智能终端系统&#xff0c;是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验&#xff0c;可通过技术手段对应用程序和设备进行智能协同&#xf…