DeepStream进阶插件之路

一、DeepStream的gst插件

gst插件,即GStreamer插件,是用于实现DeepStream功能嵌入GStreamer编解码流程使用。

GStreamer插件:

GStreamer是用于插件,数据流和媒体类型处理/协商的框架。它用于创建流媒体应用程序。插件是在运行时动态加载的共享库,可以独立扩展和升级。当安排并链接在一起时,插件形成处理流水线,该流水线定义了流媒体应用程序的数据流。您可以通过其广泛的在线文档,从“什么是GStreamer?”开始了解有关GStreamer的更多信息。

开源GStreamer插件:

  • GstFileSrc-从文件中读取数据:视频数据或图像。
  • GstH264Parse-解析传入的H264流。对于H265编解码器,请使用H265Parse。
  • GstRtpH264Pay-将H264编码的有效负载转换为RTP数据包(RFC 3984)。
  • GstUDPSink-将UDP数据包发送到网络。与RTP有效负载(GstRtpH264Pay)配对时,它可以实现RTP流。
  • GstCapsFilter-在不修改数据的情况下限制数据格式。
  • GstV4l2Src-从v4l2设备捕获视频。
  • GstQTMux-将流(音频和视频)合并到QuickTime(.mov)文件中。
  • GstFileSink-将传入数据写入本地文件系统中的文件。
  • GstURIDecodeBin-将数据从URI解码到原始媒体中。它选择可以处理给定“ uri”方案的源元素,并将其连接到解码器。
DeepStream的gst插件:

除了在GStreamer框架库中提供的开源插件之外,DeepStream SDK还包括利用GPU功能的NVIDIA硬件加速插件。有关DeepStream GStreamer插件的完整列表,请参见《 NVIDIA DeepStream插件手册》。

NVIDIA硬件加速插件:

  • Gst-nvstreammux-在发送AI推理之前批处理流。
  • Gst-nvinfer-使用TensorRT运行推理。
  • Gst-nvvideo4linux2-使用硬件加速解码器(NVDEC)解码视频流;使用硬件加速编码器(NVENC)将I420格式的RAW数据编码为H264或H265输出视频流。
  • Gst-nvvideoconvert-执行视频颜色格式转换。Gst-nvdsosd插件之前的第一个Gst-nvvideoconvert插件将流数据从I420转换为RGBA,Gst-nvdsosd插件将Gst-nvdsosd插件将数据从RGBA转换为I420。
  • Gst-nvdsosd-绘制边界框,文本和关注区域(ROI)多边形。
  • Gst-nvtracker-跟踪帧之间的对象。
  • Gst-nvmultistreamtiler-从批处理缓冲区合成2D切片。
  • Gst-nvv4l2decoder-解码视频流。
  • Gst-Nvv4l2h264enc-编码视频流。
  • Gst-NvArgusCameraSrc-提供使用Argus API控制ISP属性的选项。
DeepStream SDK

NVIDIA DeepStream SDK是基于开源GStreamer多媒体框架的流分析工具包。DeepStream SDK加快了可伸缩IVA应用程序的开发速度,使开发人员更容易构建核心深度学习网络,而不必从头开始设计端到端应用程序。包含NVIDIA Jetson模块或NVIDIA dGPU适配器的系统均支持该SDK。它由可扩展的硬件加速插件集合组成,这些插件与低级库进行交互以优化性能,并定义了标准化的元数据结构,可实现自定义/用户特定的添加。

有关DeepStream SDK的更多详细信息和说明,请参考以下材料:
NVIDIA DeepStream SDK开发指南
NVIDIA DeepStream插件手册
NVIDIA DeepStream SDK API参考文档

二、官方插件

通过gst命令可以查看到有很多nvidia官方插件:

