+
+# chmod +x scripts/test_12cam_ib.sh
+./scripts/test_12cam_ib.sh
+
+# To use RT-DETR detector instead of the default PeopleNetTransformer:
+# DETECTOR_MODEL=RTDETR ./scripts/test_12cam_ib.sh
+
+# To use PeopleNet v2.6.3 detector:
+# DETECTOR_MODEL=PeopleNet2.6.3 ./scripts/test_12cam_ib.sh
+```
+
+#### Step-by-step Instructions
+For detailed step-by-step instructions, see [Inference Builder: Step-by-step Instructions](docs/step-by-step-inference-builder.md#sample-2-12-camera-dataset).
+
+
+## Output Visualization
+Whether you use Option 1 (DeepStream Container) or Option 2 (Inference Builder), both approaches launch two windows with similar visualizations. This section explains and demonstrates the content of these visualization windows.
+
+### DeepStream Direct Visualization
+---
+When the pipeline is launched, DeepStream shows the output video like below while processing the input video. In the example frames below, you can see that objects detected across different cameras are assigned globally consistent IDs. And both 2D and 3D bounding boxes are visualized for each tracked object.
+
+In the Inference Builder OSD window, object IDs are visible directly in the grid view. In the DeepStream Container OSD window, object IDs are only visible when viewing a single camera. To enter single camera view with object IDs, left-click on the desired camera view. And to return to the multi-camera grid view, simply right-click anywhere in the window.
+
+
+ Example 1: 4-cam dataset, with PeopleNetTransformer, Inference Builder OSD
+
+
+
+
+ Example 2: 12-cam dataset, with RT-DETR, Deepstream OSD
+ 
+ Note: a forklift is also detected in the 2nd camera view (row 1, column 2).
+
+
+#### Disabling DeepStream Direct Visualization
+
+If you don't need on-screen display, you can disable it:
+
+* **For DeepStream Container:**
+ * Remove the `--enable-osd` option from `deepstream_auto_configurator.py` command in the quick-start script and run again.
+
+* **For Inference Builder:**
+ * Comment out the `render_config` section in `config_templates/ds_mv3dt.yaml` and run the quick-start script again.
+
+
+
+### Real-time BEV visualization of 3D metadata from Kafka
+---
+
+The `kafka_bev_visualizer.py` script provides real-time bird's-eye view (BEV) visualization of 3D tracking data streamed via Kafka.
+
+Note that the BEV visualization script should be launched before launching the MV3DT app.
+
+* Command:
+ ```bash
+ python utils/kafka_bev_visualizer.py \
+ --dataset-path=$DATASET_DIR \
+ --msgconv-config=$EXPERIMENT_DIR/config_msgconv.txt \
+ --show-ids \
+ --average-multi-cam
+ ```
+* Expected outputs (left: 4-camera, right: 12-camera)
+
+

+

+
+
+
+* Note that the BEV visualization shows fused tracks, where trajectories of the same object from multiple cameras are averaged into one. If you want to see the individual trajectories from every camera, simply remove the `--average-multi-cam` option from the command. The output will then look like this:
+
+

+

+
+
+# Receiving 3D Tracking Metadata from Kafka
+
+MV3DT streams tracking metadata (frame ID, sensor ID, object IDs, 3D bounding boxes, etc.) to a Kafka topic as protobuf messages. The `kafka_client.py` script demonstrates how to connect to the Kafka broker, deserialize the protobuf messages, and print them as JSON. For building downstream applications using MV3DT tracking metadata, this can be a reference implementation.
+
+```bash
+source mv3dt_venv/bin/activate
+
+# Default: connects to localhost:9092, topic 'mv3dt'
+python utils/kafka_client.py
+
+# Custom broker and topic
+python utils/kafka_client.py --broker localhost:9092 --topic mv3dt
+```
+
+# Customization
+
+This section provides customization options for the MV3DT pipeline. If you are new to DeepStream and want to try MV3DT on your own dataset, see [Running MV3DT on Custom Datasets](#running-mv3dt-on-custom-datasets). If you already have a working 2D DeepStream tracking pipeline, see [Converting your Existing 2D DeepStream Tracking Pipeline to MV3DT](#converting-your-existing-2d-deepstream-tracking-pipeline-to-mv3dt) for simple transformation to multi-view 3D pipeline.
+
+
+
+## Running MV3DT on Custom Datasets
+
+**Requirements:**
+- Multi-view video streams must be synchronized.
+- All video streams must have the same resolution.
+- Camera calibration parameters (projection matrices) must be available.
+
+### Steps
+---
+
+1. **Organize your dataset** with the following structure:
+ ```
+ your_dataset/
+ ├── videos/
+ │ ├── camera1.mp4
+ │ ├── camera2.mp4
+ │ └── ...
+ ├── camInfo/
+ │ ├── camera1.yml
+ │ ├── camera2.yml
+ │ └── ...
+ ├── map.png (optional, for BEV visualization)
+ └── transforms.yml (optional, for BEV visualization)
+ ```
+
+2. **Create camera calibration files** following the format of `datasets/mtmc_4cam/camInfo/Warehouse_Synthetic_Cam001.yml`. Replace the `projectionMatrix_3x4_w2p` values with your camera's projection matrix. For more details about these files, please refer to the [Single-View 3D Tracking](https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_plugin_gst-nvtracker.html#single-view-3d-tracking) and [The 3x4 Camera Projection Matrix](https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_plugin_gst-nvtracker.html#the-3x4-camera-projection-matrix) sections of the DeepStream documentation.
+
+3. **Optional: BEV visualization setup** - Prepare a BEV map image and create a `transforms.yml` file specifying the projection matrix that maps world coordinates (in meters) to BEV image coordinates, following the sample format in `datasets/mtmc_4cam/transforms.yml`.
+
+4. **Generate configurations** using the auto-configurator. Refer to `scripts/test_4cam_ds.sh` for the exact python command and environment variables needed.
+
+5. **Launch the MV3DT pipeline** using your generated configs. Refer to `scripts/test_4cam_ds.sh` for the exact Docker command and environment variables needed.
+
+
+### How It Works
+---
+The auto-configurator generates a complete set of MV3DT config files tailored to your dataset:
+
+1. **Detects dataset structure** - Scans your `videos/` and `camInfo/` directories to determine camera count and calibration files
+2. **Generates pipeline configuration** - Creates `config_deepstream.txt` with appropriate source URIs, batch sizes, and display grid layout based on detected cameras
+3. **Creates inter-camera communication configs** - Generates `pub_sub_info_config_0.yml` defining camera neighbor relationships for multi-view data sharing
+4. **(Optional) Applies overrides** - Uses override files to customize tracker settings for specific datasets or requirements
+
+For detailed usage and all available options, see the **[Auto-Configurator Documentation](utils/README.md)**.
+
+
+## Converting your Existing 2D DeepStream Tracking Pipeline to MV3DT
+If you have an existing 2D detection and tracking pipeline using DeepStream, the auto-configurator can automatically enhance it to support multi-view 3D tracking, provided you have camera calibration files available.
+
+### Steps
+---
+
+1. **Organize your dataset** as in the previous [Running MV3DT on Custom Datasets](#running-mv3dt-on-custom-datasets) section.
+
+2. **Create camera calibration files** as in the previous section.
+
+3. **Optional: BEV visualization setup** (required if you want to enable BEV visualization)
+ - Follow the instructions in the previous section.
+
+4. **Optional: Set up your model configs** (required if using a different detector than PeopleNetTransformer)
+ - For example, if you are using PeopleNet as your detector, create a `PeopleNet` folder under `models` and modify `config_templates/config_pgie.txt` to point to your model files.
+
+5. **Optional: Set up your DeepStream pipeline config** (required if using a custom DeepStream pipeline config)
+ - Modify `config_templates/config_deepstream.txt` based on your use case. For example, if you have a custom `[pre-process]` section, copy that section to `config_templates/config_deepstream.txt`. Note that `[source%d]` and `[sink%d]` sections will be handled by the auto-configurator.
+
+6. **Place your tracker config file in the `config_templates` folder.**
+
+
+7. **Generate MV3DT configs**
+ - Use the auto-configurator with `--tracker-config` argument, i.e. suppose your tracker config file is named `config_tracker_custom_2d.yml`, pass `--tracker-config=config_tracker_custom_2d.yml` to the auto-configurator. The auto-configurator assumes all template configs are located in the `config_templates` folder, so only the file name is needed, not the full path.
+
+8. **Launch the MV3DT pipeline** using your generated configs.
+
+
+### A Step-by-step Example
+---
+
+1. To simulate a custom dataset, let's create a 6-camera subset (randomly selected) from the 12-camera dataset. Run the following command to generate a new dataset in `datasets/mtmc_6cam`.
+ ```bash
+ ./scripts/create_6cam_subset.sh
+ ```
+
+2. Assume you have an existing 2D tracking config file. In this example, we will use the `config_tracker_2d.yml` file in the `config_templates` folder.
+
+3. Set up output directories and run the auto-configurator to generate the MV3DT config files.
+ ```bash
+ export DATASET_DIR=$PWD/datasets/mtmc_6cam/
+ export EXPERIMENT_DIR=$PWD/experiments/deepstream/6cam
+
+ mkdir -p $EXPERIMENT_DIR/infer-kitti-dump
+ mkdir -p $EXPERIMENT_DIR/tracker-kitti-dump
+
+ python utils/deepstream_auto_configurator.py \
+ --dataset-dir=$DATASET_DIR \
+ --tracker-config=config_tracker_2d.yml \
+ --enable-msg-broker \
+ --enable-osd \
+ --output-dir=$EXPERIMENT_DIR
+ ```
+
+4. Launch the MV3DT pipeline:
+ ```bash
+ export MODEL_REPO=$PWD/models
+
+ docker run -t --privileged --rm --net=host --runtime=nvidia \
+ -v $MODEL_REPO:/workspace/models \
+ -v $DATASET_DIR:/workspace/inputs \
+ -v $EXPERIMENT_DIR:/workspace/experiments \
+ -v /tmp/.X11-unix/:/tmp/.X11-unix \
+ -e DISPLAY=$DISPLAY \
+ -w /workspace/experiments \
+ nvcr.io/nvidia/deepstream:9.0-triton-multiarch \
+ deepstream-test5-app -c config_deepstream.txt
+ ```
+
+* For convenience, the same process is automated in the following scripts:
+
+ ```bash
+ # Create the 6-camera dataset if not already done
+ # ./scripts/create_6cam_subset.sh
+
+ # Option 1: using DeepStream Container
+ ./scripts/test_custom_2d_tracker_ds.sh
+
+ # Option 2: using Inference Builder
+ ./scripts/test_custom_2d_tracker_ib.sh
+ ```
+
+### How It Works
+---
+The auto-configurator generates a complete set of MV3DT config files based on your custom 2D tracker, pipeline, and model configs, as well as your dataset.
+
+1. **Detects dataset structure** - Scans your `videos/` and `camInfo/` directories to determine camera count and calibration files
+2. **Generates pipeline configuration** - Uses your updated `config_templates/config_deepstream.txt` as template and generates `$EXPERIMENT_DIR/config_deepstream.txt` with appropriate source URIs, batch sizes, and display grid layout
+3. **Extends 2D tracker configs with MV3DT additional sections** - automatically injects MV3DT sections (`ObjectModelProjection` for 3D model projection, `MultiViewAssociator` for multi-view association, and `Communicator` for inter-camera communication) to your 2D tracker config
+4. **Creates inter-camera communication configs** - Generates `$EXPERIMENT_DIR/pub_sub_info_config_0.yml` defining camera publish/subscribe relationships for multi-view data sharing
+5. **(Optional) Applies overrides** - Uses override files to customize tracker settings for specific datasets or requirements
+
+For detailed usage and all available options, see the **[Auto-Configurator Documentation](utils/README.md)**.
+
+
+
+
+## Python Util Scripts
+
+For more details on python utility scripts including auto-configuration generators and visualization tools, see
+📁 **[Python Util Scripts Documentation](utils/README.md)**
+
+
+
+
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/assets/LICENSE b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/assets/LICENSE
new file mode 100644
index 00000000..758d5be4
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/assets/LICENSE
@@ -0,0 +1,8 @@
+SPDX-FileCopyrightText: Copyright (c) 2018‑2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+SPDX-License-Identifier: CC-BY-ND-4.0
+
+Licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License.
+
+You may copy, distribute, modify, and build upon the material for any purpose,
+including commercial use, as long as proper credit is given to the creator
+and a link to the license is provided.
\ No newline at end of file
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_deepstream.txt b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_deepstream.txt
new file mode 100644
index 00000000..7b3d5651
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_deepstream.txt
@@ -0,0 +1,140 @@
+[application]
+kitti-track-output-dir=tracker-kitti-dump
+gie-kitti-output-dir=infer-kitti-dump
+perf-measurement-interval-sec=5
+enable-perf-measurement=1
+
+[source0]
+type=3
+enable=1
+cudadec-memtype=0
+gpu-id=0
+num-sources=1
+uri=file://videos/Warehouse_Synthetic_Cam001.mp4
+
+[source1]
+type=3
+enable=1
+cudadec-memtype=0
+gpu-id=0
+num-sources=1
+uri=file://videos/Warehouse_Synthetic_Cam002.mp4
+
+[source2]
+type=3
+enable=1
+cudadec-memtype=0
+gpu-id=0
+num-sources=1
+uri=file://videos/Warehouse_Synthetic_Cam003.mp4
+
+[source3]
+type=3
+enable=1
+cudadec-memtype=0
+gpu-id=0
+num-sources=1
+uri=file://videos/Warehouse_Synthetic_Cam004.mp4
+
+[streammux]
+enable-padding=0
+nvbuf-memory-type=0
+width=1920
+height=1080
+batched-push-timeout=-1
+batch-size=4
+live-source=0
+gpu-id=0
+
+[primary-gie]
+enable=1
+nvbuf-memory-type=0
+bbox-border-color3=0;1;0;1
+bbox-border-color2=0;0;1;1
+bbox-border-color1=0;1;1;1
+bbox-border-color0=1;0;0;1
+batch-size=4
+gpu-id=0
+gie-unique-id=1
+interval=0
+model-engine-file=/workspace/models/PeopleNetTransformer/peoplenet_transformer_model_op17.onnx_b4_gpu0_fp16.engine
+config-file=config_pgie.txt
+
+[tracker]
+enable=1
+tracker-width=1920
+tracker-height=1088
+display-tracking-id=1
+gpu-id=0
+ll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so
+ll-config-file=config_tracker.yml
+
+[osd]
+enable=1
+nvbuf-memory-type=0
+clock-color=1;0;0;0
+clock-text-size=12
+show-clock=0
+font=Serif
+text-size=10
+text-bg-color=0.3;0.3;0.3;1
+text-color=1;1;1;1
+border-width=1
+clock-x-offset=800
+clock-y-offset=820
+gpu-id=0
+display-text=1
+
+[tiled-display]
+enable=1
+gpu-id=0
+width=1920
+height=1080
+nvbuf-memory-type=0
+rows=2
+columns=2
+
+[sink0]
+enable=1
+type=1
+qos=0
+gpu-id=0
+nvbuf-memory-type=0
+source-id=0
+sync=0
+
+[sink1]
+enable=0
+type=2
+qos=0
+gpu-id=0
+nvbuf-memory-type=0
+source-id=0
+sync=0
+
+[sink2]
+enable=0
+type=3 # file
+container=1 # mp4
+codec=1 #h264
+enc-type=0 # hardware
+sync=0
+# bitrate=2000000
+profile=0 # baseline
+output-file=outVideos/tiled_display_raw.mp4
+
+[sink3]
+enable=0
+#Type - 1=FakeSink 2=EglSink 3=File 4=UDPSink 5=nvdrmvideosink 6=MsgConvBroker
+type=6
+msg-conv-config=config_msgconv.txt
+msg-conv-payload-type=2
+msg-conv-msg2p-new-api=0
+msg-conv-frame-interval=1
+msg-conv-msg2p-lib=/opt/nvidia/deepstream/deepstream/lib/libnvds_msgconv_mega.so
+msg-broker-proto-lib=/opt/nvidia/deepstream/deepstream/lib/libnvds_kafka_proto.so
+msg-broker-conn-str=localhost;9092;mv3dt
+topic=mv3dt
+
+[tests]
+file-loop=0
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_mqtt.txt b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_mqtt.txt
new file mode 100644
index 00000000..1cadee83
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_mqtt.txt
@@ -0,0 +1,13 @@
+[message-broker]
+username = user
+password = password
+#client-id = uniqueID
+#enable-tls = 1
+#tls-cafile =
+#tls-capath =
+#tls-certfile =
+#tls-keyfile =
+#share-connection = 1
+#loop-timeout = 2000
+#keep-alive = 60
+set-threaded = 0
\ No newline at end of file
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_msgconv.txt b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_msgconv.txt
new file mode 100644
index 00000000..8a7a2d0f
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_msgconv.txt
@@ -0,0 +1,21 @@
+[sensor1]
+enable=1
+type=Camera
+id=Camera1
+
+[sensor2]
+enable=1
+type=Camera
+id=Camera2
+
+[sensor3]
+enable=1
+type=Camera
+id=Camera3
+
+[sensor4]
+enable=1
+type=Camera
+id=Camera4
+
+
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie.txt b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie.txt
new file mode 100644
index 00000000..f0a6f0c0
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie.txt
@@ -0,0 +1,23 @@
+[property]
+gpu-id=0
+offsets=123.675;116.28;103.53
+net-scale-factor=0.0173520735728
+labelfile-path=/workspace/models/PeopleNetTransformer/detector_labels.txt
+onnx-file=/workspace/models/PeopleNetTransformer/peoplenet_transformer_model_op17.onnx
+tlt-model-key=nvidia_tao
+batch-size=12
+## 0=FP32, 1=INT8, 2=FP16 mode
+network-mode=2
+num-detected-classes=4
+filter-out-class-ids=0;2;3
+interval=0
+gie-unique-id=1
+output-blob-names=pred_boxes;pred_logits
+infer-dims=3;544;960
+cluster-mode=4
+parse-bbox-func-name=NvDsInferParseCustomDDETRTAO
+custom-lib-path=/workspace/models/PeopleNetTransformer/custom_parser/libnvds_infercustomparser_tao.so
+
+[class-attrs-all]
+pre-cluster-threshold=0.3
+topk=20
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie_peoplenet.txt b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie_peoplenet.txt
new file mode 100644
index 00000000..38bfd991
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie_peoplenet.txt
@@ -0,0 +1,14 @@
+[property]
+net-scale-factor=0.0039215697906911373
+offsets=0.0;0.0;0.0
+labelfile-path=/workspace/models/PeopleNet2.6.3/detector_labels.txt
+onnx-file=/workspace/models/PeopleNet2.6.3/resnet34_peoplenet.onnx
+gie-unique-id=1
+network-type=0
+network-mode=2
+num-detected-classes=3
+filter-out-class-ids=1;2
+infer-dims=3;544;960
+model-color-format=0
+maintain-aspect-ratio=0
+output-tensor-meta=0
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie_rt_detr.txt b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie_rt_detr.txt
new file mode 100644
index 00000000..542c5e86
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_pgie_rt_detr.txt
@@ -0,0 +1,23 @@
+[property]
+cluster-mode=4
+custom-lib-path=/workspace/models/RTDETR/custom_parser/libnvds_infercustomparser_tao.so
+gie-unique-id=1
+infer-dims=3;544;960
+labelfile-path=/workspace/models/RTDETR/detector_labels.txt
+maintain-aspect-ratio=1
+model-color-format=0
+net-scale-factor=0.00392156862745098
+network-mode=2
+network-type=0
+num-detected-classes=7
+filter-out-class-ids=6
+offsets=0;0;0
+onnx-file=/workspace/models/RTDETR/rtdetr_warehouse_v1.0.fp16.onnx
+output-blob-names=pred_logits;pred_boxes
+output-tensor-meta=1
+parse-bbox-func-name=NvDsInferParseCustomDDETRTAO
+workspace-size=1048576
+
+[class-attrs-all]
+pre-cluster-threshold=0.4652309073592239
+topk=20
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker.yml b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker.yml
new file mode 100644
index 00000000..3c8fc11e
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker.yml
@@ -0,0 +1,107 @@
+%YAML:1.0
+
+BaseConfig:
+ minDetectorConfidence: 0.027087304322979212
+TargetManagement:
+ enableBboxUnClipping: 1
+ preserveStreamUpdateOrder: 0
+ maxTargetsPerStream: 200
+ minIouDiff4NewTarget: 0.22656630527418112
+ minTrackerConfidence: 0.6957540479571296
+ probationAge: 5
+ maxShadowTrackingAge: 162
+ earlyTerminationAge: 1
+ maxTrajectoryBufferLength: -1
+ outputTerminatedTracks: 0
+TrajectoryManagement:
+ useUniqueID: 0
+ enableReAssoc: 1
+ minMatchingScore4Overall: 0.9349462651721144
+ minTrackletMatchingScore: 0.2940
+ minMatchingScore4ReidSimilarity: 0
+ matchingScoreWeight4TrackletSimilarity: 0.7981
+ matchingScoreWeight4ReidSimilarity: 0
+ minTrajectoryLength4Projection: 34
+ prepLength4TrajectoryProjection: 58
+ trajectoryProjectionLength: 33
+ maxAngle4TrackletMatching: 67
+ minSpeedSimilarity4TrackletMatching: 0.0574
+ minBboxSizeSimilarity4TrackletMatching: 0.1013
+ maxTrackletMatchingTimeSearchRange: 27
+ trajectoryProjectionProcessNoiseScale: 0.0100
+ trajectoryProjectionMeasurementNoiseScale: 100
+ trackletSpacialSearchRegionScale: 0.0100
+ reidExtractionInterval: 0
+DataAssociator:
+ dataAssociatorType: 0
+ associationMatcherType: 1
+ checkClassMatch: 0
+ minMatchingScore4Overall: 0.4
+ minMatchingScore4SizeSimilarity: 0.4
+ minMatchingScore4Iou: 0.1393522182207021
+ minMatchingScore4VisualSimilarity: 0.0520394823204932
+ matchingScoreWeight4SizeSimilarity: 0.104589699500018
+ matchingScoreWeight4Iou: 0.7844652139368062
+ matchingScoreWeight4VisualSimilarity: 0.9294872869302965
+ tentativeDetectorConfidence: 0.70167245554449
+ minMatchingScore4TentativeIou: 0.1768733030811293
+ minMatchingScore4PeerAssocIou: 0.2
+StateEstimator:
+ stateEstimatorType: 3
+ processNoiseVar4Loc: 6497.75224242603
+ processNoiseVar4Vel: 8035.858212054732
+ measurementNoiseVar4Detector: 100.0000
+ measurementNoiseVar4Tracker: 883.5847350922555
+ObjectModelProjection:
+ minPoseConfidence: 0.925
+ outputFootLocation: 1
+ outputVisibility: 1
+ outputConvexHull: 0
+ cameraModelFilepath:
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam001.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam002.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam003.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam004.yml
+ objectModelType: 0
+VisualTracker:
+ visualTrackerType: 2
+ useColorNames: 1
+ useHog: 1
+ featureImgSizeLevel: 5
+ featureFocusOffsetFactor_y: -0.10525549278780495
+ filterLr: 0.025008995723548734
+ filterChannelWeightsLr: 0.09460260509799209
+ gaussianSigma: 0.44967391866177786
+MultiViewAssociator:
+ multiViewAssociatorType: 1
+ enableLatePeerReAssoc: 1
+ enableIDCorrection: 1
+ enableSeeThrough: 1
+ enableMsgSync: 1
+ maxPeerTrackletSize: 50
+ recentlyActiveAge: 178
+ minCommonFrames4MatchScore: 2
+ maxPeerToPredDistance4Fusion: 1.35
+ minPeerVisibility4Fusion: 0.15
+ minPeerTrackletMatchScore: 0.48
+ maxTrackletMatchingTimeSearchRange: 1
+ maxPeerFrameDiff4NoDet: 2
+ communicatorInitSleepTime: 0
+Communicator:
+ communicatorType: 2
+ pubSubInfoConfigPath: /workspace/experiments/pub_sub_info_config_0.yml
+ mqttProtoAdaptorConfigPath: /workspace/experiments/config_mqtt.txt
+PoseEstimator:
+ poseEstimatorType: 1
+ useVPICropScaler: 1
+ batchSize: 1
+ workspaceSize: 1000
+ inferDims: [3, 256, 192]
+ networkMode: 1
+ inputOrder: 0
+ colorFormat: 0
+ offsets: [123.6750, 116.2800, 103.5300]
+ netScaleFactor: 0.00392156
+ onnxFile: /workspace/models/BodyPose3DNet/bodypose3dnet_accuracy.onnx
+ modelEngineFile: /workspace/models/BodyPose3DNet/bodypose3dnet_accuracy.onnx_b1_gpu0_fp16.engine
+ poseInferenceInterval: 30
\ No newline at end of file
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_2d.yml b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_2d.yml
new file mode 100644
index 00000000..09c3c1ff
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_2d.yml
@@ -0,0 +1,63 @@
+%YAML:1.0
+
+BaseConfig:
+ minDetectorConfidence: 0.027087304322979212
+TargetManagement:
+ enableBboxUnClipping: 1
+ preserveStreamUpdateOrder: 0
+ maxTargetsPerStream: 200
+ minIouDiff4NewTarget: 0.22656630527418112
+ minTrackerConfidence: 0.6957540479571296
+ probationAge: 1
+ maxShadowTrackingAge: 162
+ earlyTerminationAge: 1
+ maxTrajectoryBufferLength: -1
+ outputTerminatedTracks: 0
+TrajectoryManagement:
+ useUniqueID: 0
+ enableReAssoc: 1
+ minMatchingScore4Overall: 0.9349462651721144
+ minTrackletMatchingScore: 0.2940
+ minMatchingScore4ReidSimilarity: 0
+ matchingScoreWeight4TrackletSimilarity: 0.7981
+ matchingScoreWeight4ReidSimilarity: 0
+ minTrajectoryLength4Projection: 34
+ prepLength4TrajectoryProjection: 58
+ trajectoryProjectionLength: 33
+ maxAngle4TrackletMatching: 67
+ minSpeedSimilarity4TrackletMatching: 0.0574
+ minBboxSizeSimilarity4TrackletMatching: 0.1013
+ maxTrackletMatchingTimeSearchRange: 27
+ trajectoryProjectionProcessNoiseScale: 0.0100
+ trajectoryProjectionMeasurementNoiseScale: 100
+ trackletSpacialSearchRegionScale: 0.0100
+ reidExtractionInterval: 0
+DataAssociator:
+ dataAssociatorType: 0
+ associationMatcherType: 1
+ checkClassMatch: 0
+ minMatchingScore4Overall: 0.6671945991661751
+ minMatchingScore4SizeSimilarity: 0.6718623956657859
+ minMatchingScore4Iou: 0.1393522182207021
+ minMatchingScore4VisualSimilarity: 0.0520394823204932
+ matchingScoreWeight4SizeSimilarity: 0.104589699500018
+ matchingScoreWeight4Iou: 0.7844652139368062
+ matchingScoreWeight4VisualSimilarity: 0.9294872869302965
+ tentativeDetectorConfidence: 0.70167245554449
+ minMatchingScore4TentativeIou: 0.1768733030811293
+ minMatchingScore4PeerAssocIou: 0.2
+StateEstimator:
+ stateEstimatorType: 1
+ processNoiseVar4Loc: 6497.75224242603
+ processNoiseVar4Vel: 8035.858212054732
+ measurementNoiseVar4Detector: 100.0000
+ measurementNoiseVar4Tracker: 883.5847350922555
+VisualTracker:
+ visualTrackerType: 1
+ useColorNames: 1
+ useHog: 1
+ featureImgSizeLevel: 5
+ featureFocusOffsetFactor_y: -0.10525549278780495
+ filterLr: 0.025008995723548734
+ filterChannelWeightsLr: 0.09460260509799209
+ gaussianSigma: 0.44967391866177786
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_tuned_12cam.yml b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_tuned_12cam.yml
new file mode 100644
index 00000000..89290a81
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_tuned_12cam.yml
@@ -0,0 +1,112 @@
+%YAML:1.0
+
+BaseConfig:
+ minDetectorConfidence: 0.294
+TargetManagement:
+ enableBboxUnClipping: 1
+ preserveStreamUpdateOrder: 1
+ maxTargetsPerStream: 200
+ minIouDiff4NewTarget: 0.255
+ minTrackerConfidence: 0.756
+ probationAge: 3
+ maxShadowTrackingAge: 150
+ earlyTerminationAge: 2
+ maxTrajectoryBufferLength: -1
+ outputTerminatedTracks: 0
+TrajectoryManagement:
+ useUniqueID: 0
+ enableReAssoc: 1
+ minMatchingScore4Overall: 0.935
+ minTrackletMatchingScore: 0.2940
+ minMatchingScore4ReidSimilarity: 0
+ matchingScoreWeight4TrackletSimilarity: 0.7981
+ matchingScoreWeight4ReidSimilarity: 0
+ minTrajectoryLength4Projection: 34
+ prepLength4TrajectoryProjection: 58
+ trajectoryProjectionLength: 33
+ maxAngle4TrackletMatching: 67
+ minSpeedSimilarity4TrackletMatching: 0.0574
+ minBboxSizeSimilarity4TrackletMatching: 0.1013
+ maxTrackletMatchingTimeSearchRange: 27
+ trajectoryProjectionProcessNoiseScale: 0.0100
+ trajectoryProjectionMeasurementNoiseScale: 100
+ trackletSpacialSearchRegionScale: 0.0100
+ reidExtractionInterval: 0
+DataAssociator:
+ dataAssociatorType: 0
+ associationMatcherType: 1
+ checkClassMatch: 1
+ minMatchingScore4Overall: 0.586
+ minMatchingScore4Iou: 0.253
+ minMatchingScore4SizeSimilarity: 0.6
+ minMatchingScore4VisualSimilarity: 0.6
+ minMatchingScore4ReidSimilarity: 0.5
+ matchingScoreWeight4Iou: 0.557
+ matchingScoreWeight4SizeSimilarity: 0.326
+ matchingScoreWeight4VisualSimilarity: 0.654
+ matchingScoreWeight4ReidSimilarity: 0.1
+ tentativeDetectorConfidence: 0.842
+ minMatchingScore4TentativeIou: 0.364
+ minMatchingScore4PeerAssocIou: 0.25
+StateEstimator:
+ stateEstimatorType: 3
+ processNoiseVar4Loc: 3561.3
+ processNoiseVar4Size: 447.7
+ processNoiseVar4Vel: 3663.2
+ measurementNoiseVar4Detector: 2078.3
+ measurementNoiseVar4Tracker: 2108.0
+
+ObjectModelProjection:
+ objectModelType: 0
+ minPoseConfidence: 0.925
+ outputFootLocation: 1
+ outputVisibility: 1
+ outputConvexHull: 0
+ cameraModelFilepath:
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam001.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam002.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam003.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam004.yml
+VisualTracker:
+ visualTrackerType: 2
+ useColorNames: 1
+ useHog: 1
+ featureImgSizeLevel: 5
+ featureFocusOffsetFactor_y: -0.10525549278780495
+ filterLr: 0.025008995723548734
+ filterChannelWeightsLr: 0.09460260509799209
+ gaussianSigma: 0.44967391866177786
+
+MultiViewAssociator:
+ multiViewAssociatorType: 1
+ enableLatePeerReAssoc: 1
+ enableIDCorrection: 1
+ enableSeeThrough: 1
+ enableMsgSync: 1
+ maxPeerTrackletSize: 30
+ recentlyActiveAge: 600
+ minCommonFrames4MatchScore: 15
+ minPeerTrackletMatchScore: 0.35
+ minPeerVisibility4Fusion: 0.0213
+ maxPeerToPredDistance4Fusion: 1.78
+ maxTrackletMatchingTimeSearchRange: 1
+ maxPeerFrameDiff4NoDet: 2
+ communicatorInitSleepTime: 0
+Communicator:
+ communicatorType: 2
+ pubSubInfoConfigPath: /workspace/experiments/pub_sub_info_config_0.yml
+ mqttProtoAdaptorConfigPath: /workspace/experiments/config_mqtt.txt
+PoseEstimator:
+ poseEstimatorType: 1
+ useVPICropScaler: 1
+ batchSize: 1
+ workspaceSize: 1000
+ inferDims: [3, 256, 192]
+ networkMode: 1
+ inputOrder: 0
+ colorFormat: 0
+ offsets: [123.6750, 116.2800, 103.5300]
+ netScaleFactor: 0.00392156
+ onnxFile: /workspace/models/BodyPose3DNet/bodypose3dnet_accuracy.onnx
+ modelEngineFile: /workspace/models/BodyPose3DNet/bodypose3dnet_accuracy.onnx_b1_gpu0_fp16.engine
+ poseInferenceInterval: 29
\ No newline at end of file
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_tuned_12cam_rt_detr.yml b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_tuned_12cam_rt_detr.yml
new file mode 100644
index 00000000..745c956c
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/config_tracker_tuned_12cam_rt_detr.yml
@@ -0,0 +1,112 @@
+%YAML:1.0
+
+BaseConfig:
+ minDetectorConfidence: 0.4249794671414514
+TargetManagement:
+ enableBboxUnClipping: 1
+ preserveStreamUpdateOrder: 1
+ maxTargetsPerStream: 200
+ minIouDiff4NewTarget: 0.38243687471903276
+ minTrackerConfidence: 0.741735665044422
+ probationAge: 9
+ maxShadowTrackingAge: 25
+ earlyTerminationAge: 8
+ maxTrajectoryBufferLength: -1
+ outputTerminatedTracks: 0
+TrajectoryManagement:
+ useUniqueID: 0
+ enableReAssoc: 1
+ minMatchingScore4Overall: 0.935
+ minTrackletMatchingScore: 0.294
+ minMatchingScore4ReidSimilarity: 0
+ matchingScoreWeight4TrackletSimilarity: 0.798
+ matchingScoreWeight4ReidSimilarity: 0
+ minTrajectoryLength4Projection: 34
+ prepLength4TrajectoryProjection: 58
+ trajectoryProjectionLength: 33
+ maxAngle4TrackletMatching: 67
+ minSpeedSimilarity4TrackletMatching: 0.057
+ minBboxSizeSimilarity4TrackletMatching: 0.101
+ maxTrackletMatchingTimeSearchRange: 27
+ trajectoryProjectionProcessNoiseScale: 0.010
+ trajectoryProjectionMeasurementNoiseScale: 100
+ trackletSpacialSearchRegionScale: 0.010
+ reidExtractionInterval: 0
+DataAssociator:
+ dataAssociatorType: 0
+ associationMatcherType: 1
+ checkClassMatch: 1
+ minMatchingScore4Overall: 0.3302893671614782
+ minMatchingScore4Iou: 0.24954038423337854
+ minMatchingScore4SizeSimilarity: 0.7113775241492641
+ minMatchingScore4VisualSimilarity: 0.3
+ minMatchingScore4ReidSimilarity: 0.5
+ matchingScoreWeight4Iou: 0.7917115752543623
+ matchingScoreWeight4SizeSimilarity: 0.153194768090538
+ matchingScoreWeight4VisualSimilarity: 0.9123026990374454
+ matchingScoreWeight4ReidSimilarity: 0.1
+ tentativeDetectorConfidence: 0.8847552837432789
+ minMatchingScore4TentativeIou: 0.4499128093756385
+ minMatchingScore4PeerAssocIou: 0.8239182971090612
+StateEstimator:
+ stateEstimatorType: 3
+ processNoiseVar4Loc: 580.1268780450512
+ processNoiseVar4Size: 4804.018474713682
+ processNoiseVar4Vel: 435.8294162749178
+ measurementNoiseVar4Detector: 9370.665057327513
+ measurementNoiseVar4Tracker: 7510.009244259698
+
+ObjectModelProjection:
+ objectModelType: 0
+ minPoseConfidence: 0.9840686678221622
+ outputFootLocation: 1
+ outputVisibility: 1
+ outputConvexHull: 0
+ cameraModelFilepath:
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam001.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam002.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam003.yml
+ - /workspace/inputs/camInfo/Warehouse_Synthetic_Cam004.yml
+VisualTracker:
+ visualTrackerType: 2
+ useColorNames: 1
+ useHog: 1
+ featureImgSizeLevel: 5
+ featureFocusOffsetFactor_y: -0.10525549278780495
+ filterLr: 0.025008995723548734
+ filterChannelWeightsLr: 0.09460260509799209
+ gaussianSigma: 0.44967391866177786
+
+MultiViewAssociator:
+ multiViewAssociatorType: 1
+ enableLatePeerReAssoc: 1
+ enableIDCorrection: 0
+ enableSeeThrough: 1
+ enableMsgSync: 1
+ maxPeerTrackletSize: 30
+ recentlyActiveAge: 554
+ minCommonFrames4MatchScore: 5
+ minPeerTrackletMatchScore: 0.4979019568226545
+ minPeerVisibility4Fusion: 0.39809962133314714
+ maxPeerToPredDistance4Fusion: 1.5012866693280356
+ maxTrackletMatchingTimeSearchRange: 1
+ maxPeerFrameDiff4NoDet: 2
+ communicatorInitSleepTime: 0
+Communicator:
+ communicatorType: 2
+ pubSubInfoConfigPath: /workspace/experiments/pub_sub_info_config_0.yml
+ mqttProtoAdaptorConfigPath: /workspace/experiments/config_mqtt.txt
+PoseEstimator:
+ poseEstimatorType: 1
+ useVPICropScaler: 1
+ batchSize: 1
+ workspaceSize: 1000
+ inferDims: [3, 256, 192]
+ networkMode: 1
+ inputOrder: 0
+ colorFormat: 0
+ offsets: [123.6750, 116.2800, 103.5300]
+ netScaleFactor: 0.00392156
+ onnxFile: /workspace/models/BodyPose3DNet/bodypose3dnet_accuracy.onnx
+ modelEngineFile: /workspace/models/BodyPose3DNet/bodypose3dnet_accuracy.onnx_b1_gpu0_fp16.engine
+ poseInferenceInterval: 30
\ No newline at end of file
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/ds_mv3dt.yaml b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/ds_mv3dt.yaml
new file mode 100644
index 00000000..8017268a
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/ds_mv3dt.yaml
@@ -0,0 +1,53 @@
+name: "deepstream-app"
+model_repo: "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/workspace/models"
+models:
+- name: PeopleNetTransformer
+ backend: deepstream/nvinfer
+ max_batch_size: 4
+ input:
+ - name: media_url
+ data_type: TYPE_CUSTOM_BINARY_URLS
+ dims: [ -1 ]
+ optional: true
+ - name: mime
+ data_type: TYPE_CUSTOM_DS_MIME
+ dims: [ -1 ]
+ optional: true
+ - name: source_config
+ data_type: TYPE_CUSTOM_DS_SOURCE_CONFIG
+ dims: [ 1 ]
+ optional: true
+ output:
+ - name: output
+ data_type: TYPE_CUSTOM_DS_METADATA
+ dims: [ -1 ]
+ parameters:
+ infer_config_path:
+ - nvdsinfer_config.yaml
+ resize_video: [1080, 1920]
+ tracker_config:
+ ll_lib_file: /opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so
+ ll_config_file: /workspace/experiments/config_tracker.yml
+ width: 1920
+ height: 1088
+ display_tracking_id: true
+ msgbroker_config:
+ msgbroker_proto_lib_path: /opt/nvidia/deepstream/deepstream/lib/libnvds_kafka_proto.so
+ msgconv_config_path: /workspace/experiments/config_msgconv.txt
+ msgbroker_conn_str: localhost;9092;mv3dt
+ msgbroker_topic: mv3dt
+ msgconv_payload_type: 2
+ msgconv_msg2p_new_api: 0
+ msgconv_frame_interval: 1
+ msgconv_msg2p_lib: /opt/nvidia/deepstream/deepstream/lib/libnvds_msgconv_mega.so
+ perf_config:
+ enable_fps_logs: true
+ enable_latency_logs: true
+ kitti_output_path:
+ infer: /workspace/experiments/infer-kitti-dump/
+ tracker: /workspace/experiments/tracker-kitti-dump/
+ inference_timeout: 1000
+ batch_timeout: -1
+ render_config:
+ enable_display: true
+ enable_osd: true
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/override_tracker_12cam.yml b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/override_tracker_12cam.yml
new file mode 100644
index 00000000..2ad8db6f
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/override_tracker_12cam.yml
@@ -0,0 +1,15 @@
+MultiViewAssociator:
+ multiViewAssociatorType: 1
+ enableLatePeerReAssoc: 1
+ enableIDCorrection: 1
+ enableSeeThrough: 1
+ enableMsgSync: 1
+ maxPeerTrackletSize: 50
+ recentlyActiveAge: 178
+ minCommonFrames4MatchScore: 2
+ minPeerToPredDistance4Fusion: 1.35
+ minPeerVisibility4Fusion: 0.15
+ minPeerTrackletMatchScore: 0.48
+ maxTrackletMatchingTimeSearchRange: 1
+ maxPeerFrameDiff4NoDet: 2
+ communicatorInitSleepTime: 0
\ No newline at end of file
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/override_tracker_4cam.yml b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/override_tracker_4cam.yml
new file mode 100644
index 00000000..554fbc1a
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/config_templates/override_tracker_4cam.yml
@@ -0,0 +1,8 @@
+VisualTracker:
+ visualTrackerType: 0
+MultiViewAssociator:
+ multiViewAssociatorType: 1
+ maxPeerToPredDistance4Fusion: 4.0 # mtmc 4.0 # 1.0 # sdg 1.3475168402461755
+ minPeerTrackletMatchScore: 0.3 # mtmc 0.3 # sdg 0.48 # 0.48177346044415703
+ minPeerVisibility4Fusion: 0.15 # sdg 0.1575362440818593
+ recentlyActiveAge: 178
\ No newline at end of file
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/manual-setup.md b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/manual-setup.md
new file mode 100644
index 00000000..4f40982f
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/manual-setup.md
@@ -0,0 +1,214 @@
+## Manual Setup Instructions
+
+
+1. Please check [Deepstream Container Prerequisites](https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_docker_containers.html#prerequisites) for Deepstream container setup, and download the latest DeepStream container image.
+ ```bash
+ docker pull nvcr.io/nvidia/deepstream:9.0-triton-multiarch
+ ```
+2. Git clone the current `deepstream_reference_apps` repository to the host machine and enter `deepstream-tracker-3d-multi-view` directory
+ ```bash
+ # Install Git LFS
+ sudo apt install git-lfs
+ git lfs install
+
+ git clone https://github.com/NVIDIA-AI-IOT/deepstream_reference_apps.git
+ cd deepstream_reference_apps/deepstream-tracker-3d-multi-view
+ git lfs pull # In case repo is already cloned before installing git-lfs
+ ```
+
+3. Unzip the datasets.zip managed by Git LFS
+ ```bash
+ unzip assets/datasets.zip
+ ```
+
+
+4. Download the `PeopleNetTransformer`, `RTDETR`, `PeopleNet v2.6.3`, and `BodyPose3DNet` models from NGC, and build custom parsers
+ * Download the models ([PeopleNetTransformer](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/peoplenet_transformer_v2), [RT-DETR 2D Warehouse](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/rtdetr_2d_warehouse), [PeopleNet v2.6.3](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/peoplenet), and [BodyPose3DNet](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/bodypose3dnet))
+ ```bash
+ wget --content-disposition 'https://api.ngc.nvidia.com/v2/models/org/nvidia/team/tao/peoplenet_transformer_v2/deployable_v1.0/files?redirect=true&path=dino_fan_small_astro_delta.onnx' -O 'models/PeopleNetTransformer/peoplenet_transformer_model_op17.onnx'
+ wget --content-disposition 'https://api.ngc.nvidia.com/v2/models/org/nvidia/team/tao/rtdetr_2d_warehouse/deployable_efficientvit_l2_v1.0/files?redirect=true&path=rtdetr_warehouse_v1.0.fp16.onnx' -O 'models/RTDETR/rtdetr_warehouse_v1.0.fp16.onnx'
+ wget --content-disposition 'https://api.ngc.nvidia.com/v2/models/org/nvidia/team/tao/peoplenet/deployable_quantized_onnx_v2.6.3/files?redirect=true&path=resnet34_peoplenet.onnx' -O 'models/PeopleNet2.6.3/resnet34_peoplenet.onnx'
+ wget --content-disposition 'https://api.ngc.nvidia.com/v2/models/org/nvidia/team/tao/bodypose3dnet/deployable_accuracy_onnx_1.0/files?redirect=true&path=bodypose3dnet_accuracy.onnx' -O 'models/BodyPose3DNet/bodypose3dnet_accuracy.onnx'
+ ```
+
+ * Build the custom parsers for both PeopleNetTransformer and RTDETR
+ ```bash
+ # Build PeopleNetTransformer custom parser
+ docker run --privileged --rm --net=host --runtime=nvidia \
+ -v $PWD/models:/workspace/models \
+ -w /workspace/models/PeopleNetTransformer \
+ --entrypoint /bin/bash \
+ nvcr.io/nvidia/deepstream:9.0-triton-multiarch \
+ -c "cd custom_parser && make clean && make"
+ # [Expected output] You should see "libnvds_infercustomparser_tao.so" built under models/PeopleNetTransformer/custom_parser/. Warnings during build are expected.
+
+ # Build RTDETR custom parser
+ docker run --privileged --rm --net=host --runtime=nvidia \
+ -v $PWD/models:/workspace/models \
+ -w /workspace/models/RTDETR \
+ --entrypoint /bin/bash \
+ nvcr.io/nvidia/deepstream:9.0-triton-multiarch \
+ -c "cd custom_parser && make clean && make"
+ # [Expected output] You should see "libnvds_infercustomparser_tao.so" built under models/RTDETR/custom_parser/. Warnings during build are expected.
+ ```
+
+5. Install and run the Mosquitto MQTT broker
+
+ * Install Mosquitto and its client tools:
+ ```bash
+ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
+ sudo apt update
+ sudo apt install mosquitto mosquitto-clients
+ ```
+
+ * Configure Mosquitto for optimal performance by enabling TCP_NODELAY:
+ ```bash
+ echo "set_tcp_nodelay true" | sudo tee /etc/mosquitto/conf.d/mv3dt.conf
+ ```
+
+ * After the installation, the Mosquitto broker service will be automatically started on port 1883. Restart it to apply the new config, then verify by running the provided test script. If the broker is active, you should see `Hello from Mosquitto test!` in the output:
+ ```bash
+ sudo systemctl restart mosquitto
+
+ chmod +x ./scripts/mosquitto_test.sh
+ ./scripts/mosquitto_test.sh
+ ```
+
+ * If the previous step fails (e.g. seeing `Error: Connection refused`), use the following command to start Mosquitto on port 1883, and then run the test script again:
+ ```bash
+ mosquitto -p 1883
+ # [Expected output] You should see "mosquitto version running" printed.
+ # You need to keep it running in a separate terminal window. To avoid this, you can use the following command to start it in the background:
+ # mosquitto -p 1883 -d
+ # [Expected output] Nothing will be printed. Use the mosquitto_test.sh script to verify the broker is running.
+ # And to kill it, you can use the following command:
+ # kill -9 $(lsof -t -i:1883)
+ ```
+
+ * Please refer to [Mosquitto documentation](https://mosquitto.org/download/) if you still encounter issues.
+
+6. Install and start a Kafka broker, and create a `mv3dt` topic:
+ * Follow the [Kafka quickstart](https://kafka.apache.org/quickstart) to download and start Kafka. The commands are provided below. **Note that please start a separate terminal window to keep the Kafka broker running.**
+ ```bash
+ # Kafka requires Java 17+. Check your Java version.
+ # If you see "Command 'java' not found" or it is older than 17, please install openjdk-17-jdk.
+ java -version
+ sudo apt install openjdk-17-jdk
+
+ # Get Kafka
+ wget https://dlcdn.apache.org/kafka/4.2.0/kafka_2.13-4.2.0.tgz
+ tar -xzf kafka_2.13-4.2.0.tgz
+ cd kafka_2.13-4.2.0
+
+ # Start the Kafka environment
+ export KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
+
+ bin/kafka-storage.sh format --standalone -t $KAFKA_CLUSTER_ID -c config/server.properties
+ # [Expected output] You should see `Formatting dynamic metadata voter directory /tmp/kraft-combined-logs with metadata.version 4.0-IV3.`
+
+ bin/kafka-server-start.sh config/server.properties
+ # [Expected output] You should see `Kafka Server started.` and it will keep logging `INFO` messages.
+ ```
+
+ * Create a `mv3dt` topic under broker server `localhost:9092`, and set the message retention to 30 seconds.
+
+ ```bash
+ cd
+
+ ./bin/kafka-topics.sh --bootstrap-server localhost:9092 \
+ --create \
+ --topic mv3dt \
+ --partitions 1 \
+ --replication-factor 1 \
+ --config retention.ms=30000 \
+ --if-not-exists
+ # [Expected output] Seeing `Created topic mv3dt.` or nothing if the topic already exists.
+ ```
+ * After you have followed the above Kafka setup steps, in the future, you only need to run the following command to start Kafka:
+ ```bash
+ bin/kafka-server-start.sh config/server.properties
+ # [Expected output] It is expected to see DUPLICATE_BROKER_REGISTRATION in the logs. As long as the broker keeps running and logging INFO messages, you can proceed.
+ ```
+
+ * To stop a Kafka broker running in the background, you can use the following command:
+ ```bash
+ cd
+ bin/kafka-server-stop.sh
+ ```
+
+
+7. Install the required Python dependencies. Note that the scripts in this repo expect a virtual environment named `mv3dt_venv` located under the root of the repo. Please make sure to follow the following instructions exactly for quick start.
+
+ ```bash
+ cd
+
+ # Install required deb packages
+ sudo apt update
+ sudo apt install python3-tk python3.12-venv python3.12-dev
+
+ # Create a python virtual enviornment named `mv3dt_venv` and install required python packages
+ python3 -m venv mv3dt_venv
+ source mv3dt_venv/bin/activate
+
+ pip install -r requirements.txt
+ ```
+ * Check the virtual environment. If any specific package fails, please install it manually with `pip install `.
+ ```bash
+ ls -d mv3dt_venv
+ # [Expected output] You should see "mv3dt_venv" printed. If you see "No such file or directory", please check the previous step "python3 -m venv mv3dt_venv".
+
+ pip list
+ # [Expected output] You should see kafka-python, protobuf in the list
+ ```
+
+
+8. (Optional) This step is only needed if you choose to use Option 2: Inference Builder.
+
+ Set up [Deepstream Inference Builder](https://github.com/NVIDIA/deepstream/-/tree/master/tools/inference_builder). It is recommended to clone the `inference_builder` repo outside of the current repo.
+ * Clone the inference builder repo
+
+ ```bash
+ git clone https://github.com/NVIDIA/deepstream.git
+ cd tools/inference_builder
+ git submodule update --init --recursive
+ ```
+ * Create a new virtual environment for inference builder and install prerequisites. Please follow the following instructions exactly for quick start. **Note that there are 2 virtual environments used in this repo, `mv3dt_venv` and `ib_venv`. The scripts provided in the repo assumes that a `mv3dt_venv` folder is under the current repo, and a `ib_venv` folder is under the inference_builder repo.**
+
+ ```bash
+ # Install required deb packages
+ sudo apt install protobuf-compiler
+
+ # Deactivate the mv3dt_venv, and create a new virtual environment named ib_venv for inference builder
+ deactivate
+ python -m venv ib_venv
+ source ib_venv/bin/activate
+ pip3 install -r requirements.txt
+ ```
+ * Check the virtual environment. If any specific package fails, please install it manually with `pip install `.
+ ```bash
+ ls -d ib_venv
+ # [Expected output] You should see "ib_venv" printed. If you see "No such file or directory", please check the previous step "python -m venv ib_venv".
+
+ pip list
+ # [Expected output] You should see omegaconf 2.3.0 in the list
+ ```
+ * Build a Docker image named `inference-builder-mv3dt:latest` with Inference Builder python dependencies.
+ ```bash
+ # Create a temporary Dockerfile
+ cat > ./Dockerfile.ib_mv3dt << 'EOF'
+ FROM nvcr.io/nvidia/deepstream:9.0-triton-multiarch
+ RUN pip3 install torch==2.7.0 omegaconf==2.3.0
+ ENV GST_PLUGIN_PATH=/opt/nvidia/deepstream/deepstream/lib/gst-plugins
+ ENV LD_LIBRARY_PATH=/opt/nvidia/deepstream/deepstream/lib:$LD_LIBRARY_PATH
+ ENV NVSTREAMMUX_ADAPTIVE_BATCHING=yes
+ WORKDIR /mv3dt_app
+ EOF
+
+ # [Expected output] You should see a Dockerfile.ib_mv3dt file created under the current directory.
+
+ # Build the Docker image
+ docker build -f ./Dockerfile.ib_mv3dt -t inference-builder-mv3dt:latest .
+
+ # [Expected output] You should see "naming to docker.io/library/inference-builder-mv3dt:latest" printed as the last line.
+ ```
+
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/step-by-step-deepstream.md b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/step-by-step-deepstream.md
new file mode 100644
index 00000000..63ed6cae
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/step-by-step-deepstream.md
@@ -0,0 +1,96 @@
+# DeepStream Container: Step-by-step Instructions
+
+This page provides detailed step-by-step instructions for running MV3DT using the DeepStream Container. For quick start scripts, see the [main README](../README.md#option-1-running-mv3dt-using-deepstream-container).
+
+## Sample 1: 4-camera dataset
+
+1. Set up environment variables and prepare experiment directories
+ ```bash
+ export DATASET_DIR=$PWD/datasets/mtmc_4cam/
+ export EXPERIMENT_DIR=$PWD/experiments/deepstream/4cam
+ export MODEL_REPO=$PWD/models
+
+ mkdir -p $EXPERIMENT_DIR/infer-kitti-dump
+ mkdir -p $EXPERIMENT_DIR/tracker-kitti-dump
+ mkdir -p $EXPERIMENT_DIR/outVideos
+ ```
+2. Generate DeepStream configuration files using the auto-configurator
+
+ The auto-configurator automatically generates all necessary configuration files based on your dataset. It supports various output options (OSD display, video file output, Kafka streaming) and can work with both 2D and 3D tracker configurations.
+
+ **About Override Files:** The `--config-overrides` parameter allows you to apply dataset-specific settings. For example, `override_tracker_4cam.yml` is optimized for the sample 4-camera dataset (which uses feet as world coordinate units). You can create custom override files for your own datasets.
+
+ For more info on the auto-configurator, see [`utils/README.md`](../utils/README.md#deepstream_auto_configuratorpy).
+
+ ```bash
+ # Activate the Python environment
+ source mv3dt_venv/bin/activate
+
+ # Generate configs with 4-camera overrides
+ python utils/deepstream_auto_configurator.py \
+ --dataset-dir=$DATASET_DIR \
+ --enable-msg-broker \
+ --enable-osd \
+ --config-overrides=override_tracker_4cam.yml \
+ --output-dir=$EXPERIMENT_DIR
+
+ # [Expected output] You should see
+ # Generated files:
+ # - config_deepstream.txt (main pipeline config)
+ # - config_tracker.yml (3D tracker config)
+ # - config_msgconv.txt (message converter config)
+ # - pub_sub_info_config_0.yml (communication config)
+
+ ```
+3. (Optional) Launch real-time BEV visualization
+
+ Before launching the main MV3DT pipeline, optionally start the bird's-eye view visualizer to see real-time 3D tracking results. Please keep it running in a separate terminal window or add `&` to the end of the command to run it in the background.
+
+ ```bash
+ # Start BEV visualization
+ python utils/kafka_bev_visualizer.py \
+ --dataset-path=$DATASET_DIR \
+ --msgconv-config=$EXPERIMENT_DIR/config_msgconv.txt \
+ --average-multi-cam \
+ --show-ids
+
+ # [Expected output] You should see a window named "Bird-Eye View of Multi-View 3D Tracking" pop up and will display the live tracking results.
+ # Select the window and press 'q' to quit.
+ ```
+
+4. Launch MV3DT
+
+ The following command mounts the necessary folders into the DeepStream container and starts the `deepstream-test5-app` with MV3DT configs.
+
+ ```bash
+ sudo xhost + # give container access to display
+
+ docker run -t --privileged --rm --net=host --runtime=nvidia \
+ -v $MODEL_REPO:/workspace/models \
+ -v $DATASET_DIR:/workspace/inputs \
+ -v $EXPERIMENT_DIR:/workspace/experiments \
+ -v /tmp/.X11-unix/:/tmp/.X11-unix \
+ -e DISPLAY=$DISPLAY \
+ -w /workspace/experiments \
+ nvcr.io/nvidia/deepstream:9.0-triton-multiarch \
+ deepstream-test5-app -c config_deepstream.txt
+
+ # [Expected output] You should see a window named "DeepStreamTest5App" pop up and will display 4 camera views in a grid.
+ # Select the window and press 'q' to quit early.
+ # The pipeline will quit automatically with "App run succesful" as the last line from the logs.
+ ```
+
+## Sample 2: 12-camera dataset
+
+The steps are the same as for the 4-camera dataset, except setting `DATASET_DIR` and `EXPERIMENT_DIR` to the 12-camera directories. The auto-configurator automatically detects the number of cameras in your dataset and generates required config files for 12-camera dataset.
+
+```bash
+export DATASET_DIR=$PWD/datasets/mtmc_12cam/
+export EXPERIMENT_DIR=$PWD/experiments/deepstream/12cam
+
+python utils/deepstream_auto_configurator.py \
+ --dataset-dir=$DATASET_DIR \
+ --enable-msg-broker \
+ --enable-osd \
+ --output-dir=$EXPERIMENT_DIR
+```
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/step-by-step-inference-builder.md b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/step-by-step-inference-builder.md
new file mode 100644
index 00000000..cbbfef83
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/docs/step-by-step-inference-builder.md
@@ -0,0 +1,104 @@
+# Inference Builder: Step-by-step Instructions
+
+This page provides detailed step-by-step instructions for running MV3DT using Inference Builder. For quick start scripts, see the [main README](../README.md#option-2-running-mv3dt-using-inference-builder).
+
+## Sample 1: 4-camera dataset
+
+1. Set up environment variables and prepare experiment directories
+ ```bash
+ export DATASET_DIR=$PWD/datasets/mtmc_4cam/
+ export EXPERIMENT_DIR=$PWD/experiments/inference_builder/4cam
+ export MODEL_REPO=$PWD/models
+
+ mkdir -p $EXPERIMENT_DIR/infer-kitti-dump
+ mkdir -p $EXPERIMENT_DIR/tracker-kitti-dump
+ ```
+
+2. Generate Inference Builder configuration files using the auto-configurator
+
+ ```bash
+ # Activate the Python environment
+ source mv3dt_venv/bin/activate
+
+ # Generate configs with 4-camera overrides
+ python utils/inference_builder_auto_configurator.py \
+ --dataset-dir=$DATASET_DIR \
+ --config-overrides=override_tracker_4cam.yml \
+ --output-dir=$EXPERIMENT_DIR
+ # [Expected output] You should see
+ # Generated files:
+ # - ds_mv3dt.yaml (inference config with max_batch_size: 4)
+ # - config_tracker.yml (3D tracker config)
+ # - source_list_static.yaml (source configuration)
+ # - nvdsinfer_config.yaml (inference engine config with batch_size: 4)
+ # - config_msgconv.txt (message converter config)
+ # - pub_sub_info_config_0.yml (communication config)
+
+ # Copy the generated nvdsinfer config to the model directory
+ cp $EXPERIMENT_DIR/nvdsinfer_config.yaml $MODEL_REPO/PeopleNetTransformer/
+ ```
+
+3. Generate a Python package at `$INFERENCE_BUILDER_DIR/builder/samples/mv3dt_app` containing the MV3DT inference flow.
+ ```bash
+ export INFERENCE_BUILDER_DIR=
+ cd $INFERENCE_BUILDER_DIR
+ source ib_venv/bin/activate
+ python builder/main.py $EXPERIMENT_DIR/ds_mv3dt.yaml \
+ -o builder/samples/mv3dt_app \
+ --server-type serverless
+ ```
+
+4. (Optional) Launch real-time BEV visualization.
+ Please keep it running in a separate terminal window or add `&` to the end of the command to run it in the background.
+
+ ```bash
+ # Return to the repo directory and activate the Python environment
+ cd
+ source mv3dt_venv/bin/activate
+
+ # Start BEV visualization
+ python utils/kafka_bev_visualizer.py \
+ --dataset-path=$DATASET_DIR \
+ --msgconv-config=$EXPERIMENT_DIR/config_msgconv.txt \
+ --average-multi-cam \
+ --show-ids
+
+ # [Expected output] You should see a window named "Bird-Eye View of Multi-View 3D Tracking" pop up and will display the live tracking results.
+ # Select the window and press 'q' to quit.
+ ```
+
+5. Launch the `inference-builder-mv3dt:latest` container with volume mounts, including the Python package generated in the previous step.
+
+ Note that this container is built during prerequisites setup. Please refer to the Inference Builder setup step in [Manual Setup Instructions](manual-setup.md) for more details.
+ ```bash
+ sudo xhost + # give container access to display
+
+ docker run --privileged --rm -it --net=host --runtime=nvidia \
+ -v $INFERENCE_BUILDER_DIR/builder/samples/mv3dt_app/deepstream-app:/mv3dt_app \
+ -v $MODEL_REPO:/workspace/models \
+ -v $DATASET_DIR:/workspace/inputs \
+ -v $EXPERIMENT_DIR:/workspace/experiments \
+ -v /tmp/.X11-unix/:/tmp/.X11-unix \
+ -e DISPLAY=$DISPLAY \
+ -w /mv3dt_app \
+ inference-builder-mv3dt:latest \
+ python3 __main__.py --source-config /workspace/experiments/source_list_static.yaml -s /dev/null
+
+ # [Expected output] You should see a window named "python3" pop up and will display 4 camera views in a grid.
+ # Run this command to quit early: `docker ps -q --filter "ancestor=inference-builder-mv3dt" | xargs docker stop`.
+ # By default, the application waits up to **1000 seconds** if there is no data being streamed before exiting gracefully. You should see "Inference completed" as the last line from the logs.
+ ```
+
+
+## Sample 2: 12-camera dataset
+
+The steps are the same as for the 4-camera dataset, except setting `DATASET_DIR` and `EXPERIMENT_DIR` to the 12-camera directories.
+
+```bash
+export DATASET_DIR=$PWD/datasets/mtmc_12cam/
+export EXPERIMENT_DIR=$PWD/experiments/inference_builder/12cam
+
+python utils/inference_builder_auto_configurator.py \
+ --dataset-dir=$DATASET_DIR \
+ --output-dir=$EXPERIMENT_DIR
+```
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_bev.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_bev.png
new file mode 100644
index 00000000..3b5c2711
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_bev.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_bev_fused.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_bev_fused.png
new file mode 100644
index 00000000..006cf189
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_bev_fused.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_osd.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_osd.png
new file mode 100644
index 00000000..05b13454
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_osd.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_osd_rtdetr.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_osd_rtdetr.png
new file mode 100644
index 00000000..14874463
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/12cam_osd_rtdetr.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_bev.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_bev.png
new file mode 100644
index 00000000..f3d19c0c
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_bev.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_bev_fused.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_bev_fused.png
new file mode 100644
index 00000000..ec084745
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_bev_fused.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_osd.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_osd.png
new file mode 100644
index 00000000..2320b2c5
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/4cam_osd.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/MV3DT_12cam_live.gif b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/MV3DT_12cam_live.gif
new file mode 100644
index 00000000..614a7d15
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/MV3DT_12cam_live.gif differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/output_12cam.gif b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/output_12cam.gif
new file mode 100644
index 00000000..34230cc0
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/output_12cam.gif differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/output_4cam.gif b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/output_4cam.gif
new file mode 100644
index 00000000..884f5a5f
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/output_4cam.gif differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ds.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ds.png
new file mode 100644
index 00000000..e7d76c94
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ds.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ds_engine_generation.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ds_engine_generation.png
new file mode 100644
index 00000000..c70350be
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ds_engine_generation.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ib.png b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ib.png
new file mode 100644
index 00000000..0a6f306f
Binary files /dev/null and b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/figures/screenshot_quickstart_4cam_ib.png differ
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNet2.6.3/detector_labels.txt b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNet2.6.3/detector_labels.txt
new file mode 100644
index 00000000..ef12c0ae
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNet2.6.3/detector_labels.txt
@@ -0,0 +1,3 @@
+Person
+Bag
+Face
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNetTransformer/custom_parser/Makefile b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNetTransformer/custom_parser/Makefile
new file mode 100644
index 00000000..18d8e1f7
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNetTransformer/custom_parser/Makefile
@@ -0,0 +1,47 @@
+# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: MIT
+#
+# 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.
+
+
+DS_VER = $(shell deepstream-app -v | awk '$$1~/DeepStreamSDK/ {print substr($$2,1,3)}' )
+
+DS_SRC_PATH := /opt/nvidia/deepstream/deepstream-$(DS_VER)
+CC:= g++
+
+# Change to your deepstream SDK includes
+CFLAGS+= -I$(DS_SRC_PATH)/sources/includes \
+ -I/usr/local/cuda/include
+
+CFLAGS+= -Wall -std=c++11 -shared -fPIC
+
+LIBS+= -lnvinfer -L/usr/local/cuda/lib64 -lcudart -lcublas
+
+LFLAGS:= -Wl,--start-group $(LIBS) -Wl,--end-group
+
+SRCFILES:= nvdsinfer_custombboxparser_tao.cpp
+TARGET_LIB:= libnvds_infercustomparser_tao.so
+
+all: $(TARGET_LIB)
+
+$(TARGET_LIB) : $(SRCFILES)
+ $(CC) -o $@ $^ $(CFLAGS) $(LFLAGS)
+
+clean:
+ rm -rf $(TARGET_LIB)
diff --git a/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNetTransformer/custom_parser/nvdsinfer_custombboxparser_tao.cpp b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNetTransformer/custom_parser/nvdsinfer_custombboxparser_tao.cpp
new file mode 100644
index 00000000..bb07342e
--- /dev/null
+++ b/src/apps/reference_apps/deepstream-tracker-3d-multi-view/models/PeopleNetTransformer/custom_parser/nvdsinfer_custombboxparser_tao.cpp
@@ -0,0 +1,422 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ */
+
+#include
+#include
+#include "nvdsinfer_custom_impl.h"
+#include
+#include
+#include
+#include