deepstream学习记录


优秀的博客链接 DeepStream初步学习
本文参照英伟达的教学过程。

1介绍

说明

视频分析技术比较复杂。
雷霄骅前辈的博客有许多详细的说明。
有各种格式的处理和插件。
deepstream是NVIDIA最尖端技术精髓于一身的智能视频分析套件。

可以和深度学习的智能技术搭配,快速提取特定的信息并回传至控制中心,能在指定范围中提供安全监控机制,也能提高总体营运的效率

Deepstream的工作流程(单机)


在这里插入图片描述
英伟达的图片
收集->解码->预处理->追踪推理环境->结果(图像信息)编码->结果(图像)合成->数据信息的分析->视觉输出

在“单一设备”上所执行的8个步骤:

  1. COLLECT:可对接各种数据源,包括摄像头(CSI、USB、GigE接口等)、存储设备(硬盘、SSD等)的视频/图像档案、网络路由器所传入数据等等。

  2. DECODE:进行解码,这个过程传统上非常消耗CPU资源,但目前NVIDIA的很多设备上都提供硬件解码器(DECODER)与算法,能针对不同输入源/视频格式进行快速解码动作,不仅兼容性高,并且能大幅度减轻CPU的负担。

  3. PRE-PROCESS:这个环节中,大部分需要结合OpenCV以及NVIDIA MultiMedia API做大量的格式转换(如RGB转BGR、HSV颜色空间等)、数学转换计算(如Hough转换、Canny检测等)等。这些计算具备明显的并行化特性,也是CUDA/GPU十分擅长的部分。

可以看到这个区块上方绿色部分有个“CUDA”字眼,表示CUDA在扮演重要角色。

  1. TRACK INFERENCE:追踪推理环境,是整个DeepStream中性能影响最大的部分,重度依赖于NVIDIA TensorRT推理引擎的FP16/INT8性能提升能力。
    TensorRT这个推理引擎也是NVIDIA在边缘计算应用中一个非常关键的底层加速API,其本身并不是一个深度学习的框架,但是能支持绝大部分常用的神经网络与框架所训练出来的模型,并将这些模型转换成TensroRT加速的引擎,功能十分强大。

  2. ENCODE:将推理过后的结果进行编码,包括物件识别后的物件位置(色框)、类别、可信比例(confidence)等,转换成后续进行视觉化显示的格式。

  3. COMPOSITE:将多种AI计算后的结果(车型识别、颜色识别、车牌识别等)进行合成,提供给下一阶段进行数据分析。

  4. ANALYZE DATA:这部分的重点,在于“使用者需要进行哪些方面的分析”。目前比较明显的案例是用在特定场所的车流、人流统计数据。

  5. VISUALIZE:视觉化输出,可以根据使用环境的GPU显示功能进行显示屏数量的调整,目前NVIDIA设备的显示功能都能输出多个 4K 质量的画面。

DeepStream的集群功能

双向通讯与云服务
在这里插入图片描述
应用部署与管理
在这里插入图片描述
不知所云。。。
架构:
底层处理性能
中层“通讯”与“部署”
上层语言:python和C++。
在这里插入图片描述

2配置和体验

下载deepstream

官网一般是最新的链接。
下载其他版本本次实验使用的是5.0
下载deb,使用dpkg安装

sudo dpkg -i deb文件名
#查看安装信息
dpkg -l deepstream-5.0

查看版本
安装位置应在/opt/nvidia/deepstream/deepstream
查看deepstream可以使用的命令。

deepstream-
#使用tab键补全命令

以samples下的内容来进行体验。
samples在上述的安装路径下。cuda等许多库可以通过例子来学习。
教程中,建立一个软连接到家目录下,便于访问文件夹。

cd ~
ln -s /opt/nvidia/deepstream/deepstream 自定文件夹名字

使用tree命令查看目录结构
没有tree的话,通过sudo apt install tree下载.

tree -L 2 -d ds5_samples
#-L指定显示层数,-d指定开始目录

使用的工具的位置。
在这里插入图片描述
在config下面有几个示例。
deepstream-app命令 使用 -c 在加上配置文件就可以。
source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt 这个配置文件比较适合 Jetson Nano 2GB 使用,先简单分解一下文件名所代表的意义:
在这里插入图片描述
此处给里面的所有文件所有权限,复制出一个简单名字的副本,来进行修改。
在这里插入图片描述

deepstream-app -c 文件名

