简介
置信大家从玩转 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…