nvidia@nvidia-desktop:~/projects/deepstream-test1-app_toson/build$ gst-inspect-1.0 -a |grep NVIDIA
dsexample:   Author                   NVIDIA Corporation. Post on Deepstream for Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
dsexample:   Description              NVIDIA example plugin for integration with DeepStream on DGPU
dsexample:   Binary package           NVIDIA DeepStream 3rdparty IP integration example plugin
nvof:   Author                   NVIDIA Corporation. Post on Deepstream for Jetson/Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvof:   Description              NVIDIA opticalflow plugin for integration with DeepStream on DGPU
nvof:   Binary package           NVIDIA DeepStream 3rdparty IP integration opticalflow plugin
nvinfer:   Author                   NVIDIA Corporation. Deepstream for Tesla forum: https://devtalk.nvidia.com/default/board/209
nvinfer:   Description              NVIDIA DeepStreamSDK TensorRT plugin
nvinfer:   Binary package           NVIDIA DeepStreamSDK TensorRT plugin
nvmultistreamtiler:   Author                   NVIDIA Corporation. Post on Deepstream for Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvmultistreamtiler:   Description              NVIDIA Multistream Tiler plugin
nvmultistreamtiler:   Binary package           NVIDIA Multistream Plugins
nvdewarper:   Author                   NVIDIA Corporation. Post on Deepstream for Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvsegvisual:   Author                   NVIDIA Corporation. Post on Deepstream for Jetson/Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvsegvisual:   Description              NVIDIA segmentation visualization plugin for integration with DeepStream on DGPU
nvsegvisual:   Binary package           NVIDIA DeepStream Segmantation Visualization Plugin
nvdsosd:   Author                   NVIDIA Corporation. Post on Deepstream for Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvmsgconv:   Author                   NVIDIA Corporation. Post on Deepstream for Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvofvisual:   Author                   NVIDIA Corporation. Post on Deepstream for Jetson/Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvofvisual:   Description              NVIDIA opticalflow visualization plugin for integration with DeepStream on DGPU
nvofvisual:   Binary package           NVIDIA DeepStream Optical Flow Visualization Plugin
nvmsgbroker:   Author                   NVIDIA Corporation. Post on Deepstream for Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvstreamdemux:   Author                   NVIDIA Corporation. Post on Deepstream for Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvstreamdemux:   Description              NVIDIA Multistream mux/demux plugin
nvstreamdemux:   Binary package           NVIDIA Multistream Plugins
nvstreammux:   Author                   NVIDIA Corporation. Post on Deepstream for Tesla forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvstreammux:   Description              NVIDIA Multistream mux/demux plugin
nvstreammux:   Binary package           NVIDIA Multistream Plugins
nvtracker:   Author                   NVIDIA Corporation. Post on Deepstream SDK forum for any queries @ https://devtalk.nvidia.com/default/board/209/
nvv4l2decoder:   Long-name                NVIDIA v4l2 video decoder

三、开源插件源码

请参阅官方文档:https://docs.nvidia.com/metropolis/deepstream/dev-guide/DeepStream%20Development%20Guide/deepstream_custom_plugin.html#wwpID0E0TB0HA

了解到有几个插件源码,大部分都未开源,暂时可以从仅有的插件入手,如果不能支持则需要自己写插件就比较繁琐了。

deepstream开源插件在目录:/opt/nvidia/deepstream/deepstream-4.0/sources/gst-plugins/

nvidia@nvidia-desktop:/opt/nvidia/deepstream/deepstream-4.0/sources/gst-plugins$ ls
gst-dsexample  gst-nvinfer  gst-nvmsgbroker  gst-nvmsgconv

DeepStream进阶插件之路_第1张图片DeepStream进阶插件之路_第2张图片

我们可以先从dsexample开始:
/opt/nvidia/deepstream/deepstream-4.0/sources/gst-plugins/gst-dsexample/gstdsexample.cpp

gst-dsexample插件的描述:
GStreamer示例插件(gst-dsexample)演示了以下内容:

  • 处理整个帧,并根据需要进行缩小/颜色转换。
  • 处理主要检测器检测到的对象,特别是从帧中裁剪这些对象,然后进行裁剪。

