DeepStream-3D 传感器融合多模态应用和框架#
此 deepstream-3d-lidar-sensor-fusion
示例应用程序展示了使用 DS3D 框架的激光雷达 (LiDAR) 和相机数据的多模态传感器融合管线。此应用程序与 DS3D 框架可以设置不同的激光雷达/雷达/相机传感器融合模型、具有多个关键特性的后期融合推理管线。
相机处理管线利用 DeepStream 的通用 2D 视频管线和 batchMeta。
用于激光雷达 (LiDAR) 捕获的自定义 ds3d::dataloader,带有预处理选项。
自定义 ds3d::databridge 将 DeepStream NvBufSurface 和 GstNvDsPreProcessBatchMeta 数据转换为基于形状的张量数据 ds3d::Frame2DGuard 和 ds3d::FrameGuard 格式,并将键值对嵌入到 ds3d::datamap 中。
ds3d::mixer 用于将相机、激光雷达 (LiDAR) 和任何传感器数据高效合并到 ds3d::datamap 中。
ds3d::datatfiler,后跟 libnvds_tritoninferfilter.so,用于多模态 ds3d::datamap 推理和自定义预处理/后处理。
ds3d::datasink 与 ds3d_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) 数据的顶视图和前视图,以便于理解。
示例 2. V2XFusion 多模态批量 4 摄像头和 4 激光雷达 (LiDAR) 推理管线:#
有关设置,请参阅提供的说明。 DS3D V2XFusion 设置
处理来自单个摄像头和激光雷达 (LiDAR) 的数据,批量大小为 4。
利用基于 BEVFusion 和 BEVHeight 的预训练 V2XFusion 模型。
将 V2X ONNX 模型构建到 TensorRT 中以实现 GPU 加速。
将 4 个批量的摄像头和激光雷达 (lidar) 数据一起可视化到多视图中。
![]()
快速入门#
必须安装以下开发包。
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> )
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)/相机数据对齐/校准过滤#
ds3d::datafilter
(在libnvds_3d_alignment_datafilter.so
中实现)应用一系列变换,以将激光雷达 (LiDAR) 数据与相机图像坐标系对齐。
有关更多详细信息,请参阅 DS3D 自定义库规范 自定义 ds3d::datafilter 库:libnvds_3d_alignment_datafilter.so
激光雷达 (LiDAR) 数据 V2X 预处理过滤#
ds3d::datafilter
(在libnvds_3d_lidar_preprocess_datafilter.so
中实现)为 v2x 传感器融合模型预处理激光雷达 (lidar) 数据。
有关更多详细信息,请参阅 DS3D 自定义库规范 自定义 Datafilter libnvds_3d_lidar_preprocess_datafilter 规范
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
中实现)使用 OpenGL ES (GLES) 渲染 3D 场景,其中包含各种元素(纹理、激光雷达 (LiDAR) 点、边界框),在单个窗口中,允许多视图模式下的灵活布局自定义。
有关更多详细信息,请参阅对齐规范 自定义 datarender libnvds_3d_gles_ensemble_render 配置规范
数据推理过滤#
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 支持的自定义组件规范 部分。