女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

改進VPI和PyTorch之間的互操作性

星星科技指導員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-06-21 16:47 ? 次閱讀

NVIDIA Vision Programming Interface ( VPI )是 NVIDIA 的一個計算機視覺和圖像處理軟件庫,使您能夠在 NVIDIA Jetson 嵌入式設備和離散 GPU 上提供的不同硬件后端上實現加速算法

庫中的一些算法包括濾波方法、透視扭曲、時間降噪、直方圖均衡化、立體視差和鏡頭畸變校正。 VPI 提供了易于使用的 Python 綁定,以及一個 C ++ API 。

除了 與 OpenCV 接口 , VPI 還能夠與 PyTorch 和其他基于 Python 的庫進行互操作。在本文中,我們將通過一個基于 PyTorch 的對象檢測和跟蹤示例向您展示這種互操作性是如何工作的。有關更多信息,請參閱 視覺編程接口( VPI ) 頁和 Vision 編程接口 文檔。

與 PyTorch 和其他庫的互操作性

根據您在計算機視覺和深度學習管道中實現的應用程序,您可能必須使用多個庫。開發此類管道的挑戰之一是這些庫之間交互的效率。例如,當在內存拷貝之間交換圖像數據時,可能會由于內存拷貝而出現性能問題。

使用 VPI ,您現在可以與 PyTorch 或任何其他支持__cuda_array_interace__的庫進行互操作。__cuda_array_interface__( CUDA Array Interface )是 Python 中的一個屬性,它支持各種項目(如庫)中類似 GPU Array 對象的不同實現之間的互操作性。

陣列對象(如圖像)可以在一個庫中創建,在另一個庫中修改,而無需復制 GPU 中的數據或將其傳遞給 CPU

圖 1 VPI 和其他庫之間的互操作性使用 __cuda_array_interface__

時間噪聲抑制以改進目標檢測和跟蹤

噪聲是視頻中跨幀的常見特征。這種時間噪聲會對視頻中目標檢測和跟蹤算法的性能產生負面影響。

VPI 庫提供了一種時間降噪( TNR )算法,這是計算機視覺應用中用于降低視頻數據中噪聲的常用方法。

在本演練中,您將在嘈雜的視頻上使用基于 PyTorch 的對象檢測和跟蹤示例。然后應用 VPI 中的 TNR 算法來減少噪聲,從而改進目標檢測和跟蹤。

我們表明,在執行 VPI 和 PyTorch 算法的過程中, VPI 和 PyTorch 都可以無縫工作,沒有任何內存拷貝。

該示例包括以下內容:

PyTorch 基于原始輸入視頻的目標檢測與跟蹤

PyTorch 基于 VPI TNR 的干凈輸入視頻目標檢測與跟蹤

使用 CUDA 陣列接口實現 VPI 和 PyTorch 之間的互操作性

PyTorch 基于原始輸入視頻的目標檢測與跟蹤

首先,首先定義一個基于 PyTorch 的應用程序來檢測圖像中的對象。此示例應用程序基于 具有 MobileNetV3 主干的 SSDLite ,用于使用 PyTorch 和 Torchvision 進行目標檢測 Example.

創建一個名為PyTorchDetection的類來處理所有 PyTorch 對象和調用。創建此類對象時,應用程序正在將用于對象檢測的預訓練深度學習模型加載到 GPU ,僅用于推理。以下代碼示例顯示了所需的導入和類構造函數定義:

import torch
import torchvision class PyTorchDetection: def __init__(self): assert torch.cuda.is_available() self.cuda_device = torch.device('cuda') self.convert = torchvision.transforms.Compose([ torchvision.transforms.ConvertImageDtype(torch.float32), torchvision.transforms.Lambda(lambda x: x.permute(2, 0, 1)), torchvision.transforms.Lambda(lambda x: x.unsqueeze(0)), ]) model = torchvision.models.detection.ssdlite320_mobilenet_v3_large(
pretrained=True) self.torch_model = model.eval().to(self.cuda_device)

PyTorchDetection類還負責從陣列創建 CUDA 圖像幀,有效地將其上載到 GPU 。稍后,您將使用 OpenCV 從文件中讀取輸入視頻,其中每個視頻幀都是一個 NumPy 數組,用作該類創建函數的輸入。

