詳解百度大腦EdgeBoard出色的視頻處理技術

背景介紹

視頻處理是人工智能應用中的一個重要方向,對於一款端上部署的 AI 加速產品,其視頻接入能力是產品技術實力的重要體現,同時也直接影響用戶的產品體驗。端上的嵌入式設備,受制於本身的 CPU 等硬件資源,同時支持多種視頻設備及多種視頻格式是極大的挑戰。

EdgeBoard 是百度基於 FPGA 打造的嵌入式 AI 解決方案,能夠提供強大的算力,並支持定製化模型,適配各種不同的場景,並大幅提高設備的 AI 推理能力,具有高性能、高通用、易集成等特點。EdgeBoard 作爲一款面向各個層次的 AI 開發者的硬件平臺,兼顧了多種視頻輸入,包括 MIPI、BT1120、USB 攝像頭、IPC(IP Camera,網絡攝像頭)、GigE 工業攝像頭,這極大地體現出 EdgeBoard 在視頻處理上出色的技術實力,而同時支持如此多的視頻接入設備在一般的 AI 端產品上也是不常見的。

本文將詳細介紹 EdgeBoard 上的視頻處理方案,如何兼顧效率和通用性,在二者之間取得平衡,最大程度上滿足用戶的需求。

Linux V4L2結構

內核 V4L2模塊

Linux 系統發展至今,以其優越的跨平臺特性和擴展移植性在嵌入式操作系統領域佔據很大的份額,EdgeBoard 採用的是 Xilinx PetaLinux 工具打造的 Linux 內核,操作系統採用的是 RootFS,如果用戶需要 Ubuntu 操作系統,可以直接在 Xilinx 論壇上獲得 arm64 Ubuntu 操作系統。

Video4Linux2(簡稱 V4L2)是 Linux 下關於視頻採集相關設備的驅動框架,爲驅動和應用程序提供了一套統一的接口規範。支持三類設備,分別會在 /dev 目錄下產生不同的設備節點:

1. 視頻輸入輸出設備(video capture device,video output device),分別是提供視頻捕獲功能的攝像頭類型設備和提供視頻輸出功能的設備,對應的設備名爲 videoX。這是我們最常用的一種設備類型。

2.VBI 設備(Vertical Blanking Interval),對 VBI 數據進行控制、發送或抓取的設備,對應設備名 vbiX。

3. radio 設備,提供 FM/AM 發送和接收的設備,對應設備名 radioX

V4L2 在 Linux 系統中的結構圖如下:

 

image.png

 

 

從圖中可以看出,驅動的框架層次分明,最上層通過字符設備提供 video 和 media 兩種控制接口,分別從視頻流控制(video)和媒體子設備控制(media)兩種不同的角度抽象出操作接口。中間內核驅動層通過三層設備驅動分別從視頻抽象,V4L2 設備功能定義,子設備功能定義三個層面展開,模塊化的設計提供了非常完善的擴展性。最下方是硬件層,除了提供常用攝像頭傳感器的功能外,對於常用的視頻轉換也有很好的支持。

在應用層的軟件支持也非常豐富,比如廣泛使用的 FFmpeg、Gstreamer、LiVes、MPlayer 等對本地視頻設備的支持也都是通過 V4L2 提供的接口實現的。

Xilinx V4L2驅動結構

深入理解 V4L2 框架對於 FPGA 視頻方案的靈活配置有很大的幫助作用,也方便 FPGA 開發人員快速驗證視頻功能。本節以 Xilinx 視頻處理子系統爲例,介紹一套完整的 V4L2 內核功能的實現,如下圖。

 

image.png

 

 

