NVIDIA DeepStream 5.0构建智能视频分析应用程序
NVIDIA DeepStream 5.0構(gòu)建智能視頻分析應(yīng)用程序
無(wú)論是要平衡產(chǎn)品分配和優(yōu)化流量的倉(cāng)庫(kù),工廠流水線檢查還是醫(yī)院管理,要確保員工和護(hù)理人員在照顧病人的同時(shí)使用個(gè)人保護(hù)設(shè)備(PPE),就可以實(shí)現(xiàn)高級(jí)智能視頻分析(IVA)有用。
在基礎(chǔ)層,全球在城市,體育館,工廠和醫(yī)院中部署了數(shù)十億個(gè)攝像頭和IoT傳感器,每天生成數(shù)PB的數(shù)據(jù)。隨著數(shù)據(jù)的爆炸式增長(zhǎng),必須使用AI來(lái)簡(jiǎn)化和執(zhí)行有效的IVA。
許多公司和開(kāi)發(fā)人員都在努力構(gòu)建可管理的IVA管道,因?yàn)檫@些工作需要AI專業(yè)知識(shí),高效的硬件,可靠的軟件以及廣泛的資源才能進(jìn)行大規(guī)模部署。NVIDIA打造了DeepStream SDK,以消除這些障礙,并使每個(gè)人都能輕松,高效地創(chuàng)建基于AI的,GPU加速的應(yīng)用程序,以進(jìn)行視頻分析。
DeepStream SDK是一個(gè)可擴(kuò)展的框架,用于為邊緣構(gòu)建高性能,托管的IVA應(yīng)用程序。借助DeepStream,可以跨多個(gè)行業(yè)構(gòu)建從智慧城市和建筑到零售,制造業(yè)和醫(yī)療保健的AI應(yīng)用程序。
DeepStream運(yùn)行時(shí)系統(tǒng)已通過(guò)流水線化,以支持深度學(xué)習(xí)推理,圖像和傳感器處理,并在流應(yīng)用程序中將見(jiàn)解發(fā)送到云。為了進(jìn)行大規(guī)模部署,可以使用容器構(gòu)建本機(jī)云,DeepStream應(yīng)用程序,并使用Kubernetes平臺(tái)對(duì)所有這些進(jìn)行編排。在邊緣上部署時(shí),應(yīng)用程序可以在IoT設(shè)備和云標(biāo)準(zhǔn)消息代理(例如Kafka和MQTT)之間進(jìn)行通信,以進(jìn)行大規(guī)模,廣域部署。
圖1. DeepStream –邊緣到云。
DeepStream應(yīng)用程序可以在由NVIDIA Jetson提供支持的邊緣設(shè)備或由NVIDIA T4提供支持的本地服務(wù)器上運(yùn)行。來(lái)自邊緣的數(shù)據(jù)可以發(fā)送到云,以進(jìn)行更高級(jí)別的分析和可視化。
本文其余部分深入探討了DeepStream 5.0發(fā)行的主要功能。
DeepStream 5.0功能
借助DeepStream 5.0,NVIDIA使在邊緣上構(gòu)建和部署基于AI的IVA應(yīng)用程序的工作變得前所未有的輕松。以下是新功能:
? 支持NVIDIA Triton Inference Server
? Python綁定
? 應(yīng)用程序的遠(yuǎn)程管理和控制
? 安全通訊
? 使用Mask R-CNN進(jìn)行實(shí)例分割
對(duì)Triton Inference Server的支持
創(chuàng)建AI是一個(gè)反復(fù)的實(shí)驗(yàn)過(guò)程,數(shù)據(jù)科學(xué)家在其中花費(fèi)大量時(shí)間在不同的架構(gòu)上進(jìn)行實(shí)驗(yàn)和制作原型。在此階段,重點(diǎn)更多地放在如何最好地解決問(wèn)題上,而不是AI模型的效率上。希望花費(fèi)更多的時(shí)間來(lái)獲得其用例的高精度,而不是花費(fèi)優(yōu)化推理的周期。希望在實(shí)際場(chǎng)景中快速創(chuàng)建原型并查看模型的性能。
過(guò)去,使用DeepStream執(zhí)行視頻分析涉及將模型轉(zhuǎn)換為NVIDIA TensorRT(推理運(yùn)行時(shí))。從DeepStream 5.0開(kāi)始,可以選擇在訓(xùn)練框架中本地運(yùn)行模型。這使可以快速構(gòu)建端到端系統(tǒng)的原型。
DeepStream 5.0直接從應(yīng)用程序集成了Triton Server。Triton Server為提供了將任何深度學(xué)習(xí)框架與DeepStream結(jié)合使用的靈活性。推理服務(wù)Gst-nvinferserver通過(guò)可用的API從DeepStream插件()本地集成。該插件接收NV12 / RGBA緩沖區(qū),并將其發(fā)送到較低級(jí)的庫(kù)。該庫(kù)對(duì)圖像進(jìn)行預(yù)處理,并轉(zhuǎn)換為模型可接受的所需張量大小。張量通過(guò)CUDA共享內(nèi)存發(fā)送到Triton Server庫(kù)。
推斷后,Triton Server將輸出張量返回到共享庫(kù),在共享庫(kù)中對(duì)其進(jìn)行后處理以生成元數(shù)據(jù)。該元數(shù)據(jù)被附加回現(xiàn)有的元數(shù)據(jù)并向下游發(fā)送。通過(guò)集成推理服務(wù)器,可以使用DeepStream中的所有構(gòu)建塊來(lái)構(gòu)建有效的IVA管道,并在的訓(xùn)練框架上本地執(zhí)行推理。
圖2. DeepStream 5.0中的Triton Server推理插件。
DeepStream本身仍支持TensorRT。如果正在尋找最高的推理吞吐量或資源受限以部署完整的框架和大型模型,則這是首選的方法。如果正在尋找靈活性,并且可以在性能方面做出取舍,那么Triton Server是最佳途徑。
下表總結(jié)了這兩種方法的優(yōu)缺點(diǎn)。
TensorRT Triton服務(wù)器
優(yōu)點(diǎn) 最高產(chǎn)量 最高的靈活性
缺點(diǎn) 自定義圖層需要編寫插件 性能不如TensorRT解決方案
表1. TensorRT和Triton Server的權(quán)衡。
以下是帶有DeepStream的Triton Server的主要功能:
? 支持以下模型格式:
o 在Jetson和T4上的TensorRT,TensorFlow GraphDef和SavedModel以及TensorFlow-TensorRT模型
o 僅T4上的ONNX,PyTorch和Caffe2 NetDef
? 多個(gè)模型(或同一模型的多個(gè)實(shí)例)可以在同一GPU上同時(shí)運(yùn)行。
要開(kāi)始使用帶有DeepStream的Triton Server,提供了幾個(gè)示例配置文件和一個(gè)腳本來(lái)檢索開(kāi)源模型。有同時(shí)運(yùn)行TensorRT和TensorFlow模型的示例。對(duì)于本文,將DeepStream安裝目錄稱為$DEEPSTREAM_DIR。實(shí)際的安裝目錄取決于使用的是裸機(jī)版本還是容器版本。
如果在x86平臺(tái)上的NVIDIA GPU上運(yùn)行,請(qǐng)nvcr.io/nvidia/deepstream:5.0-20.04-triton從NVIDIA NGC中拉出容器。在x86上帶有DeepStream的Triton Server僅適用于-triton容器。如果在Jetson上運(yùn)行,則Triton Server共享庫(kù)作為DeepStream的一部分預(yù)先安裝??梢耘c任何Jetson容器一起使用。
轉(zhuǎn)到/ samples目錄:
cd $ DEEPSTREAM_DIR / deepstream-5.0 / samples
在該目錄中執(zhí)行bash腳本。該腳本下載所有必需的開(kāi)源模型,并將提供的Caffe和UFF模型轉(zhuǎn)換為TensorRT引擎文件。此步驟將所有模型轉(zhuǎn)換為引擎文件,因此可能需要幾分鐘或更長(zhǎng)時(shí)間。
bash腳本中指定了所生成引擎文件的最大批處理大小。要修改默認(rèn)批處理大小,必須修改此腳本。這也將下載TensorFlowssd-inception_v2模型。
./prepare_ds_trtis_model_repo.sh
模型已生成或復(fù)制到/trtis_model_repo目錄中。這是運(yùn)行ssd-inception_v2模型的方法。首先進(jìn)入 /trtis_model_repo/ssd_inception_v2_coco_2018_01_28目錄并找到config.pbtxt文件。如果bash腳本成功運(yùn)行,還應(yīng)該看到1/model.graphdef。這是TensorFlow凍結(jié)的graphdef。
這是config.pbtxt模型庫(kù)中提供的示例文件。首先,使用platform關(guān)鍵字指定深度學(xué)習(xí)框架??捎眠x項(xiàng)如下:
? tensorrt_plan
? tensorflow_graphdef
? tensorflow_savedmodel
? caffe2_netdef
? onnxruntime_onnx
? pytorch_libtorch
? custom
接下來(lái),指定輸入維,數(shù)據(jù)類型和數(shù)據(jù)格式。然后,指定所有輸出張量的所有輸出尺寸和數(shù)據(jù)類型。有關(guān)配置文件中所有選項(xiàng)的更多信息,請(qǐng)參見(jiàn)模型配置。
名稱:“ ssd_inception_v2_coco_2018_01_28”
平臺(tái):“ tensorflow_graphdef”
max_batch_size:128
輸入 [
{
名稱:“ image_tensor”
數(shù)據(jù)類型:TYPE_UINT8
格式:FORMAT_NHWC
昏暗:[300,300,3]
}
]
輸出 [
{
名稱:“ detection_boxes”
數(shù)據(jù)類型:TYPE_FP32
昏暗:[100,4]
重塑{形狀:[100,4]}
},
{
名稱:“ detection_classes”
數(shù)據(jù)類型:TYPE_FP32
昏暗:[100]
},
{
名稱:“ detection_scores”
數(shù)據(jù)類型:TYPE_FP32
昏暗:[100]
},
{
名稱:“ num_detections”
數(shù)據(jù)類型:TYPE_FP32
昏暗:[1]
重塑{形狀:[]}
}
]
接下來(lái),使用ssd_inception_v2模型運(yùn)行deepstream-app 。Triton Server的示例配置文件位于中/configs/deepstream-app-trtis。通常需要運(yùn)行兩個(gè)或更多配置文件deepstream-app。一個(gè)是頂級(jí)配置文件,為整個(gè)管道設(shè)置參數(shù),其他是用于推理的配置文件。
為了提高可用性和簡(jiǎn)化性,每個(gè)推理引擎都需要一個(gè)唯一的配置文件。如果級(jí)聯(lián)多個(gè)推理,則需要多個(gè)配置文件。對(duì)于此示例,使用以下文件:
? source1_primary_detector.txt
? config_infer_primary_detector_ssd_inception_v2_coco_2018_01_28.txt
[primary-gie]
啟用= 1
(0):nvinfer; (1):nvinferserver
插件類型= 1
推斷原始輸出dir = trtis輸出
批量大小= 1
間隔= 0
gie-unique-id = 1
config-file = config_infer_primary_detector_ssd_inception_v2_coco_2018_01_28.txt
該source1_primary_detector.txt文件是頂級(jí)配置文件。如果使用本機(jī)TensorRT或Triton Server進(jìn)行推理,這很常見(jiàn)。在這個(gè)配置文件,更改插件式下[primary-gie],以1使用推理服務(wù)器。
該config_infer_primary_detector_ssd_inception_v2_coco_2018_01_28.txt文件用于指定推理選項(xiàng),例如預(yù)處理,后處理和模型存儲(chǔ)庫(kù)。有關(guān)不同選項(xiàng)的更多信息,請(qǐng)參見(jiàn)《NVIDIA DeepStream SDK快速入門指南》和《NVIDIA DeepStream插件手冊(cè)》。
為了將張量數(shù)據(jù)后處理到邊界框中,本示例使用一個(gè)名為的自定義邊界框解析器,該解析器NvDsInferParseCustomTfSSD由custom_parse_bbox_funcconfig文件中的鍵指定。此自定義函數(shù)custom_lib在以下配置文件的部分下指定的庫(kù)中編譯。的源代碼在NvDsInferParseCustomTfSSD中提供$DEEPSTREAM_DIR/sources/libs/nvdsinfer_customparser/。
infer_config {
unique_id:5
gpu_ids:[0]
max_batch_size:4
后端{(lán)
trt_is {
型號(hào)名稱:“ ssd_inception_v2_coco_2018_01_28”
版本:-1
model_repo {
根目錄:“ …/…/ trtis_model_repo”
log_level:2
tf_gpu_memory_fraction:0.6
tf_disable_soft_placement:0
}
}
}
預(yù)處理{
網(wǎng)絡(luò)格式:IMAGE_FORMAT_RGB
張量順序:TENSOR_ORDER_NONE
maintain_aspect_ratio:0
規(guī)范化{
scale_factor:1.0
channel_offsets:[0,0,0]
}
}
后期過(guò)程 {
labelfile_path:“ …/…/ trtis_model_repo / ssd_inception_v2_coco_2018_01_28 / labels.txt”
檢測(cè){
num_detected_classes:91
custom_parse_bbox_func:“ NvDsInferParseCustomTfSSD”
nms {
置信度閾值:0.3
iou_threshold:0.4
最高紀(jì)錄:20
}
}
}
額外的 {
copy_input_to_host_buffers:否
}
custom_lib {
路徑:“ / opt / nvidia / deepstream / deepstream-5.0 / lib / libnvds_infercustomparser.so”
}
}
input_control {
進(jìn)程模式:PROCESS_MODE_FULL_FRAME
間隔:0
}
現(xiàn)在,使用以下命令運(yùn)行該應(yīng)用程序:
deepstream-app -c source1_primary_detector.txt
應(yīng)打開(kāi)一個(gè)帶有示例視頻的彈出窗口,其中顯示了行人,汽車和自行車周圍的邊界框。
應(yīng)用程序需要花費(fèi)幾分鐘來(lái)構(gòu)建TensorFlow圖。如果應(yīng)用程序無(wú)法運(yùn)行并返回“已殺死”,則很可能是系統(tǒng)內(nèi)存不足。檢查系統(tǒng)內(nèi)存使用情況以確認(rèn)問(wèn)題。如果是內(nèi)存問(wèn)題,則根據(jù)tf_gpu_memory_fraction模型修改infer_configin中的參數(shù)config_infer_primary_detector_ssd_inception_v2_coco_2018_01_28.txt,或其他nvinferserver適用的配置文件。此參數(shù)為TF模型分配每個(gè)進(jìn)程的GPU內(nèi)存份額。將其更改為0.4可能會(huì)有所幫助。有關(guān)如何使用此參數(shù)的更多信息,請(qǐng)參閱DS插件手冊(cè)– Gst-inferserver。
該模型最多可以檢測(cè)91個(gè)類別,包括各種動(dòng)物,食物和運(yùn)動(dòng)器材。有關(guān)可以檢測(cè)到的類的更多信息,請(qǐng)參見(jiàn)trtis-model-repo/ssd_inception_v2_coco_2018_01_28/labels.txt文件。
嘗試將這個(gè)應(yīng)用程序與其他視頻一起運(yùn)行,看看該模型是否可以檢測(cè)到其他類。使用海衛(wèi)服務(wù)器與的自定義DeepStream管道,檢查出的源代碼deepstream-app下$DEEPSTREAM_DIR/sources/apps/sample-apps/deepstream-app。
Python綁定
Python易于使用,并且在創(chuàng)建AI模型時(shí)被數(shù)據(jù)科學(xué)家和深度學(xué)習(xí)專家廣泛采用。NVIDIA引入了Python綁定,以幫助使用Python構(gòu)建高性能的AI應(yīng)用程序。可以使用GStreamer框架的Python綁定Gst-Python構(gòu)造DeepStream管道。
圖3. Python綁定堆棧。
DeepStream Python應(yīng)用程序使用Gst-Python API操作構(gòu)造管道,并使用探測(cè)函數(shù)訪問(wèn)管道中各個(gè)點(diǎn)的數(shù)據(jù)。數(shù)據(jù)類型全部在本機(jī)C中,并且需要通過(guò)PyBindings或NumPy的填充層才能從Python應(yīng)用程序訪問(wèn)。張量數(shù)據(jù)是推斷后得出的原始張量輸出。如果要檢測(cè)對(duì)象,則需要通過(guò)解析和聚類算法對(duì)該張量數(shù)據(jù)進(jìn)行后處理,以在檢測(cè)到的對(duì)象周圍創(chuàng)建邊界框。
利用張量數(shù)據(jù)的可用性,可以在Python應(yīng)用程序內(nèi)部創(chuàng)建解析算法。這很重要,因?yàn)閺埩繑?shù)據(jù)的大小和尺寸以及解析數(shù)據(jù)所需的解析和聚類算法取決于AI模型的類型。如果希望能夠?qū)⑿碌哪P突蛐碌暮筇幚砑夹g(shù)引入DeepStream,則將發(fā)現(xiàn)非常有用。
另一個(gè)有用的數(shù)據(jù)源是圖像數(shù)據(jù)。這可用于捕獲AI模型拾取對(duì)象的異常,并且想要保存圖像以供將來(lái)參考?,F(xiàn)在通過(guò)該應(yīng)用程序支持訪問(wèn)此框架。
DeepStream元數(shù)據(jù)的Python綁定與示例應(yīng)用程序一起可用,以演示其用法。可以從GitHub存儲(chǔ)庫(kù)NVIDIA-AI-IOT / deepstream_python_apps下載Python示例應(yīng)用程序。Python綁定模塊現(xiàn)已作為DeepStream SDK軟件包的一部分提供。
遠(yuǎn)程管理和控制應(yīng)用程序
從邊緣向云發(fā)送元數(shù)據(jù)很有用,但能夠從云接收和控制消息到邊緣也很重要。
DeepStream 5.0現(xiàn)在支持雙向通信,以發(fā)送和接收云到設(shè)備的消息。這對(duì)于各種用例來(lái)說(shuō)尤其重要,例如觸發(fā)應(yīng)用程序記錄重要事件,更改操作參數(shù)和應(yīng)用程序配置,空中(OTA)更新或請(qǐng)求系統(tǒng)日志和其他重要信息。
圖4.雙向消息傳遞體系結(jié)構(gòu)。
DeepStream應(yīng)用程序可以訂閱Apache Kafka主題,以從云中接收消息。設(shè)備到云的消息傳遞當(dāng)前是通過(guò)Gstnvmsgbroker(MSGBROKER)插件進(jìn)行的。默認(rèn)情況下,Gstnvmsgbroker插件使用適當(dāng)?shù)膮f(xié)議調(diào)用較低級(jí)的適配器庫(kù)。可以在Kafka,AMQP,MQTT或Azure IoT之間進(jìn)行選擇,甚至可以創(chuàng)建自定義適配器。DeepStream 5.0引入了新的低級(jí)msgbroker庫(kù),以提供統(tǒng)一的接口,用于跨各種協(xié)議的雙向消息傳遞。Gstnvmsgbroker插件可以選擇與此新庫(kù)進(jìn)行接口連接,而不必直接調(diào)用協(xié)議適配器庫(kù),這是使用配置選項(xiàng)控制的。
對(duì)于云到邊緣消息傳遞,DeepStream 5.0中受支持的協(xié)議是Kafka,使用新的低級(jí)msgbroker庫(kù),可直接與DeepStream應(yīng)用程序進(jìn)行交互。
DeepStream 5.0支持其他幾種IoT功能,這些功能可以與雙向消息傳遞結(jié)合使用。DeepStream現(xiàn)在提供了一個(gè)API,可根據(jù)異常消息或可能發(fā)送給設(shè)備的消息進(jìn)行智能記錄。此外,在應(yīng)用程序運(yùn)行時(shí),DeepStream還支持AI模型的OTA更新。
智能錄像
通常需要進(jìn)行基于事件的視頻錄制。代替連續(xù)記錄內(nèi)容,智能記錄可以節(jié)省寶貴的磁盤空間并可以提供更快的可搜索性。
智能記錄僅在滿足特定規(guī)則或條件時(shí)記錄事件。發(fā)出記錄信號(hào)的觸發(fā)器可以來(lái)自應(yīng)用程序本地,來(lái)自邊緣運(yùn)行的某些服務(wù)或來(lái)自云。
圖5.智能記錄架構(gòu)。
提供了豐富的API以構(gòu)建智能錄制事件管理器。這些操作可隨時(shí)用于開(kāi)始和停止記錄。當(dāng)必須記錄事件時(shí),在觸發(fā)器之前開(kāi)始保存剪輯很有用。通過(guò)智能記錄API操作,可以將其配置為記錄事件發(fā)生前的時(shí)間。這非常有用,因?yàn)樵跈z測(cè)到并觸發(fā)異常時(shí),在異常發(fā)生與錄制事件管理器開(kāi)始錄制之間存在一定的延遲。在記錄開(kāi)始提供整個(gè)事件序列之前,記錄一段有限的時(shí)間。
為了演示此功能,在deepstream-test5應(yīng)用程序中內(nèi)置了一個(gè)智能錄制事件管理器。智能記錄模塊保留視頻緩存,以便記錄的視頻不僅在事件生成后具有幀,而且還可以在事件之前具有幀??梢愿鶕?jù)使用情況配置視頻緩存的大小。事件管理器啟動(dòng)智能記錄模塊的開(kāi)始和停止選項(xiàng)。
可以通過(guò)從云接收到的JSON消息來(lái)觸發(fā)記錄。消息格式如下:
{
命令:字符串// <開(kāi)始記錄/停止記錄>
開(kāi)始:字符串//“ 2020-05-18T20:02:00.051Z”
結(jié)束:字符串//“ 2020-05-18T20:02:02.851Z”,
傳感器: {
id:字符串
}
}
deepstream-test5示例應(yīng)用程序演示了如何從云中接收和處理此類消息。目前支持Kafka。要激活此功能,請(qǐng)?jiān)趹?yīng)用程序配置文件中填充并啟用以下塊:
配置該組以啟用云消息使用者。
[message-consumer0]
啟用= 1
proto-lib = / opt / nvidia / deepstream / deepstream-5.0 / lib / libnvds_kafka_proto.so
conn-str =;
config-file =
subscription-topic-list = ;;
如果消息的傳感器名稱為id而不是索引(0、1,2等),請(qǐng)使用此選項(xiàng)。
傳感器列表文件= dstest5_msgconv_sample_config.txt
在應(yīng)用程序運(yùn)行時(shí),使用Kafka代理在主題中發(fā)布上述JSON消息subscribe-topic-list以開(kāi)始和停止記錄。
有關(guān)如何在應(yīng)用程序中使用此功能的更多信息,請(qǐng)參見(jiàn)《NVIDIA DeepStream插件手冊(cè)》的“智能視頻記錄”部分??梢栽谝韵履夸浿姓业絛eepstream-test5的源代碼:
$ DEEPSTREAM_DIR / sources / apps / sample_apps / deepstream-test5 /
智能記錄事件管理器的實(shí)現(xiàn)可以在以下文件中找到:
$ DEEPSTREAM_DIR / sources / apps / apps-common / src / deepstream_source_bin.c
OTA模型更新
邊緣IVA應(yīng)用程序的理想要求之一是隨著AI模型的增強(qiáng)以實(shí)現(xiàn)更高的準(zhǔn)確性,實(shí)時(shí)修改或更新AI模型。使用DeepStream 5.0,現(xiàn)在可以在應(yīng)用程序運(yùn)行時(shí)更新模型。這意味著可以使用零停機(jī)時(shí)間來(lái)更新模型。這對(duì)于不能接受任何延遲的關(guān)鍵任務(wù)應(yīng)用程序很重要。
當(dāng)需要連續(xù)交換模型時(shí),此功能也很有用。例如,可以根據(jù)一天中的時(shí)間交換模型。通常,一個(gè)模型在光線充足的白天可能效果很好,但是另一種模型在光線不足的情況下效果會(huì)更好。在這種情況下,需要根據(jù)一天中的時(shí)間輕松地交換模型,而無(wú)需重新啟動(dòng)應(yīng)用程序。假設(shè)要更新的模型應(yīng)具有相同的網(wǎng)絡(luò)參數(shù)。
在示例應(yīng)用程序中,模型更新由用戶修改配置文件啟動(dòng)。DeepStream應(yīng)用程序監(jiān)視配置文件中所做的更改并進(jìn)行驗(yàn)證。在確認(rèn)更改之后,DeepStream OTA處理程序?qū)⒔粨Q到新模型,從而完成該過(guò)程。
圖6. OTA模型更新工作流程。
在Deepstream-test5應(yīng)用程序中使用提供的源代碼演示了此功能。要運(yùn)行OTA模型更新,請(qǐng)使用-o選項(xiàng)運(yùn)行該應(yīng)用程序。這是OTA覆蓋文件。要交換模型時(shí),請(qǐng)使用新的模型引擎文件更新此文件。
deepstream-test5 -c <DS配置> -o <OTA覆蓋>
更新后的模型必須是TensorRT引擎文件,并且在更改OTA覆蓋文件之前先離線完成。要?jiǎng)?chuàng)建TensorRT引擎文件,請(qǐng)運(yùn)行trtexec:
trtexec --model = --maxBatch = --saveEngine = --deploy = --buildOnly
生成模型后,更新OTA覆蓋文件。當(dāng)應(yīng)用程序檢測(cè)到此更改時(shí),將自動(dòng)啟動(dòng)模型更新過(guò)程。在實(shí)際環(huán)境中,將需要邊緣上的守護(hù)程序或服務(wù)來(lái)更新邊緣上的文件或從云中更新文件。
安全通訊
對(duì)于大規(guī)模成功部署IoT設(shè)備而言,最重要且被忽略的方面之一是安全性:能夠在邊緣設(shè)備與云之間安全地通信。對(duì)于公司而言,保護(hù)物聯(lián)網(wǎng)設(shè)備以及在受信任位置之間收發(fā)敏感數(shù)據(jù)至關(guān)重要。
使用DeepStream 5.0,Kafka適配器支持使用基于TLS的加密的安全通信,從而確保數(shù)據(jù)的機(jī)密性。TLS(傳輸層安全性)是SSL的后繼產(chǎn)品,但是這兩個(gè)術(shù)語(yǔ)在文獻(xiàn)中仍可互換使用。TLS / SSL通常用于在連接到Web上的服務(wù)器(例如HTTPS)時(shí)進(jìn)行安全通信。TLS使用公共密鑰密碼術(shù)來(lái)建立會(huì)話密鑰,DeepStream應(yīng)用程序和代理均對(duì)稱使用該會(huì)話密鑰來(lái)加密在會(huì)話期間傳輸?shù)臄?shù)據(jù),從而即使在公共網(wǎng)絡(luò)上發(fā)送數(shù)據(jù)時(shí)也可以保持機(jī)密。
DeepStream 5.0支持兩種形式的客戶端身份驗(yàn)證:基于SSL證書的雙向TLS身份驗(yàn)證和基于用戶名/密碼機(jī)制的SASL / Plain身份驗(yàn)證。客戶端身份驗(yàn)證使代理能夠驗(yàn)證連接到客戶端的客戶端,并根據(jù)其身份有選擇地提供訪問(wèn)控制。雖然SASL / Plain使用熟悉的密碼身份驗(yàn)證隱喻并且易于設(shè)置,但是雙向TLS使用客戶端證書進(jìn)行身份驗(yàn)證,并提供了一些優(yōu)點(diǎn),這些優(yōu)點(diǎn)使得可以實(shí)現(xiàn)可靠的安全機(jī)制。
有關(guān)實(shí)現(xiàn)安全連接的更多信息,請(qǐng)參見(jiàn)《NVIDIA DeepStream插件手冊(cè)》。
圖7.使用SSL證書的安全身份驗(yàn)證。
使用Mask R-CNN進(jìn)行實(shí)例分割
為了感知導(dǎo)致可行見(jiàn)解的像素,計(jì)算機(jī)視覺(jué)依賴于深度學(xué)習(xí)來(lái)提供對(duì)環(huán)境的理解。對(duì)象檢測(cè)是一種常用的技術(shù),用于識(shí)別框架中的單個(gè)對(duì)象,例如人或汽車。盡管對(duì)象檢測(cè)對(duì)于某些應(yīng)用程序很有用,但是當(dāng)想要了解像素級(jí)別的對(duì)象時(shí),就不足。
實(shí)例分割可在識(shí)別對(duì)象時(shí)提供像素級(jí)的準(zhǔn)確性。對(duì)于需要在對(duì)象及其背景之間劃定界限的應(yīng)用程序(例如在AI驅(qū)動(dòng)的綠屏中),希望在其中模糊或更改框架的背景或在框架中分割道路或天空時(shí),分段功能非常有用。也可以用于通過(guò)輸出中的實(shí)例蒙版來(lái)提高跟蹤器的準(zhǔn)確性。
DeepStream使用新的自定義解析器進(jìn)行后期處理,屏幕顯示(OSD)中的遮罩疊加功能(用于渲染分段遮罩),新的遮罩元數(shù)據(jù)類型以及新的消息架構(gòu)來(lái)標(biāo)識(shí)管道中的多邊形,從而在管道中實(shí)現(xiàn)實(shí)例分段。消息轉(zhuǎn)換器??梢允褂酶櫰髦械难诖a元數(shù)據(jù)來(lái)改進(jìn)跟蹤,在屏幕上呈現(xiàn)掩碼或通過(guò)消息代理發(fā)送掩碼元數(shù)據(jù)以進(jìn)行脫機(jī)分析。
圖8. Mask R-CNN DeepStream管道。
要開(kāi)始使用Mask R-CNN,請(qǐng)從NVIDIA-AI-IOT / deepstream_tlt_apps#tlt-models GitHub存儲(chǔ)庫(kù)下載預(yù)訓(xùn)練的模型。該模型在NVIDIA內(nèi)部汽車行車記錄儀圖像數(shù)據(jù)集上進(jìn)行了訓(xùn)練,以識(shí)別汽車。有關(guān)更多信息,請(qǐng)參閱使用NVIDIA Transfer Learning Toolkit通過(guò)MaskRCNN進(jìn)行實(shí)例分割的訓(xùn)練模型。
DeepStream SDK包含兩個(gè)示例應(yīng)用程序,以演示如何使用預(yù)訓(xùn)練的Mask R-CNN模型。Mask R-CNN模型可以從調(diào)用deepstream-app。以下目錄中提供了用于配置管道和模型的配置:
$ DEEPSTREAM_DIR / samples / configs / tlt_pretrained_models /
這是為Mask R-CNN模型運(yùn)行的關(guān)鍵配置文件:
$ DEEPSTREAM_DIR / samples / configs / tlt_pretrained_models / deepstream_app_source1_mrcnn.txt
$ DEEPSTREAM_DIR / samples / configs / tlt_pretrained_models / config_infer_primary_mrcnn.txt
/deepstream_app_source1_mrcnn.txt是主要的配置文件,deepstream-app并為整個(gè)視頻分析管道配置參數(shù)。有關(guān)更多信息,請(qǐng)參見(jiàn)參考應(yīng)用程序配置。這是必須根據(jù)模型修改的關(guān)鍵參數(shù)。在下[OSD],將display-mask選項(xiàng)更改為1,該選項(xiàng)將在對(duì)象上覆蓋蒙版。
[osd]
啟用= 1
gpu-id = 0
border-width = 3
文字大小= 15
text-color = 1; 1; 1; 1;
text-bg-color = 0.3; 0.3; 0.3; 1
font = Serif
display-mask = 1
display-bbox = 0
顯示文字= 0
該/config_infer_primary_mrcnn.txt文件是一個(gè)推理配置文件,用于設(shè)置Mask R-CNN推理的參數(shù)。本節(jié)deepstream_app_source1_mrcnn.txt下的主配置引用了此文件[primary-gie]。這是運(yùn)行Mask R-CNN所需的關(guān)鍵參數(shù):
[財(cái)產(chǎn)]
gpu-id = 0
凈比例因子= 0.017507
偏移量= 123.675; 116.280; 103.53
模型顏色格式= 0
tlt-model-key =
tlt-encoded-model =
output-blob-names = generate_detections; mask_head / mask_fcn_logits / BiasAdd
parse-bbox-instance-mask-func-name = NvDsInferParseCustomMrcnnTLT
custom-lib-path = / opt / nvidia / deepstream / deepstream-5.0 / lib / libnvds_infercustomparser.so
network-type = 3 ## 3例如是細(xì)分網(wǎng)絡(luò)
labelfile-path =
int8-calib-file =
推斷尺寸=
num-detected-classes = <與默認(rèn)值不同的類數(shù)>
uff-input-blob-name =輸入
批量大小= 1
0 = FP32、1 = INT8、2 = FP16模式
網(wǎng)絡(luò)模式= 2
間隔= 0
gie-unique-id = 1
沒(méi)有集群
0 =組矩形,1 = DBSCAN,2 = NMS,3 = DBSCAN + NMS混合,4 =無(wú)(無(wú)聚類)
MRCNN僅支持cluster-mode = 4;聚類由模型本身完成
集群模式= 4
output-instance-mask = 1
該parse-bbox-instance-mask-func-name選項(xiàng)設(shè)置自定義后處理功能以解析推斷的輸出。此功能內(nèi)置到.so文件中custom-lib-path。以下目錄中提供了該庫(kù)的源代碼:
$ DEEPSTREAM_DIR / sources / libs / nvdsinfer_customparser / nvdsinfer_custombboxparser.cpp。
要運(yùn)行該應(yīng)用程序,請(qǐng)運(yùn)行以下命令:
deepstream-app -c deepstream_app_source1_mrcnn.txt
在SDK中提供的剪輯上運(yùn)行。要嘗試使用自己的來(lái)源,請(qǐng)[source0]在中進(jìn)行修改/deepstream_app_source1_mrcnn.txt。圖9顯示了deepstream-app在各種平臺(tái)上可以預(yù)期的端到端性能。性能以每秒處理的幀數(shù)(FPS)衡量deepstream-app:
? 在Jetson Nano和DLA上,此批處理大小為1。
? 在Jetson AGX Xavier和Xavier NX上,此批處理大小為2。
? 在T4上,此批量運(yùn)行為4。
圖9.性能牛逼他面膜R-CNN模型。
盡管最好直觀地看到輸出,但實(shí)際的用例可能是將元數(shù)據(jù)發(fā)送到其他進(jìn)程或云。此信息可由邊緣或云上的其他應(yīng)用程序使用,以進(jìn)行進(jìn)一步分析。
使用DeepStream,可以使用定義的遮罩多邊形模式,使用受支持的消息代理協(xié)議之一(例如Kafka或MQTT)發(fā)送遮罩元數(shù)據(jù)。DeepStream附帶了MaskRCNN模型的“從云端到云端”的示例。有關(guān)如何使用消息代理準(zhǔn)備事件元數(shù)據(jù)和發(fā)送掩碼信息的更多信息,請(qǐng)參見(jiàn)以下應(yīng)用程序:
$ DEEPSTREAM_DIR / sources / apps / sample_apps / deepstream-mrcnn-app
建立部署
DeepStream 5.0提供了許多出色的功能,可以輕松地開(kāi)始開(kāi)發(fā)用于邊緣部署的AI應(yīng)用程序??梢允褂肞ython API操作和Triton Server來(lái)快速原型化并創(chuàng)建IVA管道,而無(wú)需花費(fèi)太多精力。
可以使用Triton Server在培訓(xùn)框架中本地部署AI模型,以增加靈活性。可以使用大量強(qiáng)大的物聯(lián)網(wǎng)功能來(lái)創(chuàng)建可管理的IVA應(yīng)用程序??梢允褂秒p向TLS身份驗(yàn)證將消息從邊緣安全地發(fā)送到云。邊緣和云之間的雙向通信提供了更好的應(yīng)用程序可管理性。這可用于更新邊緣的AI模型,記錄感興趣的事件,或用于從設(shè)備檢索信息。
總結(jié)
以上是生活随笔為你收集整理的NVIDIA DeepStream 5.0构建智能视频分析应用程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 稀疏自编码器及TensorFlow实现
- 下一篇: 将Tensor核心引入标准Fortran