基于深度學(xué)習(xí)的實(shí)時(shí)視頻處理 | 入門指南
近來,整個(gè)機(jī)器學(xué)習(xí)領(lǐng)域似乎被大型語言模型(LLM)和檢索增強(qiáng)生成(RAG)所掩蓋。雖然許多用例可以從這些新的基礎(chǔ)模型中受益,但在非文本數(shù)據(jù)方面仍存在差距。我常把當(dāng)前的機(jī)器學(xué)習(xí)階段比作汽車工業(yè)中從燃油車向電動(dòng)車的轉(zhuǎn)變。燃油車已經(jīng)有完善的基礎(chǔ)設(shè)施(如汽車服務(wù)、加油站等),而電動(dòng)車的充電站和專用服務(wù)地點(diǎn)尚未成熟——但它們正在追趕。
這個(gè)比較的重點(diǎn)在于:基于變壓器的模型在許多用例中已經(jīng)證明了它們的實(shí)用性,但在視覺任務(wù)上,它們?nèi)孕枰獣r(shí)間來超越已有且成熟的系統(tǒng)。然而,今天的重點(diǎn)是工程——特別是如何解決使用機(jī)器學(xué)習(xí)的嵌入式視頻流應(yīng)用中的延遲問題,因?yàn)橐曨l讀取/處理/流媒體是視覺系統(tǒng)的核心。
一、什么是視頻處理?
視頻處理是指一組用于操作和分析視頻流的技術(shù)和方法。我們來看看描述視頻處理時(shí)必須了解的關(guān)鍵組件:
1. 編碼器
編碼器是一種硬件或軟件過程,用于壓縮(編碼)和解壓縮(解碼)大量視頻和音頻數(shù)據(jù)。它們對于減少視頻/音頻文件大小和流媒體至關(guān)重要,因?yàn)橐粋€(gè)原始視頻文件可能占用非常大的空間。例如,一個(gè)60秒、1920x1080、30 FPS的視頻文件的原始大小計(jì)算如下:
W = Width (pixels)
H = Height (pixels)
FPS = Frame Rate (frames/s)
BIT = Bit Depth (bits per pixel)
DUR = Duration (video length in seconds)
File Size (bytes) = W x H × FPS x BIT x DUR
File Size (bytes) = 1920 x 1080 x 30 x (24 / 8) x 60 = 11197440000 (bytes)
File Size (mbytes) = 11197440000 / (1024 ** 2) = 10678,71 (mbytes)
File Size (gbytes) = 10678,71 / 1024 = 10,42 (gbytes)
如果要存儲(chǔ)和流傳輸視頻,YouTube只能存儲(chǔ)和流傳輸Pewdiepie的頻道——由于存儲(chǔ)和網(wǎng)絡(luò)限制,不會(huì)有其他內(nèi)容。
常用的視頻壓縮編碼器包括:
- H.264(AVC):高效,兼顧質(zhì)量和相對較小的文件大小,兼容幾乎所有視頻播放器和流媒體服務(wù)。
- H.265(HEVC):在相同的視頻質(zhì)量水平下提供更好的數(shù)據(jù)壓縮。
- VP9:由Google開發(fā),主要用于YouTube等平臺(tái)的高清流媒體。
2. 比特率
指在給定時(shí)間內(nèi)處理的數(shù)據(jù)量,通常以每秒比特?cái)?shù)(bps)來衡量。在視頻中,比特率至關(guān)重要,因?yàn)樗苯佑绊懸曨l的質(zhì)量和大?。?/p>
- 高比特率:每秒數(shù)據(jù)量大,導(dǎo)致視頻質(zhì)量高但文件大小也大。
- 低比特率:減少文件大小,導(dǎo)致視頻質(zhì)量差,表現(xiàn)為視頻模糊或塊狀。
3. 分辨率
表示每個(gè)維度可以顯示的像素?cái)?shù)。常見的分辨率有HD(1280x720)、FHD(1920x1080)和4K(3840x2160)。
4. 幀率
描述每秒顯示的單獨(dú)圖像數(shù)量。我還記得在一臺(tái)破舊的電腦上玩GTA4時(shí)得到的9FPS。
5. 容器格式
如MP4和AVI,封裝視頻、音頻和元數(shù)據(jù),管理數(shù)據(jù)的存儲(chǔ)和交換,而不影響質(zhì)量。由于視頻容器的結(jié)構(gòu),它使得從一種視頻格式轉(zhuǎn)換為另一種視頻格式變得簡單。
具體術(shù)語包括:
- 源(SOURCE):格式A的視頻。
- 解復(fù)用器(DEMUX):將視頻流與音頻流分離的組件。
- 解碼器(DECODER):將兩個(gè)流解壓縮為原始格式。
- 編碼器(ENCODER):使用新的視頻和音頻編碼器重新壓縮原始流。
- 復(fù)用器(MUX):重新鏈接并同步視頻流和音頻流。
- 目標(biāo)(TARGET):將新數(shù)據(jù)流(視頻+音頻)轉(zhuǎn)儲(chǔ)到新容器中。
二、使用Phon進(jìn)行視頻處理的常見庫
在計(jì)算機(jī)視覺項(xiàng)目中,圖像處理和操作是必不可少的。從數(shù)據(jù)準(zhǔn)備、標(biāo)注、質(zhì)量保證、增強(qiáng)和模型訓(xùn)練,到模型部署后所需的預(yù)處理/后處理步驟,以下是計(jì)算機(jī)視覺工程師必須了解/使用的庫和工具:
1.OpenCV
2.Albumentations
用于數(shù)據(jù)集增強(qiáng)的快速高效庫,主要增強(qiáng)實(shí)現(xiàn)為GPU內(nèi)核。
3.PyAV
包含Python的FFmpeg綁定,適用于需要更詳細(xì)控制原始圖像幀數(shù)據(jù)或音頻數(shù)據(jù)的情況。
+----------------+-----------------+--------------------------------+
| Feature | YUV420 | RGB |
+----------------+-----------------+--------------------------------+
| | Y, U, V | Red, Green, Blue |
| Channels | (Luminance and | |
| | two chrominance)| |
+----------------+-----------------+--------------------------------+
| Storage | Less storage | More storage required due to |
| Efficiency | due to | for all three color channels. |
| | subsampling | |
+----------------+-----------------+--------------------------------+
| Bandwidth | Highly | Requires more bandwidth, all |
| Usage | efficient for | channels are fully sampled. |
| | transmission | |
+----------------+-----------------+--------------------------------+
| Complexity | Higher | Lower |
+----------------+-----------------+--------------------------------+
| Suitability | Better | Better for image editing |
| | for video | Universal compatibility |
| | compression and | |
| | transmission | | |
+----------------+-----------------+--------------------------------+
三、視頻流方法
在需要實(shí)時(shí)流媒體的生產(chǎn)用例中,計(jì)算機(jī)視覺工程師經(jīng)常需要開發(fā)優(yōu)化的低計(jì)算視頻處理工作流程,尤其是在部署用例還包括目標(biāo)檢測或分割模型并打算在邊緣設(shè)備上運(yùn)行時(shí)。視頻解碼消耗大量CPU資源,部署在邊緣時(shí),由于硬件資源有限,應(yīng)盡可能利用已部署系統(tǒng),同時(shí)保持資源和能源足跡較低。
在大多數(shù)計(jì)算機(jī)視覺項(xiàng)目中,處理是在邊緣完成的,要么是在可以訪問RTSP攝像頭的服務(wù)器上,要么是在本地轉(zhuǎn)儲(chǔ)幀或通過以太網(wǎng)流傳輸?shù)脑O(shè)備上。例如,為了解決工廠生產(chǎn)線中檢測不合格產(chǎn)品的問題,可以訓(xùn)練和部署使用實(shí)時(shí)視頻流和分割模型的系統(tǒng)來識別風(fēng)險(xiǎn)區(qū)域。
另一個(gè)例子是通過目標(biāo)檢測、深度預(yù)測和語義分割來識別商店貨架補(bǔ)貨時(shí)間的問題,實(shí)時(shí)提醒員工補(bǔ)貨。
本文將首先介紹使用Python實(shí)現(xiàn)的常見視頻流方法,以解決從API到客戶端應(yīng)用實(shí)時(shí)流傳輸幀的問題。我們將使用FastAPI作為我們的流媒體API,并使用一個(gè)基本的React應(yīng)用程序作為客戶端來演示這個(gè)概念。
我們將介紹三種方法:HTTP、WebSockets和WebRTC。對于每種方法,我們將迭代代碼,包括FastAPI和React,并說明該方法的最佳適用場景。
1.使用HTTP流媒體
這是一種快速且實(shí)用的方法,是驗(yàn)證將視頻流傳輸?shù)絎eb應(yīng)用程序的最直接的方法。對于小規(guī)模用例,這可能會(huì)奏效,但一旦應(yīng)用程序擴(kuò)展并需要支持許多設(shè)備或工作流流,由HTTP頭添加的延遲、開銷和帶寬就開始帶來挑戰(zhàn)。
FastAPI端點(diǎn):
React Web端點(diǎn):
2.使用WebSockets流媒體
與HTTP相比,Websockets提供了一種更高效的方法,因?yàn)樗鼈冊试S更低的延遲、實(shí)時(shí)交互和更優(yōu)化的數(shù)據(jù)傳輸方式。與HTTP相比,HTTP是無狀態(tài)的,意味著你觸發(fā)端點(diǎn)并得到響應(yīng),在套接字上——一旦握手完成,只要連接處于Open狀態(tài),數(shù)據(jù)就會(huì)流式傳輸。這導(dǎo)致了管理和“存儲(chǔ)”套接字狀態(tài)的需求,使它們成為有狀態(tài)的。
FastAPI端點(diǎn):
React Web端點(diǎn):
3.使用WebRTC流媒體
WebRTC(Web實(shí)時(shí)通信)是一種技術(shù)標(biāo)準(zhǔn),它允許在不需要復(fù)雜的服務(wù)器端實(shí)現(xiàn)的情況下,通過P2P(點(diǎn)對點(diǎn))連接進(jìn)行實(shí)時(shí)通信。與HTTP和Websockets相比,這是一個(gè)更復(fù)雜的協(xié)議,它專門處理視頻/音頻流式傳輸。
無論是Zoom通話、Facetime、Teams還是Google會(huì)議——都是RTC在起作用!以下是它的主要組件:
- 數(shù)據(jù)通道:允許不同對等方之間任意交換數(shù)據(jù),無論是瀏覽器到瀏覽器還是API到客戶端。
- 加密:所有通信、音頻和視頻都經(jīng)過加密,確保通信安全。
- SDP(會(huì)話描述協(xié)議):在WebRTC握手期間,兩個(gè)對等方交換SDP提議和答復(fù)。簡而言之,SDP描述了對等方的媒體能力,以便他們可以收集有關(guān)會(huì)話的信息。SDP提議描述了對等方請求的媒體類型,而SDP答復(fù)確認(rèn)已收到提議,并相應(yīng)地交換其媒體配置。
- 信令:實(shí)現(xiàn)提議-響應(yīng)通信的方法(套接字,REST API)。在我們的用例中,我們使用POST端點(diǎn)來打開通道。
隨著我們迭代了流式傳輸方法,讓我們看看它們的實(shí)際效果。完整代碼可以參考:
https://github.com/decodingml/articles-code/tree/main/articles/computer_vision, 安裝README文件中描述的所需軟件包,請運(yùn)行以下命令:
W = Width (pixels)
H = Height (pixels)
FPS = Frame Rate (frames/s)
BIT = Bit Depth (bits per pixel)
DUR = Duration (video length in seconds)
File Size (bytes) = W x H × FPS x BIT x DUR
File Size (bytes) = 1920 x 1080 x 30 x (24 / 8) x 60 = 11197440000 (bytes)
File Size (mbytes) = 11197440000 / (1024 ** 2) = 10678,71 (mbytes)
File Size (gbytes) = 10678,71 / 1024 = 10,42 (gbytes)
當(dāng)你啟動(dòng)了FastAPI后端和ReactWeb前端,可以轉(zhuǎn)到瀏覽器中的localhost:3000并檢查結(jié)果。
結(jié)論
在本文中,我們介紹了視頻格式的結(jié)構(gòu)及其關(guān)鍵組件,以理解視頻的工作原理。我們還介紹了一些廣為人知的庫,使得處理視頻/圖像數(shù)據(jù)變得容易。最后,我們逐步介紹了三種視頻流方法:HTTP、WebSockets和WebRTC。