海思NNIE開發系列文章:
海思NNIE開發(一):海思Hi3559AV100/Hi3519AV100 NNIE深度學習模塊開發與調試記錄
海思NNIE開發(二):FasterRCNN在海思NNIE平臺上的執行流程(一)
海思NNIE開發(三):FasterRCNN在海思NNIE平臺上的執行流程(二)
海思NNIE開發(五):基於Hi3559AV100的FasterRCNN、RFCN、SSD、Yolov2、Yolov3性能綜合測評
-------------------------------------------------------------------------------------------------------------------------------------------------
1. 開發流程
鏈接:https://pan.baidu.com/s/1SJ9OOfCjJvqLAuMoPpb1yA
提取碼:pjvu
2. 例程解析
海思的NNIE例程包含以下幾個模型:
~ # ./sample_nnie_main
Usage : ./sample_nnie_main <index>
index:
0) RFCN(VI->VPSS->NNIE->VGS->VO).
1) Segnet(Read File).
2) FasterRcnnAlexnet(Read File).
3) FasterRcnnDoubleRoiPooling(Read File).
4) Cnn(Read File).
5) SSD(Read File).
6) Yolov1(Read File).
7) Yolov2(Read File).
8) LSTM(Read File).
RFCN例程中,VI模塊綁定了VPSS模塊,VI從攝像頭輸入一路1080P視頻,經VPSS分解爲兩路,一路stBaseFrmInfo保持原來的1080P分辨率,一路stExtFrmInfo轉爲CIF(352x288)分辨率,stExtFrmInfo輸入到NNIE模塊SAMPLE_SVP_NNIE_Rfcn_Proc得到分類與框位置信息,再將框位置信息通過SAMPLE_COMM_SVP_NNIE_FillRect給到VGS模塊畫框,最後通過HI_MPI_VO_SendFrame發送到VO,在HDMI顯示器上顯示。測試表明處理一幀數據的時間約爲89毫秒,即幀率爲11幀左右。
其他1)~8)例程直接讀取圖片文件給到NNIE處理,處理完後打印分類及框信息。
模型 | 分類數量 | 處理時間(毫秒) | 幀率 |
---|---|---|---|
RFCN | 21 | 89 | 11 |
FasterRcnnAlexnet | 2 | 145 | 7 |
FasterRcnnDoubleRoiPooling | 4 | 240 | 4 |
MINIST | 10 | 未測試 | 未測試 |
SSD | 21 | 120 | 8 |
YOLO v1 | 21 | 37 | 27 |
YOLO v2 | 6 | 81 | 12 |
sample_nnie_main.c例程函數調用關係:
3. 模型的顏色空間
需要注意的是RFCN的wk模型文件與後面1)~8)幾個模型的wk模型文件的顏色格式是不同的,RFCN調用的wk文件是YVU420顏色空間,而1)~8)模型的是BGR顏色空間。原因是後面1)~8)的模型是通過讀圖片文件的方式,圖片需爲顏色空間爲BGR的裸數據,後綴名爲*.bgr格式。如果要使用1)~8)的模型對視頻流數據(來源於VI或VDEC模塊,即從攝像頭輸入或本地視頻文件解碼)進行處理,需要使用YVU420顏色空間的wk模型文件,否則模型處理會失敗。
4. VDEC--VPSS--NNIE-- VGS--VO流程開發
該流程通過VDEC讀入本地的視頻文件並解碼,經過VPSS給到NNIE做神經網絡處理,再通過VGS大框,再從VO-HDMI輸出。
流程如下:
(1)初始化相關參數
(2)初始化VB(SAMPLE_COMM_SYS_Init),必須先於VDEC,VPSS等模塊之前初始化VB
(3)load模型文件(SAMPLE_COMM_SVP_NNIE_LoadModel)
(4)初始化模型參數(SAMPLE_SVP_NNIE_XXXXX_ParamInit)
(5)初始化VDEC(SAMPLE_COMM_VDEC_InitVBPool)
(6)開啓VDEC(SAMPLE_COMM_VDEC_Start)
(7) 開啓VPSS(SAMPLE_COMM_VPSS_Start)
(8) 開啓VO(SAMPLE_COMM_VO_StartVO)
(9)綁定VDEC與VPSS(SAMPLE_COMM_VDEC_Bind_VPSS)
(10)開啓解碼線程(SAMPLE_COMM_VDEC_StartSendStream)
(11)開啓NNIE處理線程,從VPSS取幀數據,NNIE處理,再用VGS加框
(12)結束,反初始化等操作
VDEC模塊讀取的視頻文件需爲H.264的裸數據文件(.h264格式),該模塊可參考sample_vdec例程編寫,一個通道對應一個視頻文件。
VPSS模塊有組(Group)與通道,一個組(Group)對應一個VDEC通道,即有多少個VDEC通道就有多少個VPSS Group。每個VPSS的Group, 有兩個VPSS通道,一個對應原視頻分辨率,一個對應wk模型文件要求輸入的圖像分辨率。需要注意的是,astVpssChnAttr[i].u32Depth參數必須大於0,因爲需要調用HI_MPI_VPSS_GetChnFrame獲取幀數據。
VO支持顯示多個窗口,每個窗口對應1路視頻,例如設置
stVoConfig.enVoMode = VO_MODE_4MUX;
則顯示爲4分屏,VGS處理完後數據通過HI_MPI_VO_SendFrame給到VO,HI_MPI_VO_SendFrame的第2個參數對應於屏幕中的窗口序號。
顯示效果如下,車輛標註框爲紅色,人的標註框爲藍色