Karhan Kayan* · Stamatis Alexandropoulos* · Rishabh Jain · Yiming Zuo · Erich Liang . Jia Deng
(*equal contribution, random order)
If you use our benchmark, data, or method in your work, please cite our paper:
@InProceedings{princeton365,
author = {Kayan, Karhan and Alexandropoulos, Stamatis and Jain, Rishabh and Zuo, Yiming and Liang, Erich and Deng, Jia},
title = {Princeton365: A Diverse Dataset with Accurate Camera Pose},
booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)},
month = {October},
year = {2025},
pages = {7645-7654}
}
You can download our dataset from Google Drive or Huggingface. We recommend Huggingface due to lower rate limits.
- To download from Google Drive, please follow the instructions on our website.
- To download from Huggingface, please follow the instructions here.
For basic functionality (submitting results):
conda create --name princeton365 python=3.10
conda activate princeton365
pip install .For development with ground truth generation capabilities:
conda create --name princeton365 python=3.10
conda activate princeton365
pip install ".[dev]"You can also install the package from PyPI:
pip install princeton365or
pip install princeton365[dev]To evaluate your model on the test set, you need to submit your results to our evaluations server. Please run your model on the test set and convert the trajectories into TUM Format. This means that the resulting trajectories for each sequence should be a .txt file with timestamp tx ty tz qx qy qz qw on each line. See here for details. Put all of your estimated trajectories in the same folder. The trajectories should have exactly the same name as the corresponding video (i.e. For the video new_scanning_user_view_1.mp4 the trajectory should be named new_scanning_user_view_1.txt)
Submit your predictions to the evaluation server using the command below. Replace the placeholders:
princeton365-upload \
--email your_email \
--path path_to_your_submission_folder \
--method_name your_method_nameUpon submission, you will receive a unique submission ID, which serves as the identifier for your submission. Results are typically emailed within a few hours. Please note that each email user may upload only three submissions every seven days.
To make your submission public, run:
princeton365-make-public \
--id submission_id \
--email your_email \
--anonymous False \
--method_name your_method_name \
--publication "your publication name" \
--url_publication "https://your_publication" \
--url_code "https://your_code" \You may set "Anonymous" as the publication name if the work is under review. The url_publication, url_code fields are optional. If your method uses IMU data, please add --inertial flag. If your method uses stereo data, please add --stereo flag.
The NVS benchmark is available on our website with full ground-truth, and it does not require submission. We recommend installing Nerfstudio to run your method, and we provide our ground-truth in COLMAP format as well, which is required by Nerfstudio.
Examples of training and evaluation scripts are provided in the scripts/nvs folder. For instance, to train and evaluate a NeRF model, you can run:
bash scripts/nvs/train_nerf_all.sh
bash scripts/nvs/test_all.shNote that the sequences in the cross-validation set of the SLAM benchmark can also be used to evaluate NVS methods since they contain the camera pose ground-truth.
Princeton365 uses a method for camera pose ground-truth that allows for easy data collection with high accuracy. In this section, we give instructions on how you can annotate your own sequences with our ground-truth method. Please see the website for our camera rig setup. You do not need an exact replica of this setup to start collecting data. For monocular camera pose, you only need a 360-camera or two cameras with fixed relative pose.
If you want to use the Induced Optical Flow metric, you will need depth information, which you can get using a stereo camera or a Lidar device. This repo is only for producing ground-truth trajectories and the optical-flow metric and not for generating the depth data.
Follow the steps below to set up the required environment:
conda create --name princeton365
conda activate princeton365
pip install ".[dev]"
sudo apt-get install python3-tk
sudo apt-get install python3-pil.imagetkYou need a different environment to run Bundle PnP. Please install the following:
conda create --name bundle_pnp
conda activate bundle_pnp
conda install -c conda-forge ceres-solver cxx-compiler c-compiler
conda install -c conda-forge zlib
cd princeton365/optimization/bundle_pnp
mkdir build
cd build
cmake -DMETIS_LIBRARY=/path/to/libmetis.so -DMETIS_INCLUDE_DIR=/path/to/metis/include ..
make
cd ../../../..To install Bundle Rig PnP to compute relative pose between two views, run the following commands:
cd princeton365/optimization/rig_bundle_pnp
mkdir build
cd build
cmake -DMETIS_LIBRARY=/path/to/libmetis.so -DMETIS_INCLUDE_DIR=/path/to/metis/include ..
make
cd ../../../..If you encounter issues with the GCC compiler, add the following aliases to your ~/.bashrc file:
alias gcc="$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-gcc"
alias g++="$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-g++"Then, reload the .bashrc file:
source ~/.bashrc- Benchmark Videos (
pvl-slam/Benchmark):- Contains Benchmark videos (scanning, indoor, outdoors)
- Each folder includes the following three subdirectories:
gt_view:Ground truth (GT) view videos, the corresponding user_view video of which will be used in evaluations.pose_graph_extra_frames: GT view videos used for close-up filming and pose graph constructionuser_view: User-perspective videos that correspond to the GT view videos.
To generate the calibration boards (either grid or ChArUco), use the following command:
conda activate princeton365
princeton365-board-generator --config princeton365/configs/board_configs.yaml --board_type '<type>'Replace with the desired board type, such as 'grid' or 'charuco'. You can customize the board parameters by editing the princeton365/configs/board_configs.yaml file to suit your needs.
Print these boards and place them completely flat on a surface. The local 3D board coordinates assume that the markers are on a flat plane. This can be ensured cheaply by gluing the paper boards on a flat cardboard. Higher precision techniques such as printing on ceramic or aluminum surfaces can also be used.
The ground truth trajectory is generated in two main steps:
- Generate the Pose Graph from a Close-Up Video:
Run the following command on a close-up video of the calibration board to generate a pose graph and initial trajectory:
conda activate princeton365
princeton365-generate-gt \
--video <close_up_video> \
--intrinsics <intrinsics_folder> \
--board_type <'grid' or 'charuco'>where:
<close_up_video>: Path to the close-up video capturing the calibration board<intrinsics_folder>: Directory containing camera intrinsics<'grid' or 'charuco'>: Type of calibration board used
- Generate the GT Trajectory for the Main View: Use the pose graph from the close-up video to generate the trajectory for the main GT view:
conda activate princeton365
princeton365-generate-gt \
--video <gt_view_video> \
--intrinsics <intrinsics_folder> \
--board_type <'grid' or 'charuco'> \
--use_pose_graph <pose_graph_file> \
--bundle_pnpwhere
<gt_view_video>: Path to the GT view video<pose_graph_file>: Pose graph file generated from the close-up video<intrinsics_folder>and --board_type should match the setup used in Step 1
- Relative Pose Generator
This utility script finds the relative pose between two views (e.g., ground-truth and user views) using detected 2D points, camera intrinsics, and a ground-truth trajectory. It uses Bundle Rig PnP.
conda activate princeton365
princeton365-relative-pose \
--gt_trajectory <path_to_gt_trajectory_txt> \
--gt_detected_points <path_to_gt_detected_points_json> \
--user_detected_points <path_to_user_detected_points_json> \
--gt_intrinsics <path_to_gt_intrinsics_folder> \
--user_intrinsics <path_to_user_intrinsics_folder> \
--pose_graph <path_to_pose_graph_pickle>