HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸魚記錄(3) ---真機調試(實例分析)

#PS:要轉載請註明出處,本人版權所有

#PS:這個只是 《 我自己 》理解,如果和你的

#原則相沖突,請諒解,勿噴

背景

本文建立前兩篇的文章基礎之上:
《HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸魚記錄(1) — 環境搭建》
https://blog.csdn.net/u011728480/article/details/91125581
《HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸魚記錄(2) — 模型生成及模型仿真(實例分析)》
https://blog.csdn.net/u011728480/article/details/91294917
本文將會以一個實例來進行分析。hisi svp sdk的基礎之上。同時本文也是本系列文章的終章。

NNIE 使用流程(其實就是讀其sdk文檔)

hisi svp 整體框架
vision app
--------------------
mpi(MPP Program Interface)
--------------------
driver(ko)
--------------------
nnie(hardware)

從上述框架來說,我們要自己用的內容就是vision app 、mpi、以及nnie api
vision app就是做圖像數據的準備以及結果處理,mpi做mmz內存分配(海思特有的內存空間),nnie做forward。

相關api 簡介
/*
* mpp System init
*/
HI_MPI_SYS_Exit()
HI_MPI_VB_Exit()
//設置MPP 視頻緩存 池 屬性 。
HI_MPI_VB_SetConfig()
HI_MPI_VB_Init()
HI_MPI_SYS_Init()
//load model
//在mmz中分配一部分內存來存放model
HI_MPI_SYS_MmzAlloc()
//從mmz內存中解析模型
HI_MPI_SVP_NNIE_LoadModel()
//NNIE  Param  Init

//forward prepare
//------------------------根據model的配置,爲每一段(這裏你可以簡單理解爲層)的forward ctrl param , src Blob, dst Blob.也就是初始化SVP_NNIE_FORWARD_CTRL_S[],SVP_NNIE_FORWARD_WITHBBOX_CTRL_S[],SVP_SRC_BLOB_S[],SVP_DST_BLOB_S[]數組元素的值。
HI_MPI_SVP_NNIE_GetTskBufSize()//獲取給定網絡任務 各段 輔助內存
HI_MPI_SVP_NNIE_AddTskBuf()//記錄TskBuf 地址 信息

//----------------給第一層送入預處理好的圖片到SVP_SRC_BLOB_S

HI_MPI_SYS_MmzFlushCache()//刷新內存
HI_MPI_SVP_NNIE_Forward()//forward
HI_MPI_SVP_NNIE_Query()//查詢forward任務是否完成
HI_MPI_SYS_MmzFlushCache()//刷新內存


//---------------解析HI_MPI_SVP_NNIE_Forward的參數astDst[],得到網絡的最終輸出

各種類型的forward其實hisi都已經有各個例子可以參考的。上面的總結也是我從它的例子中剝離出來的。我這裏也想吐槽一下,hisi例子寫的很好,就是封裝的層數太多了,反而讓人感覺很不爽。

NNIE 開發實例流程(其實就是參考其sample)

魔改hisi sample

在hisi sdk中,提供了多種網絡的例子,這裏以我的cnn 分類網絡爲例。
根據前文可以得到inst 的wk模型。以及一個預處理好的圖片bin文件。

找到目標文件,smp/a7_linux/mpp/sample/svp/nnie/sample/sample_nnie.c,直接複製void SAMPLE_SVP_NNIE_Cnn(void)爲我的函數,修改圖片bin路徑和wk路徑。
在這裏插入圖片描述
作爲新手,不建議去看其他的,直接改最後一部分,打印最後一層輸出,直接和仿真的值進行對比。當然你熟悉後就必須自己一點點看懂,不然出錯沒有辦法糾正。
在這裏插入圖片描述
我這裏給個demo參考例子。結果打印:
在這裏插入圖片描述
仿真以及caffe輸出值對比最後一層:
在這裏插入圖片描述
可以發現確實是對應上了,這就證明了這個網絡至少跑出來的大方向是沒問題了,剩下的就是自己組織優化的問題了。

注意

如果出現最後輸出對應不上,先去檢查圖像輸入對不對,也就是srcBlob的第一層是不是一樣的,70%都是這裏出問題了。
其次再去看打印的方式對不對。
最後看整個nnie器件你使用對不對。

總結

要完成這個事情,需要對深度學習,嵌入式編程有一定基礎才行。一般來說,都是算法出模型,嵌入式的人做這個事情,當然有興趣的話都一起做也行。這裏我想說的是這是一個學科交叉的事情,單單瞭解一個方向的知識都不行的。所以,一定要多溝通,才能夠幹好這個事情。

其實這也是嵌入式方向的人的一個契機,當你瞭解一些基本的深度學習知識,而且又掌握嵌入式相關的內容,肯定是非常不錯的,畢竟這是一個非常有趣的事情。

#PS:請尊重原創,不喜勿噴

#PS:要轉載請註明出處,本人版權所有.

有問題請留言,看到後我會第一時間回覆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章