VPF:適用於 Python 的開源視頻處理框架,加速視頻任務、提高 GPU...

2021-01-11 雷鋒網

雷鋒網 AI 開發者按:近日,NVIDIA 開源了適用於 Python 的視頻處理框架「VideoProcessingFramework(VPF)」。該框架為開發人員提供了一個簡單但功能強大的 Python 工具,可用於硬體加速的視頻編碼、解碼和處理類等任務。

同時,由於 Python 綁定下的 C ++代碼,它使開發者可以在數十行代碼中實現較高的 GPU 利用率。解碼後的視頻幀以 NumPy 數組或 CUDA 設備指針的形式公開,以簡化交互過程及其擴展功能。

目前,VPF 並未對 NVIDIA Video Codec SDK 附加任何限制,開發者可充分利用 NVIDIA 專業級 GPU 的功能。

Python 中的硬體加速視頻處理框架 VPF

VPF 是基於 CMake 的開源跨平臺框架,它依賴於 FFmpeg 庫來進行(de)muxing 和 pybind11 項目從而構建 Python 綁定。它包含了一組開源的 C ++庫和 Python 綁定,可與其封閉原始碼 Codec SDK 進行交互。

該框架的主要功能是簡化從 Python 開發 GPU 加速視頻編碼/解碼的過程,可為視頻處理任務(例如解碼,編碼,代碼轉換以及 GPU 加速的色彩空間和像素格式轉換)提供完整的硬體加速。

儘管 Python 不是性能最高的語言,但它易於使用;在 NVIDIA 發布此視頻處理框架之後,它相當於在現有 Video Codec SDK C ++ 堆棧周圍的 Python wrapper,將用於在 Kepler 及更高版本上基於 GPU 的視頻編碼/解碼。這使得 VPF 在利用基於 GPU 的高性能視頻加速的同時,也獲得了易於閱讀/編寫的代碼。

NVIDIA Video Codec SDK 使用效果示意圖

同時值得注意的是,VPF 還利用 NVIDIA Video Codec SDK(一套全面的 API,包括用於 Windows 和 Linux 上硬體加速視頻編碼和解碼的高性能工具,示例和文檔)來提高靈活性和性能,並為開發人員提供 Python 固有的易用性。目前,該代碼在 GitHub 上已開源。

Github 地址:https://github.com/NVIDIA/VideoProcessingFramework

代碼示例及結果

在官網博客宣布 VPF 時,開發者也提供了一個簡短的 Python 代碼示例,該示例使用 PyNvCodec 模塊顯示 Python 中的視頻轉碼:

import PyNvCodec as nvcgpuID = 0encFile = "big_buck_bunny_1080p_h264.mov"xcodeFile = open("big_buck_bunny_1080p.h264", "wb")nvDec = nvc.PyNvDecoder(encFile, gpuID)nvEnc = nvc.PyNvEncoder({'preset': 'hq', 'codec': 'h264', 's': '1920x1080'}, gpuID)while True:rawSurface = nvDec.DecodeSingleSurface() # Decoder will return zero surface if input file is over; if not (rawSurface.GetCudaDevicePtr()): break encFrame = nvEnc.EncodeSingleSurface(rawSurface) if(encFrame.size): frameByteArray = bytearray(encFrame) xcodeFile.write(frameByteArray)# Encoder is asynchronous, so we need to flush itencFrames = nvEnc.Flush()for encFrame in encFrames: encByteArray = bytearray(encFrame) xcodeFile.write(encByteArray)

儘管這一示例的設計簡單,但 VPF 仍具有良好的性能。上面顯示的代碼轉換示例足以使 RTX 5000 GPU 上的 Nvenc 單元飽和,如下所示:

Big Buck Bunny 序列包含 14315 幀,可以在 32 秒內進行轉碼,而無需使用任何先進的技術(例如生產者-消費者模式),解碼器和編碼器將在單獨的線程中啟動共享解碼器隊列,從而可以在約 447fps 的速度下進行轉碼。由於所有轉碼均在 GPU 上完成,因此沒有明顯的 CPU 負載。

VPF 使用類說明

VPF 中包含了多個類,其核心部分是 PyNvDecoder 和 PyNvEncoder 類,它們是與 NVIDIA Video Codec SDK 的 Python 綁定。

PyNvDecoder 和 PyNvEncoder 類支持 NV12 像素格式,所有轉換均通過 GPU 加速,並在 VRAM 內存中完成,以提高性能。其中——

PyNvDecoder 類有五個主要方法:

