带你玩转OpenHarmony AI-基于海思NNIE的AI能力自定义

news2024/11/24 11:13:55

简介

相信大家从玩转OpenAtom OpenHarmony(简称“OpenHarmony”)AI系列专题的其他文章中,已经拓展了OpenHarmony AI在智慧出行、智慧办公等多场景下的AI自动检测、识别和判断的新体验,对于OpenHarmony平台上的AI开发有了一定认识。

如果你已经有了一个AI创意,怎样训练出相关模型?怎样在你的OpenHarmony设备上部署你的AI模型?接下来以OpenHarmony Hi3516dv300小型系统为例,带领大家使用Hi3516dv300 NNIE硬件单元完成手势检测与分类功能。

NNIE是Neural Network Inference Engine的简称,是上海海思媒体SoC中专门针对神经网络特别是深度学习卷积神经网络进行加速处理的硬件单元,支持现有大部分的公开网络,如相关分类网络、检测网络、分割网络等。(详细资料见文末参考链接:《Hi3516dv300平台NNIE开发指南文档》)

开发流程

下面以手势分类这一需求为例,梳理一下相关AI需求在Hi3516dv300开发板端落地的开发步骤:

1) 数据采集:针对设想的手势场景,录制相关场景素材。其中必须考虑到样本的丰富性和可靠性;

2) 数据集制作和标注:对步骤1中的素材抽取生成数据集,同时还必须对数据集进行相应数据清洗和数据标注动作;

3) 算法模型设计:你可以参考相关开源算法模型,并针对于应用场景做相应修改。相关模型选择请参考《Hi3516dv300平台NNIE开发指南文档》3.3公开模型下载章节;本实例中,需要完成手势的检测和分类,其中对于手势检测选用了Yolov2模型,对于手势的分类则选用Resnet18模型;

4) 模型训练:利用算法模型和相应数据集训练出目标模型。模型训练可以部署在本地或者云平台上;

5) 模型转换:目前Hi3516dv300 NNIE配套软件及工具链仅支持Caffe框架,使用其他框架的网络模型需要转化为Caffe框架下的模型。所以必须有相关模型转换步骤;

6) 模型量化仿真:利用RuyiStudio的Runtime wk功能和仿真NNIE功能不断优化模型文件,最终生成部署所需的wukong文件(文件后缀为.wk) ;

7) 板端推理:通过Hi3516dv300摄像头获取的实时图片,加载相关WK文件来完成相关推理动作。(详细开发流程见参考文档:《分类网相关开发流程文档》)

板端推理关键代码

Hi3516dv300板端推理的关键代码,按照执行步骤分成如下三部分:

1) 实时图片获取

获取实时图片的前提需要保证Hi3516dv300相关视频输入VI(Video In)、视频处理子系统VPSS(Video Process Sub-System)、视频输出VO(Video Out)模块做好相应初始化动作和完成模块之间的绑定动作。(详细初始化流程见参考文档:《Hi3516dv300平台HiMPP媒体处理软件开发参考文档》)

ret = HI_MPI_VPSS_GetChnFrame(g_aicMediaInfo.vpssGrp, g_aicMediaInfo.vpssChn0, &frm, s32MilliSec); // 获取通道中一帧图像的数据    if (ret != 0) {      ret = HI_MPI_VPSS_ReleaseChnFrame(g_aicMediaInfo.vpssGrp,   g_aicMediaInfo.vpssChn0, &frm); // 如获取图像失败,需做图像释放操作      if (ret != HI_SUCCESS) {SAMPLE_PRT("Error(%#x),HI_MPI_VPSS_ReleaseChnFrame failed"};      }    }

2) 模型文件加载

本实例中,需要完成手势的检测和分类,需要加载相关两个模型文件。

