使用DeepStream 2.0加速视频分析开发

翻译自:https://devblogs.nvidia.com/accelerate-video-analytics-deepstream-2/

智慧城市的规模令人难以置信。全球将部署数十亿的传感器,用于使每个街道,公路,公园,机场,停车场和建筑物更加高效。这可以更好地设计我们的道路,以减少拥堵,更好地了解零售环境中的消费者行为,以及快速找到失去的孩子以保持城市安全的能力。视频代表了所使用的最丰富的传感器之一,产生需要分析的大量数据流。 NVIDIA DeepStream 2.0使开发人员能够快速,简单地创建视频分析应用程序。

人类目前只处理捕获视频的一小部分。传统方法远不如人类解释可靠。智能视频分析通过深度学习以实时精确的方式理解视频,从而解决了这一挑战。

NVIDIA发布了针对特斯拉的DeepStream软件开发套件(SDK)2.0,以解决最具挑战性的智能城市问题。 DeepStream是NVIDIA Metropolis平台的关键部分。该技术使开发人员能够为智能视频分析(IVA)设计和部署可扩展的AI应用程序。接近100个NVIDIA Metropolis合作伙伴已经提供了在GPU上使用深度学习的产品和应用程序。

DeepStream SDK 2.0允许开发人员为智慧城市和视频分析创建灵活且可扩展的基于AI的解决方案。它包括TensorRT™和CUDA®,以结合最新的AI技术并加速视频分析工作量。

DeepStream 2.0为开发人员提供了以下工具:

  • 并行多视频流处理:通过深度学习和加速多媒体图像处理创建高流密度应用程序,以大规模构建解决方案。
  • 异构并发神经网络架构:利用多个神经网络处理每个视频流,为开发人员提供动力和灵活性,以便为更智能的洞察提供不同的深度学习技术。
  • 可配置的处理流水线:轻松创建灵活、直观的基于图形的应用程序,从而实现高度优化的流水线,实现最大吞吐量。

此版本还包括参考插件,应用程序,预训练神经网络和参考框架。

1 DeepStream 2.0的工作流

DeepStream SDK基于开源GStreamer多媒体框架。插件架构提供视频编码/解码,缩放,推理等功能。可以链接插件以创建应用程序流水线。应用程序开发人员可以利用作为此SDK一部分提供的NVIDIA平台的参考加速插件。

DeepStream SDK包括参考应用程序,参考RESNET神经网络和测试流。表1显示了NVIDIA硬件加速的一些插件。

表1 NVIDIA加速插件

插件名称 功能
gst-nvvideocodecs 加速H265和H264视频解码器
gst-nvstreammux 流复用和批处理
gst-nvinfer 基于TensorRT的检测和分类的推断
gst-nvtracker KLT跟踪器实现
gst-nvosd 用于绘制框和文本叠加的API
gst-tiler 将视频帧从多源渲染为2D阵列
gst-eglglessink 基于加速X11 / EGL的渲染器插件
gst-nvvidconv 缩放,格式转换,旋转

2 DeepStream SDK

DeepStream SDK由一组软件构建块组成,它们在低级API(如TensorRT和Video Codec SDK)和用户应用程序之间进行分层,如图1所示。

使用DeepStream 2.0加速视频分析开发_第1张图片
图1 DeepStream SDK信息图

3 DeepStream应用

DeepStream应用程序是一组以图形方式连接的模块化插件。每个插件代表一个功能块,如使用TensorRT或多流解码的推理。在适用的情况下,使用底层硬件加速插件以提供最高性能。每个插件都可以根据需要在应用程序中多次实例化。

3.1 配置文件

DeepStream包含许多高度可配置的插件,可实现高度的应用程序自定义。这使开发人员可以根据用例和应用程序更改插件参数。配置文件由作为SDK的一部分包含的简单文本文件组成。我们来看一下下面配置文件的一个例子:

DeepStream 2.0 reference config file: source4_720p_resnet_dec_infer_tracker_sgie_tiled_display_int8.txt.

配置文件的结构和参数在“DeepStream用户指南”中定义。下面的代码段说明了一些关键参数及其用法。

例如,要设置性能测量的参考应用程序,请配置以下参数:
enable-perf-measurement = 1 //启用性能测量
perf-measurement-interval-sec = 10 //性能指标的采样间隔(以秒为单位)
flow-original-resolution = 1 //流复用器在流水线中流动原始输入帧
#gie -kitti-output-dir = / home / ubuntu / kitti_data / // KITTI元数据文件的位置

DeepStream支持多种输入源,如摄像头和文件。此配置文件允许您选择输入源,然后将视频流式传输到应用程序。

