No LiDAR, no stereo rig, no site visit. Self-calibrates height, tilt and focal length purely from the people already walking through the scene, then turns every detection box a downstream detector produces into a real-world position, distance, height, speed, separation, area and density.
docs/EXTERNAL_EVAL.md, not run yet (board item AC1).These three configurations are the ones committed as evidence in the repository itself
(src/fixedcam3d/bench.py, DEFAULT_SWEEP). They are the numbers the
product README states, reproduced digit for digit by running the command below in this
generation session.
| camera (truth) | position RMSE | position p90 | speed MAE | height MAE | recovered tilt error | sensitivity (m/0.5°) |
|---|---|---|---|---|---|---|
| 3 m, 20 deg tilt (hard case) | 4.30 m | 5.77 m | 0.353 m/s | 0.038 m | 3.14 deg | 1.72 |
| 5 m, 30 deg tilt | 0.16 m | 0.23 m | 0.083 m/s | 0.056 m | 0.43 deg | 0.72 |
| 8 m, 45 deg tilt | 0.19 m | 0.22 m | 0.076 m/s | 0.078 m | 0.02 deg | 0.2 |
Command: fixedcam3d bench --seed 0
(python -m fixedcam3d.cli bench --seed 0), reading src/fixedcam3d/bench.py.
Full suite this session: python -m pytest tests/ -q printed
51 passed in 13.37s (tests/test_bench.py, tests/test_cli.py, tests/test_depth_fusion.py, tests/test_geometry.py, tests/test_metric.py).
The raw grid backing this page (bench_results.json) is committed alongside this
page in the Space itself, not just claimed.
This is every cell behind the interactive grid above, as plain numbers. Rows shaded and bolded
are the ones the calibrator's own conditioning probe flags as ill-conditioned
(sensitivity_m_per_half_deg > 1.0, the same threshold calibration.py
uses internally): 11 of the 42 cells cross that line, concentrated at low height
paired with a shallow tilt.
| height | tilt | focal | position RMSE (m) | position p90 (m) | speed MAE (m/s) | height MAE (m) | sensitivity (m/0.5°) | residual |
|---|---|---|---|---|---|---|---|---|
| 3 m | 15 deg | 1200 px | 6.681 | 9.094 | 0.440 | 0.032 | 2.03 | 0.0366 |
| 3 m | 20 deg | 1200 px | 4.304 | 5.767 | 0.353 | 0.038 | 1.72 | 0.0366 |
| 3 m | 25 deg | 1200 px | 3.040 | 3.992 | 0.298 | 0.044 | 1.57 | 0.0366 |
| 3 m | 30 deg | 1200 px | 1.278 | 1.631 | 0.213 | 0.066 | 0.95 | 0.0399 |
| 3 m | 35 deg | 1200 px | 1.172 | 1.317 | 0.234 | 0.065 | 0.43 | 0.0387 |
| 3 m | 40 deg | 1200 px | 1.213 | 1.316 | 0.165 | 0.181 | 0.15 | 0.0380 |
| 3 m | 45 deg | 1200 px | 6.031 | 6.397 | n/a | 0.057 | 0.31 | 0.0357 |
| 4 m | 15 deg | 1300 px | 0.571 | 0.796 | 0.209 | 0.035 | 1.08 | 0.0365 |
| 4 m | 20 deg | 1300 px | 1.688 | 2.205 | 0.277 | 0.046 | 1.17 | 0.0409 |
| 4 m | 25 deg | 1300 px | 2.008 | 2.516 | 0.268 | 0.049 | 1.11 | 0.0392 |
| 4 m | 30 deg | 1300 px | 1.070 | 1.296 | 0.113 | 0.056 | 0.76 | 0.0395 |
| 4 m | 35 deg | 1300 px | 0.215 | 0.279 | 0.094 | 0.094 | 0.33 | 0.0450 |
| 4 m | 40 deg | 1300 px | 0.640 | 0.684 | 0.114 | 0.124 | 0.16 | 0.0398 |
| 4 m | 45 deg | 1300 px | 0.052 | 0.073 | 0.123 | 0.135 | 0.14 | 0.0381 |
| 5 m | 15 deg | 1400 px | 2.094 | 2.585 | 0.100 | 0.034 | 0.81 | 0.0352 |
| 5 m | 20 deg | 1400 px | 0.211 | 0.283 | 0.110 | 0.039 | 0.91 | 0.0366 |
| 5 m | 25 deg | 1400 px | 0.437 | 0.587 | 0.157 | 0.052 | 0.88 | 0.0412 |
| 5 m | 30 deg | 1400 px | 0.165 | 0.235 | 0.083 | 0.056 | 0.72 | 0.0390 |
| 5 m | 35 deg | 1400 px | 0.513 | 0.587 | 0.131 | 0.073 | 0.41 | 0.0377 |
| 5 m | 40 deg | 1400 px | 1.644 | 1.800 | 0.069 | 0.067 | 0.25 | 0.0361 |
| 5 m | 45 deg | 1400 px | 0.253 | 0.280 | 0.039 | 0.120 | 0.14 | 0.0417 |
| 6 m | 15 deg | 1500 px | 47.410 | 61.124 | 1.740 | 0.024 | 5.94 | 0.0397 |
| 6 m | 20 deg | 1500 px | 1.264 | 1.478 | 0.077 | 0.037 | 0.75 | 0.0353 |
| 6 m | 25 deg | 1500 px | 0.101 | 0.145 | 0.097 | 0.043 | 0.79 | 0.0366 |
| 6 m | 30 deg | 1500 px | 0.394 | 0.515 | 0.163 | 0.048 | 0.73 | 0.0403 |
| 6 m | 35 deg | 1500 px | 0.454 | 0.541 | 0.171 | 0.062 | 0.36 | 0.0396 |
| 6 m | 40 deg | 1500 px | 0.581 | 0.628 | 0.071 | 0.084 | 0.24 | 0.0391 |
| 6 m | 45 deg | 1500 px | 0.494 | 0.542 | 0.091 | 0.114 | 0.14 | 0.0398 |
| 7 m | 15 deg | 1600 px | 60.594 | 74.534 | 1.231 | 0.026 | 7.25 | 0.0369 |
| 7 m | 20 deg | 1600 px | 12.900 | 15.969 | 0.461 | 0.025 | 1.42 | 0.0397 |
| 7 m | 25 deg | 1600 px | 0.838 | 0.972 | 0.067 | 0.040 | 0.69 | 0.0354 |
| 7 m | 30 deg | 1600 px | 0.109 | 0.167 | 0.091 | 0.046 | 0.65 | 0.0361 |
| 7 m | 35 deg | 1600 px | 1.457 | 1.570 | 0.073 | 0.076 | 0.3 | 0.0396 |
| 7 m | 40 deg | 1600 px | 0.143 | 0.181 | 0.083 | 0.092 | 0.22 | 0.0391 |
| 7 m | 45 deg | 1600 px | 0.461 | 0.496 | 0.042 | 0.084 | 0.18 | 0.0394 |
| 8 m | 15 deg | 1700 px | 6.555 | 8.186 | 0.166 | 0.025 | 1.18 | 0.0328 |
| 8 m | 20 deg | 1700 px | 31.846 | 38.362 | 0.554 | 0.028 | 2.82 | 0.0368 |
| 8 m | 25 deg | 1700 px | 7.457 | 8.942 | 0.270 | 0.027 | 0.94 | 0.0396 |
| 8 m | 30 deg | 1700 px | 0.593 | 0.681 | 0.060 | 0.044 | 0.63 | 0.0355 |
| 8 m | 35 deg | 1700 px | 1.148 | 1.267 | 0.081 | 0.056 | 0.34 | 0.0430 |
| 8 m | 40 deg | 1700 px | 1.424 | 1.639 | 0.074 | 0.083 | 0.22 | 0.0366 |
| 8 m | 45 deg | 1700 px | 0.190 | 0.219 | 0.076 | 0.078 | 0.2 | 0.0392 |
Grid: fixedcam3d.bench.run_bench(), the same function
DEFAULT_SWEEP calls, swept over height 3 to 8 m (step 1 m) by tilt 15 to 45 degrees
(step 5 degrees), seed 0, 80 calibration walkers and 60 evaluation points per cell, focal length
scaled with height the same way the shipped sweep does
(focal_px = 900 + 100 * height_m, confirmed against all three DEFAULT_SWEEP cameras).
This 42-cell grid is not one of the product repo's committed evidence files (the repo
ships only the 3-camera DEFAULT_SWEEP); it is a disclosed extension built from the identical
run_bench code path, computed fresh in this generation session and committed in
bench_results.json in this Space.
docs/EXTERNAL_EVAL.md.sensitivity_m_per_half_deg flags most, not all, ill-conditioned geometries -
see docs/REAL_DATA_RISK_AUDIT.md for the known gaps.