帶你玩轉OpenHarmony AI-基於海思NNIE的AI能力自定義

OpenHarmony開發者發表於2023-01-12

簡介

相信大家從玩轉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...

圖片

相關文章