此外,PyTorchDetection類可以將 CUDA 圖像幀轉換為 CUDA 張量對象,為模型推斷做好準備,并將基于 VPI 的 CUDA 幀轉換為張量。最后一次轉換使用 VPI 的__cuda_array_interface__互操作性來避免復制幀。

 def CreateCUDAFrame(self, np_frame): return torch.from_numpy(np_frame).to(self.cuda_device) def ConvertToTensor(self, cuda_frame): return self.convert(cuda_frame) def ConvertFromVPIFrame(self, vpi_cuda_frame): return torch.as_tensor(vpi_cuda_frame, device=self.cuda_device)

除了前面定義的函數外,PyTorchDetection類還定義了一個函數,在給定scores_threshold值的情況下,可以在當前 OpenCV 幀中檢測和繪制對象:

 def DetectAndDraw(self, cv_frame, torch_tensor, title, scores_threshold=0.2): with torch.no_grad(): pred = self.torch_model(torch_tensor) (...)

在這篇文章中,我們省略了代碼,以提請大家注意 PyTorch 模型的預測結果。此處下載或使用本規范即表示您接受本規范的條款和條件。 您可以下載并查看代碼 。

下一節介紹如何使用 VPI 降低輸入視頻中的噪聲,將 VPI 與 PyTorch 耦合以改進其目標檢測。

PyTorch 基于 VPI TNR 的干凈輸入視頻目標檢測與跟蹤

在本節中,定義一個基于 VPI 的實用程序類VPITemporalNoiseReduction,以清除視頻幀中的噪聲。

創建此類對象時,應用程序加載主 VPI TNR 對象和基于 VPI 的 CUDA 幀以存儲清理后的輸出。以下代碼示例顯示了所需的導入和類構造函數定義:

import vpi class VPITemporalNoiseReduction: def __init__(self, shape, image_format): if (image_format == 'BGR8'): self.vpi_image_format = vpi.Format.BGR8 else: self.vpi_image_format = vpi.Format.INVALID self.vpi_output_frame = vpi.Image(shape, format=self.vpi_image_format) self.tnr = vpi.TemporalNoiseReduction(shape, vpi.Format.NV12_ER, version=vpi.TNRVersion.V3, backend=vpi.Backend.CUDA)

類的構造函數需要每個輸入圖像幀的形狀(圖像寬度和高度)和格式。為簡單起見,您只接受BGR8圖像格式,因為這是OpenCV在讀取輸入視頻時使用的格式。

此外,您正在創建 VPI 圖像,以使用提供的形狀和格式存儲輸出幀。然后使用 TNR code 版本 3 和 CUDA 后端為該形狀構造 TNR 對象。 TNR 的輸入格式為 NV12 \ u ER ,與輸入圖像幀中的格式不同。接下來將在Denoise實用程序函數中處理幀轉換。

 def Denoise(self, torch_cuda_frame, tnr_strength=1.0): vpi_input_frame = vpi.asimage(torch_cuda_frame, format=self.vpi_image_format) with vpi.Backend.CUDA: vpi_input_frame = vpi_input_frame.convert(vpi.Format.NV12_ER) vpi_input_frame = self.tnr(vpi_input_frame, preset=vpi.TNRPreset.OUTDOOR_LOW_LIGHT, strength=tnr_strength) vpi_input_frame.convert(out=self.vpi_output_frame) return self.vpi_output_frame

最后一個函數執行輸入圖像幀的實際清理。此函數用于從基于 PyTorch 的輸入 CUDA 幀中移除噪聲,返回基于 VPI 的輸出 CUDA 幀。

首先使用 PyTorch 函數將 PyTorch vpi.asimage幀轉換為 VPI 。torch_cuda_frame與vpi_input_frame共享相同的內存空間:即不涉及內存拷貝。

接下來,將輸入幀從給定的輸入格式( BGR8 )轉換為 CUDA 中的 NV12 \ u ER 進行處理。

使用 TNR 預設OUTDOOR_LOW_LIGHT和給定的 TNR 強度,在轉換后的輸入幀上執行 TNR 算法。