请参阅官方文档:https://docs.nvidia.com/metropolis/deepstream/dev-guide/DeepStream%20Development%20Guide/deepstream_custom_plugin.html#wwpID0E0TB0HA

可以使用命令行简单测试:

#----------------------- use dsexample plugin -----------------------
# use mp4 files
gst-launch-1.0 filesrc location=/opt/nvidia/deepstream/deepstream-4.0/samples/streams/sample_720p.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 height=720 ! nvvideoconvert ! dsexample full-frame=1 ! nvdsosd ! nvegltransform ! nveglglessink
# use rtsp camera
gst-launch-1.0 rtspsrc latency=2000 location="rtsp://admin:[email protected]:554/cam/realmonitor?channel=1&subtype=0" ! rtph264depay ! h264parse ! nvv4l2decoder ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 height=720 ! nvvideoconvert ! dsexample full-frame=1 ! nvdsosd ! nvegltransform ! nveglglessink

结果:
(如图,画了2个固定不动的框,不明白在表达什么,可以从gstdsexample.cpp里去了解,我正在研究中。)

四、我的研究之路

1. nvidia官网教程

《使用NVIDIA DeepStream构建实时修订应用程序》:
《Building a Real-time Redaction App Using NVIDIA DeepStream, Part 1: Training》
《Building a Real-time Redaction App Using NVIDIA DeepStream, Part 2: Deployment》
Part 1中,学习如何使用ResNet34骨干训练RetinaNet网络以进行对象检测。这包括使用容器,准备数据集,调整超参数以及训练模型。
Part 2中,学习如何构建和部署基于AI的实时应用程序。该模型使用DeepStream SDK 部署在NVIDIA Jetson驱动的AGX Xavier边缘设备上,以实时编辑多个视频流上的人脸。
PS:遗憾的是我没有完成调试,没有环境训练,并且由于得不到part1中的onnx模型文件,所以part2也未能完成。

注:part2中编译/opt/nvidia/deepstream/deepstream-4.0/sources/apps/retinanet_for_redaction_with_deepstream的时候,有一个坑,需要修改Makfile:47行:
增加库-lgstrtp-1.0

2. deepstream源码例程

问了相关人员,暂时未能了解到其他的学习资源,所以还是回到deepstream源码例程中去研究。

objectDetector_SSD例程:
源码路径:/opt/nvidia/deepstream/deepstream-4.0/sources/objectDetector_SSD
方法请查阅README
该例程需要安装tensorflow:For Jetson, refer to https://elinux.org/Jetson_Zoo#TensorFlow
并且下载:http://download.tensorflow.org/models/object_detection/ssd_inception_v2_coco_2017_11_17.tar.gz

$ cd ssd_inception_v2_coco_2017_11_17
     $ python /usr/lib/python2.7/dist-packages/uff/bin/convert_to_uff.py \
         frozen_inference_graph.pb -O NMS \
         -p /usr/src/tensorrt/samples/sampleUffSSD/config.py \
         -o sample_ssd_relu6.uff

再将得到的sample_ssd_relu6.uff模型文件复制到README目录。
编译并运行:

# 需要指定cuda版本
$ export CUDA_VER=10.0
$ make -C nvdsinfer_custom_impl_ssd
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_1080p_h264.mp4 ! \
        decodebin ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 \
        height=720 ! nvinfer config-file-path= config_infer_primary_ssd.txt ! \
        nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink
# 或者:
$ deepstream-app -c deepstream_app_config_ssd.txt

objectDetector_Yolo例程:
源码路径:/opt/nvidia/deepstream/deepstream-4.0/sources/objectDetector_Yolo
方法请查阅README
需要先下载yolo模型文件:$ ./prebuild.sh
(注:其中下载了有yolo-v2、yolo-v2-tiny、yolo-v3、yolo-v3-tiny,根据自己的需要可以关闭不需要的下载)
根据README修改配置文件config_infer_primary_yolo[...].txt

你可能感兴趣的:(Xavier,自动驾驶,深度学习,deepstream,gstreamer,xavier)