第一次执行时要为神经网络模型生成 TensorRT 加速引擎,所以需要几分钟时间去建立,正常运行会看到下图的显示,出现 2x4 个并列显示框。
在这里插入图片描述
此处需要在实机运行,ssh连接不可以。此处运行的速度非常慢。
在这里插入图片描述
这个参数是每个视频源的FPS数。

NoMachine 远程控制 Jetson Nano 2GB,可能会看不到显示的画面,这时请先按 Ctrl-C 退出执行,然后修改 myNano.txt 里面的[sink0]两个参数
在这里插入图片描述

在这里插入图片描述
在远程链接,选择简单的检测算法和少的并行度(视频数)可以达到较快的帧率。
下面是对配置文件的一些修改:


  1. 为了让显示的尺寸更加合理化,修改[tiled-display]下面的 rows=2, columns=2。行列数。

  2. 以[source0]为范本,删除不需要的参数,复制为[source1]、[source2]、[source3]
    每个源单独写配置文件。
    在这里插入图片描述
    使用对应的文件路径。

[source2]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI 4=RTSP
type=3
uri=file://../../streams/sample_1080p_h264.mp4
num-sources=1
#drop-frame-interval=2
gpu-id=0
# (0): memtype_device   - Memory type Device
# (1): memtype_pinned   - Memory type Host Pinned
# (2): memtype_unified  - Memory type Unified
cudadec-memtype=0
[source3]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI 4=RTSP
type=3
uri=file:///usr/share/visionworks/sources/data/signs.avi
num-sources=1
#drop-frame-interval=2
gpu-id=0
# (0): memtype_device   - Memory type Device
# (1): memtype_pinned   - Memory type Host Pinned
# (2): memtype_unified  - Memory type Unified
cudadec-memtype=0

相对路径失败可以试试绝对路径,或者按照例子1中的[source]找到对应的文件夹
此处选取两个解析,选择的格式是不一样的。
enable: 是否启用目标追踪功能。
type的类型选择源,此处是多种URI,播放不同格式,对应的应该还有可以启用多个相机的使用方法。对应的是type1。
指定uri
num-sources=1确定源的数量。
其他类型参数先按照默认。

3deepStream 目标追踪功能

目标追踪的track介绍

识别到的类型,和位置可以为后续的应用提供一些数据,缩小后面的运算量。是视频分析的基础功能。
Opencv有8种主流的目标追踪算法:
参考opencv的目标追踪python
C++版的opencv目标追踪
基本逻辑是对视频的杏林帧进行类别和位置的对比。计算占用很多计算资源。视频分析软件开启目标追踪功能时。性能会下降。

DeepStream支持IOU,KLT,NVDCF三种追踪算法
传统的追踪算法:
IOU交并比原理在目标识别中是一个精确度的评估方法。
KLT光流算法
NVDCF的参数调制准确度高,但性能要求高。多视频效果不好。
KLT多视频推荐,综合效果最好。
在这里插入图片描述VIC视频图像处理器

使用功能

启动追踪功能效果,识别物件的类别,多图模式下只能看到框,在单图模式下可以看到标号。关闭功能后,有标记框,但是无编号。

切换追踪器

[tracker]参数组
在这里插入图片描述
三个共享库
IOU 追踪器的性能最好,可达到 200FPS 左右,但是同一物件的编号并不是太稳定,而 NVDCF 追踪器的编号最为稳定,但性能大概只有 IOU 的 1/4,最多只能承受 2 路视频的实时分析。

KLT 算法总体性能可达到 160FPS,可以支持到8路以内的实时识别,追踪能力也比 IOU 好不少,不过这个算法对 CPU 的占用率比较高,是这个算法的主要缺点。该如何选择需要看实际的场景与计算设备的资源而定。

我的实际测试性能略低。KLT只有一半,不知道是不是2GB的内存影响。
在这里插入图片描述
4GB内存应该可以发挥出性能。

获取追踪的数据