清理后的輸入幀( TNR 算法的輸出)被轉換回原始格式( BGR8 ),并存儲在基于 VPI 的 CUDA 輸出幀中。

生成的輸出幀將返回,以供 PyTorch 稍后使用。

使用 CUDA 陣列接口實現 VPI 和 PyTorch 之間的互操作性

最后,在主模塊中定義一個MainWindow類。此類基于 PySide2 ,并為本例提供了圖形用戶界面。

窗口界面顯示兩個輸出圖像幀,一個僅使用 PyTorch 進行檢測,另一個在 VPI TNR 后使用 PyTorch 。此外,窗口界面包含兩個滑塊,用于控制用于 PyTorch 檢測的分數閾值和用于去除 VPI 時間噪聲的 TNR 強度。

import cv2
import numpy as np
(...)
from PySide2 import QtWidgets, QtGui, QtCore
(...)
from vpitnr import VPITemporalNoiseReduction
from torchdetection import PyTorchDetection class MainWindow(QMainWindow): def __init__(self, input_path): super().__init__() #-------- OpenCV part -------- self.video_capture = cv2.VideoCapture(input_path) if not self.video_capture.isOpened(): self.Quit() self.input_width = int(self.video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)) self.input_height = int(self.video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) self.output_video_shape = (self.input_height * 2, self.input_width, 3) self.output_frame_shape = (self.input_height, self.input_width, 3) self.cv_output_video = np.zeros(self.output_video_shape, dtype=np.uint8) #-------- Main objects of this example -------- self.torch_detection = PyTorchDetection() self.vpi_tnr = VPITemporalNoiseReduction((self.input_width, self.input_height), 'BGR8') (...) def UpdateDetection(self): in_frame = self.cv_input_frame if in_frame is None: return cuda_input_frame = self.torch_detection.CreateCUDAFrame(in_frame) # -------- Top Frame: No VPI --------- cuda_tensor = self.torch_detection.ConvertToTensor(cuda_input_frame) self.torch_detection.DetectAndDraw(self.TopFrame(), cuda_tensor, 'Pytorch only (no VPI)', self.scores_threshold) # -------- Bottom Frame: With VPI --------- vpi_output_frame = self.vpi_tnr.Denoise(cuda_input_frame, self.tnr_strength) with vpi_output_frame.rlock_cuda() as cuda_frame: cuda_output_frame=self.torch_detection.ConvertFromVPIFrame(cuda_frame) cuda_tensor = self.torch_detection.ConvertToTensor(cuda_output_frame) self.torch_detection.DetectAndDraw(self.BottomFrame(), cuda_tensor, 'Pytorch + VPI TNR', self.scores_threshold) (...)

類的構造函數需要輸入視頻的路徑。它使用OpenCV讀取輸入視頻,并創建一個高度為輸入視頻兩倍的輸出視頻幀。這用于存儲兩個輸出幀,一個僅用于PyTorch輸出,另一個用于VPI+ PyTorch 輸出。

構造函數還為 PyTorch 檢測和 VPI TNR 創建對象。在本文中,我們省略了創建圖形用戶界面小部件和處理其回調的代碼。我們還省略了創建主窗口和啟動應用程序的代碼。有關 TNR code 這一部分的更多信息,請下載示例。

當有新的輸入視頻幀可用時,調用UpdateDetection函數,從 NumPy OpenCV 輸入幀創建基于 PyTorch 的 CUDA 輸入幀。然后將其轉換為張量,以檢測并繪制PyTorchDetection類。頂部幀的管道直接在輸入視頻幀中運行 PyTorch 檢測。

底部幀的下一條管道首先對基于 PyTorch CUDA 的輸入幀進行去噪。去噪后的輸出是一個名為vpi_output_frame的基于 VPI 的 CUDA 幀,使用rlock_cuda函數在 CUDA 中鎖定讀取。此函數為cuda_frame對象中的 VPI CUDA 互操作性提供__cuda_array_interface__。該對象將轉換為 PyTorch CUDA 幀,然后轉換為張量。再次,對管道的結果調用 detect and draw 函數。第二條管道在 VPI 去噪功能之后運行PyTorchDetection。

