詳解百度大腦EdgeBoard出色的視頻處理技術(shù)
[導(dǎo)讀]
視頻處理是人工智能應(yīng)用中的一個(gè)重要方向,對(duì)于一款端上部署的AI加速產(chǎn)品,其視頻接入能力是產(chǎn)品技術(shù)實(shí)力的重要體現(xiàn),同時(shí)也直接影響用戶(hù)的產(chǎn)品體驗(yàn)。端上的嵌入式設(shè)備,受制于本身的CPU等硬件資源,同時(shí)支持多種視頻設(shè)備及多種視頻格式是極大的挑戰(zhàn)。
背景介紹
視頻處理是人工智能應(yīng)用中的一個(gè)重要方向,對(duì)于一款端上部署的AI加速產(chǎn)品,其視頻接入能力是產(chǎn)品技術(shù)實(shí)力的重要體現(xiàn),同時(shí)也直接影響用戶(hù)的產(chǎn)品體驗(yàn)。端上的嵌入式設(shè)備,受制于本身的CPU等硬件資源,同時(shí)支持多種視頻設(shè)備及多種視頻格式是極大的挑戰(zhàn)。
EdgeBoard是百度基于FPGA打造的嵌入式AI解決方案,能夠提供強(qiáng)大的算力,并支持定制化模型,適配各種不同的場(chǎng)景,并大幅提高設(shè)備的AI推理能力,具有高性能、高通用、易集成等特點(diǎn)。EdgeBoard作為一款面向各個(gè)層次的AI開(kāi)發(fā)者的硬件平臺(tái),兼顧了多種視頻輸入,包括MIPI、BT1120、USB攝像頭、IPC(IP Camera,網(wǎng)絡(luò)攝像頭)、GigE工業(yè)攝像頭,這極大地體現(xiàn)出EdgeBoard在視頻處理上出色的技術(shù)實(shí)力,而同時(shí)支持如此多的視頻接入設(shè)備在一般的AI端產(chǎn)品上也是不常見(jiàn)的。
本文將詳細(xì)介紹EdgeBoard上的視頻處理方案,如何兼顧效率和通用性,在二者之間取得平衡,最大程度上滿(mǎn)足用戶(hù)的需求。
Linux V4L2結(jié)構(gòu)
內(nèi)核V4L2模塊
Linux系統(tǒng)發(fā)展至今,以其優(yōu)越的跨平臺(tái)特性和擴(kuò)展移植性在嵌入式操作系統(tǒng)領(lǐng)域占據(jù)很大的份額,EdgeBoard采用的是Xilinx PetaLinux工具打造的Linux內(nèi)核,操作系統(tǒng)采用的是RootFS,如果用戶(hù)需要Ubuntu操作系統(tǒng),可以直接在Xilinx論壇上獲得arm64 Ubuntu操作系統(tǒng)。
Video4Linux2(簡(jiǎn)稱(chēng)V4L2)是Linux下關(guān)于視頻采集相關(guān)設(shè)備的驅(qū)動(dòng)框架,為驅(qū)動(dòng)和應(yīng)用程序提供了一套統(tǒng)一的接口規(guī)范。支持三類(lèi)設(shè)備,分別會(huì)在/dev目錄下產(chǎn)生不同的設(shè)備節(jié)點(diǎn):
1.視頻輸入輸出設(shè)備(video capture device,video output device),分別是提供視頻捕獲功能的攝像頭類(lèi)型設(shè)備和提供視頻輸出功能的設(shè)備,對(duì)應(yīng)的設(shè)備名為videoX。這是我們最常用的一種設(shè)備類(lèi)型。
2.VBI設(shè)備(Vertical Blanking Interval),對(duì)VBI數(shù)據(jù)進(jìn)行控制、發(fā)送或抓取的設(shè)備,對(duì)應(yīng)設(shè)備名vbiX。
3. radio設(shè)備,提供FM/AM發(fā)送和接收的設(shè)備,對(duì)應(yīng)設(shè)備名radioX
V4L2在Linux系統(tǒng)中的結(jié)構(gòu)圖如下:
從圖中可以看出,驅(qū)動(dòng)的框架層次分明,最上層通過(guò)字符設(shè)備提供video和media兩種控制接口,分別從視頻流控制(video)和媒體子設(shè)備控制(media)兩種不同的角度抽象出操作接口。中間內(nèi)核驅(qū)動(dòng)層通過(guò)三層設(shè)備驅(qū)動(dòng)分別從視頻抽象,V4L2設(shè)備功能定義,子設(shè)備功能定義三個(gè)層面展開(kāi),模塊化的設(shè)計(jì)提供了非常完善的擴(kuò)展性。最下方是硬件層,除了提供常用攝像頭傳感器的功能外,對(duì)于常用的視頻轉(zhuǎn)換也有很好的支持。
在應(yīng)用層的軟件支持也非常豐富,比如廣泛使用的FFmpeg、Gstreamer、LiVes、MPlayer等對(duì)本地視頻設(shè)備的支持也都是通過(guò)V4L2提供的接口實(shí)現(xiàn)的。
Xilinx V4L2驅(qū)動(dòng)結(jié)構(gòu)
深入理解V4L2框架對(duì)于FPGA視頻方案的靈活配置有很大的幫助作用,也方便FPGA開(kāi)發(fā)人員快速驗(yàn)證視頻功能。本節(jié)以Xilinx視頻處理子系統(tǒng)為例,介紹一套完整的V4L2內(nèi)核功能的實(shí)現(xiàn),如下圖。
結(jié)合上一節(jié)提到的V4L2結(jié)構(gòu)圖可以看出V4 L2內(nèi)核對(duì)應(yīng)了全部視頻框架的內(nèi)容。中間部分,xilinx通過(guò)xvip_dma結(jié)構(gòu)實(shí)現(xiàn)了整體的video_device功能,給用戶(hù)層提供必要的控制設(shè)備接口(右側(cè)用戶(hù)層接口);左側(cè)部分,是內(nèi)核將所有的xilinx視頻相關(guān)設(shè)備組合成xvip_composite_device,即v4l2_device,通過(guò)該模塊可以擴(kuò)展具體的子設(shè)備功能,即v4l2_subdev,包括TPG、VTC、RGB2YUV、scaler等等;右側(cè)部分,是用戶(hù)層的接口,用戶(hù)層調(diào)用接口實(shí)現(xiàn)對(duì)視頻設(shè)備的操作;頂層部分,為了提高數(shù)據(jù)搬運(yùn)的效率使用了DMA設(shè)備功能,即xilinx_dma_device。下層部分,對(duì)于內(nèi)部數(shù)據(jù)的管理,使用了v4l2統(tǒng)一抽象提供的vb2_queue、vb2_buffer等模塊實(shí)現(xiàn)。
V4L2結(jié)構(gòu)應(yīng)用實(shí)例解析
這里以在EdgeBoard上使用的MIPI攝像頭為例介紹V4L2的具體應(yīng)用。
MIPI攝像頭視頻通路
對(duì)MIPI攝像頭的支持采用了xilinx video框架,符合標(biāo)準(zhǔn)的驅(qū)動(dòng)以及和硬件結(jié)合的流程。具體的實(shí)現(xiàn)為:硬件上采用FPGA的IP實(shí)現(xiàn)視頻通路上的各種視頻預(yù)處理,內(nèi)核驅(qū)動(dòng)模塊使用vipp對(duì)應(yīng)的功能,應(yīng)用層通過(guò)/dev/media節(jié)點(diǎn)將這些子設(shè)備之間的連接關(guān)系進(jìn)行關(guān)聯(lián),通過(guò)/dev/video控制視頻的傳輸及視頻抓取。
V4L2子設(shè)備驅(qū)動(dòng)(攝像頭驅(qū)動(dòng))的編寫(xiě)方法
從上文可以看出,雖然利用已有的IP和驅(qū)動(dòng)資源,可以快速搭建MIPI攝像頭的數(shù)據(jù)接入功能,但還缺少對(duì)于攝像頭本身的參數(shù)控制功能等,這部分功能的實(shí)現(xiàn)是在驅(qū)動(dòng)模塊完成。本節(jié)將介紹一下此類(lèi)驅(qū)動(dòng)的結(jié)構(gòu)和開(kāi)發(fā)流程。
相對(duì)于實(shí)現(xiàn)一個(gè)完整的V4L2驅(qū)動(dòng)功能比較龐大,針對(duì)攝像頭驅(qū)動(dòng)的實(shí)現(xiàn)相對(duì)簡(jiǎn)單了許多,只需要實(shí)現(xiàn)V4L2的子設(shè)備驅(qū)動(dòng)即可,因?yàn)榇蟛糠止δ芤呀?jīng)在video_device里實(shí)現(xiàn)了。詳細(xì)的子設(shè)備驅(qū)動(dòng)結(jié)構(gòu)圖如下
結(jié)合前文的整體結(jié)構(gòu)圖,這里的核心是實(shí)現(xiàn)一個(gè)v4l2_subdev結(jié)構(gòu),即填充其內(nèi)部各操作接口結(jié)構(gòu)體,其中核心是v4l2_subdev_ops,通過(guò)該接口實(shí)現(xiàn)從用戶(hù)層對(duì)其配置各種參數(shù),以對(duì)視頻流的控制。media_entity目地是實(shí)現(xiàn)各個(gè)v4l2_subdev之間的連接通路。用戶(hù)層對(duì)mediaX設(shè)備的操作都需要這個(gè)結(jié)構(gòu)的支持。
基于V4L2的軟件開(kāi)發(fā)
應(yīng)用層的軟件開(kāi)發(fā),推薦使用gstreamer或者opencv videocapture,opencv的底層實(shí)現(xiàn)可能依賴(lài)gstreamer,如果這些不能滿(mǎn)足讀者的要求,需要更詳細(xì)的參數(shù)控制,或者軟件環(huán)境不具備這兩種支持,可以考慮直接操作v4l2設(shè)備。如下將介紹V4L2 軟件層面的具體方法。
V4L2通常支持三種不同IO訪(fǎng)問(wèn)方式(其他內(nèi)核里支持的方式暫不討論),包括
1.read/write基本IO訪(fǎng)問(wèn)方式,read方式讀取一幀數(shù)據(jù),數(shù)據(jù)需要從內(nèi)核空間傳輸?shù)接脩?hù)空間,增加了內(nèi)存訪(fǎng)問(wèn)的開(kāi)銷(xiāo),對(duì)于圖像類(lèi)的應(yīng)用效率不高
2.內(nèi)存映射方式,這是在內(nèi)核空間開(kāi)辟的緩沖區(qū),這些緩沖區(qū)可能支持DMA功能,這樣極大的提高了數(shù)據(jù)從設(shè)備搬運(yùn)到內(nèi)存的效率。用戶(hù)只需要使用mmap()系統(tǒng)調(diào)用將其映射到用戶(hù)空間后,可以直接使用。這種方式支持的設(shè)備很多。
3.用戶(hù)空間緩沖區(qū)方式,這是在用戶(hù)空間開(kāi)辟的緩沖區(qū),再把緩沖區(qū)的指針告訴內(nèi)核,這種方式雖然也能減少內(nèi)存拷貝,但是內(nèi)核驅(qū)動(dòng)或者硬件設(shè)備在處理這些用戶(hù)空間的地址會(huì)麻煩很多,不是所有的設(shè)備都會(huì)支持
這里以第二種方式詳細(xì)說(shuō)明具體使用過(guò)程,參考如下流程圖
包括這幾個(gè)步驟:
1、 使用open()打開(kāi)設(shè)備
2、 使用ioctl()進(jìn)行初始化參數(shù)設(shè)置,一般包括查詢(xún)?cè)O(shè)備能力(VIDIOC_QUERYCAP),設(shè)置視頻捕獲相關(guān)參數(shù),如幀率控制(VIDIOC_S_PARM)、圖像的窗口尺寸(VIDIOC_S_CROP)、像素點(diǎn)的格式和寬高(VIDIOC_S_FMT)等,詳細(xì)支持的參數(shù)可以使用上面介紹的工具進(jìn)行查詢(xún)
3、 使用ioctl()申請(qǐng)幀緩沖(VIDIOC_REQBUFS),并查詢(xún)申請(qǐng)到的緩沖區(qū)的信息(VIDIOC_QUERYBUF)
4、 使用mmap()對(duì)申請(qǐng)到的緩沖區(qū)進(jìn)行內(nèi)存映射,保存映射得到的地址
5、 使用ioctl()把幀緩沖進(jìn)行入隊(duì)操作(VIDIOC_QBUF)
6、 使用ioctl()開(kāi)始視頻流進(jìn)行捕獲(VIDIOC_STREAMON)
7、 使用selet()等待接收到數(shù)據(jù)
8、 使用ioctl()取出幀緩沖即出隊(duì)操作(VIDIOC_DQBUF)
9、 進(jìn)行數(shù)據(jù)處理,
10、 重復(fù)幀緩沖入隊(duì)操作,如此循環(huán)
11、 退出時(shí),停止采集工作(VIDIOC_STREAMOFF),使用unmap()和close()釋放資源
用戶(hù)層工具介紹(技術(shù)小福利)
上文介紹完EdgeBoard中視頻處理的完整方案,現(xiàn)介紹V4L2開(kāi)發(fā)中常用的調(diào)試工具,有助于提升開(kāi)發(fā)效率。
得益于Linux豐富的開(kāi)源資源,操作v4l2設(shè)備的應(yīng)用層工具也非常多。默認(rèn)的EdgeBoard PetaLinux系統(tǒng)已經(jīng)配置好常用的幾個(gè)工具,特此介紹給大家。v4l-utils是專(zhuān)門(mén)控制v4l設(shè)備的一系列命令工具集,包含以下實(shí)用程序:
1. v4l2-ctl:用來(lái)全方位的配置v4l2設(shè)備,對(duì)于內(nèi)核模塊暴露出來(lái)的接口,幾乎都有支持。特別是軟件開(kāi)發(fā)時(shí)候使用的ioctl控制命令,也可以使用該工具來(lái)直接設(shè)置,幫助我們調(diào)試驅(qū)動(dòng)或軟件。
2. v4l2-compliance:兼容性工具,用于測(cè)試v4l設(shè)備驅(qū)動(dòng)程序的v4l2 API兼容性,會(huì)打印出來(lái)各個(gè)ioctal命令接口是否有支持。多用在v4l應(yīng)用軟件開(kāi)發(fā)過(guò)程中。
3.v4l2-dbg:直接獲取和設(shè)置v4l2設(shè)備寄存器的工具,這依賴(lài)于設(shè)備驅(qū)動(dòng)的支持?梢允褂胿4l2-compliance查看VIDIOC_DBG_G/S_REGISTER命令接口是否可用,在可用的情況下,可以使用該工具來(lái)測(cè)試。
4.v4l2-sysfs-path:檢查平臺(tái)已經(jīng)加載的v4l2設(shè)備以及相應(yīng)的設(shè)備節(jié)點(diǎn)。
5. media-ctl:媒體設(shè)備的控制工具,幫助我們?cè)趘4l2各個(gè)子設(shè)備間建立連接。
gstreamer是Linux平臺(tái)廣泛應(yīng)用的視頻流工具,特別是嵌入式平臺(tái),良好的軟件架構(gòu)及衍生出其豐富的擴(kuò)展插件對(duì)不同硬件平臺(tái)都具有良好的支持。
這里給出一個(gè)命令行示例,就可以了解它的獨(dú)特之處了,如下:
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
這條命令的意思是打開(kāi)v4l2視頻源即/dev/video4這個(gè)USB視頻設(shè)備,抓取其1280x720寬度的原始jpeg圖片流按照4秒1幀的速度保存到本地文件,命名格式為frame100.jpg開(kāi)始
總結(jié)
本文以MIPI攝像頭為例介紹了在EdgeBoard中采用V4L2結(jié)構(gòu)的視頻處理方案,得益于V4L2結(jié)構(gòu)的靈活性和可擴(kuò)展性,像BT1120、USB攝像頭等也采用類(lèi)似的方案,實(shí)現(xiàn)了對(duì)多視頻接入方案的支持。對(duì)于需要視頻接入方案的用戶(hù),可以直接購(gòu)買(mǎi)EgdeBoard產(chǎn)品,實(shí)現(xiàn)視頻接入的即插即用。