DecodeSingleSurface 從輸入視頻解碼單幀,返回帶有解碼像素的 Surface。下次用戶調用此方法時,先前返回的 Surface 可能會被重用。如果未解碼幀,則解碼後的 Surface 的 GetCudaDevicePtr 方法將返回零;DecodeSingleFram 從輸入視頻解碼單幀,返回帶有解碼像素的 NumPy 數組。下次用戶調用此方法時,將返回另一個 NumPy 數組實例。如果未解碼幀,它將返回空的 NumPy 數組。此操作將設備複製到主機內存;Width 返回解碼的幀寬度;Height 返回解碼的幀高度;PixelFormat 返回解碼的幀像素格式。用戶使用 DecodeSingleSurface 和 DecodeSingleFrame 時,不會破壞解碼器的內部狀態。解碼器類支持 H.264 和 H.265 編解碼器。

PyNvEncoder 類有六個方法:

EncodeSingleSurface 以原始像素獲取 NV12 Surface,對其進行編碼,然後將基本視頻比特流作為 NumPy 數組返回。編碼器是異步的,因此此方法可能會在前幾次調用時返回空數組(取決於編碼器設置),這不是編碼錯誤;EncodeSingleFrame 以原始像素獲取 NumPy 數組,對其進行編碼,然後將基本視頻比特流作為 NumPy 數組返回。編碼器是異步的,因此此方法可能在前幾次調用時返回空數組(取決於編碼器設置);Flush 衝洗編碼器。除非編碼器隊列中的所有原始幀都已編碼,否則它不會返回,並返回帶有基本流字節的 NumPy 數組的列表;Width 返回編碼的幀寬度;Height 返回編碼的幀高度;PixelFormat 返回編碼的幀像素格式。如果用戶使用 EncodeSingleSurface 和 EncodeSingleFrame,則不會破壞編碼器的內部狀態。此外,PyNvEncoder 可以獲取任意解析度的輸入幀,並在實際編碼之前即時在 GPU 上調整其大小。

編碼器類支持 H.264 和 H.265 編解碼器,並且具有較低的延遲,因此在編碼會話結束時,應調用 Flush 刷新編碼器幀隊列。

HardwareSurface 類包含一個包裝器 CUdeviceptr:

GetCudaDevicePtr 將 CUdeviceptr 返回到 CUDA 內存對象。對於主機和設備之間的內存傳輸,有兩個名為 PyFrameUploader 和 PySurfaceDownloader 的類:

PyFrameUploader 用於將 NumPy 數組上傳到 GPU;UploadSingleFrame 將一個 numpy 數組上傳到 GPU,再將句柄返回到上傳的 Surface。下次用戶調用此方法時,先前返回的 Surface 可能會被重用。PySurfaceDownloader 類用於從 GPU 下載 Surface,它只包含一種方法:

DownloadSingleSurface 將 GPU 端 Surface 下載到 CPU 端 numpy 數組中。下次用戶調用此方法時,將返回另一個 numpy 數組實例。PySurfaceConverter 類用於 GPU 加速的色彩空間和像素格式轉換。以下是受支持的轉化列表:

YUV420 至 NV12 NV12 到 YUV420NV12 轉 RGBPySurfaceConverter 類包含一種方法:

Execute 在 GPU 上執行轉換,將句柄以輸出格式返回給 Surface。下次用戶調用此方法時,先前返回的 Surface 可能會被重用。而 VPF 運行的主要數據類型有兩種:

用於 CPU 端數據的 NumPy 數組;用戶透明 Surface 類,表示 GPU 端數據;由於 GPU 端內存對象分配很複雜,並且會嚴重影響性能,因此所有歸還 Surface,並在下次調用時重用先前返回的 VPF 類方法。

與此不同的是,VPF 類方法每次被調用時都會返回新的 NumPy 數組實例。移動構造函數可避免內存複製的運行成本。

其它開源視頻處理框架

一、RxFFmpeg

RxFFmpeg 是基於 ( FFmpeg 4.0 + X264 + mp3lame + fdk-aac ) 編譯的適用於 Android 平臺的音視頻編輯、視頻剪輯的快速處理框架。

包含:視頻拼接,轉碼,壓縮,裁剪,片頭片尾,分離音視頻,變速,添加靜態貼紙和 gif 動態貼紙,添加字幕,添加濾鏡,添加背景音樂,加速減速視頻,倒放音視頻,音頻裁剪,變聲,混音,圖片合成視頻,視頻解碼圖片等主流特色功能。

RxFFmpeg 開源地址:https://github.com/microshow/RxFFmpeg

二、VidGear

VidGear 是一個圍繞 OpenCV 視頻 I/O 模塊的輕量級 python 包裝器,它使用多線程 Gears(又名 API)構建,每個都有獨特的開拓性功能。

這些 API 提供了易於使用,高度可擴展的多線程包裝器,這些包裝器圍繞著許多底層的最新 python 庫,例如 OpenCV,FFmpeg,picamera,pafy,pyzmq 和 python-mss ,可以在各種設備和平臺上實現高速視頻幀讀取功能 。它也是 imutils 庫視頻模塊的重新實現,修復了所有主要錯誤,並附帶了直接網絡流支持。