結果

圖 3 顯示了在公共場所行人噪聲輸入視頻上,無 VPI TNR 和有 VPI TNR 的 PyTorch 目標檢測和跟蹤的結果。正如您可以從帶有注釋的輸出視頻中看到的那樣,在檢測之前應用去噪可以改善檢測和跟蹤結果(右)。

圖 3 PyTorch 無 VPI TNR 和(右)有 VPI TNR 的目標檢測和跟蹤(左)

視頻幀右下角顯示的每秒幀數( FPS )( 32.8 僅適用于 PyTorch , 32.1 適用于 VPI + PyTorch )表明,將 VPI 添加到 PyTorch 檢測管道不會增加太多開銷。這在一定程度上是由于避免了從 CUDA 內存到 CPU 內存的每幀超過 20Mb 的拷貝,這是通過使用__cuda_array_interface__啟用的。

總結

在這篇文章中,我們以 PyTorch 對象檢測和跟蹤為例,展示了 VPI 和其他支持__cuda_array_interface__的庫之間的互操作性。在目標檢測和跟蹤之前,您應用了 VPI 的時間噪聲抑制來改進它。我們還證明了在 PyTorch 管道中添加 VPI 不會導致性能損失。

關于作者

Sandeep Hiremath 是NVIDIA 計算機視覺的首席技術產品經理。他是一位經驗豐富的產品領導者,專長于計算機視覺、機器學習嵌入式系統領域。在NVIDIA ,他負責為汽車、醫療保健、機器人和研究領域的開發人員提供一組計算機視覺和圖像處理解決方案的產品愿景和戰略。

