一、Gst-nvinfer
Gst-nvinfer插件使用NVIDIA®TensorRT™对输入数据进行推断。该插件从上游接受批处理的NV12 / RGBA缓冲区。NvDsBatchMeta结构必须已经附加到Gst缓冲区。低级库(libnvds_infer)可对尺寸为“网络高度”和“网络宽度”的INT8 RGB,BGR或GREY数据进行操作。Gst-nvinfer插件根据网络要求在输入帧上执行转换(格式转换和缩放),并将转换后的数据传递到低级库。低级库对转换后的帧进行预处理(执行归一化和均值减法),并生成最终的float RGB / BGR / GRAY平面数据,该数据将传递到TensorRT引擎进行推理。低级库生成的输出类型取决于网络类型
二、Gst-nvinferserver
Gst-nvinferserver插件使用对应于NGC容器20.03的NVIDIA®Triton Inference Server(以前称为TensorRT Inference Server)1.12.0版对输入数据进行推断。请参阅 https://docs.nvidia.com/cn/deeplearning/triton-inference-server/user-guide/docs/index.html以获得Triton Inference Server(Triton)文档。插件接受批量NV12/RGBA
来自上游的缓冲区。NvDsBatchMeta结构必须已经附加到Gst缓冲区。低级库(libnvds_infer_server)在NV12或RGBA缓冲区中的任何一个上运行。Gst-nvinferserver插件将输入的批处理缓冲区传递给低级库,并等待结果可用。同时,它会在接收到输入缓冲区时将输入缓冲区排队。一旦可从低级库获得结果,插件将转换结果并将其附加回下游插件的Gst-buffer中。低级库对转换后的帧进行预处理(执行颜色转换和缩放,归一化和均值减法)并生成最终FP32/FP16/INT8/UINT8/INT16/UINT16/INT32/UINT32 RGB/BGR/GRAY planar/
打包的数据,这些数据将传递到Triton进行推理。低级库生成的输出类型取决于网络类型。
三、Gs-tracker
该插件跟踪检测到的对象,并为每个新对象提供唯一的ID。该插件将低级跟踪器库适应管道。它支持实现底层API的任何底层库,包括三个参考实现NvDCF,KLT和IOU跟踪器。作为此API的一部分,该插件会查询低级库以获取有关输入格式和内存类型的功能和要求。然后,它将输入缓冲区转换为低级库请求的格式。例如,KLT跟踪器使用仅Luma格式;NvDCF使用NV12或RGBA;IOU根本不需要缓冲区。低级功能还包括跨多个输入流的批处理支持。批处理通常比独立处理每个流更有效。如果低层库支持批处理,那是首选的操作模式。但是,如果低级库同时支持批处理和逐流模式,则可以使用enable-batch-process配置选项覆盖此首选项。低级功能还包括对过去帧数据的传递的支持,该过去帧数据包括过去帧中生成但尚未报告为输出的对象跟踪数据。当低级跟踪器在内部存储过去帧中生成的对象跟踪数据时(例如,由于置信度较低),但后来又由于(例如)置信度提高而决定进行报告,就是这种情况。这些过去的帧数据被报告为用户元。可以通过enable-past-frame配置选项启用。该插件从上游组件接受NV12 / RGBA数据,并将输入缓冲区缩放(转换)为低级库所需格式的缓冲区,并带有跟踪器的宽度和高度。(必须在配置文件的[tracker]部分中指定跟踪器的宽度和高度。)低级跟踪器库是通过跟踪器配置部分中的ll-lib-file配置选项选择的。所选的低级库可能还需要其自己的配置文件,可以通过ll-config-file选项指定该文件。三种参考低级库支持不同的算法:)可通过跟踪器配置部分中的ll-lib-file配置选项选择低级跟踪器库。所选的低级库可能还需要其自己的配置文件,可以通过ll-config-file选项指定该文件。三种参考低级库支持不同的算法:)可通过跟踪器配置部分中的ll-lib-file配置选项选择低级跟踪器库。所选的低级库可能还需要其自己的配置文件,可以通过ll-config-file选项指定该文件。三种参考低级库支持不同的算法:
-
KLT跟踪器使用Kanade Lucas Tomasi(KLT)跟踪器算法的基于CPU的实现。该库不需要配置文件。
-
联合口交(IOU)跟踪器使用检测器的边界框在各个帧之间的相交来确定对象的唯一ID。该库带有一个可选的配置文件。
-
Nv自适应判别相关滤波器(NvDCF)跟踪器使用基于相关滤波器的在线判别学习算法,并结合匈牙利算法进行多对象跟踪中的数据关联。该库接受可选的配置文件。
四、Gst-nvstreammux
Gst-nvstreammux插件从多个输入源形成一批帧。将源连接到nvstreammux(多路复用器)时,必须使用gst_element_get_request_pad()
和pad模板向多路复用器请求一个新的打击垫sink_%u
。有关更多信息,请参见link_element_to_streammux_sink_pad()
在DeepStream应用源代码中。复用器形成批量大小的帧的批量缓冲区。(使用gst对象属性指定批处理大小。)如果多路复用器的输出格式和输入格式相同,则多路复用器将从该源转发帧,作为多路复用器的输出批处理缓冲区的一部分。当多路复用器返回其输出缓冲区时,这些帧将返回到源。如果分辨率不同,则复用器将帧从输入缩放到批处理缓冲区中,然后将输入缓冲区返回到上游组件。当批处理被填充时,复用器将批处理推向下游,或者达到了批处理形成超时,即批处理超时。收集新批次的第一个缓冲区时,超时开始运行。复用器使用循环算法从源收集帧。它尝试从每个源中平均每批收集(批大小/数字源)帧(如果所有源都是活动的并且它们的帧速率都相同)。但是,每个来源的数字都不同,具体取决于来源的帧频。复用器输出单个分辨率(即批处理中的所有帧都具有相同的分辨率)。可以使用width和height属性指定此分辨率。复用器将所有输入帧缩放到此分辨率。可以将enable-padding属性设置为true,以保留输入宽高比,同时通过黑带填充进行缩放。对于DGPU平台,可以通过gpu-id属性指定用于缩放和内存分配的GPU。对于每个需要扩展到复用器输出分辨率的信号源,复用器都会创建一个缓冲池并分配四个大小各不相同的缓冲区:
output width*output height*f
哪里f
是1.5
为NV12
格式,或4.0
为RGBA
。内存类型由nvbuf-memory-type
属性确定。将live-source属性设置为true可以通知多路复用器源是实时的。在这种情况下,复用器将最后复制的输入缓冲区的PTS附加到批处理的Gst缓冲区的PTS。如果将该属性设置为false,则多路复用器根据首先与多路复用器协商功能的源的帧速率来计算时间戳。多路复用器将NvDsBatchMeta
元数据结构附加到输出的批处理缓冲区。此元数据包含有关复制到批处理中的帧的信息(例如,帧的源ID,输入帧的原始分辨率,输入帧的原始缓冲区PTS)。连接到Sink_N
打击垫的信号源将pad_index
N
在NvDsBatchMeta
。混合器支持在运行时添加和删除源。当多路复用器从新源接收到缓冲区时,它将发送一个GST_NVEVENT_PAD_ADDED
事件。移除复用器接收器垫后,复用器将发送GST_NVEVENT_PAD_DELETED
事件。这两个事件都包含要添加或删除的源的源ID(请参阅参考资料sources/includes/gst-nvevent.h
)。下游元素收到这些事件后可以重新配置。此外,多路复用器还发送aGST_NVEVENT_STREAM_EOS
来指示来自源的EOS。多路复用器支持为源帧计算NTP时间戳。它支持两种模式。在系统时间戳模式下,复用器将当前系统时间附加为NTP时间戳。在RTCP时间戳模式下,当在源处生成帧时,多路复用器使用RTCP发送方报告来计算帧的NTP时间戳。该NTP时间戳在设定ntp_timestamp
的场NvDsFrameMeta
。可以通过设置attach-sys-ts
属性来切换模式。有关更多详细信息,请参阅DeepStream中的NTP时间戳。
五、Gst-nvstreamdemux
Gst-nvstreamdemux插件将批处理的帧多路分解为单独的缓冲区。它为批处理中的每个帧创建一个单独的Gst缓冲区。它不会复制视频帧。每个Gst缓冲区都包含一个指向批处理中相应帧的指针。该插件将未分批处理的Gst Buffer对象推到与每个帧源相对应的打击垫下游。该插件通过Gst-nvstreammux附带的NvDsBatchMeta获取此信息。各个帧的原始缓冲区时间戳(PTS)也附加回到Gst缓冲区。由于没有帧副本,因此输入的Gst缓冲区不会立即返回上游。当从输入的批处理Gst Buffer解复用的所有非批处理的Gst Buffer对象由下游组件返回到解复用器时,输入的批处理的Gst Buffer返回上游。
六、Gst-nvdsosd
该插件绘制边界框,文本和感兴趣区域(RoI)多边形。(多边形显示为一组线。)该插件接受带有来自上游组件的附加元数据的RGBA缓冲区。它绘制边界框,根据给定边界框的配置(例如,宽度,颜色和不透明度),可以对其进行着色。它还在框架中的指定位置绘制文本和RoI多边形。文本和多边形参数可通过元数据进行配置。
七、Gst-Nvvideoconvert
该插件执行视频颜色格式转换。它接受NVMM内存以及RAW(使用calloc()
或分配的内存malloc()
),并在输出处提供NVMM或RAW内存。
八、Gst-Nvdevarper
该插件使摄像机输入分离。它接受gpu-id和config-file作为属性。根据选定的曲面配置,它最多可以生成四个变形曲面。目前,它支持三种类型的投影的去扭曲NVDS_META_SURFACE_FISH_PUSHBROOM
,NVDS_META_SURFACE_FISH_VERTCYL
和NVDS_META_SURFACE_PERSPECTIVE_PERSPECTIVE
。前两个用于360-D用例中,以使360°摄像机输入变形。该插件通过以下步骤执行其功能:
-
读取配置文件并创建表面配置的向量。它最多支持四个翘曲表面配置。
-
从解码器接收帧;根据配置,最多生成四个变形曲面。
-
使用NPP API将这些表面缩小到网络/选定的变形输出分辨率。
-
将包含变形曲面的缓冲区推入下游组件。
九、Gs-Nvof
从dGPU Turing一代和Jetson Xavier一代开始的NVIDIA GPU包含用于计算光流的硬件加速器。光流矢量在各种用例中很有用,例如对象检测和跟踪,视频帧速率上转换,深度估计,拼接等。Gst-nvof插件收集一对NV12图像,并将其传递到低级光流库。低级库返回两个帧之间的流向量图作为其输出。流向量的映射封装在NvDsOpticalFlowMeta
结构中,并作为meta_type设置为的用户元添加NVDS_OPTICAL_FLOW_META
。用户元添加到NvDsFrameMeta的frame_user_meta_list成员中。有关如何访问用户元数据的指导,请参阅内部的用户/自定义元数据添加NvDsMatchMeta
和张量元数据。
十、Gst-nvofvisual
Gst-nvofvisual插件可用于可视化运动矢量数据。可视化方法类似于以下网址中的OpenCV参考源代码:https : //github.com/opencv/opencv/blob/master/samples/gpu/optical_flow.cpp 该插件通过计算光的大小和方向来解决光流问题。来自两通道流矢量阵列的光流。然后,它通过色相可视化流动的角度(方向),并通过色相饱和度值(HSV)颜色表示的值可视化流动的距离(幅度)。HSV的强度始终设置为最大255,以获得最佳可见性。
十一、Gst-nvsegvisual
Gst-nvsegvisual插件可显示细分结果。分割基于图像识别,区别在于分类发生在像素级别,而不是图像识别。分段输出大小通常与输入大小相同。有关更多信息,请参见以下网站上的细分培训参考:https : //github.com/qubvel/segmentation_models
十二、Gst-Nvvideo4linux2
DeepStream扩展了开源V4L2编解码器插件(此处称为Gst-v4l2
),以支持硬件加速的编解码器。
解码(decoder):
H.264、H.265、JPEG——> GstBuffer(NV12'/RGBA')
编码:(Encoder):
GstBuffer NV12(l420)——> H.264、H.265
解码器
OSS Gst-nvvideo4linux2插件通过与Jetson和DGPU平台上的libv4l2插件接口来利用这些平台上的硬件解码引擎。它支持H.264,H.265,JPEG和MJPEG格式。该插件接受编码的比特流,并使用NVDEC硬件引擎解码该比特流。解码后的输出为NV12格式。
注意
使用v4l2解码器解码JPEG图像时,在解码器解析编码的JPEG图像之前,必须使用开源jpegparse插件。
OSS Gst-nvvideo4linux2插件通过与Jetson和dGPU平台上的libv4l2插件接口,利用了硬件加速编码引擎。该插件接受I420格式的RAW数据。它使用NVENC硬件引擎对RAW输入进行编码。编码输出采用基本比特流支持的格式。
编码器
OSS Gst-nvvideo4linux2插件通过与Jetson和dGPU平台上的libv4l2插件接口,利用了硬件加速编码引擎。该插件接受I420格式的RAW数据。它使用NVENC硬件引擎对RAW输入进行编码。编码输出采用基本比特流支持的格式。
十二、Gst-nvjpegdec
Gst-nvjpegdec插件可在dGPU和Jetson平台上解码图像。这是解码JPEG图像的首选方法。在dGPU平台上,此插件基于CUDA工具包的一部分libnvjpeg库。在Jetson上,它使用特定于平台的硬件加速器。该插件使用内部软件解析器来解析JPEG流。因此,无需单独使用jpegparse开源插件来解析编码的帧。该插件接受JPEG编码的比特流,并在dGPU平台上生成RGBA输出,并在Jetson平台上生成I420输出。
十三、Gst-nvmsgconv
Gst-nvmsgconv插件将NVDS_EVENT_MSG_META
附加到缓冲区的(NvDsEventMsgMeta)类型元数据解析为帧元的用户元数据,并生成架构有效负载。对于批处理缓冲区,一帧所有对象的元数据必须在相应的帧元之下。生成的有效负载(NvDsPayload)作为以下内容附加到输入缓冲区NVDS_PAYLOAD_META
输入用户元数据。DeepStream 5.0支持架构的两个变体,完整和最小。可以将Gst-nvmsgconv插件配置为使用任一架构。默认情况下,插件使用完整的DeepStream模式生成JSON格式的有效负载。完整模式支持对象检测,分析模块,事件,位置和传感器的详细语义。每个有效负载都具有有关单个对象的信息。您可以使用架构的最小变体与后端通信最少的信息。这为有效载荷从DeepStream传输到消息代理提供了很小的空间。每个有效负载可以具有帧中多个对象的信息。