DeepStream-3D 传感器融合多模态应用和框架#

deepstream-3d-lidar-sensor-fusion 示例应用程序展示了使用 DS3D 框架的激光雷达 (LiDAR) 和相机数据的多模态传感器融合管线。此应用程序与 DS3D 框架可以设置不同的激光雷达/雷达/相机传感器融合模型、具有多个关键特性的后期融合推理管线。

  • 相机处理管线利用 DeepStream 的通用 2D 视频管线和 batchMeta。

  • 用于激光雷达 (LiDAR) 捕获的自定义 ds3d::dataloader,带有预处理选项。

  • 自定义 ds3d::databridge 将 DeepStream NvBufSurfaceGstNvDsPreProcessBatchMeta 数据转换为基于形状的张量数据 ds3d::Frame2DGuardds3d::FrameGuard 格式,并将键值对嵌入到 ds3d::datamap 中。

  • ds3d::mixer 用于将相机、激光雷达 (LiDAR) 和任何传感器数据高效合并到 ds3d::datamap 中。

  • ds3d::datatfiler,后跟 libnvds_tritoninferfilter.so,用于多模态 ds3d::datamap 推理和自定义预处理/后处理。

  • ds3d::datasinkds3d_gles_ensemble_render 用于 3D 检测结果可视化,并带有多分屏显示。

deepstream-3d-lidar-sensor-fusion 示例应用程序和源代码位于 app/sample_apps/deepstream-3d-lidar-sensor-fusion/,供您参考。

有两个用于激光雷达 (LiDAR) 和相机数据的多模态传感器融合管线,可实现 3D 检测。

示例 1. 带有 6 个摄像头加 1 个激光雷达 (LiDAR) 数据融合管线的 BEVFusion 多模态#

有关设置,请参阅提供的说明。 使用 Triton 的 DS3D BEVFusion 设置

  • 处理来自 6 个摄像头和 1 个激光雷达 (LiDAR) 的数据。

  • 利用预训练的 PyTroch BEVFusion 模型,该模型通过 CUDA-BEVFusion 针对使用 TensorRT 和 CUDA 的 NVIDIA GPU 进行了优化。

  • PyTriton 多模态推理模块 (triton-lmm) 简化了 Python 模型集成,允许包含任何 Python 推理。

  • 基于 ds3d::datatfiler 的 triton 推理通过 gRPC。

  • 通过 6 个摄像头视图可视化 ds3d::datamap,并将激光雷达 (LiDAR) 数据投影到每个视图中。此外,它还提供同一激光雷达 (LiDAR) 数据的顶视图和前视图,以便于理解。

    DS-3D Lidar-Camera BEVFusion pipeline overview

示例 2. V2XFusion 多模态批量 4 摄像头和 4 激光雷达 (LiDAR) 推理管线:#

有关设置,请参阅提供的说明。 DS3D V2XFusion 设置

  • 处理来自单个摄像头和激光雷达 (LiDAR) 的数据,批量大小为 4。

  • 利用基于 BEVFusion 和 BEVHeight 的预训练 V2XFusion 模型。

  • 将 V2X ONNX 模型构建到 TensorRT 中以实现 GPU 加速。

  • 将 4 个批量的摄像头和激光雷达 (lidar) 数据一起可视化到多视图中。

DS-3D Lidar-Camera V2XFusion pipeline overview

快速入门#

  • 必须安装以下开发包。

    • GStreamer-1.0

    • GStreamer-1.0 基础插件

    • GLES 库

    • libyaml-cpp-dev

  • 在主机本地下载并安装 DeepStream SDK。按照 安装 DeepStream SDK 页面上的方法 1 或 2 在本地安装 DeepStream SDK 的说明进行操作。

    BEVFusion 需要本地安装 DeepStream SDK,其中包括用于构建/运行容器、模型和数据集的脚本,以便于使用。

  • 启动容器之前的先决条件。

    # run cmdline outside of the container
    $ export DISPLAY=0.0 # set the correct display number if DISPLAY is not exported
    $ xhost +
    $ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion
    # make directory for dataset and model repo in host, it would be mounted into the container for bevfusion tests
    $ sudo chmod -R a+rw . # Grant read/write permission for all of the files in this folder
    $ mkdir -p data bevfusion/model_root
    

如果在容器外部运行任何脚本,或者遇到文件读/写权限错误,请使用 sudo -E 运行命令。

注意

