Handy toolkit for saving, evaluating, and visualizing 3D reconstruction predictions.
Project description
Eval3r: 3D reconstruction evaluation, made explicit
[!NOTE] Eval3r is a research-oriented project and is under active development, we strive to make it more useful for the research community. Please don't hesitate to open an issue or submit a pull request with feedback, suggestions, or improvements.
Overview
Eval3r focuses on a small, explicit core:
- A handy CLI for 3D reconstruction evaluation and visualization.
- A stable on-disk prediction format (manifest + geometry + trajectory + cameras)
The goals are reproducibility and explicit assumptions: no silent alignment, no silent unit conversion, no hidden default for pose conventions.
Install
Base install:
pip install eval3r
Optional extras:
pip install eval3r[render] # pyrender + pillow + imageio
pip install eval3r[dev] # pytest + ruff + mypy + pre-commit
Quick start
Suppose you have two mesh/point cloud files:
pred.ply # your reconstruction
gt.ply # ground truth
You want to know: how good is the reconstruction?
Run geometry metrics
e3r metric all pred.ply --gt gt.ply
This reports Chamfer distance, accuracy, completeness, precision, recall, and F-score. Use this when both point clouds are already in the same coordinate frame.
Visualize before trusting numbers
e3r metric all pred.ply --gt gt.ply --debug-plot
Check whether the two point clouds overlap. If they are shifted, rotated, or scaled differently, raw metrics may look bad even when the shape is reasonable.
Align before evaluation
Rigid alignment:
e3r metric all pred.ply --gt gt.ply --align icp --debug-plot
Use this when the prediction has correct scale but may be rotated or translated.
Similarity alignment:
e3r metric all pred.ply --gt gt.ply --align sim3 --debug-plot
Use this when the prediction may have unknown scale, such as monocular reconstruction.
Trajectory-based alignment:
e3r metric all pred.ply --gt gt.ply \
--align traj_sim3 \
--pred-traj pred_trajectory.txt \
--gt-traj gt_trajectory.txt \
--debug-plot
Use this when the method also predicts camera poses.
Benchmark a dataset split
For a full dataset benchmark, organize predictions by scene:
preds_root/
scene0000_00/
mesh.ply
scene0001_00/
mesh.ply
Then run:
e3r benchmark preds_root \
--dataset scannet \
--root /path/to/scannet \
--split split.txt \
--align sim3 \
--debug-plot \
--out results.json \
--csv results.csv
This evaluates all scenes in the split and reports dataset-level summary statistics.
Useful options:
--align sim3 # alignment mode
--samples 200000 # points sampled per scene
--thresholds 0.05 # F-score threshold
--workers 8 # parallel workers
--debug-plot # save per-scene visualization
--out results.json # full benchmark result
--csv results.csv # per-scene table
For custom prediction filenames:
e3r benchmark run scannet preds_root \
--root /path/to/scannet \
--split split.txt \
--pred-filename "{scene_id}/mesh.ply" \
--align sim3 \
--csv results.csv
For trajectory-based alignment:
e3r benchmark run scannet preds_root \
--root /path/to/scannet \
--split split.txt \
--align traj_sim3 \
--pred-pose-dir pred_poses \
--pred-pose-file "{scene_id}.txt" \
--pred-pose-convention T_wc \
--csv results.csv
Use e3r metric for one pair of geometries.
Use e3r benchmark run for dataset-level evaluation.
Saving a prediction
If you want to save your method's output in Eval3r's format for downstream evaluation, use PredictionWriter:
import numpy as np
import eval3r as e3r
with e3r.PredictionWriter(
"outputs/scannet/scene0799_00",
scene_id="scene0799_00",
dataset="scannet",
method="my_method",
unit="m",
coordinate_system="opengl",
pose_convention="T_wc",
) as pred:
pred.save_point_cloud(points, colors=colors)
pred.save_mesh(vertices, faces)
pred.save_poses(poses, timestamps=timestamps)
pred.save_metadata({"checkpoint": "ckpt.pth"})
The writer warns if unit, coordinate_system, or pose_convention is left
unspecified — the manifest will record "unspecified" so downstream evaluation
can flag the ambiguity instead of guessing.
Document
For monocular or feedforward methods, sim3 is often a good default.
For SLAM or pose-producing methods, prefer traj_se3 or traj_sim3.
For more update-to-date examples, see the docs.
License
Eval3r is released under the MIT License. See pyproject.toml for the canonical metadata.
Disclaimer
Eval3r does not redistribute any third-party datasets. Datasets (ScanNet, Replica, DTU, ETH3D, Tanks & Temples, TUM RGB-D) remain under their original licenses; you must obtain them from their respective sources and abide by those terms. Adapter code in eval3r/datasets/ only describes filesystem layouts — no dataset contents.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file eval3r-0.1.4.tar.gz.
File metadata
- Download URL: eval3r-0.1.4.tar.gz
- Upload date:
- Size: 70.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b0ee1d811476acf762adadfb0693286d80d235bb7d4f1d53889d93e6b23de42
|
|
| MD5 |
5fe5f7ca7bef5ff30f943dee2bb3db17
|
|
| BLAKE2b-256 |
189b3189e25ee725cee5a02781354addb452408c1182e015674460a722ea1e9a
|
Provenance
The following attestation bundles were made for eval3r-0.1.4.tar.gz:
Publisher:
publish.yml on xingruiy/eval3r
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eval3r-0.1.4.tar.gz -
Subject digest:
8b0ee1d811476acf762adadfb0693286d80d235bb7d4f1d53889d93e6b23de42 - Sigstore transparency entry: 1474996123
- Sigstore integration time:
-
Permalink:
xingruiy/eval3r@15eeff6a16fb30a41dab6df52b04ea8515418545 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/xingruiy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@15eeff6a16fb30a41dab6df52b04ea8515418545 -
Trigger Event:
push
-
Statement type:
File details
Details for the file eval3r-0.1.4-py3-none-any.whl.
File metadata
- Download URL: eval3r-0.1.4-py3-none-any.whl
- Upload date:
- Size: 104.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d6d5b4495e2631894a16db2b70e173f2eac8242a2c476887be24a07ba1613ee
|
|
| MD5 |
436e2d903084c7b1bbe27f5be34ca623
|
|
| BLAKE2b-256 |
426f33d7fa0457df12ab9f790dede9028bd36c63a09cb9a432d0231513b00158
|
Provenance
The following attestation bundles were made for eval3r-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on xingruiy/eval3r
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eval3r-0.1.4-py3-none-any.whl -
Subject digest:
8d6d5b4495e2631894a16db2b70e173f2eac8242a2c476887be24a07ba1613ee - Sigstore transparency entry: 1474996270
- Sigstore integration time:
-
Permalink:
xingruiy/eval3r@15eeff6a16fb30a41dab6df52b04ea8515418545 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/xingruiy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@15eeff6a16fb30a41dab6df52b04ea8515418545 -
Trigger Event:
push
-
Statement type: