Multi-View 3D Tracking(MV3DT)是在8.0推出来的,9.0对精度做了优化(Accuracy improvements for Reference Apps - MV3DT, MaskTracker, Pose Estimation)。
在传统视频分析里,多目标跟踪通常发生在单个摄像头视角内:检测器发现目标,tracker 给目标分配 ID,并在后续帧中保持这个 ID。但在仓库、零售、园区、工厂等大空间场景里,一个目标往往会同时或先后出现在多个摄像头中。如果每个摄像头独立跟踪,就会出现一个问题:同一个人在不同相机里可能拥有不同 ID。
MV3DT正是为了解决这个问题。它把多路相机的检测结果、相机标定信息和 3D 空间建模结合起来,在全局空间中跟踪目标,从而实现跨相机一致的目标 ID 和 3D 轨迹。
本文基于 NVIDIA 官方 Gst-nvtracker 文档和 deepstream-tracker-3d-multi-view 示例,介绍 MV3DT 的基本概念、pipeline 结构、配置重点和运行方式。
MV3DT 解决什么问题
单相机 tracking 只在一个画面里工作。比如 Camera 1 里某个人是 ID 5,走出画面后又进入 Camera 2,普通 tracker 可能会重新分配成 ID 12。
MV3DT 的目标是让系统理解:
Camera 1 中的 ID 5
和 Camera 2 中的 ID 12
可能是同一个真实世界中的人
为了做到这一点,它不只看 2D bbox,而是把检测目标投影到 3D 世界坐标系中,再利用多摄像头之间的空间关系和时间关系进行关联。
最终输出不只是:
2D bbox + tracking ID
而是更接近:
global ID + 3D position + 3D bbox + visibility + camera/source metadata
DeepStream 中的整体架构
MV3DT 仍然基于 DeepStream 的标准 pipeline:
multi-camera sources
→ nvstreammux
→ primary detector
→ nvtracker
→ OSD / message broker / BEV visualizer
关键在 nvtracker。官方文档说明,Gst-nvtracker 插件会加载 low-level tracker library,并把多路视频帧和检测结果以 batch 形式交给 tracker。MV3DT 使用的仍然是 DeepStream tracker 框架,只是 tracker 配置中增加了 3D 和多视角相关模块。
示例里的 DeepStream 配置模板中,tracker 部分包括:
ll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so
ll-config-file=config_tracker.yml
tracker-width=1920
tracker-height=1088
display-tracking-id=1
这说明应用层仍然通过 Gst-nvtracker 使用 tracker,不需要直接接触 low-level tracker 的内部实现。
3D Tracking 的核心:相机标定
MV3DT 的前提是:每个相机必须有标定参数。
示例要求自定义数据集按如下结构组织:
your_dataset/
├── videos/
│ ├── camera1.mp4
│ ├── camera2.mp4
│ └── ...
├── camInfo/
│ ├── camera1.yml
│ ├── camera2.yml
│ └── ...
├── map.png
└── transforms.yml
其中 camInfo 文件包含相机投影矩阵。官方文档中提到,3D tracking 依赖 3x4 camera projection matrix,用于把 3D 世界坐标投影到 2D 图像坐标。
简单理解:
2D image bbox
-
camera projection matrix
-
object 3D model
→ estimated 3D location
对于人类目标,系统通常会建模为一个 cylinder 或 cuboid,并估计 foot location,也就是人在地面上的脚点位置。脚点比 2D bbox 中心更适合表达真实世界运动轨迹。
MV3DT 配置中的关键模块
示例的 config_tracker.yml 包含几个重要 section。
ObjectModelProjection
这个模块负责把 2D 检测结果和相机模型结合起来,得到 3D 世界坐标相关信息。
示例中会配置:
cameraModelFilepath
outputFootLocation
outputVisibility
outputConvexHull
含义是:
cameraModelFilepath:每个相机对应的标定文件outputFootLocation:输出目标脚点位置outputVisibility:输出可见性信息outputConvexHull:输出投影后的凸包信息
StateEstimator
MV3DT 使用 3D 位置状态估计,因此配置里使用:
stateEstimatorType: 3
这对应官方文档中的 SIMPLE_LOCATION_KF,用于估计目标在 2D 图像平面或 3D 世界地面上的位置,而不是只估计 bbox 的 x, y, w, h。
PoseEstimator
示例还使用 BodyPose3DNet 来估计人体关键点。Pose estimator 可以帮助系统更准确地估计人的 3D height 和 foot location。
配置中包含:
poseEstimatorType: 1
onnxFile: BodyPose3DNet
poseInferenceInterval
这说明 MV3DT 不只是依赖 bbox,还可以利用人体姿态来改进 3D 定位。
MultiViewAssociator
这是 MV3DT 的关键多视角关联模块。它负责把不同 camera view 中的 tracklet 进行跨相机关联和融合。
示例中有这些配置项:
multiViewAssociatorType
enableLatePeerReAssoc
enableIDCorrection
enableSeeThrough
enableMsgSync
minPeerTrackletMatchScore
maxPeerToPredDistance4Fusion
minPeerVisibility4Fusion
可以理解为:系统会根据不同相机里目标的 3D 位置、轨迹、可见性和时间同步关系,判断它们是否代表同一个真实目标。
Communicator
多视角关联需要不同相机之间交换 track 信息。示例中使用 Communicator 配置:
communicatorType
pubSubInfoConfigPath
mqttProtoAdaptorConfigPath
auto-configurator 会生成 pub_sub_info_config_0.yml,定义 camera 之间的发布/订阅关系。例如哪些相机是邻居,哪些 camera tracklet 需要互相通信。
输出可视化:OSD + BEV
示例提供两种可视化方式。
第一种是 DeepStream OSD 窗口。它显示多路相机画面,叠加 2D/3D bbox 和 tracking ID。README 中说明,不同相机中的同一个目标会被分配全局一致 ID。
第二种是 BEV,也就是 Bird's-Eye View鸟瞰图。示例提供:
utils/kafka_bev_visualizer.py
它从 Kafka 读取 3D tracking metadata,并在地图上显示目标轨迹。可以选择:
--average-multi-cam
把多个相机看到的同一个目标轨迹平均成一个全局轨迹点;如果去掉这个选项,可以看到每个 camera view 单独贡献的轨迹点。
Kafka 元数据输出
MV3DT 示例使用 Kafka 输出 3D tracking metadata。README 中说明,消息包含:
frame ID
sensor ID
object IDs
3D bounding boxes
示例提供 kafka_client.py,用于消费 Kafka topic 并把 protobuf 消息转换成 JSON 打印。这对下游系统很重要,比如:
- 实时告警
- 行为分析
- 数字孪生地图
- 仓库人员/叉车轨迹分析
- 多摄像头融合监控平台
如何运行示例
示例支持两条路径。
Option 1: DeepStream Container
快速运行 4 路相机:
./scripts/test_4cam_ds.sh
运行 12 路相机:
./scripts/test_12cam_ds.sh
也可以切换 detector:
DETECTOR_MODEL=RTDETR ./scripts/test_4cam_ds.sh
DETECTOR_MODEL=PeopleNet2.6.3 ./scripts/test_4cam_ds.sh
Option 2: Inference Builder
Inference Builder 路径用于自动生成 inference pipeline 和容器化应用。示例中对应命令包括:
./scripts/test_4cam_ib.sh
./scripts/test_12cam_ib.sh
相比传统 DeepStream 配置,Inference Builder 的 ds_mv3dt.yaml 更简洁,适合需要自动生成 pipeline 或集成到微服务的场景。
如下图,左边是多路流的tile图。右边是Bird's-Eye View鸟瞰图。

自定义数据集
如果要在自己的多相机数据集上使用 MV3DT,需要准备:
- 多路视频需要同步
- 所有视频最好有相同分辨率
- 每个相机需要 calibration file
- 可选:用于 BEV 的地图
map.png - 可选:world coordinate 到 BEV image coordinate 的
transforms.yml
示例提供 deepstream_auto_configurator.py 自动生成配置。它会:
- 扫描
videos/和camInfo/ - 生成 DeepStream pipeline config
- 生成 tracker config
- 生成 Kafka/message config
- 生成 camera pub/sub 通信配置
- 根据 override 文件应用 dataset-specific 参数
这大幅降低了手动配置多路相机的复杂度。
MV3DT 适合什么场景
MV3DT 特别适合大空间、多摄像头、需要跨视角一致 ID 的场景:
- 仓库人员/叉车跟踪
- 零售门店多摄像头客流分析
- 工厂安全监控
- 机场/车站/园区多摄像头融合
- 数字孪生中的实时人员/车辆轨迹
- 需要鸟瞰图轨迹的空间行为分析
如果只是单相机 tracking,普通 NvDCF 或 NvSORT 可能已经足够。但如果目标会跨相机移动,或者需要世界坐标中的轨迹,MV3DT 就更有价值。
总结
DeepStream 的 Multi-View 3D Tracking 可以理解为:
多路相机检测
-
相机标定
-
3D 目标建模
-
跨相机关联
-
Kafka/BEV 可视化
= 全局一致的 3D 多目标跟踪
它不是简单地把多个 camera view 拼在一起,而是把每个相机中的目标映射到共同的 3D 空间中,再进行跨视角融合。
一句话总结:
MV3DT 让 DeepStream 从"单相机目标跟踪"升级为"多相机全局 3D 空间跟踪"。