用户必须在容器外部的每个终端上运行以下命令行,或者看到诸如 xhost:  unable to open display 之类的错误

$ export DISPLAY=0.0 # set the correct display number if DISPLAY is not exported
$ xhost +
  • Bevfusion 和 V2XFusion 设置差异。

    • BEVFusion 将在 deepstream-triton 基础镜像 nvcr.io/nvidia/deepstream:{xx.xx.xx}-triton-multiarch 之上构建一个新的本地 docker 镜像 deepstream-triton-bevfusion:{xx.xx},以安装所有 CUDA-BEVFusion 依赖项、构建离线模型,并为 x86 dGPU 上的 gRPC 远程推理设置 triton 服务器。客户端融合管线可以在 x86 和 Jetson 上运行。

    • V2XFusion 设置说明在 deepstream-triton 基础容器 nvcr.io/nvidia/deepstream:{xx.xx.xx}-triton-multiarch 内部,并通过 Triton CAPI(原生)在本地进行推理。如果手动安装了 Triton 依赖项,它还支持在没有容器的主机上进行 Jetson 测试。

    deepstream-triton-bevfusion:{xx.xx}{xx.xx} 来自本地安装的 deepstream sdk major.minor 版本号。nvcr.io/nvidia/deepstream:{xx.xx.xx}-triton-multiarch{xx.xx.xx}DeepStream X86 容器DeepStream Jetson 容器 匹配