André de Almeida Maximo 是 NVIDIA 的系統工程師,專注于嵌入式平臺的軟件。他曾在多家工業公司的研究中心工作,幫助塑造不同行業的人工智能。在空閑時間,安德烈喜歡跑步和閱讀小說。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5143

    文章

    19567

    瀏覽量

    315585
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4919

    瀏覽量

    130770
  • 計算機
    +關注

    關注

    19

    文章

    7637

    瀏覽量

    90317
  • pytorch
    +關注

    關注

    2

    文章

    809

    瀏覽量

    13795
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Matter 智能家居的通用語言

    Matter由連接標準聯盟(CSA)創建,旨在解決智能家居的操作性問題。Matter 基于簡單性、操作性、可靠和安全
    發表于 05-19 15:35

    解讀新發布的 Matter 1.4:推動智能家居設備操作性的關鍵升級

    著Matter 1.4的發布,智能家居和物聯網(IoT)行業迎來了新的里程碑。Matter作為全球統一的智能家居互聯協議,在操作性、安全和能效優化等方面取得了重大突破。本文將從Matter
    的頭像 發表于 05-16 17:38 ?231次閱讀

    Valens聯合七家MIPI A-PHY芯片廠商完成操作性測試,加速中國及全球MIPI A-PHY生態發展

    2025年3月4日,全球汽車高速連接技術領導者Valens Semiconductor(以下簡稱“Valens”)(紐交所代碼:VLN)宣布,已與七家MIPI A-PHY芯片提供商成功完成了操作性
    的頭像 發表于 03-19 14:04 ?344次閱讀
    Valens聯合七家MIPI A-PHY芯片廠商完成<b class='flag-5'>互</b><b class='flag-5'>操作性</b>測試,加速中國及全球MIPI A-PHY生態發展

    Matter 1.4如何提升智能家居設備操作性

    SiliconLabs(芯科科技)Matter首席產品經理Rob Alexander先生近期制作本篇趨勢應用文章,重點介紹了Matter 1.4標準版本引入的全新功能,以及這些新特性如何用來提升智能家居設備的操作性,并進一步拓展設備支持類型到能源管理的應用領域。
    的頭像 發表于 03-11 10:50 ?594次閱讀

    新思科技與英特爾攜手完成UCIe操作性測試

    近日,新思科技與英特爾攜手合作,率先完成了UCIe(Universal Chiplet Interconnect Express)操作性測試芯片演示,并成功推出了包含控制器、PHY(物理層)和驗證
    的頭像 發表于 02-18 14:18 ?410次閱讀

    TC10以太網休眠喚醒測試詳細指南!

    休眠喚醒操作性測試是確保車載以太網設備在低功耗模式下正常工作的關鍵步驟。通過詳細的測試用例和嚴格的通過標準,OPEN Alliance的測試規范確保了不同廠商設備之間
    的頭像 發表于 02-18 10:00 ?770次閱讀
    TC10以太網休眠喚醒測試詳細指南!

    操作指南:pytorch云服務器怎么設置?

    設置PyTorch云服務器需選擇云平臺,創建合適的GPU實例,安裝操作系統、Python及Anaconda,創建虛擬環境,根據CUDA版本安裝PyTorch,配置環境變量,最后驗證安裝。過程中需考慮
    的頭像 發表于 02-08 10:33 ?317次閱讀

    樂鑫 ESP32-C6 通過 Thread 1.4 操作性認證

    樂鑫信息科技(688018.SH)很高興地宣布,ESP32-C6已經成功通過Thread1.4操作性認證。這一成就標志著樂鑫在提供先進物聯網解決方案之路上又邁進了重要一步。ESP32-C6在
    的頭像 發表于 02-06 18:02 ?418次閱讀
    樂鑫 ESP32-C6 通過 Thread 1.4 <b class='flag-5'>互</b><b class='flag-5'>操作性</b>認證

    PCIe 6.0 操作性PHY驗證測試方案

    由于CPU、GPU、加速器和交換機的創新,超大規模數據中心的接口需要更快的數據傳輸,不僅在計算和內存之間,還涉及網絡。PCI Express (PCIe?) 成為這些互連的基礎,支持構建 CXL
    的頭像 發表于 01-02 08:43 ?671次閱讀
    PCIe 6.0 <b class='flag-5'>互</b><b class='flag-5'>操作性</b>PHY驗證測試方案

    TI ADS42JB69系列JESD204B ADC與Altera FPGA的操作性

    電子發燒友網站提供《TI ADS42JB69系列JESD204B ADC與Altera FPGA的操作性.pdf》資料免費下載
    發表于 12-10 14:27 ?0次下載
    TI ADS42JB69系列JESD204B ADC與Altera FPGA的<b class='flag-5'>互</b><b class='flag-5'>操作性</b>

    M-LVDS和總線LVDS的操作性

    電子發燒友網站提供《M-LVDS和總線LVDS的操作性.pdf》資料免費下載
    發表于 09-29 09:46 ?1次下載
    M-LVDS和總線LVDS的<b class='flag-5'>互</b><b class='flag-5'>操作性</b>

    CC-Link IE Field Basic主站轉Profinet從站現場總線協議轉換網關

    通過捷米特網關從而實現不同工業通信協議之間操作性
    的頭像 發表于 09-10 10:12 ?493次閱讀
    CC-Link IE Field Basic主站轉Profinet從站現場總線協議轉換網關

    操作性對智能家居的重要

    在智能家居領域,操作性對不同群體有不同的意義。消費者希望有多種選擇、較高的靈活性、簡單的設置以及安全感,確保設備不會被黑客攻擊。最重要的是,他們希望設備能夠“正常工作”。
    的頭像 發表于 08-26 17:29 ?6.1w次閱讀
    <b class='flag-5'>互</b><b class='flag-5'>操作性</b>對智能家居的重要<b class='flag-5'>性</b>

    是德科技攜手高通突破5G高頻段FR3操作性

    了業內首個在FR3頻段(高頻段)的端到端操作性和數據連接測試,這一成就標志著5G技術在高頻段應用上的重大進展。
    的頭像 發表于 08-14 11:24 ?1344次閱讀

    ZigBee多網關之間如何通訊?

    在智能家居領域,ZigBee占據著舉足輕重的地位。作為一項開放標準,ZigBee確保了不同制造商生產的設備之間操作性,簡化了智能家居系統的集成和擴展。ZigBee網絡能夠支持大量的節點,理論上
    的頭像 發表于 07-12 08:21 ?1409次閱讀
    ZigBee多網關<b class='flag-5'>之間</b>如何通訊?