通常都需要透过 Python 或 C++从 DeepStream 提供的接口去获取。
也可以从配置文件中配置生成的目录:
myNano.txt 里面的[application]参数组,添加一条“kitti-track-output-dir= ”的路径指向就可以,这里假设要将数据存入“/home/nvidia/track”路径下,在 myNano.txt 里添加一行参数即可:
此处的路径文件夹要提前创建。
因为机子的性能不同,也不了解视频格式。按照处理显示的来生成结果文件。不确定是否对应。视频秒数和帧数相乘。获得结果数。
生成的文件名字的解析:
00_000代表视频源的编号。
4路视频。“00_000”~“00_003”
后面 6 位则是流水号,例如这个测试视频就会生成“000000.txt”~“001440.txt”
数据格式的说明:
在这里插入图片描述
KITTI 格式的数据,第一栏位是该物件的类别,第二栏是该物件的“追踪编号”,后面数据所代表的意义,请自行参考 KITTI 的格式定义。
在这里插入图片描述
Car
0.0
0
0.0
536.000000 472.500000 584.000000 516.176453
0.0 0.0 0.0
0.0 0.0 0.0
0.0
-0.100000
’DontCare’ 标签表示该区域没有被标注,比如由于目标物体距离激光雷达太远。为了防止在评估过程中(主要是计算precision),将本来是目标物体但是因为某些原因而没有标注的区域统计为假阳性(false positives),评估脚本会自动忽略’DontCare’ 区域的预测结果。
数据集的使用和说明

4使用摄像头

在 deepstream-app 里调用 USB 与 CSI 摄像头,并且与先前的视频同时启用来进行物件识别的应用。
此处只有一个CSI摄像头,如果查看双摄像头参考英伟达原文

v4l2-ctl --list-formats-ext  --device=0

在这里插入图片描述
表示CSI摄像头(device=0)能支持3264x2464、3264x1848、1920x080、1640x1232、1280x720 等 5 种分辨率。

配置文件
使用原配置文件
在DeepStream路径(/opt/nvidia/deepstream/deepstream)
示例文件
samples/configs/deepstream-app

/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app

是各种配置文件
在这里插入图片描述
使用source1_csi_dec_infer_resnet_int8.txt

################################################################################
# Copyright (c) 2018-2020, NVIDIA CORPORATION. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
################################################################################

[application]
enable-perf-measurement=1
perf-measurement-interval-sec=5
#gie-kitti-output-dir=streamscl

[tiled-display]
enable=1
rows=1
columns=1
width=1280
height=720

[source0]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI 4=RTSP 5=CSI
type=5
#如果是USB相机请选择1
camera-width=1280
camera-height=720
camera-fps-n=30
camera-fps-d=1

[sink0]
enable=1
#Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming 5=Overlay
type=5
sync=0
display-id=0
offset-x=0
offset-y=0
width=0
height=0
overlay-id=1
source-id=0

[sink1]
enable=0
type=3
#1=mp4 2=mkv
container=1
#1=h264 2=h265 3=mpeg4
codec=1
#encoder type 0=Hardware 1=Software
enc-type=0
sync=0
bitrate=2000000
#H264 Profile - 0=Baseline 2=Main 4=High
#H265 Profile - 0=Main 1=Main10
profile=0
output-file=out.mp4
source-id=0

[sink2]
enable=0
#Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming 5=Overlay
type=4
#1=h264 2=h265
codec=1
#encoder type 0=Hardware 1=Software
enc-type=0
sync=0
bitrate=4000000
#H264 Profile - 0=Baseline 2=Main 4=High
#H265 Profile - 0=Main 1=Main10
profile=0
# set below properties in case of RTSPStreaming
rtsp-port=8554
udp-port=5400

[osd]
enable=1
border-width=2
text-size=15
text-color=1;1;1;1;
text-bg-color=0.3;0.3;0.3;1
font=Serif
show-clock=0
clock-x-offset=800
clock-y-offset=820
clock-text-size=12
clock-color=1;0;0;0

[streammux]
##Boolean property to inform muxer that sources are live
live-source=1
batch-size=1
##time out in usec, to wait after the first buffer is available
##to push the batch even if the complete batch is not formed
batched-push-timeout=40000
## Set muxer output width and height
width=1280
height=720
## If set to TRUE, system timestamp will be attached as ntp timestamp
## If set to FALSE, ntp timestamp from rtspsrc, if available, will be attached
# attach-sys-ts-as-ntp=1

# config-file property is mandatory for any gie section.
# Other properties are optional and if set will override the properties set in
# the infer config file.
[primary-gie]
enable=1
model-engine-file=../../models/Primary_Detector/resnet10.caffemodel_b30_gpu0_int8.engine
#Required to display the PGIE labels, should be added even when using config-file
#property
batch-size=1
#Required by the app for OSD, not a plugin property
bbox-border-color0=1;0;0;1
bbox-border-color1=0;1;1;1
bbox-border-color2=0;0;1;1
bbox-border-color3=0;1;0;1
interval=0
#Required by the app for SGIE, when used along with config-file property
gie-unique-id=1
config-file=config_infer_primary.txt

