Hi3559AV100 NNIE RFCN開發:V4L2->VDEC->VPSS->NNIE->VGS->VO系統整體動態調試實現
下面隨筆將給出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攝影機驅動分析:
//www.cnblogs.com/iFrank/p/14399421.html
Hi3559AV100外接UVC/MJPEG相機實時采圖設計(二):V4L2介面的實現(以YUV422為例) :
//www.cnblogs.com/iFrank/p/14403397.html
Hi3559AV100外接UVC/MJPEG相機實時采圖設計(三):V4L2介面通過MPP平台輸出 :
//www.cnblogs.com/iFrank/p/14403620.html
Hi3559AV100外接UVC/MJPEG相機實時采圖設計(四):VDEC_Send_Stream執行緒分析:
//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加框的效果)。



