下面隨筆將給出Hi3559AV100 NNIE RFCN開發:V4L2->VDEC->VPSS->NNIE->VGS->VO系統整體動態除錯實現,最終的效果是:USB攝像頭通過板載處理能夠把影像通過HDMI介面輸出,並結合RFCN模型,通過NNIE實現目標檢測,下面給出具體的實現過程。
板載平臺:BOXER-8410AI
晶片型號:Hi3559AV100
相機型號:Logitch c270
開發環境:VM15.5+ubuntu16.04+Hilinux
首先給出本篇隨筆涉及之前寫的隨筆,希望大家先提前看一看,因為有些知識你可能不大清楚,看了之後能夠清楚V4L2的實現及更好理解移植過程:
Hi3559AV100外接UVC/MJPEG相機實時採圖設計(一):Linux USB攝像頭驅動分析:
https://www.cnblogs.com/iFrank/p/14399421.html
Hi3559AV100外接UVC/MJPEG相機實時採圖設計(二):V4L2介面的實現(以YUV422為例) :
https://www.cnblogs.com/iFrank/p/14403397.html
Hi3559AV100外接UVC/MJPEG相機實時採圖設計(三):V4L2介面通過MPP平臺輸出 :
https://www.cnblogs.com/iFrank/p/14403620.html
Hi3559AV100外接UVC/MJPEG相機實時採圖設計(四):VDEC_Send_Stream執行緒分析:
https://www.cnblogs.com/iFrank/p/14485199.html
1、系統框圖及VDEC Chn通道與VPSS Group組的關係
在實現系統功能前先要確定VDEC的通道數、VPSS Group組的關係,我先給出系統的整體實現圖解:
為了確定引數,再度分析VPSS上下文關係,使用者可通過 MPI 介面對 GROUP 進行管理。每個 GROUP 僅可與一個輸入源繫結。GROUP 的物理通道兩種工作模式:AUTO 和 USER,兩種模式間可動態切換。AUTO 模式下各通道僅可與一個接收者繫結,主要用於預覽和回放場景下做播放控制。USER 模式下各通道可與多個接收者繫結。需要特別注意的是,USER 模式主要用於對同一通道影像進行多路編碼的場景,此模式下播放控制不生效,因此回放場景下不建議使用 USER 模式。(對於RFCN移植就用到了user模式)
在移植過程中,用到了VPSS兩個物理通道,對應Hi3559AV100(#define VPSS_MAX_PHY_CHN_NUM 4),對應圖示圖下:
VPSS 硬體提供多個物理通道,每個通道具縮放、裁剪等 功能。擴充套件通道具備縮放功能,它通過繫結物 理通道,將物理通道輸出作為自己的輸入,把影像縮放成使用者設定的目標解析度輸出,對於本專案,VPSS的輸入源為VDEC,輸出為SVP NNIE,我之前實現的Hi3559AV100外接UVC/MJPEG相機實時採圖設計(三):V4L2介面通過MPP平臺輸出VPSS是接的VO,所有開發過程有不同,實現過程如下圖:
VDEC模組讀取的視訊檔案需為H.264/H.265/MJPEG的資料檔案,該模組可參考sample_vdec demo編寫,一個通道對應一個視訊檔案。
2、V4L2->VDEC->VPSS->NNIE->VGS->VO實現過程
#include "sample_comm.h"
#include <linux/types.h>
#include <linux/videodev2.h>
檔案改動位置:
3、除錯遇到問題解決
在完成MJPEG->VDEC->VPSS->NNIE->VGS->VO函式的初始化之後,最初是簡單的移植了VDEC執行緒開啟執行的三個函式,但是出現了程式卡住的bug,具體如下所示:
程式碼對應位置:
因為SAMPLE_COMM_VDEC_CmdCtrl()函式進入了while,卡住了程式,直接將函式位置放到NNIE初始化後面即可,且把函式輸入的引數換成全域性變數即可。
4、結果測試
系統的硬體連線圖如下所示:
結果測試如下所示,因為視訊上傳不了,所有以圖片來進行演示,從圖片可以看到,資料通過V4L2->VDEC->VPSS->NNIE->VGS->VO的系統開發後,能夠將攝像頭的資料通過HDMI在螢幕輸出,並且開發的NNIE實現了RFCN目標識別的深度學習模型(紅色框為NNIE處理圖形後VGS加框的效果)。