DeepStream:下一代智慧城市的视频分析
文章翻譯自:https://devblogs.nvidia.com/deepstream-video-analytics-smart-cities/
想象一下每個父母最糟糕的噩夢:一個孩子在一個擁擠的購物中心迷路了。現(xiàn)在想象一下這樣一個場景:使用部署在建筑物內(nèi)的攝像機網(wǎng)絡(luò)在幾分鐘內(nèi)找到并救出該孩子 - 并且實時記錄,檢索和分析所有視頻。這僅代表視頻分析領(lǐng)域提供的眾多可能性之一。
傳統(tǒng)視頻分析使用基于計算機視覺的方法,而下一代解決方案越來越依賴于深度學(xué)習(xí)技術(shù)。在GPU上運行這些技術(shù)可提供前所未有的準(zhǔn)確性、功能和速度。實現(xiàn)視頻分析潛力的關(guān)鍵是構(gòu)建以經(jīng)濟高效的方式擴展的應(yīng)用程序。
NVIDIA的新DeepStream SDK通過使用NVIDIA Tesla GPU的硬件功能,幫助開發(fā)人員快速構(gòu)建高效,高性能的視頻分析應(yīng)用程序,包括卓越的解碼性能,通過降低精度的高速推理和低功耗。在這篇博文中,我將概述DeepStream SDK,說明其用于滿足性能和可伸縮性要求,并根據(jù)對象檢測示例用例強調(diào)其易于部署。
1 什么是DeepStream
視頻分析的核心是標(biāo)準(zhǔn)計算機視覺任務(wù),包括圖像分類,對象檢測,識別和跟蹤。圖1顯示了每個任務(wù)在圖像中的應(yīng)用。
圖1.(左)基于類概率識別的對象。 (中)基于邊界框檢測到的對象。 (右)跨幀跟蹤對象。
常使用卷積神經(jīng)網(wǎng)絡(luò),有效地解決這些任務(wù)的網(wǎng)絡(luò)數(shù)量激增。連續(xù)的數(shù)據(jù)幀通常通過這些網(wǎng)絡(luò)運行以產(chǎn)生感興趣的結(jié)果。高性能應(yīng)用程序構(gòu)建在流水線上,以最佳方式為神經(jīng)網(wǎng)絡(luò)提供所需分辨率和格式的解碼視頻幀,以最大化吞吐量。可擴展性要求并行處理多個視頻流以獲得優(yōu)越的信道密度(在給定(機架)空間中處理的視頻信道的數(shù)量)。使用深度學(xué)習(xí)進行視頻分析在計算上非常昂貴,并且對于實時視頻的要求更加嚴格,因為它通常涉及使用自定義邏輯和靈活工作流程的實時分析。
DeepStream的關(guān)鍵價值在于使視頻的深度學(xué)習(xí)易于使用,使您能夠?qū)W⒂诳焖贅?gòu)建和定制高效且可擴展的視頻分析應(yīng)用程序。 DeepStream是NVIDIA Metropolis平臺的一部分,該平臺為構(gòu)建智能邊緣到云視頻分析系統(tǒng)提供統(tǒng)一的架構(gòu)。
2 DeepStream視頻智能分析工作流
流水線2顯示了使用DeepStream的典型應(yīng)用程序l。 SDK提供的階段以綠色顯示,與用戶實現(xiàn)的階段不同,以藍色顯示。流水線戶僅負責(zé)解析視頻并將其注入l,提供深度學(xué)習(xí)網(wǎng)絡(luò)并使用流水線中的推斷結(jié)果。
圖2 DeepStream工作流
DeepStream SDK提供的模塊包含輸入視頻流的解碼,預(yù)處理和推理,所有模塊都經(jīng)過精細設(shè)計,以提供最大的幀吞吐量。解碼模塊接受以H.264,H.265和MPEG-4編碼的視頻以及其他格式,并對它們進行解碼以渲染NV12顏色格式的原始幀。視頻解碼使用硬件加速的NVIDIA Video Codec SDK。
預(yù)處理階段將顏色格式從NV12轉(zhuǎn)換為BGR,并且還將幀的大小調(diào)整為所使用的神經(jīng)網(wǎng)絡(luò)所需的分辨率。色彩空間轉(zhuǎn)換和縮放使用自定義CUDA內(nèi)核和NVIDIA Performance Primitives(NPP)庫函數(shù)的組合。
推理模塊使用TensorRT導(dǎo)入和執(zhí)行的神經(jīng)網(wǎng)絡(luò)批量處理幀,TensorRT優(yōu)化了它們以實現(xiàn)高吞吐量和低延遲,并具有同類最佳的功效。 DeepStream目前支持基于Caffe的網(wǎng)絡(luò); TensorFlow支持將在不久的將來添加。
這些模塊緊密集成,以確保合理使用數(shù)據(jù)傳輸和軟件同步,同時實現(xiàn)最大的硬件并發(fā)性。
3 DeepStream用戶API
DeepStream提供了一個C ++ API,其核心是三個實體:作為流水線的獨立構(gòu)建塊的模塊,封裝整個流水線本身的設(shè)備計算器,以及模塊之間通信的張量。模塊表示流水線中的階段,可以分為預(yù)定義(解碼器,預(yù)處理和推理)或添加自定義邏輯的用戶定義模塊。
要構(gòu)建流水線,可以通過調(diào)用createDeviceWorker()來創(chuàng)建設(shè)備計算器的實例:
// Create a deviceWorker on a GPU device, the user needs to set the channel number. IDeviceWorker *pDeviceWorker = createDeviceWorker(g_nChannels, g_devID);然后,通過定義用于解碼的輸入編解碼器類型,預(yù)處理階段要輸出的顏色格式以及推理模型的網(wǎng)絡(luò)詳細信息,啟用和配置流水線的預(yù)定義階段。
// Add decode task, the parameter is the format of codec. pDeviceWorker->addDecodeTask(cudaVideoCodec_H264);// Add post processing task and define color format for inference pDeviceWorker->addColorSpaceConvertorTask(BGR_PLANAR);// Enable inference module and define model details pDeviceWorker->addInferenceTask(preModule_infer, deployFile, modelFile, meanFile,inputLayerName, outputLayerNames);該應(yīng)用程序現(xiàn)在可以運行了。
//finally, start the pipeline! pDeviceWorker->start();4 常見的處理流程
您可以通過將用戶定義的模塊添加到流水線來擴展此模型。創(chuàng)建模塊涉及定義其輸入,執(zhí)行過程和輸出張量。您可以通過將輸出張量連接到后續(xù)模塊中的適當(dāng)輸入來擴展和配置流水線。張量具有形狀和數(shù)據(jù)類型屬性,以及CPU或GPU的“存儲器類型”,允許相應(yīng)地處理和復(fù)制與它們相關(guān)聯(lián)的數(shù)據(jù)。輸入張量的數(shù)據(jù)類型必須與模塊預(yù)期的類型匹配。
自定義模塊通過將自定義內(nèi)核、OpenCV算法等插入流水線來補充深層神經(jīng)網(wǎng)絡(luò),從而實現(xiàn)更復(fù)雜的多階段分析。圖3中的示例說明了基于OpenCV的對象跟蹤算法與DeepStream流水線的集成。推理模塊將包含邊界框的張量輸出到對象跟蹤模塊中,然后跟蹤后續(xù)幀中的檢測到的對象。跟蹤和邊界框信息在屏幕上一起顯示上以實現(xiàn)可視化。
圖3 常見的模塊集成
5 為Tesla P4/P40開發(fā)
雖然DeepStream可以在任何最近具有支持相關(guān)CUDA和TensorRT版本的計算功能的GPU上運行,但它的設(shè)計目的是利用基于Pascal系列的Tesla P4和P40 GPU的卓越推理和視頻功能。結(jié)合高浮點吞吐量和效率,這些GPU支持最新(H265)編碼格式,并可同時解碼30多路高清視頻。這使軟件能夠為這些GPU上執(zhí)行的深度神經(jīng)網(wǎng)絡(luò)提供幀,以前所未有的速度進行推理。DeepStream軟件架構(gòu)利用此硬件解碼功能,通過解碼模塊的多線程實現(xiàn)與逐通道數(shù)據(jù)包緩存相結(jié)合,為NVDECODE API提供信息。這導(dǎo)致最大化硬件解碼器(NVDEC)利用率和解碼性能。
增加的解碼吞吐量實現(xiàn)了更大的推理批量大小,從而提高了推理吞吐量。GPU支持8位整數(shù)(INT8)操作,為提高系統(tǒng)吞吐量提供了更大的機會。TensorRT 2.1引入了將單精度浮點(FP32)深度學(xué)習(xí)網(wǎng)絡(luò)(CNN)轉(zhuǎn)換為使用INT8精度而無需任何調(diào)整或再訓(xùn)練的能力。通過使用校準(zhǔn)技術(shù),盡管INT8的范圍和精度降低,但在推理過程中沒有明顯的精度損失。。DeepStream提供校準(zhǔn)表和API,以在運行時啟用或禁用INT8。這允許TensorRT在執(zhí)行網(wǎng)絡(luò)時以最佳方式在FP32和INT8精度之間進行轉(zhuǎn)換。
Tesla P4是一款緊湊型加速器板,最大功率為75W,專為高密度數(shù)據(jù)中心部署而設(shè)計,每臺服務(wù)器具有多塊卡。基于此要求,DeepStream支持在不同GPU上執(zhí)行多個流水線,每個GPU上一個,以實現(xiàn)卓越的通道密度。您可以通過deviceID參數(shù)將流水線的GPU ID傳遞給createDevice Worker()。
目的是讓上層軟件根據(jù)用例、利用率和服務(wù)質(zhì)量等考慮因素創(chuàng)建和管理各種流水線,并在適當(dāng)?shù)腉PU上安排視頻流。
6 目標(biāo)檢測示例
DeepStream版本包含一個基于未剪枝的Resnet-18網(wǎng)絡(luò)的名為nvDecInfer_detection的對象檢測示例。該示例重點介紹了DeepStream使用的所有方面,包括流水線創(chuàng)建和配置,H264流解析和注入,自定義模塊的添加以及推理結(jié)果的使用。大部分代碼都是可重用的,可以很容易地應(yīng)用于用戶項目。
6.1 示例流水線
圖4顯示了目標(biāo)檢測的端到端流水線。
圖4:目標(biāo)檢測流水線
和以前一樣,SDK提供的塊為綠色,用戶提供的邏輯為藍色。為了補充DeepStream中解碼模塊的多線程實現(xiàn),示例中的用戶邏輯使用單獨的線程將數(shù)據(jù)包注入到流水線中的相應(yīng)通道輸入,使用以下代碼實現(xiàn)。
//per thread injection of packets into pipeline pDeviceWorker->pushPacket(pBuf, nBuf, laneID);雖然該示例使用基于文件的視頻輸入,但該概念可以類似地擴展到其他情況,例如相機饋送或網(wǎng)絡(luò)流。推理模塊使用的Resnet-18網(wǎng)絡(luò)輸出兩個包含每個幀中檢測到的各類對象的邊界框和IOU信息的張量。這些結(jié)果由解析器模塊聚合,該解析器模塊通過基于IOU閾值進行過濾并聚類其余邊界框來輸出合并的邊界框信息。這些由演示者模塊呈現(xiàn)在原始幀上并顯示在顯示器上。
6.2 效率分析
DeepStream提供的分析器可幫助您通過解碼和推理模塊測量幀吞吐量。每個通道報告解碼吞吐量,而推理吞吐量提供組合吞吐量,因為所有通道合并到運行分析的共享緩沖區(qū)中。下面的清單顯示了解碼分析的結(jié)果:
您可以通過添加每個通道的吞吐量來確定總解碼吞吐量。
分析器報告結(jié)果的速率可根據(jù)DecodeProfiler類中的定義進行配置,該類實現(xiàn)處理分析結(jié)果的邏輯。
6.3 顯示
視頻分析,通常需要查看疊加在視頻上的分析結(jié)果。目標(biāo)檢測示例示出了該功能的實現(xiàn),作為自定義模塊,其接受兩個輸入張量,其遞送由預(yù)處理模塊輸出的解碼幀和來自推斷模塊的檢測到的邊界框的坐標(biāo)。該示例使用OpenGL過濾庫來渲染邊界框,這需要底層窗口系統(tǒng)和顯示。由于Tesla GPU無法直接驅(qū)動顯示器,因此樣本可以使用單獨的圖形卡(例如GeForce或Quadro GPU板)進行顯示。因此,該示例說明了如何將DeepStream視頻管道擴展到第二個GPU。圖5顯示了帶有邊界框的目標(biāo)檢測結(jié)果。
圖5:多通道目標(biāo)檢測可視化。
6.4 性能
與大多數(shù)基于GPU的工作負載一樣,視頻分析應(yīng)用程序的性能受可用內(nèi)存大小和帶寬(設(shè)備內(nèi)存帶寬以及主機到設(shè)備內(nèi)存?zhèn)鬏數(shù)腜CIe帶寬)、GPU內(nèi)核數(shù)量和GPU時鐘頻率的影響。這些因素決定了視頻流水線中每個階段的塊級吞吐量。基于DeepStream的應(yīng)用程序通常是受解碼限制或推理(計算)限制,這取決于所使用的深度學(xué)習(xí)網(wǎng)絡(luò)的復(fù)雜性。使用諸如nvidia-smi之類的工具來識別哪些硬件解碼器(NVDEC)或GPU核心接近100%利用率(如果有的話)可以提供關(guān)于哪個階段是瓶頸的快速提示。
當(dāng)在基于P4的系統(tǒng)上執(zhí)行時,目標(biāo)檢測示例是推理約束,當(dāng)處理30fps HD視頻時,當(dāng)頻道計數(shù)達到16時展現(xiàn)出完全的GPU利用率,如下面的nvidia-smi輸出所示。頻道數(shù)量的任何進一步增加都會導(dǎo)致吞吐量低于視頻幀速率,使得實時處理變得不可行。
$ nvidia-smi -i 0 -q -d UTILIZATION GPU 0000:05:00.0UtilizationGpu : 96 %Memory : 41 %Encoder : 0 %Decoder : 56 %更改為等效(但更小)的Resnet-10網(wǎng)絡(luò),可以30 fps處理多達30個通道。以下nvidia-smi輸出顯示此時解碼器利用率達到100%,表明應(yīng)用程序受限于解碼。
$ nvidia-smi -i 0 -q -d UTILIZATION GPU 0000:05:00.0UtilizationGpu : 76 %Memory : 56 %Encoder : 0 %Decoder : 100 %由于較高的計算成本,使用較大網(wǎng)絡(luò)的應(yīng)用是在相對較低的信道數(shù)下推斷的。最佳實踐涉及在網(wǎng)絡(luò)功能和性能方面進行最佳權(quán)衡,充分修剪網(wǎng)絡(luò),以及使用INT8推斷來實現(xiàn)最大通道數(shù)并從GPU中提取所有可用性能。
通過達到這種平衡,您可以以前所未有的規(guī)模和功率支持激動人心的新用例。圖7顯示了基于Resnet-10的檢測應(yīng)用程序的解碼分析器輸出,該應(yīng)用程序列出了與輸入幀速率30fps匹配的所有30個通道的吞吐量。圖7還顯示了nvidia-smi輸出,證明Tesla P4 GPU在執(zhí)行工作負載期間僅消耗47 W,僅為1.56 W /通道。當(dāng)在服務(wù)器場內(nèi)部署時,這提供了在可接受的功率預(yù)算內(nèi)實現(xiàn)特殊信道密度的機會。
圖7:目標(biāo)檢測的執(zhí)行指標(biāo):(頂部)由nvidia-smi顯示的GPU功耗。 (下)每通道幀吞吐量。
8 歡迎嘗試DeepStream
Tesla GPU為深度學(xué)習(xí)驅(qū)動的視頻分析應(yīng)用程序帶來了機會,而NVIDIA DeepStream SDK使它們更易于構(gòu)建。 DeepStream使您能夠在深度學(xué)習(xí)中利用尖端概念。您可以在此博客中描述的想法的基礎(chǔ)上實現(xiàn)諸如級聯(lián)網(wǎng)絡(luò)和實時對象跟蹤器之類的功能。DeepStream團隊很高興看到使用SDK實現(xiàn)的創(chuàng)新。
我們歡迎您在DeepStream開發(fā)人員論壇中提出問題和意見。我們的目標(biāo)是根據(jù)您的反饋繼續(xù)擴展和發(fā)展DeepStream,讓我們知道您的想法。
總結(jié)
以上是生活随笔為你收集整理的DeepStream:下一代智慧城市的视频分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fifo java_java – 如何保
- 下一篇: 文件属性及权限修改