简介

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

Hi3516dv300平台NNIE开发指南文档https://gitee.com/openharmony...

Hi3516dv300平台NNIE相干API文档https://gitee.com/openharmony...

Hi3516dv300平台HiMPP媒体解决软件开发参考文档https://gitee.com/openharmony...

Hi3516dv300 AI试验文档https://gitee.com/openharmony...

分类网相干开发流程文档https://gitee.com/openharmony...