简介

相信大家从玩转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

带你玩转OpenHarmony AI-基于海思NNIE的AI能力自定义的更多相关文章

  1. 基于海思H3520DV400和QT5.9设计的车载终端DVR控制平台

    ​ 目录 前言: 说明: 功能介绍: 设计思路: 详细设计: QT界面设计: 代码实现: 注意事项: (一)QT运行慢问题 (二)QT图层隐藏问题 (三)鼠标问题 (四)字体问题 (五)主界面图案 ( ...

  2. Google发布机器学习平台Tensorflow游乐场~带你玩神经网络(转载)

    Google发布机器学习平台Tensorflow游乐场-带你玩神经网络 原文地址:http://f.dataguru.cn/article-9324-1.html> 摘要: 昨天,Google发 ...

  3. 魔幻特效,慢放世界,nova 3带你玩转抖音新技能

    无论是明暗相交的都市夜色, 还是鲜亮风景前的逆光美人: 无论是瞬息飘飞的叶片, 还是动如脱兔的稚子孩童…… 色彩与速度,精彩的每一刻, 华为摄影都尽在掌握! (华为手机摄影效果) 一直以来,华为的图形 ...

  4. 带你玩转Visual Studio

    带你玩转Visual Studio 带你新建一个工程 工程目录下各文件的含义 解决方案与工程 在这之前先了解一个概念:解决方案与工程. 解决方案(Solution):一个大型项目的整体的工作环境: 工 ...

  5. 来吧!带你玩转 Excel VBA

    来吧!带你玩转 Excel VBA 从错失良机到艰辛的DOS征程,从坎坷购机自学路到转机起程,从爱好到事业,他从一个完全不懂电脑的人到VBA高级应用者,一切全是自学…… 我是罗刚君,来自四川的一个小县 ...

  6. 转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码

    上一篇文章带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑帮我们理解了Windows中的各种类型C/C++运行时库及它的来龙去脉,这是C++开发中特别容易误入歧途的 ...

  7. iOS开发——高级UI&带你玩转UITableView

    带你玩装UITableView 在实际iOS开发中UITableView是使用最多,也是最重要的一个控件,如果你不会用它,那别说什么大神了,菜鸟都不如. 其实关于UItableView事非常简单的,实 ...

  8. acdream 瑶瑶带你玩激光坦克 (模拟)

    瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submi ...

  9. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  10. B - 瑶瑶带你玩激光坦克

    B - 瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) S ...

随机推荐

  1. 反射,装饰器,类当中的方法,property---day24

    1.反射 # ### 反射(针对于类对象 模块) '''概念:通过字符串去操作类对象或者模块当中的成员(属性方法)''' class Man(): pass class Woman(): pass c ...

  2. JavaScript之原生ajax && jQuery之ajax

        ajax提供了异步访问服务器的方法,使页面无须刷新就可以更改页面内容,在实际情况中使用原生的情况较少但是原理需要掌握,一般都是使用jquey更轻量级的实现ajax但是原理是共同的.     原 ...

  3. 监控系统open-falcon安装部署

    目录 官方文档 安装包下载地址 环境准备 安装redis 安装mysql 安装git 安装GO 安装后台 部署前端: 邮件报警 修改ALARM配置 修改报警接口 报警测试邮件展示 Q&A 官方 ...

  4. 【Azure Redis 缓存】Azure Reids是否可以开启慢日志(slowlog)和执行config指令

    问题描述 使用Azure Redis,是否可以开启慢日志来查看最近时间中执行比较耗时的指令呢? 同时,如何执行Redis的Config只能来修改配置呢? 根本原因 一:Azure Reids通过Red ...

  5. 【Azure 媒体服务】记录一个简单的媒体视频上传到Media Service无法播放问题

    问题描述 从本地上传到Azure Media Service Portal的视频,并且新增定位符后,无法播放.但是上传的其他视频是可以的.疑惑中!! 问题自查 自查发现,是视频的文件名中有个特殊符号. ...

  6. Java //在150之内 是三的倍数 输出Zzz 是5个倍数输出 Lll 是7的倍数输出zlzl

    1 //在150之内 是三的倍数 输出Zzz 是5个倍数输出 Lll 是7的倍数输出zlzl 2 int i =1; 3 for(i = 1; i<=150;i++) 4 { 5 System. ...

  7. supervisor的使用与配置说明

    Supervisor 是用 Python 开发的一套通用的 进程管理程序 ,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 一. 安装 1.1 安装 # 根目录下 ...

  8. settings.json 20201209

    李昱版 { "editor.fontSize": 20, "workbench.iconTheme": "material-icon-theme&qu ...

  9. linux-给终端建立快捷键

    在设置里,找到快捷键窗口,自定义快捷键, 名字:终端 命令:gnome-terminal 快捷键:ctrl+alt+t

  10. 基于BES2500芯片的低功耗蓝牙BLE游戏手柄解决方案源码解析

    一 往事    寒冬腊月,在一个寂静的天空飘着碎银雪花的夜晚.我接到这么一个电话:"朋友,能否帮忙开发一个游戏手柄的案子?我们遇到了一些问题,迟迟无法解决.",喔,这边我陷入了沉思 ...