VidGear 開源地址:https://pypi.org/project/vidgear/

VPF 博客地址:https://devblogs.nvidia.com/vpf-hardware-accelerated-video-processing-framework-in-python/

雷鋒網 AI 開發者 雷鋒網

相關焦點

  • ImagePy——UI界面支持開放插件的Python開源圖像處理框架
    python 開源圖像處理框架,其 UI 界面支持開放插件。在 github:https://github.com/Image-Py/imagepy 上,不僅有關於這款圖像處理軟體的詳細介紹,還有一些使用示例,雷鋒網 AI 科技評論接下來將詳細介紹這一開源圖像處理框架。
  • 亞馬遜開源神經機器翻譯框架Sockeye:基於Apache MXNet的NMT平臺
    隨著神經機器翻譯(NMT)技術的不斷演進,越來越多的科研機構和公司選擇開源自己的項目,讓更多人能夠開發出自己的 NMT 模型。此前,清華大學開源了神經機器翻譯工具包 THUMT,谷歌也推出了基於 TensorFlow 的 NMT 模型搭建教程。
  • 常用的十大 python 圖像處理工具
    但無論是用於何種用途,這些圖像都需要進行處理。圖像處理就是分析和處理數字圖像的過程,主要旨在提高其質量或從中提取一些信息,然後可以將其用於某種用途。圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。
  • 盤點:GPU加速的神經網絡與JavaScript的交叉
    它們都是通過WebGL在瀏覽器中實現GPU加速,如果不存在合適的顯卡則可以退回到CPU。本概述中不包括那些旨在運行現有模型的庫(特別是那些使用Python框架訓練的模型)。最後,四個項目榜上有名。雖然它的特性集面向神經網絡,但deeplearn.js可以被描述為通用機器學習框架。Propel是一個提供自動微分的科學計算的庫。Gpu.js提供了一種方便的方式來運行GPU上的JavaScript函數。Brain.js是舊的神經網絡庫的延續,並使用Gpu.js硬體加速。
  • 10 個加速 CSS 開發的框架 - OSCHINA - 中文開源技術交流社區
    Compass 是一個開源的 CSS 製作框架。 CSS CacheerCSScaffold是一款幫助CSS開發者快速進行開發的框架,使用PHP編寫而成- Simple, but powerful !不同於許多CSS框架,它必須依靠PHP與Apache的mod_rewrite來執行,但也因為需要這兩種東西,讓CSScaffold變得很神奇、很方便,寫起CSS來又快又輕鬆! Sass
  • 融合視頻目標檢測與單目標、多目標跟蹤,港中文開源視頻感知平臺
    機器之心報導編輯:魔王香港中文大學多媒體實驗室(MMLab)OpenMMLab 開源一體化視頻目標感知平臺 MMTracking。新年伊始,香港中文大學多媒體實驗室(MMLab)OpenMMLab 又有新動作,發布了一款一體化視頻目標感知平臺 MMTracking。
  • 部署效率提高17倍,開源Metaflow,真正以人為本的數據科學框架
    12月3日,Netflix和AWS開源Metaflow框架。Metaflow 框架最早是由Netflix公司(《紙牌屋》這部劇的出品方)開發的,旨在滿足從事嚴苛的現實數據科學項目的數據科學家的需求。在許多其他框架中,工件的加載和存儲任務留給用戶,這迫使他們決定應保留和不應保留的內容。Metaflow消除了這種認知成本。Metaflow包含了這些以人為中心的細節,所有細節都旨在提高數據科學家的生產力。亞馬遜雲計算服務上的MetaflowNetflix的數據倉庫包含數百PB的數據。
  • Python,爬蟲開發的不二選擇
    請看下面描述:1)JAVAJava的語法比較規則,採用嚴格的面向對象編程方法,同時有很多大型的開發框架,比較適合企業級應用。Java的學習曲線較長,不僅要學習語言相關的特性,還要面向對象的軟體構造方法,在此之後要學習一些框架的使用方法。(1)用途:Android & IOS 應用開發,視頻遊戲開發,桌面GUIs(即圖形用戶頁面),軟體開發,架構等。
  • Python多階段框架實現虛擬試衣間,超逼真
    故在論文《Downto the Last Detail: Virtual Try-on with Detail Carving》中提出了一種新的多階段合成框架,可以很好地保留圖像顯著區域的豐富細節。具體地說,就是提出了一個多階段的框架,將生成分解為空間對齊,然後由粗到細生成。
  • Agora新增支持Python:視頻通話中也可做圖像識別了
    Python 擁有很活躍的社區和豐富的第三方庫,Web 框架、爬蟲框架、數據分析框架、機器學習框架等,開發者無需重複造輪子,可以用 Python 進行 Web 編程、網絡編程,開發多媒體應用,進行數據分析,或實現圖像識別等應用。其中圖像識別是最熱門的應用場景之一,也是與實時音視頻契合度最高的應用場景之一。
  • 雲立方網科普:常用高效的Python爬蟲框架有哪些?
    Python是現在非常流行的程式語言,而爬蟲則是Python語言中最典型的應用,下面是總結的高效Python爬蟲框架,大家看看是否都用過呢。 Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中
  • 音視頻技術開發周刊
    、前處理、編碼、發送、接受、解碼、混音、後處理、播放等一系列處理流程。線上分享的內容整理而成,從系統架構角度,分析了常見的開源SFU在分布式部署以及高可用、高並發方面的不足,並提出相應的解決方案。他表示,回溯深度學習框架在過去十年間的演進,國外的 TensorFlow 、PyTorch 、caffe 等主流深度學習框架發展迅速,國產深度學習框架的發展相對慢一些。
  • 3個開源Python GUI框架
    在各種平臺上存在多個UI框架的綁定,包括Windows,Mac和Linux本地的UI框架,以及可以在這三個平臺上工作的許多UI框架。更多Python資源什麼是Python?頂級Python IDE頂級Python GUI框架最新的Python內容更多開發者資源在我們進一步討論之前,讓我扮演魔鬼的擁護者,並問:你的應用程式是否真的有一個傳統的圖形用戶界面?對於某些程序,答案是顯而易見的。如果您的應用程式本質上是圖形化的,並且要麼針對單個本地計算機本地運行進行優化或者只是有意義,那麼是的,您可能應該考慮構建桌面GUI。很多時候,你所設計的內容就很明顯了。
  • Python實現視頻裁剪添加水印功能
    今天來實現一個利用Python的moviepy類庫裁剪視頻的功能。寫這個功能的初衷是想批量的裁剪一下視頻,下面一起來看一下代碼吧!python目前我們實現的是將單獨一個視頻進行裁剪。本次我們將目前視頻截取一小段內容,並為其添加一個水印圖片。
  • ...檢測與單目標、多目標跟蹤,港中文開源一體化視頻感知平臺MM...
    新年伊始,香港中文大學多媒體實驗室(MMLab)OpenMMLab 又有新動作,發布了一款一體化視頻目標感知平臺 MMTracking。該框架基於 PyTorch 寫成,支持單目標跟蹤、多目標跟蹤與視頻目標檢測,目前已開源。GitHub 地址:https://github.com/open-mmlab/mmtracking
  • 41頁PPT深入解析高通量計算在大規模視頻處理中的特點、挑戰及應用...
    ,其設計目標也相應的從追求傳統單個任務的「快」,轉變為追求單位時間內處理任務數量的「多」。在強時間約束下處理高吞吐量請求,所謂系統的吞吐量指的是計算機系統單位時間內可處理的服務請求數,它的計算特點是需要挖掘算法本身的可並行性,計算任務是基於一系列學習子任務的一個較大任務,這些子任務之間使用相同的數據或者關聯數據,如果能充分利用子任務間的相關性和數據的相關性,就能提高計算的並行度和計算效率。
  • 一周AI最火論文 | 移動端的3D實時CNN正在成為現實,加速框架細節起底
    如果你關注推薦系統,那麼python版的LensKit推薦系統引擎庫(LKPY)可能會引起你的興趣。這是一個開源工具包,可用於構建、研究及學習推薦系統。2010年LensKit 的Java版本首次發布,目前該工具已經應用於各種研究的發表、小規模生產部署以及線上(MOOC)和線下(傳統教室)教育中。
  • 誰是2020年最強Python庫?年度Top10出爐
    支持編輯器(如VSCode)代碼自動補全,提高開發人員的開發效率,減少bug的數量。其次,Typer還能配合命令行神器Click使用,就可以利用Click的優點和插件,實現更複雜的功能。開源地址:https://github.com/tiangolo/typer2、Rich誰規定CLI界面一定得是黑白的?它也可以是彩色的。
  • 港中文開源視頻動作分析庫MMAction,目標檢測庫算法大更新
    2018 年 10 月,在 OpenMMLab 的首期計劃中,商湯和港中文正式開源了 mmdetection,這是一個基於 PyTorch 的開源目標檢測工具包。該工具包支持 Mask RCNN 等多種流行的檢測框架,讀者可在 PyTorch 環境下測試不同的預訓練模型及訓練新的檢測分割模型。
  • OpenCV 2.4.5 發布,開源計算機視覺庫
    OpenCV 2.4.5 發布了,該版本增加了完全功能的 Java 桌面綁定,兼容任意 JVM;此外關於 CUDA gpu 模塊的多項改進;基於OpenCL 的硬體加速模塊已成熟,修復了不少