输入源配置示例:
[source0]
enable = 1 //启用source0输入

#Type - 1 = CameraV4L2 2 = URI 3 = MultiURI
// 1)输入源可以是USB Camera(V4L2)// 2)编码流的URI 。可以是文件,HTTP URI或RTSP实时源// 3)从多源输入中选择URL
type= 3 //选择输入源类型uri = file://…/…/streams/sample_720p。 mp4 //编码源的实际路径。
num-sources = 1 //输入源数量。
gpu-id = 0 //流水线在单个系统中运行的GPU ID

3.2 数据流

DeepStream附带一个参考应用程序,可实时显示多个摄像机流的智能视频分析。提供的参考应用程序接受来自各种类型的源(如摄像机,RTSP流和磁盘)的输入。它可以同时接受来自多个源的RAW或编码视频数据。视频聚合器插件(nvstreammux)从这些输入源形成一批缓冲区。然后,基于TensorRT的插件(nvinfer)检测此批帧中的主要对象。基于KLT的跟踪器元素(nvtracker)为每个对象生成唯一ID并跟踪它们

相同的nvinfer插件与辅助网络一起用于辅助对象检测或主要对象的属性分类。有关参考应用,请参见图2。

使用DeepStream 2.0加速视频分析开发_第2张图片图2.参考应用程序架构和流程

Tiler插件(nvmultistreamtiler)将此批次合成为单个2D帧。 DeepStream OSD插件(nvosd)使用生成的元数据在合成帧上绘制阴影框,矩形和文本,如图3所示。

图3.参考应用程序输出

元数据包含图中所有插件生成的信息。每个插件都会向元数据添加增量信息。 NvDsMeta结构由应用程序中的所有组件使用,以表示与对象相关的元数据。有关DeepStream元数据规范,请参阅gstnvivameta_api.h和相关文档。

4 自定义算法

DeepStream SDK提供了一个模板插件,可用于实现自定义库,算法和神经网络,以便通过应用程序图形无缝地实现即插即用功能。此模板的源位于gst-dsexample_sources的sources目录中。

4.1 Sample Plugin: gst-dsexample

作为模板插件的一部分,提供了静态库dsexample_lib,用于连接自定义IP。该库生成字符串标签,以显示库输出与DeepStream SDK元数据格式的集成。该库实现了四个功能:
DsExampleCtx_Init - >初始化自定义库
DsExampleCtx_Deinit - >取消初始化自定义库
DsExample_QueueInput - >队列输入帧/对象裁剪处理
DsExample_DequeueOutput - > Dequeue处理后的输出

该插件不会生成任何新缓冲区。它只添加/更新现有元数据,使其成为就地变换。

插件中可调用的其他功能包括:
start:获取资源,分配内存,初始化示例库。
stop:取消初始化示例库,释放资源和内存。
set_caps:获取将流经此元素的视频功能(即分辨率,颜色格式,帧速率)。可以在此处完成依赖于输入视频格式的分配/初始化。
transform_ip:上游元素推送缓冲区时调用。找到主检测器的元数据,使用get_converted_mat获取推送到库所需的缓冲区。将数据推送到示例库。弹出示例库输出。使用attach_metadata_full_frame或attach_metadata_object附加/更新元数据。
get_converted_mat_dgpu:根据主检测器元数据中的坐标,对整个帧或对象进行缩放/转换/裁剪输入缓冲区。
free_iva_meta:当该元素附加的元数据被销毁时,由GStreamer框架调用。
attach_metadata_full_frame:显示插件如何附加自己的元数据。
attach_metadata_object:显示插件如何更新主检测器检测到的对象的标签。

该应用程序需要进行其他更改,以解析与库相关的配置文件,并将此新的自定义元素添加到流水线中。有关所需的更改,请参阅nvgstiva-app_sources中的以下文件:

src/deepstream_dsexample.c
includes/deepstream_dsexample.c
src/deepstream_config_file_parser.c
src/deepstream_app.c
includes/deepstream_app.h

4.2 启用和配置示例插件

预编译的deepstream-app二进制文件已经包含了解析配置并将样本元素添加到流水线的功能。将以下部分添加到现有配置文件以启用和配置插件:
enable = 1 // 启用示例插件
gpu-id = 0 // GPU ID用于多个GPU处理
processing-width= 640 //此插件处理的操作图像宽度
processing- height= 480 //为此插件处理的图像高度
full-frame = 0 //在上游组件给出的各个边界框/对象上操作(例如,主要模型)
unique-id = 15 //插件的唯一ID(应该> = 15)以通过以下方式识别其元数据申请或其他要素

