一、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
三、开源插件源码
了解到有几个插件源码,大部分都未开源,暂时可以从仅有的插件入手,如果不能支持则需要自己写插件就比较繁琐了。
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
我们可以先从dsexample
开始:
/opt/nvidia/deepstream/deepstream-4.0/sources/gst-plugins/gst-dsexample/gstdsexample.cpp
gst-dsexample插件的描述:
GStreamer示例插件(gst-dsexample)演示了以下内容:
- 处理整个帧,并根据需要进行缩小/颜色转换。
- 处理主要检测器检测到的对象,特别是从帧中裁剪这些对象,然后进行裁剪。
可以使用命令行简单测试:
#----------------------- 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:admin123@192.168.1.106: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
。