發(fā)表評(píng)論
登錄
手機(jī)
驗(yàn)證碼
立即登錄即可訪(fǎng)問(wèn)所有OFweek服務(wù)
還不是會(huì)員?免費(fèi)注冊(cè)
忘記密碼請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
最新活動(dòng)更多
-
7月8日立即報(bào)名>> 【在線(xiàn)會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線(xiàn)下論壇】第三屆安富利汽車(chē)生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身智能機(jī)器人產(chǎn)業(yè)技術(shù)創(chuàng)新應(yīng)用論壇
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專(zhuān)題
- 1 AI 眼鏡讓百萬(wàn) APP「集體失業(yè)」?
- 2 豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
- 3 一文看懂視覺(jué)語(yǔ)言動(dòng)作模型(VLA)及其應(yīng)用
- 4 “支付+”時(shí)代,支付即生態(tài) | 2025中國(guó)跨境支付十大趨勢(shì)
- 5 中國(guó)最具實(shí)力AI公司TOP10
- 6 特斯拉Robotaxi上路,馬斯克端上畫(huà)了十年的餅
- 7 國(guó)家數(shù)據(jù)局局長(zhǎng)劉烈宏調(diào)研格創(chuàng)東智
- 8 AI的夏天:第四范式VS云從科技VS地平線(xiàn)機(jī)器人
- 9 張勇等人退出阿里合伙人
- 10 AI視頻,攪動(dòng)1.5萬(wàn)億市場(chǎng)