結合上一節提到的 V4L2 結構圖可以看出 V4 L2 內核對應了全部視頻框架的內容。中間部分,xilinx 通過 xvip_dma 結構實現了整體的 video_device 功能,給用戶層提供必要的控制設備接口(右側用戶層接口);左側部分,是內核將所有的 xilinx 視頻相關設備組合成 xvip_composite_device,即 v4l2_device,通過該模塊可以擴展具體的子設備功能,即 v4l2_subdev,包括 TPG、VTC、RGB2YUV、scaler 等等;右側部分,是用戶層的接口,用戶層調用接口實現對視頻設備的操作;頂層部分,爲了提高數據搬運的效率使用了 DMA 設備功能,即 xilinx_dma_device。下層部分,對於內部數據的管理,使用了 v4l2 統一抽象提供的 vb2_queue、vb2_buffer 等模塊實現。

V4L2結構應用實例解析

這裏以在 EdgeBoard 上使用的 MIPI 攝像頭(MIPI 開發介紹見 https://www.csdn.net/article/a/2019-08-21/15979781)爲例介紹 V4L2 的具體應用。

MIPI 攝像頭視頻通路

對 MIPI 攝像頭的支持採用了 xilinx video 框架,符合標準的驅動以及和硬件結合的流程。具體的實現爲:硬件上採用 FPGA 的 IP 實現視頻通路上的各種視頻預處理,內核驅動模塊使用 vipp 對應的功能,應用層通過 /dev/media 節點將這些子設備之間的連接關係進行關聯,通過 /dev/video 控制視頻的傳輸及視頻抓取。

 

image.png

 

 

V4L2子設備驅動(攝像頭驅動)的編寫方法

從上文可以看出,雖然利用已有的 IP 和驅動資源,可以快速搭建 MIPI 攝像頭的數據接入功能,但還缺少對於攝像頭本身的參數控制功能等,這部分功能的實現是在驅動模塊完成。本節將介紹一下此類驅動的結構和開發流程。

相對於實現一個完整的 V4L2 驅動功能比較龐大,針對攝像頭驅動的實現相對簡單了許多,只需要實現 V4L2 的子設備驅動即可,因爲大部分功能已經在 video_device 裏實現了。詳細的子設備驅動結構圖如下

 

image.png

 

 

結合前文的整體結構圖,這裏的核心是實現一個 v4l2_subdev 結構,即填充其內部各操作接口結構體,其中核心是 v4l2_subdev_ops,通過該接口實現從用戶層對其配置各種參數,以對視頻流的控制。media_entity 目地是實現各個 v4l2_subdev 之間的連接通路。用戶層對 mediaX 設備的操作都需要這個結構的支持。

基於 V4L2的軟件開發

應用層的軟件開發,推薦使用 gstreamer 或者 opencv videocapture,opencv 的底層實現可能依賴 gstreamer,如果這些不能滿足讀者的要求,需要更詳細的參數控制,或者軟件環境不具備這兩種支持,可以考慮直接操作 v4l2 設備。如下將介紹 V4L2 軟件層面的具體方法。

V4L2 通常支持三種不同 IO 訪問方式(其他內核裏支持的方式暫不討論),包括

1.read/write 基本 IO 訪問方式,read 方式讀取一幀數據,數據需要從內核空間傳輸到用戶空間,增加了內存訪問的開銷,對於圖像類的應用效率不高

2. 內存映射方式,這是在內核空間開闢的緩衝區,這些緩衝區可能支持 DMA 功能,這樣極大的提高了數據從設備搬運到內存的效率。用戶只需要使用 mmap()系統調用將其映射到用戶空間後,可以直接使用。這種方式支持的設備很多。

3. 用戶空間緩衝區方式,這是在用戶空間開闢的緩衝區,再把緩衝區的指針告訴內核,這種方式雖然也能減少內存拷貝,但是內核驅動或者硬件設備在處理這些用戶空間的地址會麻煩很多,不是所有的設備都會支持

這裏以第二種方式詳細說明具體使用過程,參考如下流程圖

 

image.png

 

 

包括這幾個步驟:

1、 使用 open()打開設備

2、 使用 ioctl()進行初始化參數設置,一般包括查詢設備能力(VIDIOC_QUERYCAP),設置視頻捕獲相關參數,如幀率控制(VIDIOC_S_PARM)、圖像的窗口尺寸(VIDIOC_S_CROP)、像素點的格式和寬高(VIDIOC_S_FMT)等,詳細支持的參數可以使用上面介紹的工具進行查詢

3、 使用 ioctl()申請幀緩衝(VIDIOC_REQBUFS),並查詢申請到的緩衝區的信息(VIDIOC_QUERYBUF)

4、 使用 mmap()對申請到的緩衝區進行內存映射,保存映射得到的地址

5、 使用 ioctl()把幀緩衝進行入隊操作(VIDIOC_QBUF)

6、 使用 ioctl()開始視頻流進行捕獲(VIDIOC_STREAMON)

7、 使用 selet()等待接收到數據

8、 使用 ioctl()取出幀緩衝即出隊操作(VIDIOC_DQBUF)

9、 進行數據處理,

10、 重複幀緩衝入隊操作,如此循環

11、 退出時,停止採集工作(VIDIOC_STREAMOFF),使用 unmap()和 close()釋放資源

用戶層工具介紹(技術小福利)

上文介紹完 EdgeBoard 中視頻處理的完整方案,現介紹 V4L2 開發中常用的調試工具,有助於提升開發效率。

得益於 Linux 豐富的開源資源,操作 v4l2 設備的應用層工具也非常多。默認的 EdgeBoard PetaLinux 系統已經配置好常用的幾個工具,特此介紹給大家。v4l-utils 是專門控制 v4l 設備的一系列命令工具集,包含以下實用程序:

1. v4l2-ctl:用來全方位的配置 v4l2 設備,對於內核模塊暴露出來的接口,幾乎都有支持。特別是軟件開發時候使用的 ioctl 控制命令,也可以使用該工具來直接設置,幫助我們調試驅動或軟件。

2. v4l2-compliance:兼容性工具,用於測試 v4l 設備驅動程序的 v4l2 API 兼容性,會打印出來各個 ioctal 命令接口是否有支持。多用在 v4l 應用軟件開發過程中。

3.v4l2-dbg:直接獲取和設置 v4l2 設備寄存器的工具,這依賴於設備驅動的支持。可以使用 v4l2-compliance 查看 VIDIOC_DBG_G/S_REGISTER 命令接口是否可用,在可用的情況下,可以使用該工具來測試。

4.v4l2-sysfs-path:檢查平臺已經加載的 v4l2 設備以及相應的設備節點。

5. media-ctl:媒體設備的控制工具,幫助我們在 v4l2 各個子設備間建立連接。

gstreamer 是 Linux 平臺廣泛應用的視頻流工具,特別是嵌入式平臺,良好的軟件架構及衍生出其豐富的擴展插件對不同硬件平臺都具有良好的支持。

這裏給出一個命令行示例,就可以瞭解它的獨特之處了,如下:

gst-launch-1.0 v4l2src device=/dev/video4 ! video/x-raw,width=1280,height=720 ! videorate ! image/jpeg,framerate=1/4 ! multifilesink location="frame%d.jpg" index=100

這條命令的意思是打開 v4l2 視頻源即 /dev/video4 這個 USB 視頻設備,抓取其 1280x720 寬度的原始 jpeg 圖片流按照 4 秒 1 幀的速度保存到本地文件,命名格式爲 frame100.jpg 開始

 

總結
本文以 MIPI 攝像頭爲例介紹了在 EdgeBoard 中採用 V4L2 結構的視頻處理方案,得益於 V4L2 結構的靈活性和可擴展性,像 BT1120、USB 攝像頭等也採用類似的方案,實現了對多視頻接入方案的支持。對於需要視頻接入方案的用戶,可以直接購買 EgdeBoard 產品,實現視頻接入的即插即用。官網地址:https://ai.baidu.com/tech/hardware/deepkit

福利
據可靠小道消息:EdgeBoard 正在打折中,歷史最低價,降價 1000 元,有興趣可以看看:https://aim.baidu.com/product/search?word=edgeboard

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