BEVFusion 管线演示设置#

  • 准备所有必需的容器、推理模型、示例数据集。请参阅 DS3D BEVFusion 设置 中提供的详细说明

    注意

    除非另有说明,否则以下所有 BEVFusion 设置的命令行都在容器外部运行

  • BEVFusion 管线快速入门。

    • 选项 1:构建 bevfusion 模型容器,启动 triton 服务器,最后运行管线。

      运行以下命令行以在带有 dGPU 的 x86 上构建本地 bevfusion 模型容器 deepstream-triton-bevfusion:{DS_VERSION_NUM}

      $ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion
      $ bevfusion/docker_build_bevfusion_image.sh nvcr.io/nvidia/deepstream:{xx.xx.xx}-triton-multiarch
      

      运行以下命令行以在带有 dGPU 的 x86 上下载模型并构建 TensorRT 引擎文件。

      $ mkdir -p bevfusion/model_root
      $ bevfusion/docker_run_generate_trt_engine_models.sh bevfusion/model_root
      

      在带有 dGPU 的 x86 上使用上一步构建的模型启动 triton 服务器。

      $ bevfusion/docker_run_triton_server_bevfusion.sh bevfusion/model_root
      

      打开另一个终端以在 x86 上使用 bevfusion 配置启动 deepstream 3d 传感器融合管线。

      $ export NUSCENE_DATASET_URL="https://github.com/NVIDIA-AI-IOT/deepstream_reference_apps/raw/DS_7.1/deepstream-3d-sensor-fusion/data/nuscene.tar.gz"
      $ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion
      # this cmdline is also preparing the dataset for pipeline tests.
      # this config file would project lidar data back to camera view in display.
      $ bevfusion/docker_run_ds3d_sensor_fusion_bevfusion_pipeline.sh ds3d_lidar_plus_multi_cam_bev_fusion.yaml
      # OR
      # this config file would keep clear lidar and camera data in display, meanwhile show lables in each view.
      $ bevfusion/docker_run_ds3d_sensor_fusion_bevfusion_pipeline.sh ds3d_lidar_plus_multi_cam_bev_fusion_with_label.yaml
      

      有关说明的更多详细信息,请参阅 DS3D BEVFusion 设置

    • 选项 2:一旦用户从选项 1 中设置好所有内容,并保持 tritonserver 运行,并确保数据集已下载,则用户可以在 deepstream-triton 容器内运行 cmdline。

      在选项 1 中模型和数据集准备就绪后启动 deepstream triton 容器。export DOCKER_GPU_ARG="--runtime nvidia" 用于 Jetson。 有关如何修改配置文件以设置 Jetson 测试的更多详细信息,请参阅 DS3D BEVFusion 设置

      $ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion
      # make directory for dataset and model repo in host, it would be mounted into the container for bevfusion tests
      $ mkdir -p data bevfusion/model_root
      
      $ export DOCKER_GPU_ARG="--gpus all" # for x86
      # export DOCKER_GPU_ARG="--runtime nvidia" # for Jetson
      # start the container interactively, and mount dataset and model folder into the container for tests
      $ docker run $DOCKER_GPU_ARG -it --rm --ipc=host --net=host --privileged -v /tmp/.X11-unix:/tmp/.X11-unix \
       -e DISPLAY=$DISPLAY \
       -w /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion \
       -v ./data:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion/data \
       -v ./bevfusion/model_root:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion/bevfusion/model_root \
       nvcr.io/nvidia/deepstream:{xx.xx.xx}-triton-multiarch
      

      启动 deepstream bevfusion 管线,在容器内运行 cmdline。

      # run cmdline inside of this container
      $ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion
      $ deepstream-3d-lidar-sensor-fusion -c ds3d_lidar_plus_multi_cam_bev_fusion.yaml
      # Or render with the 3D-bbox labels.
      $ deepstream-3d-lidar-sensor-fusion -c ds3d_lidar_plus_multi_cam_bev_fusion_with_label.yaml
      
    • BEVFusion 管线渲染结果与 nuscene 数据集(nuscene 数据集使用条款 <https://www.nuscenes.org/terms-of-use> )

      DS-3D Lidar-Camera BEVFusion Snapshot

V2XFusion 管线演示设置#

请参阅 DS3D V2XFusion 设置 中提供的详细说明

  • 启动 deepstream-triton 基础容器以进行 V2XFusion 测试。

    如果用户已在 Jetson 主机上手动安装 Triton 依赖项,请跳过此步骤。

    # running cmdline outside of the container
    $ xhost +
    # export DOCKER_GPU_ARG="--runtime nvidia --privileged" # for Jetson Orin
    $ export DOCKER_GPU_ARG="--gpus all" # for x86
    
    # start the container interactively
       $ docker run $DOCKER_GPU_ARG -it --rm --ipc=host --net=host -v /tmp/.X11-unix:/tmp/.X11-unix \
        -e DISPLAY=$DISPLAY \
        -w /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion \
        nvcr.io/nvidia/deepstream:{xx.xx.xx}-triton-multiarch
    # {xx.xx.xx} is deepstream sdk version number
    

    使用此 docker run 容器,v2XFusion 设置的以下说明在此容器内运行。 如果在 Jetson 上跳过此步骤,则以下说明直接在主机上运行。

  • 安装依赖项

    $ pip install gdown python-lzf # with sudo if running on Jetson host
    
  • 准备所有必需的推理模型,优化模型和示例数据集

    按照 下载 V2XFusion 模型并构建 TensorRT 引擎文件 中的说明下载原始 V2X 数据集。

    注意:示例数据集由 https://thudair.baai.ac.cn/coop-forecast 提供。对于用户选择使用的每个数据集,用户有责任检查数据集许可证是否适合预期用途。

    $ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion/v2xfusion/scripts
    $ gdown 1gjOmGEBMcipvDzu2zOrO9ex_OscUZMYY
    $ ./prepare.sh dataset# with sudo if running on Jetson host
    
  • 模型和数据集准备就绪后,启动 V2XFusion 管线。

    # run the cmdline inside deepstream-triton container
    $ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion
    $ deepstream-3d-lidar-sensor-fusion -c ds3d_lidar_video_sensor_v2x_fusion.yml
    
    • 用户可以在显示器上看到管线运行。

从源代码构建应用程序#

  • 在容器内部编译示例应用程序 deepstream-3d-lidar-sensor-fusion

$ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-3d-lidar-sensor-fusion
$ make
$ sudo make install (sudo not required in the case of docker containers)

注意

要编译源文件,请使用 sudo -E 或 root 权限运行 make。

此示例应用程序中使用的 DS3D 组件#

本节介绍 deepstream-3d-lidar-sensor-fusion 管线中使用的 DS3D 组件。

激光雷达 (LiDAR) 数据加载#

  • ds3d::dataloader(在 libnvds_lidarfileread.so 中实现)

    • 从磁盘读取激光雷达 (LiDAR) 点云文件列表到 ds3d::datamap 格式。

    • 源代码位于 /opt/nvidia/deepstream/deepstream/sources/libs/ds3d/dataloader/lidarsource 中。

    • 有关编译和安装说明,请参阅该目录中的 README。

    • 有关更多详细信息,请参阅 DS3D 自定义库规范 自定义数据加载器 libnvds_lidarfileread 配置规范

将视频数据桥接到 DS3D ds3d::datamap#

  • ds3d::databridge(在 libnvds_3d_video_databridge.so 中实现)

    • 将 2D 视频缓冲区传输到 ds3d::datamap 格式。

    • DeepStream 期望 2D 缓冲区采用 video/x-raw(memory:NVMM) 格式(例如,来自 nvv4l2decoder 的输出)。

    • 有关更多详细信息,请参阅 DS3D databridge 规范 配置文件

    注意ds3d::datamap 是一种通用数据结构,由键值对组成。它用作 DeepStream ds3d 框架内组件的主要输入和输出缓冲区格式。

数据混合#

  • ds3d::datamixer(在 libnvds_3d_multisensor_mixer.so 中实现)

    • 将视频数据 (2D) 和激光雷达 (LiDAR) 数据 (3D) 组合成单个 ds3d::datamap

    • 混音器以用户指定的帧速率运行。处理速度可能受到最慢的输入源的限制。

    • 有关更多详细信息,请参阅 DS3D 混音器规范 配置文件

激光雷达 (LiDAR)/相机数据对齐/校准过滤#

激光雷达 (LiDAR) 数据 V2X 预处理过滤#

  • ds3d::datafilter(在 libnvds_3d_lidar_preprocess_datafilter.so 中实现)

  • ds3d 自定义点云数据到点柱散射数据转换(在 libnvds_3d_lidar_preprocess_datafilter.so 中实现)

    • 实现 V2XFusion 模型 pointpillar 散射数据转换功能,以适应 ds3d 激光雷达 (lidar) 预处理 ds3d::datafilter

    • 请参阅 /opt/nvidia/deepstream/deepstream/sources/libs/ds3d/datafilter/lidar_preprocess/README

激光雷达 (LiDAR)/相机数据 GLES 渲染#

  • ds3d::datarender(在 libnvds_3d_gles_ensemble_render.so 中实现)

数据推理过滤#

  • ds3d::datafilter(在 libnvds_tritoninferfilter.so 中实现)

    • 使用 Triton 推理服务器执行多模态数据推理。来自 ds3d::datamap 的任何数据元素都可以转发到 Triton。它同时支持 Triton CAPI 和 gRPC 模式。根据具体的推理任务,可能需要自定义预处理和后处理。

    • 有关更多详细信息,请参阅 libnvds_tritoninferfilter 配置规范

  • ds3d 自定义 V2XFusion 模型输入预处理库(在 libnvds_3d_v2x_infer_custom_preprocess.so 中实现)

    • 为 V2XFusion 模型的张量输入准备并复制常量参数和数据

    • 将 pointpillar 散射数据复制到模型输入张量

    • 请参阅 /opt/nvidia/deepstream/deepstream/sources/libs/ds3d/inference_custom_lib/ds3d_v2x_infer_custom_preprocess/README

激光雷达 (LiDAR) 检测的自定义后处理#

  • ds3d 自定义后处理库(在 libnvds_3d_infer_postprocess_lidar_detection.so 中实现)

    • 对传感器融合结果(3D 检测对象)执行自定义后处理操作。接口继承自 nvdsinferserver::IInferCustomProcessor

    • 源代码位于 /opt/nvidia/deepstream/deepstream/sources/libs/ds3d/inference_custom_lib/ds3d_lidar_detection_postprocess 中。

    • 有关编译和安装说明,请参阅该目录中的 README。

  • ds3d 自定义 V2XFusion 输出后处理库(在 libnvds_3d_v2x_infer_custom_postprocess.so 中实现)

    • 解析来自 V2XFusion 模型的输出张量数据

    • 从输出张量数据计算 3D bboxes

    • 请参阅 /opt/nvidia/deepstream/deepstream/sources/libs/ds3d/inference_custom_lib/ds3d_v2x_infer_custom_postprocess/README

使用 Triton-LMM 的 BEVFusion 模型推理#

  • 用于 bevfusion 的 triton_lmm Python 模块

    • 一个基于 Triton 和 PyTriton 的 Python 模块,专为多模态推理而设计。它简化了将基于 Python 的推理模型集成到 Triton 服务器的过程。此示例应用程序使用此模块利用 BEVFusion 模型(Python 版本)。

    • 源代码位于 app/sample_apps/deepstream-3d-lidar-sensor-fusion/python/triton_lmm

    • Python 模块许可证 Apache-2.0

DS3D 自定义组件配置规范#

有关更多详细信息,请参阅 DeepStream-3D 自定义应用和库教程DS_3D 支持的自定义组件规范 部分。