[tests]
file-loop=0

将输出节点sink一个调整为type=2.
来在远程模式下输出画面。
教程中添加了两个视频文件一起进来执行检测,我们以系统上提供的视频文件做示范:

/opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
/usr/share/visionworks/sources/data/pedestrians.h264
设置了另外两个源。

发现混合源效率低的方法。
事实上问题出现在[primary-gie]使用的模型上,因为Jetson Nano(含2GB)的计算资源较为缺乏,因此DeepStream专门为Nano提供resnet10.caffemodel_b8_gpu0_fp16.engine特调版加速引擎,存放在“…/…/models/Primary_Detector_Nano”路径下,这是第一个需要做修改的地方:
在文件的接近最后的位置。

  1. 修改加速引擎
    model-engine-file=…/…/models/Primary_Detector_Nano/resnet10.caffemodel_b8_gpu0_fp16.engine
  2. “config-file”置换成支持Nano版本的配置文件
    config-file=config_infer_primary_nano.txt

在这里插入图片描述模型文件
在这里插入图片描述
“interval”参数设为“1”可以进一步加速。

5 多模型组合检测

以一个主(Primary)推理引擎(GIE:GPU Inference Engine)去带着多个次(Secondary)推理引擎。
本实验在 Jetson Nano 2GB 上,执行 4 种模型的组合检测功能,能将检测到的车辆再往下区分颜色、厂牌、车种等进一步信息,在 4 路输入视频状态下能得到 20+FPS 性能,并且我们将显示的信息做中文化处理。
模型文件经过了调节后,还是非常慢。不进行记录。

6DeepStream-插件说明

原文
deepstream-app非常好用,但是并非止步于此。deepstream本质上还是Gstreamer框架搭建起来的

好的项目

英伟达基于deepstream的开发项目github
deepstream-occupancy-analytics人流分析”、“deepstream_lpr_app车牌识别”、“redaction_with_deepstream视频编辑”、“deepstream_pose_estimation姿势识别”、“Deepstream-Dewarper-App 360度镜头还原”等等,都是直接用DeepStream的插件与API接口直接开发的项目。

Gstreamer的介绍

Gstreamer的基本组成元件(pipeline)
在这里插入图片描述
从视频输入流到一系列用于处理流的元素或插件以及深入的输出流组成,每个插件都有一个定义的输入(名为sink)和定义的输出(名为source)。在管道中,一个插件的源衬垫(source pad)连接到下一个插件的接收器板(sink pad),源包括从处理过程中提取的信息、元数据,这些信息可用于视频注释和关于输入流的其他细节。

“输入源处理”、“计算处理”、“汇总输出”
在这里插入图片描述
Gstreamer框架在输入与输出部分,原本就提供非常丰富的插件,因此DeepStream除了需要调用NVIDIA并行计算能力或硬件资源的部分,包括视频颜色空间转换、图像处理(放大/缩小/旋转)、streammux/streamdemux多图像组合/分解处理、图像合成渲染、以及Jetson设备上的H254/H265/JPEG硬件编解码器CSI摄像头调用的ISP图像信号处理器等,其他都直接使用Gstreamer的开源插件。

GStream的开源插件
在这里插入图片描述
NVIDIA提供的插件:

请参考DeepStream开发手册的DS_plugins_intro.html。

在这里插入图片描述
内容较多。

如果需要查看源码
deepstream-app这个范例为了展现完整的功能,于是使用deepstream_app.c、deepstream_app_main.c与
deepstream_app_config_parser.c这三支程式,总代码量超过2,200行,反而不适合入门开发人员去修改成自己想要的专属应用。当然不是说做不到,而是你必须花费更多时间去解读的所有内容。
/sources/apps/sample_apps里提供大约20个C/C++范例代码,除了deepstream-appa是通用范例之外,其他的都是特定应用的基础代码,特别是deepstream-testN系列范例是比较合适入门学习。

/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-app

7配置Deepstream的Python环境

可以参考下面的博客还有知乎的那个教程
Deepstream安装python环境-博客
Deepstream安装python环境-知乎
在安装完成后,调用pyds的时候出现了.so文件没找到,这个时候发现是lib下的一个共享库文件,
参考这种错误python的.so文件找不到
所以将LD_LIBRARY_PATH这个添加上deepstream的lib都路径。添加的方法
添加后就可以使用教程中的测试用例了。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值