MohamedNagyMostafa/RobMOT

Official implementation of "RobMOT: Robust 3D Multi-Object Tracking by Observational Noise and State Estimation Drift Mitigation on LiDAR PointCloud" (Online Method).

โ˜… 4Forks 0C++GitHub โ†—Compare

Project website โ†—

lidar-point-cloudlocalizationmultiobject-trackingstate-estimationtrajectory

README

RobMOT: Robust 3D Multi-Object Tracking Framework

arXiv PWC PWC

Tracking Visualization

Official implementation of "RobMOT: Robust 3D Multi-Object Tracking by Observational Noise and State Estimation Drift Mitigation on LiDAR PointCloud" (Online Method).

Key Features

  • ๐Ÿš€ State Estimation Refinement: Novel Kalman Filter adaptation reduces localization noise by 4.8% HOTA
  • ๐Ÿ‘ป Ghost Track Mitigation: Introduces the first trajectory validity mechanism in object tracking, reduces false positives by 80%
  • โšก Real-Time Performance: 3221 FPS on single CPU - 50x faster than SOTA methods
  • ๐Ÿ”„ Occlusion Handling: Improved recovery after prolonged occlusions with uncertainty-aware tracking
  • ๐Ÿ“Š Multi-Detector Support

Benchmarks

Dataset MOTA โ†‘ HOTA โ†‘ IDSW โ†“
KITTI Test 91.02% 81.76% 7
KITTI Val 86.31% 91.53% 1

Waymo Test (Vehicle) MOTA/L1 โ†‘ MOTA/L2 โ†‘
All 77.72% 74.66%
Range-[0.30) 92.17% 91.59%
Range-[30, 50) 78.78% 75.99%
Range-[50,+inf) 59.74% 55.14%

Installation

Requirements

  • OS: Ubuntu 20.04/22.04 (64-bit)
  • Compiler: GCC 13+ (C++17 required)
  • CMake: 3.28+
  • Dependencies:
    • OpenCV 4.1+
    • PCL 1.14+
    • Eigen3 3.4+
# Install dependencies
sudo apt-get install -y \
    gcc-13 g++-13 \
    libopencv-dev \
    libpcl-dev \
    libeigen3-dev

# Clone repository
git clone https://github.com/yourusername/RobMOT.git
cd RobMOT

Data Preparation

Organize the dataset as: (**Note the code does not include visualization, you may exclude directories with "# No need with no visualization")

datasets/
โ”œโ”€โ”€ kitti/           
    โ”œโ”€โ”€ Camera # No need with no visualization
        โ”œโ”€โ”€ training 
            โ”œโ”€โ”€ 0000
            ...
        โ”œโ”€โ”€ testing
            โ”œโ”€โ”€ 0000
            ...
    โ”œโ”€โ”€ LiDAR
        โ”œโ”€โ”€ training
            โ”œโ”€โ”€ calib
                โ”œโ”€โ”€ 0000.txt
                ...
            โ”œโ”€โ”€ pose
                โ”œโ”€โ”€ 0000.txt
                ...
            โ”œโ”€โ”€ velodyne # No need with no visualization
                โ”œโ”€โ”€ 0000
                ...
        โ”œโ”€โ”€ testing
            โ”œโ”€โ”€ calib
                โ”œโ”€โ”€ 0000.txt
                ...
            โ”œโ”€โ”€ pose
                โ”œโ”€โ”€ 0000.txt
                ... 
            โ”œโ”€โ”€ velodyne # No need with no visualization
                โ”œโ”€โ”€ 0000
                ..

โ”œโ”€โ”€ waymo/
    โ”œโ”€โ”€ Camera # No need with no visualization
        โ”œโ”€โ”€ training
            โ”œโ”€โ”€ 17065833287841703_2980_000_3000_000
            ...
        โ”œโ”€โ”€ testing
            โ”œโ”€โ”€ 2601205676330128831_4880_000_4900_000.parquet
            ...
    โ”œโ”€โ”€ LiDAR
        โ”œโ”€โ”€ training
            โ”œโ”€โ”€ pose
                โ”œโ”€โ”€ 17065833287841703_2980_000_3000_000.txt
                ...
            โ”œโ”€โ”€ velodyne # No need with no visualization
                โ”œโ”€โ”€ 17065833287841703_2980_000_3000_000
                ...
        โ”œโ”€โ”€ testing
            โ”œโ”€โ”€ pose
                โ”œโ”€โ”€ 17065833287841703_2980_000_3000_000.txt
                ...
            โ”œโ”€โ”€ velodyne # No need with no visualization
                โ”œโ”€โ”€ 17065833287841703_2980_000_3000_000
                ...

Configuration

All directories should be set up correctly to avoid issues when running the software. Please note all detector data are in folder advanced_detection.

config/config.cpp

        //TODO: Include the fill project path. The path should end by 'RobMOT/src'
        constexpr static const char* basePath  = "/EXAMPLE/RobMOT/src"; # The directory where you placed the repository, update "/EXAMPLE" only.

main.cpp

            const string BASE_DIR               = "EXAMPLE/datasets/"; // TODO: Update to the dataset directory on your machine, update "/EXAMPLE" only.

Configuration Options

config/config.cpp

        # select dataset -> values: kitti or waymo
        constexpr static const char* dataset_name = "kitti";
        # select dataset type -> values: training or testing
        constexpr static const char* dataset = "training";
        # true/false based on the dataset type.   
        constexpr static const bool  isTraining                 = true;
        # To not include state estimation in the results when objects are occluded. (Note: some datasets do not have ground truth for occluded objects)
        constexpr static const bool  processDetectedObjectsOnly = true;
        # To run a specific stream. Add a single or multiple stream names to the list, and put true for the `selectedStreamsActivation`
        constexpr static const bool selectedStreamsActivation   = false; // To run specific stream/s
        constexpr static const char* selectedStreams[1]   ={"0002"};

....
        // Define selectedDetector here
        # Change the detector name, Options:
        # for kitti (Virconv, Casc, Pointrcnn, Pvcnn, SecondIou),
        # for waymo (CascWaymo, Ctrl)
        inline std::unique_ptr<parameters::Detector> selectedDetector = std::make_unique<Virconv>();

Citation

@ARTICLE{11071990,
  author={Nagy, Mohamed and Werghi, Naoufel and Hassan, Bilal and Dias, Jorge and Khonji, Majid},
  journal={IEEE Transactions on Intelligent Transportation Systems}, 
  title={RobMOT: 3D Multi-Object Tracking Enhancement Through Observational Noise and State Estimation Drift Mitigation in LiDAR Point Clouds}, 
  year={2025},
  volume={},
  number={},
  pages={1-13},
  keywords={3D multi-object tracking;state estimation;Kalman filter;LiDAR point cloud},
  doi={10.1109/TITS.2025.3581980}}

Contributors

MohamedNagyMostafa

Issues