YOLOV5检测+追踪使用deepstream部署(c++版)

文章目录

    • 一、Deepstream
      • 1.1 简介
      • 1.2 图架构(Graph architecture)
      • 1.3 应用架构(Application Architecture)
    • 二、配置文件方式运行Deepstream
      • 2.1 环境准备
      • 2.2 主机运行
      • 2.3 配置文件解析
      • 2.4 docker运行
    • 三、代码方式运行Deepstream
      • 3.1 开发一个Deepstream应用
      • 3.2 Metadata
      • 3.3 GStreamer 核心概念
        • 3.3.1 GstElement
        • 3.3.2 bin
        • 3.3.3 pipeline
        • 3.3.4 pads
      • 3.4 课程应用
      • 3.5 jetson NX 运行
      • 3.6 Jetson nano

一、Deepstream

1.1 简介

https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Overview.html

DeepStream是一个基于NVIDIA GPU和TensorRT的开源视频分析框架。它提供了一个端到端的、可扩展的平台,可以处理多个视频和图像流,并支持实时的人脸识别、车辆识别、物体检测和跟踪、行为分析等视觉分析任务。DeepStream可以通过在不同的节点上进行分布式部署来实现高吞吐量和低延迟的处理,从而满足各种应用场景的需求,如智能城市、智能交通、工业自动化等。

简单来说,就是一个开发套件,让我们可以更快地开发视觉AI相关的应用,本节课使用它主要考虑两点:

  • Deepstream稳定高效的读流和推流能力;
  • Deepstream内置的目标追踪算法(deepsort等)

特性:

  • 支持输入:USB/CSI 摄像头, 文件, RTSP流
  • 示例代码:
    • C++: https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_C_Sample_Apps.html
    • python: https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Python_Sample_Apps.html
  • 硬件加速插件:VIC, GPU, DLA, NVDEC, and NVENC
  • 使用软件SDK: CUDA, TensorRT, NVIDIA® Triton™ (Deepstream将它们抽象为插件)
  • 支持平台:Jetson , 各种 GPU, container

1.2 图架构(Graph architecture)

图示:

  • 典型的视频分析应用:都是从读取视频开始,从视频中抽取有价值信息,最后输出
  • 上半部分:用到的所有插件
  • 下半部分:整个App链路中用到的硬件引擎

图架构:

  • Deepstream基于开源 GStreamer 框架开发;
  • 优化了内存管理:pipeline上插件之间没有内存拷贝,并且使用了各种加速器来保证最高性能;

插件(plugins):

  • input→ decode: Gst-nvvideo4linux2
  • preprocessing:
    • Gst-nvdewarper: 对鱼眼或360度相机的图像进行反扭曲
    • Gst-nvvideoconvert: 颜色格式的调整
    • Gst-nvstreammux: 多路复用器,从多个输入源形成一批缓冲区(帧)
    • inference:
      • Gst-nvinfer: TensorRT
      • Gst-nvinferserver: Triton inference server: native frameworks such as TensorFlow or PyTorch
    • Gst-nvtracker: 目标追踪
    • Gst-nvdsosd: 可视化:bounding boxes, segment masks, labels
  • output:
    • 格式: 窗口显示,保存到文件,流通过RTSP,发送元数据到云
    • Gst-nvmsgconv :将元数据metadata转换为数据结构
    • Gst-nvmsgbroker:向服务器发送遥测数据(如Kafka, MQTT, AMQP和Azure IoT)

1.3 应用架构(Application Architecture)

https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_ref_app_deepstream.html#reference-application-configuration

  • 包含了一系列的GStreamer插件
  • 英伟达开发的插件有:
    • Gst-nvstreammux: 从多个输入源形成一批缓冲区(帧)
    • Gst-nvdspreprocess: 对预先定义的roi进行预处理,进行初步推理
    • Gst-nvinfer: TensorRT推理引擎(可用来检测和分类、分割)
    • Gst-nvtracker: 使用唯一ID来跟踪目标物体
    • Gst-nvmultistreamtiler: 拼接多个输入视频源显示
    • Gst-nvdsosd: 使用生成的元数据在合成视频帧上绘制检测框、矩形和文本等
    • Gst-nvmsgconv, Gst-nvmsgbroker: 将分析数据发送到云服务器。

二、配置文件方式运行Deepstream

2.1 环境准备

https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Quickstart.html#dgpu-setup-for-ubuntu