4.3 在示例插件中实现自定义逻辑

在插件中实现自定义逻辑或算法需要使用任何其他自定义库的相应功能替换以下函数调用。包括DsExampleCtx_Init,DsExampleCtx_Deinit,DsExample_QueueInput,
DsExample_DequeueOutput。

5 构建一个典型应用

DeepStream SDK可用于构建用于图像和视频分析的自定义应用程序。以下部分显示了人员统计应用程序的简单方法,如图4所示。

使用DeepStream 2.0加速视频分析开发_第3张图片图4.典型人数统计应用程序的逻辑流程

考虑使用IP摄像头捕获实时馈送,以便在人们进入和离开某个位置时对其进行监控。编码的相机流需要被解码为H.264或H.265格式。一旦流被解码,推理引擎识别人并给出边界框。这些边界框输入到对象跟踪器中,该跟踪器为每个人生成唯一的ID。然后,可以将得到的分析输出到开发人员需要的任何显示以及存储以供以后使用。

图5显示了DeepStream SDK中的关键元素,它支持上面概述的完整应用程序。

使用DeepStream 2.0加速视频分析开发_第4张图片图5.实现人员跟踪应用程序示例所需的DeepStream 2.0元素

该示例演示了连接基本构建块的简单性。开发人员可以从DeepStream SDK映射多组GStreamer插件,以形成完整的解决方案。

通过引用参考应用程序中的元数据API规范和process_buffer函数,可以理解访问元数据的方式。

6 DeepStream性能

DeepStream表示一个并发软件系统,其中各种插件在处理和通过流水线传递帧时一起执行。 DeepStream应用程序的性能取决于各个插件的执行特性,以及它们在并发执行时共享底层硬件的效率。

帧吞吐量是底层硬件是否能够支持基于输入视频和流计数的应用程序的实时执行的确定指示。作为SDK的一部分提供的参考应用程序说明了使用GStreamer探测功能来定期显示控制台的每个流吞吐量。图6说明了以30 fps处理输入视频的应用程序没有性能瓶颈的情况。

使用DeepStream 2.0加速视频分析开发_第5张图片图6 理想状况:以30fps处理视频

图7中第二种情况慢于实时处理。
使用DeepStream 2.0加速视频分析开发_第6张图片图7 吞吐量小于30fps表明存在性能瓶颈

虽然吞吐量仍然是识别应用程序是否遇到性能瓶颈的便利指标,但硬件利用率有助于我们了解系统中的哪个实体是瓶颈。通常会影响基于DeepStream的应用程序性能的系统硬件特性包括可用内存大小和带宽,GPU核心数,GPU时钟频率和CPU配置。用于主机到设备内存传输的设备内存带宽和PCIe带宽都会对性能产生影响。

这些因素决定了视频流水线中每个插件的吞吐量,从而决定了整个流水线的吞吐量。基于DeepStream的应用程序通常是受限于解码、推理(计算)绑定或CPU,这取决于深度学习工作负载的复杂性。使用诸如nvidia-smi之类的工具来监控GPU利用率与TOP等标准Linux实用程序相结合来监控CPU利用率,这表明哪些硬件解码器(NVDEC),GPU核心或CPU显示出高度的利用率,从而确定潜在的瓶颈。

吞吐量和利用率度量的使用提供了一种快速有效的方法,通过该方法可以建立应用程序的执行性能,还可以识别硬件(插件)瓶颈。使用NVIDIA Nsight和NVIDIA NVVP等工具进行内核级分析,有助于分解插件的执行并理解与其他插件的交互效果。这些工具在建立插件底层内核执行时的并发性方面特别有用,这对于最大化流水线性能至关重要。

7 参考应用的性能

SDK提供的参考应用程序代表了一个复杂的用例,包括多流输入,级联网络和集成到流水线中的跟踪功能。在基于Tesla P4的系统上执行时,该应用程序可实现25个HD输入流的实时30fps吞吐量。

用于性能测量的系统配置:

CPU – Intel® Xeon(R) CPU E5-2620 v4 @ 2.10GHz × 2
GPU – Tesla P4
System Memory – 256 GB DDR4, 2400MHz
Ubuntu 16.04
GPU Driver – 396.26
CUDA – 9.2
TensorRT – 4.0
GPU clock frequency – 1113 MHz

图8显示了在包含25路帧率为30的720p视频进行处理时的硬件利用率,其中包括主检测器,跟踪器,三个辅助分类器和平铺显示器。

使用DeepStream 2.0加速视频分析开发_第7张图片图8 使用Tesla P4运行多个720p流时的资源使用情况

你可能感兴趣的:(DeepStream)