Dhi Labs, product A3

Fixed-Camera 3D: metric 3D from one camera you already have

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.

0.16 mposition RMSE, 5 m height / 30 deg tilt (measured, easy case)
4.30 mposition RMSE, 3 m height / 20 deg tilt (measured, disclosed hard case)
51 passed in 13.37sfull pytest suite, this session (tests/test_bench.py, tests/test_cli.py, tests/test_depth_fusion.py, tests/test_geometry.py, tests/test_metric.py)
What is measured, what is not.

Headline sweep (DEFAULT_SWEEP, three configurations)

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 RMSEposition p90speed MAEheight MAErecovered tilt errorsensitivity (m/0.5°)
3 m, 20 deg tilt (hard case)4.30 m5.77 m0.353 m/s0.038 m3.14 deg1.72
5 m, 30 deg tilt0.16 m0.23 m0.083 m/s0.056 m0.43 deg0.72
8 m, 45 deg tilt0.19 m0.22 m0.076 m/s0.078 m0.02 deg0.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.

Extended height / tilt grid, all 42 configurations

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.

heighttiltfocalposition RMSE (m)position p90 (m) speed MAE (m/s)height MAE (m)sensitivity (m/0.5°)residual
3 m15 deg1200 px6.6819.0940.4400.0322.030.0366
3 m20 deg1200 px4.3045.7670.3530.0381.720.0366
3 m25 deg1200 px3.0403.9920.2980.0441.570.0366
3 m30 deg1200 px1.2781.6310.2130.0660.950.0399
3 m35 deg1200 px1.1721.3170.2340.0650.430.0387
3 m40 deg1200 px1.2131.3160.1650.1810.150.0380
3 m45 deg1200 px6.0316.397n/a0.0570.310.0357
4 m15 deg1300 px0.5710.7960.2090.0351.080.0365
4 m20 deg1300 px1.6882.2050.2770.0461.170.0409
4 m25 deg1300 px2.0082.5160.2680.0491.110.0392
4 m30 deg1300 px1.0701.2960.1130.0560.760.0395
4 m35 deg1300 px0.2150.2790.0940.0940.330.0450
4 m40 deg1300 px0.6400.6840.1140.1240.160.0398
4 m45 deg1300 px0.0520.0730.1230.1350.140.0381
5 m15 deg1400 px2.0942.5850.1000.0340.810.0352
5 m20 deg1400 px0.2110.2830.1100.0390.910.0366
5 m25 deg1400 px0.4370.5870.1570.0520.880.0412
5 m30 deg1400 px0.1650.2350.0830.0560.720.0390
5 m35 deg1400 px0.5130.5870.1310.0730.410.0377
5 m40 deg1400 px1.6441.8000.0690.0670.250.0361
5 m45 deg1400 px0.2530.2800.0390.1200.140.0417
6 m15 deg1500 px47.41061.1241.7400.0245.940.0397
6 m20 deg1500 px1.2641.4780.0770.0370.750.0353
6 m25 deg1500 px0.1010.1450.0970.0430.790.0366
6 m30 deg1500 px0.3940.5150.1630.0480.730.0403
6 m35 deg1500 px0.4540.5410.1710.0620.360.0396
6 m40 deg1500 px0.5810.6280.0710.0840.240.0391
6 m45 deg1500 px0.4940.5420.0910.1140.140.0398
7 m15 deg1600 px60.59474.5341.2310.0267.250.0369
7 m20 deg1600 px12.90015.9690.4610.0251.420.0397
7 m25 deg1600 px0.8380.9720.0670.0400.690.0354
7 m30 deg1600 px0.1090.1670.0910.0460.650.0361
7 m35 deg1600 px1.4571.5700.0730.0760.30.0396
7 m40 deg1600 px0.1430.1810.0830.0920.220.0391
7 m45 deg1600 px0.4610.4960.0420.0840.180.0394
8 m15 deg1700 px6.5558.1860.1660.0251.180.0328
8 m20 deg1700 px31.84638.3620.5540.0282.820.0368
8 m25 deg1700 px7.4578.9420.2700.0270.940.0396
8 m30 deg1700 px0.5930.6810.0600.0440.630.0355
8 m35 deg1700 px1.1481.2670.0810.0560.340.0430
8 m40 deg1700 px1.4241.6390.0740.0830.220.0366
8 m45 deg1700 px0.1900.2190.0760.0780.20.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.

Honest limitations