# 对着官网将依赖准备装好:包括卸载老版本、装依赖包、安装好驱动、CUDA、TensorRT、librdkafka# 使用Debian package 安装,下载地址:https://developer.nvidia.com/downloads/deepstream-62-620-1-amd64-deb
# 或者使用附件:3.PC/deepstream-6.2_6.2.0-1_amd64.deb$ sudo apt-get install ./deepstream-6.2_6.2.0-1_amd64.deb

2.2 主机运行

代码位置:3.PC/代码

  • 生成engine文件:

    • 之前课程训练的是只有person这一类的模型,现在需要加上car车辆类别,我们使用coco预训练模型即可(共80类,附件位置:1.预训练模型

    • 比如使用yolov5s.pt,需要按照之前课程流程处理:修改网络结构 --> 导出onnx文件 --> build engine (注意量化需要提供校准集)

      # 进入目录
      cd 3.yolo_trt_app# 构建
      # build engine
      # 用法: ./build [onnx_file_path] [use_int8] [calib_dir] [calib_list_file]# 比如我不开启INT8量化构建
      ./build/build weights/yolov5s.onnx 0 null null
  • 运行

    # 进入目录
    cd 1.deep_stream# 编译plugin library
    /usr/local/cuda/bin/nvcc -Xcompiler -fPIC -shared -o lib/yolov5_decode.so ./src/yoloForward_nc.cu ./src/yoloPlugins.cpp ./src/nvdsparsebbox_Yolo.cpp -isystem /usr/include/x86_64-linux-gnu/ -L /usr/lib/x86_64-linux-gnu/ -I /opt/nvidia/deepstream/deepstream/sources/includes -lnvinfer # 把类别标签文件labels.txt放到config下# 将build好的yolov5 engine 文件放到weights下
    # 修改配置文件config_infer_primary_yoloV5.txt中engine的路径# 修改配置文件deepstream_app_config_windows_display_write.txt 中读取视频的地址,以及保存视频的地址# 读取文件 --> 检测 --> 窗口显示、保存文件、推流(注意看老师演示)
    deepstream-app -c config/deepstream_app_config_windows_display_write.txt# `rtsp`推流的链接为`rtsp://127.0.0.1:8554/ds-test`。可以通过vlc捕获并查看
    

2.3 配置文件解析

参考链接:https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_ref_app_deepstream.html

# deepstream_app_config_windows_display_write.txt[application]
enable-perf-measurement=1
perf-measurement-interval-sec=1[tiled-display]
enable=0
rows=1
columns=1
width=1280
height=720
gpu-id=0
nvbuf-memory-type=0[source0]
enable=1
type=3
uri=file:///home/enpei/Documents/course_cpp_tensorrt/course_10/1.deep_stream/media/sample_720p.mp4
num-sources=1
gpu-id=0
cudadec-memtype=0[sink0]
enable=1
type=4
sync=0
gpu-id=0
codec=1
bitrate=5000000
rtsp-port=8554
udp-port=5400
nvbuf-memory-type=0[sink1]
enable=1
type=2
sync=0
gpu-id=0
codec=1
width=1280
height=720
nvbuf-memory-type=0[sink2]
enable=1
type=3
sync=1
gpu-id=0
codec=1
container=1
bitrate=5000000
output-file=/home/enpei/Documents/course_cpp_tensorrt/course_10/1.deep_stream/media/output.mp4
nvbuf-memory-type=0[osd]
enable=1
gpu-id=0
border-width=5
border-color=0;1;0;1
text-size=30
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
nvbuf-memory-type=0[streammux]
gpu-id=0
live-source=0
batch-size=1
batched-push-timeout=40000
width=1920
height=1080
enable-padding=0
nvbuf-memory-type=0[primary-gie]
enable=1
gpu-id=0
gie-unique-id=1
nvbuf-memory-type=0
config-file=config_infer_primary_yoloV5.txt[tests]
file-loop=1

以上配置文件解释如下:

  • [application]

    • enable-perf-measurement=1:启用性能测量。

    • perf-measurement-interval-sec=5:性能测量间隔,时间单位是秒。

  • [tiled-display]

    多个输入源显示在同一个窗口中

    • enable=0:是否启用Tiled Display,1代表启用。

    • rows=1:Tiled Display中的行数。

    • columns=1:Tiled Display中的列数。

    • width=1280:Tiled Display中每个小窗口的宽度。

    • height=720:Tiled Display中每个小窗口的高度。

    • gpu-id=0:Tiled Display所在的GPU ID。

    • nvbuf-memory-type=0:NvBufSurface的内存类型。

  • 源属性 source

    Deepstream支持输入多个输入源,对于每个源需要单独命名为source%d,并且添加相应配置信息,类似:

    [source0]
    key1=value1
    key2=value2
    ...[source1]
    key1=value1
    key2=value2
    ...
    
    • enable=1:是否启用源。
    • type=3:源类型,

      • 1: Camera (V4L2)
      • 2: URI(统一资源标识符),一般是文件或rtsp,
      • 3: MultiURI
      • 4: RTSP
      • 5: Camera (CSI) (Jetson only)
    • uri:媒体文件的URI,可以是文件(file:///app/2.ds_tracker/media/sample_720p.mp4),也可以是http, RTSP 流。

    • num-sources=1:源数量。

    • gpu-id=0:源所在的GPU ID。

    • cudadec-memtype=0:解码器使用的内存类型。

  • sink

    sink组件用于控制显示的渲染、编码、文件存储,pipeline可以支持多个sink,命名为[sink0],[sink1]...

    • enable=1:是否启用。
    • type=4:类型,4表示RTSP流,更多类型如下:

      • 1: Fakesink
      • 2: EGL based windowed nveglglessink for dGPU and nv3dsink for Jetson (窗口显示)
      • 3: Encode + File Save (encoder + muxer + filesink) (文件)
      • 4: Encode + RTSP streaming; Note: sync=1 for this type is not applicable; (推流)
      • 5: nvdrmvideosink (Jetson only)
      • 6: Message converter + Message broker
    • sync=0:流渲染速度,0: As fast as possible 1: Synchronously

    • gpu-id=0:汇所在的GPU ID。

    • codec=1:编码器类型,1: H.264 (hardware),2: H.265 (hardware)

    • bitrate=5000000:比特率。

    • rtsp-port=8554:RTSP端口号。

    • udp-port=5400:UDP端口号。

    • nvbuf-memory-type=0:NvBufSurface的内存类型。

  • osd

    启用On-Screen Display (OSD) 屏幕绘制

    • enable=1:是否启用OSD。

    • gpu-id=0:OSD所在的GPU ID。

    • border-width=5:检测框宽度(像素值)。

    • border-color=0;1;0;1:检测框颜色(R;G;B;A Float, 0≤R,G,B,A≤1)。

    • text-size=15:文本大小。

    • text-color=1;1;1;1;:文本颜色。

    • text-bg-color=0.3;0.3;0.3;1:文本背景颜色。

    • font=Serif:字体。

    • show-clock=1:是否显示时钟。

    • clock-x-offset=800:时钟的X方向偏移量。

    • clock-y-offset=820:时钟的Y方向偏移量。

    • clock-text-size=12:时钟文本大小。

    • clock-color=1;0;0;0:时钟文本颜色。

    • nvbuf-memory-type=0:NvBufSurface的内存类型。

  • Streammux属性

    设置流多路复用器

    • gpu-id=0:Streammux所在的GPU ID。

    • live-source=0:是否使用实时源。

    • batch-size=1:批大小。

    • batched-push-timeout=40000:批处理推送超时时间。

    • width=1920:流的宽度。

    • height=1080:流的高度。

    • enable-padding=0:是否启用填充。

    • nvbuf-memory-type=0:NvBufSurface的内存类型。

  • Primary GIE属性

    GIE (GPU Inference Engines)图像推理引擎,支持1个主引擎和多个次引擎,例如:

    [primary-gie]
    key1=value1
    key2=value2
    ...[secondary-gie1]
    key1=value1
    key2=value2
    ...[secondary-gie2]
    key1=value1
    key2=value2
    ...
    
    • enable=1:是否启用Primary GIE。

    • gpu-id=0: GIE所在的GPU ID。

    • gie-unique-id=1: GIE的唯一ID。

    • nvbuf-memory-type=0:NvBufSurface的内存类型。

    • config-file=config_infer_primary_yoloV5.txt:引擎的配置文件路径,参考后文介绍,可以包含 这个表格 所有属性(除config-file

  • Tests属性

    用于调试

    file-loop=1:是否启用文件循环。

对应我们也需要对gie进行配置,配置文件为config_infer_primary_yoloV5.txt

[property]
gpu-id=0
net-scale-factor=0.0039215697906911373
model-color-format=0
onnx-file=../weights/yolov5s.onnx
model-engine-file=../weights/yolov5.engine
infer-dims=3;640;640
labelfile-path=labels.txt
batch-size=1
workspace-size=1024
network-mode=2
num-detected-classes=80
interval=0
gie-unique-id=1
process-mode=1
network-type=0
cluster-mode=2
maintain-aspect-ratio=1
parse-bbox-func-name=NvDsInferParseYolo
custom-lib-path=../lib/yolov5_decode.so[class-attrs-all]
nms-iou-threshold=0.45
pre-cluster-threshold=0.25
topk=300

每个参数的详细解释:

原始参考链接:https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_plugin_gst-nvinfer.html#gst-nvinfer-file-configuration-specifications

  • [property]:指定GIE的各种属性和参数:
    • gpu-id=0:使用的GPU ID。
    • net-scale-factor=0.0039215697906911373:输入图像归一化因子,为1/255。
    • model-color-format=0:输入图像颜色格式,0: RGB 1: BGR 2: GRAY
    • onnx-file=yolov5s.onnx:输入的ONNX模型文件路径(如果model-engine-file指向的文件不存在,则会用onnx 生成一个,并且结合network-mode调整精度)
    • model-engine-file=yolov5.engine:TensorRT模型engine文件路径(如果指向文件不存在,参考上一步,如果存在,network-mode不起作用)
    • infer-dims=3;640;640:输入图像的维度,格式为通道数;宽度;高度
    • labelfile-path=labels.txt:类别标签文件路径。
    • batch-size=1:推理时的批大小。
    • workspace-size=1024:TensorRT内部使用的工作空间大小。
    • network-mode=2:推理模式,0: FP32 1: INT8 2: FP16
    • num-detected-classes=80:模型可检测的类别数。
    • interval=0:推理时图像的采样间隔,0表示不采样。
    • gie-unique-id=1:TensorRT引擎的唯一ID。
    • process-mode=1:推理时使用的处理模式,1表示同步处理。
    • network-type=0神经网络类型,0: Detector,1: Classifier,2: Segmentation,3: Instance Segmentation
    • cluster-mode=2:推理时的集群模式,0: OpenCV groupRectangles() 1: DBSCAN 2: Non Maximum Suppression 3: DBSCAN + NMS Hybrid 4: No clustering (for instance segmentation)
    • maintain-aspect-ratio=1:是否保持输入图像的宽高比,1表示保持。
    • parse-bbox-func-name=NvDsInferParseYolo:解析边界框的函数名(这里用的是NvDsInferParseYolo)
    • custom-lib-path=yolov5_decode.so:自定义解码库路径(使用了一个自定义库文件yolov5_decode.so来解码推理输出。)
  • [class-attrs-all]:指定目标检测的属性和参数:
    • nms-iou-threshold=0.45:非极大值抑制的IOU阈值,低于阈值的候选框会丢弃
    • pre-cluster-threshold=0.25:聚类前的阈值。
    • topk=300:按置信度排序,保留前K个目标。

更多配置文件运行:

# 读取文件 --> 检测 --> 窗口显示、保存文件、推流(注意看老师演示)
deepstream-app -c config/deepstream_app_config_windows_display_write.txt# 2个输入(RTSP、文件)--> 检测 --> 推流
deepstream-app -c config/deepstream_app_config_stream.txt# 文件 -> 检测 -> 追踪 -> 推流
deepstream-app -c config/deepstream_app_config_stream_tracking.txt

2.4 docker运行

  • 启动镜像

    # 运行deepstream容器
    docker run --gpus all -v `pwd`:/app -p 8556:8554  --name deepstream_env -it nvcr.io/nvidia/deepstream:6.1.1-devel bash
    
  • 生成engine文件:

    • 安装Deepstream容器缺的包:

      # 先安装当前镜像缺少的包
      apt install libopencv-dev
      apt reinstall libavcodec58 libavformat58 libavutil56# 进入之前课程项目文件:
      cd 3.yolo_trt_app# build
      cmake . -B build
      cmake --build build# create engine
      
    • 之前课程训练的是只有person这一类的模型,现在需要加上car车辆类别,我们使用coco预训练模型即可(80类,附件位置:1.预训练模型

    • 比如使用yolov5s.pt,需要按照之前课程流程处理:修改网络结构 --> 导出onnx文件 --> build engine (注意量化需要提供校准集)

  • 运行

    # 进入目录
    cd 2.deep_stream_docker# 编译plugin library
    /usr/local/cuda/bin/nvcc -Xcompiler -fPIC -shared -o lib/yolov5_decode.so ./src/yoloForward_nc.cu ./src/yoloPlugins.cpp ./src/nvdsparsebbox_Yolo.cpp -isystem /usr/include/x86_64-linux-gnu/ -L /usr/lib/x86_64-linux-gnu/ -I /opt/nvidia/deepstream/deepstream/sources/includes -lnvinfer # 把类别标签文件labels.txt放到config下# 将build好的yolov5 engine 文件放到config下
    # 修改配置文件config_infer_primary_yoloV5.txt中engine的路径# 修改配置文件deepstream_app_config_windows_display_write.txt 中读取视频的地址,以及保存视频的地址# 2个输入(RTSP、文件)--> 检测 --> 推流
    deepstream-app -c config/deepstream_app_config_stream.txt# 文件 -> 检测 -> 追踪 -> 推流
    deepstream-app -c config/deepstream_app_config_stream_tracking.txt# `rtsp`推流的链接为`rtsp://127.0.0.1:8554/ds-test`。可以通过vlc捕获并查看(注意容器端口映射)
    

三、代码方式运行Deepstream

3.1 开发一个Deepstream应用

https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_C_Sample_Apps.html

建议在官方例子的基础上进行开发,代码位置:/opt/nvidia/deepstream/deepstream-{版本号}/sources/apps/sample_apps,本课程就是基于test3的例子改进开发的。

3.2 Metadata

  • https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_plugin_metadata.html
  • https://docs.nvidia.com/metropolis/deepstream/sdk-api/index.html (优先)

核心数据:

  • NvDsBatchMeta:Gst-nvstreammux处理后的批次数据
  • 次级结构:
    • frame
    • object
    • classifier
    • label data

3.3 GStreamer 核心概念

gstreamer是一种基于流的多媒体框架,可用于创建、处理和播放音频和视频流。它是一个开源项目,可以在Linux、Windows、macOS等多个平台上使用。gstreamer提供了一系列的库和插件,使开发者可以构建自定义的流媒体应用程序,包括音频和视频编辑器、流媒体服务器、网络摄像头应用程序等等。gstreamer具有高度的可扩展性和灵活性,可以通过插件的方式支持各种不同的编解码器、协议和设备。

3.3.1 GstElement

https://gstreamer.freedesktop.org/documentation/application-development/basics/elements.html?gi-language=c

  • 媒体应用pipeline基本的构建模块(可以看成一个有输入输出的黑箱)

    • 输入:编码数据
    • 输出:解码数据
  • 类型:

    • source element:没有输入,不接受数据,只产生数据(比如从文件中读取视频)

    • Filters, convertors, demuxers(分流器), muxers(混流器) and codecs:可以有多个输入输出(source pad、sink pad)

      • Sink pad: 接受,消费数据(图左)
      • Source pad:输出,生产数据(图右)
    • sink element:没有输出,不生产数据,只消费数据(比如写入磁盘、推流)

  • 创建元素:

    GstElement *element;/* init GStreamer */
    gst_init (&argc, &argv);/* create element */
    element = gst_element_factory_make ("fakesrc", "source");
    if (!element) {g_print ("Failed to create element of type 'fakesrc'\n");return -1;
    }
    // unref 
    gst_object_unref (GST_OBJECT (element));
    
  • 获取元素属性、设置元素属性、查询元素属性

    // get properties
    g_object_get()
    // set properties
    g_object_set()// query properties (bash command)
    gst-inspect element
    
  • 常见元素:

    • filesrc
    • h264parse
    • nv412decoder
    • nvstreammux
    • nvinfer
    • nvtracker
    • nvvideoconvert
    • nvdsosd
  • 链接元素

    GstElement *pipeline;
    GstElement *source, *filter, *sink;/* create pipeline */
    pipeline = gst_pipeline_new ("my-pipeline");/* create elements */
    source = gst_element_factory_make ("fakesrc", "source");
    filter = gst_element_factory_make ("identity", "filter");
    sink = gst_element_factory_make ("fakesink", "sink");/* must add elements to pipeline before linking them */
    gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);// more specific behavior 
    gst_element_link () and gst_element_link_pads ()
    
  • 元素状态:

    • GST_STATE_NULL

    • GST_STATE_READY

    • GST_STATE_PAUSED

    • GST_STATE_PLAYING

    • 设置函数:

      /* Set the pipeline to "playing" state */
      gst_element_set_state(pipeline, GST_STATE_PLAYING);
      
3.3.2 bin

https://gstreamer.freedesktop.org/documentation/application-development/basics/bins.html?gi-language=c

  • 一串链接起来的元素的集合(bin其实一种element)

  • 创建方式:

    /* create */
    pipeline = gst_pipeline_new ("my_pipeline");
    bin = gst_bin_new ("my_bin");
    source = gst_element_factory_make ("fakesrc", "source");
    sink = gst_element_factory_make ("fakesink", "sink");/* First add the elements to the bin */
    gst_bin_add_many (GST_BIN (bin), source, sink, NULL);
    /* add the bin to the pipeline */
    gst_bin_add (GST_BIN (pipeline), bin);/* link the elements */
    gst_element_link (source, sink);
    
3.3.3 pipeline

  • 所有的元素都必须添加进pipeline后才能被使用(pipeline需要调整时钟、消息传递等)

  • pipeline也是一种特殊的bin,所以也是element

  • 创建方式

    GstElement *pipeline;
    // create 
    pipeline = gst_pipeline_new (const gchar * name)// add elements to the pipeline
    gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
    
3.3.4 pads

https://gstreamer.freedesktop.org/documentation/application-development/basics/pads.html?gi-language=chttps://gstreamer.freedesktop.org/documentation/application-development/basics/pads.html?gi-language=c

  • pads是元素对外服务的接口
  • 数据从一个元素的source pad流向下一个元素的sink pad。

3.4 课程应用

代码:4.ds_tracker

在课程的例子中,我们主要通过构建了整条pipeline,并传入gie以及nvtracker的配置,以搭建了一条满足我们应用的流水线。

其中gie的配置文件类似上文配置文件介绍:

# pgie_config.txt
[property]
gpu-id=0
net-scale-factor=0.0039215697906911373
model-color-format=0
onnx-file=yolov5s.onnx
model-engine-file=../weights/yolov5.engine
labelfile-path=../weights/labels.txt
infer-dims=3;640;640
batch-size=1
workspace-size=1024
network-mode=2
num-detected-classes=80
interval=0
gie-unique-id=1
process-mode=1
network-type=0
cluster-mode=2
maintain-aspect-ratio=1
parse-bbox-func-name=NvDsInferParseYolo
custom-lib-path=../build/libyolo_decode.so[class-attrs-all]
nms-iou-threshold=0.45
pre-cluster-threshold=0.25
topk=300

nvtracker的配置文件也类似:

[tracker]
tracker-width=640
tracker-height=384
gpu-id=0
ll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so
ll-config-file=./config_tracker_IOU.yml
enable-batch-process=1

在docker容器内运行,示例如下:

  • 仅检测

    pipeline流程:

    # file
    ./build/ds_detect file:///app/4.ds_tracker/media/sample_720p.mp4
    # rtsp
    ./build/ds_detect rtsp://localhost:8555/live1.sdp
    

    绘制信息

    • 左上角:当前帧人员和车辆统计
    • 检测框label:类别+置信度

    推流地址:rtsp://{ip}:{port}/ds-test

  • 检测+追踪

    Pipeline:(增加了tracker)

    # file 
    ./build/ds_track file:///app/4.ds_tracker/media/sample_720p.mp4# rtsp
    ./build/ds_track rtsp://localhost:8555/live1.sdp
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    绘制信息

    • 左上角:当前帧人员和车辆统计
    • 检测框label:类别+ track_id
  • 应用:越界 + 人流量 + 车流量

    Pipeline:(probe位置变化)

    # file
    ./build/ds_app file:///app/4.ds_tracker/media/sample_720p.mp4
    # RTSP
    ./build/ds_app rtsp://localhost:8555/live1.sdp
    

  • 应用:越界 + 人流量 + 车流量 + 多源输入

    Pipeline:(增加了nvmultistreamtiler)

# 文件 + RTSP 多个输入源
./build/ds_app_multi rtsp://localhost:8555/live1.sdp file:///app/4.ds_tracker/media/sample_720p.mp4

3.5 jetson NX 运行

  • 安装 deepstream

    参考文档:https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Quickstart.html

    # 安装库
    sudo apt install \
    libssl1.1 \
    libgstreamer1.0-0 \
    gstreamer1.0-tools \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    libgstreamer-plugins-base1.0-dev \
    libgstrtspserver-1.0-0 \
    libjansson4 \
    libyaml-cpp-dev# 安装librdkafka
    git clone https://github.com/edenhill/librdkafka.git
    cd librdkafka
    git reset --hard 7101c2310341ab3f4675fc565f64f0967e135a6a
    ./configure
    make
    sudo make install# 复制文件
    sudo mkdir -p /opt/nvidia/deepstream/deepstream-6.2/lib
    sudo cp /usr/local/lib/librdkafka* /opt/nvidia/deepstream/deepstream-6.2/lib# 下载SDK,并复制到jetson: 
    下载地址:https://developer.nvidia.com/downloads/deepstream-sdk-v620-jetson-tbz2# 附件位置:2.Jetson/deepstream_sdk_v6.2.0_jetson.tbz2# 解压DeepStream SDK
    sudo tar -xvf deepstream_sdk_v6.2.0_jetson.tbz2 -C /# 安装
    cd /opt/nvidia/deepstream/deepstream-6.2
    sudo ./install.sh
    sudo ldconfig
  • 生成engine文件:

    • 之前课程训练的是只有person这一类的模型,现在需要加上car车辆类别,我们使用coco预训练模型即可(80类,附件位置:1.预训练模型
    • 比如使用yolov5s.pt,需要按照之前课程流程处理:修改网络结构 --> 导出onnx文件 --> build engine (注意量化需要提供校准集)
  • 编译运行程序,同PC

3.6 Jetson nano

Nano:不支持Deepstream 6.2

# 安装依赖
sudo apt install \
libssl1.0.0 \
libgstreamer1.0-0 \
gstreamer1.0-tools \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
libgstrtspserver-1.0-0 \
libjansson4=2.11-1#安装librdkafka
git clone https://github.com/edenhill/librdkafka.git
cd librdkafka
git reset --hard 7101c2310341ab3f4675fc565f64f0967e135a6a
./configure
make
sudo make install# 复制文件
sudo mkdir -p /opt/nvidia/deepstream/deepstream-6.0/lib
sudo cp /usr/local/lib/librdkafka* /opt/nvidia/deepstream/deepstream-6.0/lib# 下载SDK,并复制到jetson nano上: https://developer.nvidia.com/deepstream_sdk_v6.0.1_jetsontbz2# 附件位置:2.Jetson/deepstream_sdk_v6.0.1_jetson.tbz2  (Nano:不支持Deepstream 6.2)# 解压DeepStream SDK
sudo tar -xvf deepstream_sdk_v6.0.1_jetson.tbz2 -C /
# 安装
cd /opt/nvidia/deepstream/deepstream-6.0
sudo ./install.sh
sudo ldconfig

备注:本文为修改后的转载,没有转载链接,所以文章类型暂为原创

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python编程之旅:深入探索强大的容器——列表

在Python编程的世界中,容器(Containers)是一种用于存储多个项目的数据结构。其中,列表(List)是最常用且功能强大的容器之一。无论是初学者还是资深开发者,掌握列表的使用方法和技巧都是提升Pyth…

【Android】重温Activity生命周期

前言 Android中用得最多的组件是Activity,而它的生命周期也是最基础的知识,从刚接触Android到工作中会频繁依赖这部分知识。可能大多数人能说出页面新建到页面关闭会走的生命周期:onCreate、onStart、onResume、onPause、onStop、onDestory&…

Linux --- 高级IO

目录 1. 什么是IO 2. 阻塞的本质 3. 五种IO模型 3.1. 通过故事认识五种IO模型 3.2. 上述故事的总结 3.3. 具体的五种IO模型 3.3.1. 阻塞IO 3.3.2. 非阻塞轮询式IO 3.3.3. 信号驱动IO 3.3.4. 多路转接IO 3.3.5. 异步IO 4. 非阻塞IO 4.1. fcntl 系统调用 1. 什么是I…

抖店如何打造一款爆品?按照这三个阶段做,爆单很简单

大家好,我是电商笨笨熊 做抖音小店不懂得怎么选品,那还怎么出销量? 选品时很多新手最苦恼的问题,不知道从哪里选品更容易选中爆品、不懂得什么样的品才是爆品,更不懂得如何打造一款爆品。 那么今天,我们…

创建影子用户

文章目录 1.认识影子用户2.创建隐藏账户并加入管理员组3.修改注册表3.删除用户4.添加管理员权限 1.认识影子用户 影子用户通常指的是那些在系统用户列表中不可见,但在某些情况下可以进行操作的用户。在内网渗透过程中,当我们拿到shell时,肯定…

android11 如何修改状态栏的背景

修改status_bar.xml &#xff1a; <LinearLayout android:id"id/status_bar_contents"android:background"#1ABC9C"android:layout_width"match_parent"android:layout_height"match_parent"android:paddingStart"dimen/statu…

【重回王座】ChatGPT发布最新模型gpt-4-turbo-2024-04-09

今天&#xff0c;新版GPT-4 Turbo再次在大型模型排行榜上荣登榜首&#xff0c;成功超越了此前领先的Claude 3 Opus。另外&#xff0c;新模型在处理长达64k的上下文时&#xff0c;性能竟能够与旧版在处理26k上下文时的表现相当。 目前GPT-4 Turbo仅限于ChatGPT Plus的用户&…

Nginx服务 重写功能与反向代理

六、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之一&#xff0c;用于实现URL的…

DBA面试总结(Mysql篇)

一、delete与trancate的区别 相同点 1.两者都是删除表中的数据&#xff0c;不删除表结构 不同点 1.delete支持按条件删除&#xff0c;TRUNCATE不支持。 2.delete 删除后自增列不会重置&#xff0c;而TRUNCATE会被重置。 3.delete是逐条删除&#xff08;速度较慢&#xff09…

【linux编译报错】g++: error:elf_x86_64:没有那个文件或目录

背景 gcc版本已经是高版本了&#xff0c;9开头了&#xff0c;但是在IDE编译的时候报错&#xff1a; 但是记得自己没有配置过这种参数&#xff0c;只能一步步查了 解决方法 步骤1&#xff1a;先google看了下别人是否碰到该问题 找到一个解决方法说&#xff1a; 在Makefile中…

配置路由器实现互通

1.实验环境 实验用具包括两台路由器(或交换机)&#xff0c;一根双绞线缆&#xff0c;一台PC&#xff0c;一条Console 线缆。 2.需求描述 如图6.14 所示&#xff0c;将两台路由器的F0/0 接口相连&#xff0c;通过一台PC 连接设备的 Console 端口并配置P地址&#xff08;192.1…

如何在CentOS安装Firefox并结合内网穿透工具实现公网访问本地火狐浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

win11电脑驱动怎么更新,windows11更新驱动

驱动是指计算机里软件的程序,硬件的运作离不开驱动的支持,因为驱动就是使得硬件和电脑系统沟通的桥梁。既然驱动如此重要,那么不装肯定不行,如果有问题,也要及时地修复和更新。最近,有位win11用户,想要了解win11电脑驱动怎么更新?接下来,教程会带来两种更新win11驱动的…

LlamaIndex 组件 - Loading

文章目录 一、概览加载Transformations将所有内容放在一起抽象 二、文档/节点概览1、概念2、使用模式文件节点 三、定义和定制文档1、定义文档2、自定义文档2.1 元数据2.2 自定义id2.3 高级 - 元数据定制1&#xff09;自定义LLM元数据文本2&#xff09;自定义嵌入元数据文本3&a…

【数据结构与算法】最大公约数与最小公倍数

最大公因数&#xff08;英语&#xff1a;highest common factor&#xff0c;hcf&#xff09;也称最大公约数&#xff08;英语&#xff1a;greatest common divisor&#xff0c;gcd&#xff09;是数学词汇&#xff0c;指能够整除多个非零整数的最大正整数。例如8和12的最大公因数…

【Java探索之旅】数组使用 初探JVM内存布局

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、数组的使用1.1 元素访问1.2 数组遍历 二、JVM的内存布局&#x1f324;️全篇总结 …

WP免费主题下载

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html 免费WP主题 蓝色简洁实用的wordpress免费主题模板&#xff0c;免费主题资源分享给大家。 https://www.wpniu.com/…

基于Springboot+Vue的Java项目-校园管理系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

在Vue项目使用kindEditor富文本编译器

第一步 npm install kindeditor第二步&#xff0c;建立kindeditor.vue组件 <template><div class"kindeditor"><textarea :id"id" name"content" v-model"outContent"></textarea></div> </templa…

浅尝 express + ORM框架 prisma 的结合

一、prisma起步 安装&#xff1a; npm i prisma -g查看初始化帮助信息&#xff1a; prisma init -h查看初始化帮助信息结果&#xff1a; Set up a new Prisma projectUsage$ prisma init [options] Options-h, --help Display this help message --datasource-provider …