在高分辨率輸入中檢測(cè)物體是計(jì)算機(jī)視覺(jué)中的一個(gè)眾所周知的問(wèn)題。當(dāng)感興趣的是框架的某個(gè)區(qū)域時(shí),不需要對(duì)整個(gè)框架進(jìn)行推理。解決這個(gè)問(wèn)題有兩種方法:
使用具有高輸入分辨率的大型模型。
將大圖像分為塊,并將較小的模型應(yīng)用于每個(gè)塊。
在許多方面,第一種方法是困難的。訓(xùn)練輸入量大的模型通常需要更大的主干,使整個(gè)模型更笨重。訓(xùn)練或部署這樣的模型也需要更多的計(jì)算資源。較大的模型被認(rèn)為不適合在較小的設(shè)備上部署邊緣。
第二種方法,將整個(gè)圖像劃分為塊,并對(duì)每個(gè)塊應(yīng)用較小的模型,具有明顯的優(yōu)勢(shì)。使用較小的模型,因此在訓(xùn)練和推理中需要較小的計(jì)算能力。將模型應(yīng)用于高分辨率輸入不需要再培訓(xùn)。較小的模型也被認(rèn)為有利于邊緣部署。
在這篇文章中,我們將討論如何 NVIDIA DeepStream 可以幫助將較小的模型應(yīng)用于高分辨率輸入,以檢測(cè)特定的幀區(qū)域。
視頻監(jiān)控系統(tǒng)概述
視頻監(jiān)控系統(tǒng)用于解決各種問(wèn)題,例如識(shí)別行人、車輛和汽車。如今, 4K 和 8K 攝像機(jī)用于捕捉場(chǎng)景細(xì)節(jié)。軍方將航空攝影用于各種目的,這也涵蓋了大片區(qū)域。
隨著分辨率的增加,像素?cái)?shù)呈指數(shù)增長(zhǎng)。處理如此大量的像素需要大量的計(jì)算能力,尤其是使用深度神經(jīng)網(wǎng)絡(luò)。
基于在建模過(guò)程中選擇的輸入維數(shù),深度神經(jīng)網(wǎng)絡(luò)對(duì)固定形狀的輸入進(jìn)行操作。這種固定大小的輸入也稱為感受野模型的。通常,在檢測(cè)和分割網(wǎng)絡(luò)中,感受野從 256 × 256 到 1280 × 1280 不等。
您可能會(huì)發(fā)現(xiàn)感興趣的區(qū)域是一個(gè)小區(qū)域,而不是整個(gè)幀。在這種情況下,如果檢測(cè)應(yīng)用于整個(gè)幀,則不必要地使用計(jì)算資源。 DeepStream NvDsPreprocess 插件使您能夠在框架的特定區(qū)域上進(jìn)行計(jì)算。
DeepStream NvDsPreprocessing 插件
然而,當(dāng)平鋪應(yīng)用于圖像或幀時(shí),尤其是在視頻饋送上,您需要在推理管道中增加一個(gè)元素。這樣的元素預(yù)計(jì)將執(zhí)行可按流配置的分塊機(jī)制、分塊推理以及將多個(gè)分塊的推理組合到單個(gè)幀上。
有趣的是, DeepStream 中提供了所有這些功能 Gst-NvDsPreprocess 可自定義插件。它提供了一個(gè)用于預(yù)處理輸入流的自定義庫(kù)接口。每個(gè)流都有自己的預(yù)處理要求。
默認(rèn)插件實(shí)現(xiàn)提供以下功能:
具有預(yù)定義感興趣區(qū)域( ROI )或分片的流根據(jù)推理的網(wǎng)絡(luò)要求進(jìn)行縮放和格式轉(zhuǎn)換。每流 ROI 在配置文件中指定。
它從縮放和轉(zhuǎn)換的 ROI 中準(zhǔn)備一個(gè)原始張量,并通過(guò)用戶元數(shù)據(jù)傳遞給下游插件。下游插件可以訪問(wèn)該張量進(jìn)行推理。
DeepStream NvDsPreprocessing 插件
下一步是修改現(xiàn)有代碼以支持平鋪。
使用 NvdsPreprocessing 插件
定義管道內(nèi)的預(yù)處理元素:
preprocess = Gst.ElementFactory.make("nvdspreprocess", "preprocess-plugin")
NvDsPreprocess需要一個(gè)配置文件作為輸入:
preprocess.set_property("config-file", "config_preprocess.txt")
將預(yù)處理元素添加到管道:
pipeline.add(preprocess)
將元素鏈接到管道:
streammux.link(preprocess) preprocess.link(pgie)
讓 NvdsPreprocess 插件進(jìn)行預(yù)處理
推斷是通過(guò)NvDsInfer插件完成的,該插件具有幀預(yù)處理功能。
當(dāng)您在NvDsInfer之前使用NvdsPreprocess插件時(shí),您希望預(yù)處理(縮放或格式轉(zhuǎn)換)由 NvdsPreprocess而不是NvDsInfer完成。為此,請(qǐng)將NvDsInfer的input-tensor-meta屬性設(shè)置為 true 。這使得NvdsPreprocess可以進(jìn)行預(yù)處理,并使用附加為元數(shù)據(jù)的預(yù)處理輸入張量,而不是NvDsInfer本身內(nèi)部的預(yù)處理。
將Gst-nvdspreprocess功能合并到現(xiàn)有管道中需要以下步驟。
定義nvdspreprocess插件并將其添加到管道:
preprocess = Gst.ElementFactory.make("nvdspreprocess", "preprocess-plugin")
pipeline.add(preprocess)
將NvDsInfer的input-tensor-meta屬性設(shè)置為 true :
pgie.set_property("input-tensor-meta", True)
定義nvdspreprocess插件的配置文件屬性:
preprocess.set_property("config-file", "config_preprocess.txt")
將預(yù)處理插件鏈接到主推理機(jī)(pgie)之前:
streammux.link(preprocess) preprocess.link(pgie)
創(chuàng)建配置文件
Gst-nvdspreprocess配置文件使用密鑰文件格式。有關(guān)更多信息,請(qǐng)參閱 Python 和 C 源代碼中的config_preprocess.txt。
[property]組配置插件的一般行為。
[group-《id》]組使用自定義庫(kù)中的src-id值和custom-input-transformation-function為一組流配置 ROI 、 TILE 和 ull 幀。
[user-configs]組配置自定義庫(kù)所需的參數(shù),自定義庫(kù)通過(guò)《string, string》的映射作為鍵值對(duì)傳遞給自定義庫(kù)。然后,自定義庫(kù)必須相應(yīng)地解析這些值。
所需的最小值config_preprocess.txt類似于以下代碼示例:
[property] enable=1 target-unique-ids=1 # 0=NCHW, 1=NHWC, 2=CUSTOM network-input-order=0 network-input-order=0 processing-width=960 processing-height=544 scaling-buf-pool-size=6 tensor-buf-pool-size=6 # tensor shape based on network-input-order network-input-shape=12;3;544;960 # 0=RGB, 1=BGR, 2=GRAY network-color-format=0 # 0=FP32, 1=UINT8, 2=INT8, 3=UINT32, 4=INT32, 5=FP16 tensor-data-type=0 tensor-name=input_1 # 0=NVBUF_MEM_DEFAULT 1=NVBUF_MEM_CUDA_PINNED 2=NVBUF_MEM_CUDA_DEVICE 3=NVBUF_MEM_CUDA_UNIFIED scaling-pool-memory-type=0 # 0=NvBufSurfTransformCompute_Default 1=NvBufSurfTransformCompute_GPU 2=NvBufSurfTransformCompute_VIC scaling-pool-compute-hw=0 # Scaling Interpolation method # 0=NvBufSurfTransformInter_Nearest 1=NvBufSurfTransformInter_Bilinear 2=NvBufSurfTransformInter_Algo1 # 3=NvBufSurfTransformInter_Algo2 4=NvBufSurfTransformInter_Algo3 5=NvBufSurfTransformInter_Algo4 # 6=NvBufSurfTransformInter_Default scaling-filter=0 custom-lib-path=/opt/nvidia/deepstream/deepstream/lib/gst-plugins/libcustom2d_preprocess.so custom-tensor-preparation-function=CustomTensorPreparation [user-configs] pixel-normalization-factor=0.003921568 #mean-file= #offsets= [group-0] src-ids=0;1;2;3 custom-input-transformation-function=CustomAsyncTransformation process-on-roi=1 roi-params-src-0=0;540;900;500;960;0;900;500;0;0;540;900; roi-params-src-1=0;540;900;500;960;0;900;500;0;0;540;900; roi-params-src-2=0;540;900;500;960;0;900;500;0;0;540;900; roi-params-src-3=0;540;900;500;960;0;900;500;0;0;540;900;
Processing-width和processing-height是指切片在整個(gè)幀上的寬度和高度。
對(duì)于network-input-shape,當(dāng)前配置文件配置為最多運(yùn)行 12 個(gè) ROI 。要增加 ROI 計(jì)數(shù),請(qǐng)將第一維度增加到所需數(shù)量,例如network-input-shape=12;3;544;960。
在當(dāng)前配置文件config-preprocess.txt中,每個(gè)源有三個(gè) ROI ,所有四個(gè)源總共有 12 個(gè) ROI 。所有源的總 ROI 不得超過(guò)network-input-shape參數(shù)中指定的第一個(gè)維度。
Roi-params-src-《id》表示source-《id》的 III 坐標(biāo)。如果啟用了process-on-roi,則為每個(gè) ROI 指定定義 ROI 的left;top;width;height。Gst-nvdspreprocess沒(méi)有將重疊塊中的對(duì)象檢測(cè)和計(jì)數(shù)結(jié)合起來(lái)。
密碼
C 代碼可從/ opt / NVIDIA / deepstream / deepstream-6.0 / source / app / sample _ app / deepstream-preprocess-test 下載。
Python 代碼可從 NVIDIA-AI-IOT/deepstream_python_apps github 回購(gòu)。
后果
Gst-nvdspreprocess允許對(duì)視頻的特定部分(磁貼或感興趣區(qū)域)應(yīng)用推理。使用Gst-nvdspreprocess,可以在單個(gè)幀上指定一個(gè)或多個(gè)平鋪。
以下是在整個(gè)幀上應(yīng)用yolov4與在磁貼上應(yīng)用yolov4時(shí)的性能指標(biāo)。通過(guò)將流的數(shù)量增加到解碼器或計(jì)算飽和點(diǎn)來(lái)收集性能指標(biāo),并且進(jìn)一步增加流不會(huì)顯示性能增益。
1080p 的視頻分辨率用于 NVIDIA V100 GPU 的性能基準(zhǔn)??紤]性能和磁貼數(shù)量之間的權(quán)衡,因?yàn)榉胖锰嗟拇刨N會(huì)增加計(jì)算需求。
使用NvDsPreprocess平鋪有助于對(duì)視頻中需要的部分進(jìn)行選擇性推斷。例如,在圖 1 中,推理只能在人行道上使用,而不能在整個(gè)框架上使用。
GST-NVDSAnalytics 對(duì)nvinfer(主檢測(cè)器)和nvtracker附加的元數(shù)據(jù)執(zhí)行分析。Gst-nvdsanalytics可應(yīng)用于瓷磚,用于 ROI 過(guò)濾、過(guò)度擁擠檢測(cè)、方向檢測(cè)和線交叉。
關(guān)于作者
Sunil Patel 作為一名深入學(xué)習(xí)的數(shù)據(jù)科學(xué)家為 NVIDIA 工作。他的專長(zhǎng)包括開發(fā)NVIDIA 平臺(tái)上的智能視頻分析和會(huì)話人工智能的高度可擴(kuò)展的人工智能解決方案。 Sunil 主要關(guān)注應(yīng)用程序擴(kuò)展和性能優(yōu)化。他畢業(yè)于印度阿拉哈巴德信息技術(shù)學(xué)院,獲得技術(shù)碩士學(xué)位。
Alvin Clark 是 DeepStream 的產(chǎn)品營(yíng)銷經(jīng)理。阿爾文的職業(yè)生涯始于設(shè)計(jì)工程師,然后轉(zhuǎn)向技術(shù)銷售和市場(chǎng)營(yíng)銷。他曾與多個(gè)行業(yè)的客戶合作,應(yīng)用范圍從衛(wèi)星系統(tǒng)、外科機(jī)器人到深海潛水器。阿爾文持有圣地亞哥加利福尼亞大學(xué)的工程學(xué)學(xué)位,目前正在喬治亞理工大學(xué)攻讀碩士學(xué)位。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5696瀏覽量
110131 -
gpu
+關(guān)注
關(guān)注
28文章
5283瀏覽量
136093 -
python
+關(guān)注
關(guān)注
58文章
4888瀏覽量
90322
發(fā)布評(píng)論請(qǐng)先 登錄
如何為 S32DS 中的特定變量(RAM、閃存、數(shù)據(jù)閃存)強(qiáng)制使用特定內(nèi)存區(qū)域?
是德科技推出全新AI推理仿真平臺(tái)
NVIDIA推出代理式AI藍(lán)圖與電信推理模型
基于NVIDIA模組與軟件套件推動(dòng)邊緣與機(jī)器人AI推理
NVIDIA DGX SuperPOD為Rubin平臺(tái)橫向擴(kuò)展提供藍(lán)圖
NVIDIA 推出 Alpamayo 系列開源 AI 模型與工具,加速安全可靠的推理型輔助駕駛汽車開發(fā)
使用NVIDIA Grove簡(jiǎn)化Kubernetes上的復(fù)雜AI推理
如何在NVIDIA Jetson AGX Thor上通過(guò)Docker高效部署vLLM推理服務(wù)
NVIDIA TensorRT LLM 1.0推理框架正式上線
什么是AI模型的推理能力
使用NVIDIA NVLink Fusion技術(shù)提升AI推理性能
NVIDIA Nemotron Nano 2推理模型發(fā)布
NVIDIA從云到邊緣加速OpenAI gpt-oss模型部署,實(shí)現(xiàn)150萬(wàn)TPS推理
使用NVIDIA DeepStream對(duì)特定幀區(qū)域應(yīng)用推理
評(píng)論