带你玩转OpenHarmony AI-基于海思NNIE的AI能力自定义
简介
相信大家从玩转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开发指南文档
Hi3516dv300平台NNIE相关API文档
Hi3516dv300平台HiMPP媒体处理软件开发参考文档
Hi3516dv300 AI实验文档
分类网相关开发流程文档
带你玩转OpenHarmony AI-基于海思NNIE的AI能力自定义的更多相关文章
- 基于海思H3520DV400和QT5.9设计的车载终端DVR控制平台
目录 前言: 说明: 功能介绍: 设计思路: 详细设计: QT界面设计: 代码实现: 注意事项: (一)QT运行慢问题 (二)QT图层隐藏问题 (三)鼠标问题 (四)字体问题 (五)主界面图案 ( ...
- Google发布机器学习平台Tensorflow游乐场~带你玩神经网络(转载)
Google发布机器学习平台Tensorflow游乐场-带你玩神经网络 原文地址:http://f.dataguru.cn/article-9324-1.html> 摘要: 昨天,Google发 ...
- 魔幻特效,慢放世界,nova 3带你玩转抖音新技能
无论是明暗相交的都市夜色, 还是鲜亮风景前的逆光美人: 无论是瞬息飘飞的叶片, 还是动如脱兔的稚子孩童…… 色彩与速度,精彩的每一刻, 华为摄影都尽在掌握! (华为手机摄影效果) 一直以来,华为的图形 ...
- 带你玩转Visual Studio
带你玩转Visual Studio 带你新建一个工程 工程目录下各文件的含义 解决方案与工程 在这之前先了解一个概念:解决方案与工程. 解决方案(Solution):一个大型项目的整体的工作环境: 工 ...
- 来吧!带你玩转 Excel VBA
来吧!带你玩转 Excel VBA 从错失良机到艰辛的DOS征程,从坎坷购机自学路到转机起程,从爱好到事业,他从一个完全不懂电脑的人到VBA高级应用者,一切全是自学…… 我是罗刚君,来自四川的一个小县 ...
- 转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码
上一篇文章带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑帮我们理解了Windows中的各种类型C/C++运行时库及它的来龙去脉,这是C++开发中特别容易误入歧途的 ...
- iOS开发——高级UI&带你玩转UITableView
带你玩装UITableView 在实际iOS开发中UITableView是使用最多,也是最重要的一个控件,如果你不会用它,那别说什么大神了,菜鸟都不如. 其实关于UItableView事非常简单的,实 ...
- acdream 瑶瑶带你玩激光坦克 (模拟)
瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) Submi ...
- Android SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
- B - 瑶瑶带你玩激光坦克
B - 瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) S ...
随机推荐
- 迁移到 Gradle 7.x 使用 Version Catalogs 管理依赖
一.根目录下 build.gradle 变更 变更前: buildscript { ext.kotlin_version = '1.5.0' repository { repository { mav ...
- Python全栈面试题及知识点总结
Python全栈面试题 Python全栈阶段总结:https://github.com/HkwJsxl/PythonFullStack/tree/master/Notes Python基础 基础 逻辑 ...
- AI 让观众成为 3D 版《老友记》的导演了?
<老友记>上线 3D 版了? 允许用户旋转镜头,且从近景切换到全景观看故事? 今年出炉的 3D 方向 AI 项目 SitCom3D,能够自动补齐<老友记>原剧中的三维拍摄空间, ...
- ABP开发需要用到的命令
0.命令行在哪里执行? 在Visual Studio的"解决方案资源管理器"的解决方案或者项目上点鼠标右键,选择"在终端中打开". 1.安装abp的命令行 官网 ...
- springboot-@Async默认线程池导致OOM问题
目录 内存溢出的三种类型: 初步分析: 代码分析: 最终解决办法: 内存溢出的三种类型: 第一种OutOfMemoryError: PermGen space,发生这种问题的原意是程序中使用了大量的j ...
- Jmeter中属性跟变量的区别?
Jmeter属性全局生效,变量局部生效,jmeter属性默认读取jmeter.properties中的属性配置,在jmeter运行过程中,通过函数${_setProperty(属性名,属性值)来定义 ...
- 使用 maven 的 `wagon-maven-plugin`插件 快速部署 到不同的 环境
profile 在pom文件中配置 开发和测试环境的 profile信息, <profiles> <profile> <!-- 开发环境 --> <id> ...
- Java 练习题 5岁的狗按人的年龄计算的话,前两年每一年是人的 10.5岁,之后每一年 * 增加4岁。如果5岁的狗、相当于人的多少年龄 * 10.5 + 10.5 + 4 +4 +4=33岁
1 /*** 2 * 练习题 3 * 5岁的狗按人的年龄计算的话,前两年每一年是人的 10.5岁,之后每一年 4 * 增加4岁.如果5岁的狗.相当于人的多少年龄 5 * 10.5 + 10.5 + 4 ...
- linux压缩文件并排除指定目录
今天要在linux上打包一个项目另作他用,但是项目图片都是放本地服务器的,整个项目打包好后有2G多下载十分费时.项目中的图片我们可以不要,所以压缩的时候要排除图片目录. 具体命令如下: // 参数说明 ...
- vue3使用路由keep-alive和监听路由实现transition
随着vue3.0的发布,vue-router发布了4.0版本,文档 很明了,提供了vue2路由到vue3的变化和写法指导. vue2: // transition <transition nam ...