HI_S32 Yolo2HandDetectResnetClassifyLoad(uintptr_t* model){    SAMPLE_SVP_NNIE_CFG_S *self = NULL;    ret = CnnCreate(&self, MODEL_FILE_GESTURE); // 加载手势相关分类模型    *model = ret < 0 ? 0 : (uintptr_t)self;    HandDetectInit(); // 加载手势检测模型    SAMPLE_PRT("Load hand detect claasify model success\n");    return ret;}int CnnCreate(SAMPLE_SVP_NNIE_CFG_S **model, const char* modelFile){    s32Ret = SAMPLE_COMM_SVP_NNIE_LoadModel((char*)modelFile, &g_stCnnModel); // NNIE框架加载模型文件    s32Ret = SampleSvpNnieCnnParamInit(self, &g_stCnnNnieParam, &g_stCnnSoftwareParam); // 初始化cnn相关参数}int Yolo2Create(SAMPLE_SVP_NNIE_CFG_S **model, const char* modelFile){    s32Ret = SAMPLE_COMM_SVP_NNIE_LoadModel((char*)modelFile, &g_stCnnModel); // NNIE框架加载模型文件    s32Ret = SampleSvpNnieYolov2ParamInit(self, &g_stYolov2NnieParam, &g_stYolov2SoftwareParam); // 初始化Yolov2相关参数}

3) 输出推理结果

结果推理过程中,先判断是否检测到手势动作,随后对这个手势动作进行分类检测。

