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

2021-01-07 雷鋒網

雷鋒網 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 開發者 雷鋒網

相關焦點

  • 深度學習——你需要了解的八大開源框架
    作為當下最熱門的話題,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支持一些開源深度學習框架。TensorFlow最初是由研究人員和Google Brain團隊針對機器學習和深度神經網絡進行研究所開發的,目前開源之後可以在幾乎各種領域適用。Data Flow Graph: 使用有向圖的節點和邊共同描述數學計算。graph中的nodes代表數學操作,也可以表示數據輸入輸出的端點。
  • ImagePy——UI界面支持開放插件的Python開源圖像處理框架
    雷鋒網 AI 科技評論按,ImagePy 是一款 python 開源圖像處理框架,其 UI 界面支持開放插件。在 github:https://github.com/Image-Py/imagepy 上,不僅有關於這款圖像處理軟體的詳細介紹,還有一些使用示例,雷鋒網 AI 科技評論接下來將詳細介紹這一開源圖像處理框架。
  • onnx實現對pytorch模型推理加速
    ,此舉將讓機器學習框架,向著機器學習框架的標準化和性能優化方向邁進了一大步。ONNX Runtime是適用於Linux,Windows和Mac上ONNX格式的機器學習模型的高性能推理引擎。開發人員可以為自己機器學習任務選擇合適的框架,框架作者可以集中精力推出創新,提高框架的性能。對於硬體供應商來說,也可以簡化神經網絡計算的複雜度,實現優化算法。
  • 亞馬遜開源神經機器翻譯框架Sockeye:基於Apache MXNet的NMT平臺
    隨著神經機器翻譯(NMT)技術的不斷演進,越來越多的科研機構和公司選擇開源自己的項目,讓更多人能夠開發出自己的 NMT 模型。此前,清華大學開源了神經機器翻譯工具包 THUMT,谷歌也推出了基於 TensorFlow 的 NMT 模型搭建教程。作為 MXNet 的支持者,亞馬遜也開源了自己的 NMT 框架 Sockeye。
  • 小叮噹機器學習:Python3.6配置TensorFlow的GPU版詳細安裝教程
    隨著機器學習,神經網絡的搭建,我們對海量數據的處理需求越來越大。雖然,CPU的發展速度已經放緩,但並行處理的架構卻取得了爆炸式的發展。圖形處理單元(GPU)的大量運用,已經拉開了機器學習迅猛發展的序幕。
  • NVIDIA何琨:AI視頻處理加速引擎TensorRT及Deepstream介紹
    我想給大家介紹這兩個工具,並不是因為它們是針對於特定的產品或場景,而是因為這兩個工具真正能在視覺領域幫助大家加速一些任務或者應用程式。我們可以看到,從最開始的視頻的編解碼,到整個流程地完成,這個過程中有兩個東西是最重要的,一個是Gstreamer編解碼工具,一個是TensorRT工具。在AI中它是一個加速GPU的推理引擎。DeepStream中,視頻的編解碼就是依靠Gstreamer,而內容的Inference過程中就用TensorRT來實現的。
  • 【CTO講堂】如何用Python一門語言通吃高性能並發、GPU計算和深度...
    主持人:數據分析方面,請您談一談如何利用gpu加速數據分析。 黃勝藍:很多人可能會覺得gpu編程是一件很困難的事情,其實當真正接觸了之後就會了解到讓你的程序在gpu上運行其實並不難,真正的難點在於理解gpu的特性從而將最合適的任務交給gpu來做,同時採用合適的優化手段。
  • 34個最優秀好用的Python開源框架
    人工智慧和深度學習的熱潮極大的帶動了Python的發展,迅速在Python生態圈中催生了大批的涉及各個方面的優秀Python開源框架,今天小編就帶你回顧下2018年度最優秀好用的Python開源框架。下面是從2018年中近10000個python開源框架中評價整理的34個最為好用的開源框架,它們細分可以分為Python Toolkit、Web、Terminal、Code Editor、Debugging、complier、Data Related、Chart8類,分布情況如下圖:Python ToolKit
  • 獨家| 人工智慧學習篇4:計算機視覺開源框架
    利用開源軟體,研究人員可以更加快速地更新和迭代算法。開源數據集則為研究人員提供了公平的算法測試的平臺。計算機視覺的典型任務包括圖像理解、三維視覺和動態視覺。圖像理解主要包括圖像識別、目標檢測、語義分割和實例分割。
  • 微信開源推理加速工具 TurboTransformers
    騰訊宣布開源 Transformer 推理加速工具 TurboTransformers。該工具面向自然語言處理領域中 Transformers 相關模型豐富的線上預測場景,據介紹,其在微信、騰訊雲、QQ 看點等產品的線上服務中已經廣泛應用,這也是騰訊對外開源的第 100 個項目。
  • 常用的十大 python 圖像處理工具
    但無論是用於何種用途,這些圖像都需要進行處理。圖像處理就是分析和處理數字圖像的過程,主要旨在提高其質量或從中提取一些信息,然後可以將其用於某種用途。圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。
  • python實現視頻人臉替換
    如果是視頻裡的你,就算是PS大神也很難給你換一張臉。你有想過嗎?如果把明星演的電影,好比把裡邊的主角範冰冰的臉換成你的,是一張你的會動會有表情的臉,那你會如何想呢?最近一有個python的人工智慧項目很火,就是給視頻人物換臉。
  • NVIDIA 合作開源社區,將 GPU 加速帶入 Spark 3.0
    NVIDIA 方面宣布與開源社區達成合作,為 Apache Spark 3.0 帶來端到端的 GPU 加速。 Apache Spark 3.0 是一種用於大數據處理的分析引擎,目前已被全球超過 500,000 名數據科學家所使用。
  • Python中的十大圖像處理工具
    圖像處理是分析和操縱數字圖像的過程,旨在提高其質量或從中提取一些信息,然後將其用於某些方面。圖像處理中的常見任務包括顯示圖像,基本操作(如裁剪、翻轉、旋轉等),圖像分割,分類和特徵提取,圖像恢復和圖像識別等。 Python之成為圖像處理任務的最佳選擇,是因為這一科學程式語言日益普及,並且其自身免費提供許多最先進的圖像處理工具。
  • Facebook 發布開源框架 PyTorch, Torch 終於被移植到 Python 生態...
    詳情請看盤點四大民間機器學習開源框架:Theano、Caffe、Torch 和 SciKit-learn 。PyTorch 的特點和優勢PyTorch 提供了:PyTorch 的首要優勢是,它處於機器學習第一大語言 Python 的生態圈之中,使得開發者能接入廣大的 Python 庫和軟體。
  • 融合視頻目標檢測與單目標、多目標跟蹤,港中文開源視頻感知平臺
    機器之心報導編輯:魔王香港中文大學多媒體實驗室(MMLab)OpenMMLab 開源一體化視頻目標感知平臺 MMTracking。新年伊始,香港中文大學多媒體實驗室(MMLab)OpenMMLab 又有新動作,發布了一款一體化視頻目標感知平臺 MMTracking。
  • 微軟開源ONNX Runtime,想用什麼深度學習框架任你選!
    此前,為了推進AI框架標準化,更好地支持PyTorch和TensorFlow等框架,微軟甚至降低了對自家CNTK框架的宣傳調門,可謂「用心良苦」。當地時間12月4日,微軟在GitHub上宣布ONNX Runtime開源 。
  • 融合視頻目標檢測與單目標、多目標跟蹤,港中文開源一體化視頻感知...
    新年伊始,香港中文大學多媒體實驗室(MMLab)OpenMMLab 又有新動作,發布了一款一體化視頻目標感知平臺 MMTracking。該框架基於 PyTorch 寫成,支持單目標跟蹤、多目標跟蹤與視頻目標檢測,目前已開源。GitHub 地址:https://github.com/open-mmlab/mmtracking
  • Python網絡爬蟲——爬取小視頻網站源視頻!自己偷偷看哦!
    學習前提1、了解python基礎語法2、了解re、selenium、BeautifulSoup、os、requests等python第三方庫
  • 機器學習必備:前20名Python人工智慧和機器學習開源項目
    TensorFlow提高了169%,從493個增加到1324個貢獻者。2. Deap,提高了86%,從21個增加到39個貢獻者。3. Chainer,提高了83%,從84個增加到154個貢獻者。4. Gensim,提高了81%,從145個增加到262個貢獻者。5. Neon,提高了66%,從47個增加到78個貢獻者。6.