HI_S32 Yolo2HandDetectResnetClassifyCal(uintptr_t model, VIDEO_FRAME_INFO_S *srcFrm, VIDEO_FRAME_INFO_S *dstFrm){    ret = FrmToOrigImg((VIDEO_FRAME_INFO_S*)srcFrm, &img);    objNum = HandDetectCal(&img, objs); // 检测网检测是否是手势    ret = ImgYuvCrop(&img, &imgIn, &cnnBoxs[biggestBoxIndex]);    ret = CnnCalU8c1Img(self,  &imgDst, numInfo, sizeof(numInfo) / sizeof((numInfo)[0]), &resLen); // 分类网检测具体手势    HandDetectFlag(numInfo[0]); // 具体手势类型消息打印}

文末小结

本文主要从开发流程和关键板端推理代码等方面介绍了,Hi3516dv300 NNIE AI能力开发的关键流程和细节。方便广大开发者更好地了解和掌握海思NNIE AI开发。OpenHarmony AI能力的丰富离不开广大开发者的参与和共建,也期待更多的开发者加入知识体系组,做出更多富有想象力的作品!

参考链接

OpenHarmony知识体系工作组

https://gitee.com/openharmony-sig/knowledge

Hi3516dv300平台NNIE开发指南文档

https://gitee.com/openharmony/device_soc_hisilicon/raw/OpenHarmony-3.2-Beta3/hi3516dv300/sdk_linux/sample/doc/HiSVP%20%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97.pdf

Hi3516dv300平台NNIE相关API文档

https://gitee.com/openharmony/device_soc_hisilicon/raw/OpenHarmony-3.2-Beta3/hi3516dv300/sdk_linux/sample/doc/HiSVP%20API%20%E5%8F%82%E8%80%83.pdf

Hi3516dv300平台HiMPP媒体处理软件开发参考文档

https://gitee.com/openharmony/device_soc_hisilicon/raw/OpenHarmony-3.2-Beta3/hi3516dv300/sdk_linux/sample/doc/HiMPP%E5%AA%92%E4%BD%93%E5%A4%84%E7%90%86%E8%BD%AF%E4%BB%B6%20V4.0%20%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83.pdf

Hi3516dv300 AI实验文档

https://gitee.com/openharmony/device_soc_hisilicon/blob/OpenHarmony-3.2-Beta3/hi3516dv300/sdk_linux/sample/taurus/ai_sample/README.md

分类网相关开发流程文档

https://gitee.com/openharmony/device_soc_hisilicon/blob/OpenHarmony-3.2-Beta3/hi3516dv300/sdk_linux/sample/taurus/doc/4.2.3.%E5%88%86%E7%B1%BB%E7%BD%91.md

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过事件总线EventBus/AsyncEventBus进行JAVA模块解耦 (史上最全)

事件总线在 进行JAVA模块解耦 &#xff0c;价值巨大 实际开发中&#xff0c;常常 通过事件总线EventBus/AsyncEventBus进行JAVA模块解耦 &#xff0c; 比如&#xff0c;在顶级开源组件 hotkey的源码中&#xff0c; 就多次用到 EventBus/AsyncEventBus进行JAVA模块解耦 所以&am…

71、AdaNeRF: Adaptive Sampling for Real-time Rendering of Neural Radiance Fields

简介 官网&#xff1a;https://thomasneff.github.io/adanerf/ 新的双网络架构&#xff0c;它采用正交方向&#xff0c;通过学习如何最好地减少所需样本点的数量&#xff0c;将网络分为联合训练的 sample 和 shading 网络&#xff0c;训练方案在每条射线上采用固定的样本位置…

Nginx 高级篇

文章目录Nginx 高级篇一、 负载均衡1、 负载均衡概述2、 处理方式2.1 用户手动选择2.2 DNS 轮询2.3 四 / 七层负载均衡3、 七层负载均衡3.1 七层负载均衡指令3.1.1 upstream3.1.2 server3.2 实现流程3.3 负载均衡的状态3.3.1 down3.3.2 backup3.3.3 max_conns3.3.4 max_fails &…

Docker前世今生

文章目录Docker背景Docker历史docker 理念Docker能做什么虚拟机的缺点容器虚拟化技术Docker学习途径Docker背景 一款产品从开发到上线&#xff0c;从操作系统&#xff0c;到运行环境&#xff0c;再到应用配置。作为开发运维之间的协作我们需要 关心很多东西&#xff0c;这也是…

ChatGPTAPI Key申请教程

ChatGPTAPI Key申请教程 一、API Key申请使用 在浏览器打开网址&#xff1a;https://openai.com/api/ 等待网页加载完成后&#xff0c;点击右上角 LOG IN 进入登录界面 进入登录界面后&#xff0c;依次输入注册的邮箱–Continue–输入密码–Continue&#xff0c;完成登录&…

< CSS小技巧:filter滤镜妙用>

文章目录&#x1f449; 前言&#x1f449; 简述&#x1f449; 基本语法及案例》语法简述》案例&#x1f449; 拓展1. drop-shadow 更加智能的阴影效果2. 网页置灰3. 元素强调、高亮4.节省空间&#xff0c;提高网页加载速度&#x1f449; 具体案例网页参考文献往期内容 &#x1…

如何有效进行团队建设:从关注事到关注人

咱打工人都想趁着年终总结这个契机&#xff0c;拿着工作数据跟领导们提涨薪&#xff01;但是入行没多久的社畜们却没有这个底气&#xff0c;虽累但没结果&#xff08;暗指身兼数职的项目经理小白们&#xff09;&#xff0c;主要是觉得自己的工作成绩不够优秀。这几天办公室的项…

Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks

摘要 我们为元学习提出了一个算法是模型无关model−agnosticmodel-agnosticmodel−agnostic. 在某种意义上&#xff0c;其与用梯度下降训练的模型是兼容的&#xff0c;可以应用在大量不同的学习问题上。包括&#xff1a;分类、回归、和加强学习。 元学习的目标是正在学习任务…

TAZ生成实践(Intel芯片Mac Python 3.7.9)

参考文章 https://blog.csdn.net/weixin_42632778/article/details/115164518 TAZ生成 https://zhuanlan.zhihu.com/p/343576683 使用ArcGIS实现线转栅格 https://pro.arcgis.com/zh-cn/pro-app/latest/tool-reference/conversion/polyline-to-raster.htm ArcGIS Pro 折线转栅格…

第②篇 Spring IoC——容器

Spring最成功的是其提出的理念&#xff0c;而不是技术本身。 概念 Spring所依赖的两个核心理念&#xff1a; 一个是控制反转&#xff08;IoC&#xff09;。另一个是面向切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;。 IoC是Spring的核心&am…

JS入门到精通详解(1)

JavaScript概述(需要记)什么是javascript?是一门&#xff08;基于对象&#xff09;和&#xff08;事件驱动&#xff09;的&#xff08;脚本语言&#xff09;。js诞生于哪一年&#xff1f;哪个公司&#xff1f;谁&#xff1f;第一个名字叫什么&#xff1f;1995年 网景 布兰登 l…

【Python】type、isinstance、issubclass详解

type type方法有两种重载形式&#xff1a; type(o: object)&#xff1b;type(name: str, bases:Tuple[type, ...], dict:Mapping[str: Any], **kwds) 使用第一种重载形式的时候&#xff0c;传入一个【object】类型&#xff0c;返回一个【type】对象&#xff0c;通常与object…

解决使用element-plus时使用el-select-v2组件时,选中后无法移除focus的状态的方法。

我们可以使用element-ui-plus的el-select-v2的组件&#xff0c;实现复合搜索和下拉框的功能。 使用如下模块&#xff1a; <template><el-select-v2 v-model"value" filterable :options"options" placeholder"Please select"visibleCha…

爸妈记性变差怎么办?

记不住事的时候&#xff0c;我们总会自嘲“老了&#xff0c;脑子不好使了”。记忆力总是和年龄挂钩的&#xff0c;所以很多子女听到父母这样说&#xff0c;也不会放在心上。但有时&#xff0c;记性变差不一定因为年龄&#xff0c;还有可能是患病的前兆。当父母出现频繁忘事的情…

zerotier虚拟网络配置,局域网与外网如同局域网一样访问。

zerotier:可以搭建用于自己的虚拟网络&#xff0c;经过授权连接成功之后彼此都在同一网段&#xff0c;可以像在局域网一样互相访问。 1.创建zerotier账户 2.创建网络&#xff08;Create A Network&#xff09;并记住网络标识&#xff08;NETWORK ID&#xff09; 一、openwrt设…

中华财险进击数字化

本文来源 / 瞭望 中华联合财产保险股份有限公司&#xff08;下称中华财险&#xff09;&#xff0c;是一家 36 年的老牌国有保险公司&#xff0c;全国营业网点超过 2900 个。近年来&#xff0c;中华财险在业务高速发展的同时&#xff0c;从难啃的硬骨头下手&#xff0c;重构核心…

Unity 之 Addressable可寻址系统 -- 可寻址系统面板介绍 -- 入门(二)

可寻址系统面板介绍 -- 入门&#xff08;二&#xff09;一&#xff0c;可寻址系统目录介绍1.2 创建分组1.2 目录介绍二&#xff0c;可寻址系统设置介绍2.1 Profile - 配置文件2.2 Catalog - 目录2.3 Content Update - 内容更新2.4 Downloads - 下载2.5 Build - 构建2.6 Build a…

【数据结构】5.6 树和森林

文章目录5.6.1 树的存储结构&#xff08;不是二叉树&#xff09;双亲表示法孩子表示法结构定义双亲孩子法孩子兄弟法5.6.2 二叉树的转换树与二叉树的转换将树转换成二叉树将二叉树转换成树森林与二叉树的转换森林转换成二叉树二叉树转换成森林5.6.3 树和森林的遍历树的遍历森林…

Nginx简介

一、什么是Nginx?Nginx是一个高性能的HTTP和反向代理Web服务器&#xff0c;同时也提供IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器。Nginx的特点是&#xff1a;占有内存少&#xff0c;并发能…

JJWT实现令牌Token

登录实现方式 Session 详情&#xff1a; https://www.cnblogs.com/andy-zhou/p/5360107.html 会话的概念 会话就好比打电话&#xff0c;一次通话可以理解为一次会话。我们登录一个网站&#xff0c;在一个网站上不同的页面浏览&#xff0c;最后退出这个网站&#xff0c;也是…