feat: add RMSE-based fallback for depth pooling

This commit is contained in:
2026-02-07 09:07:23 +00:00
parent 8f6aee7f22
commit 8dbf892ce8
2 changed files with 153 additions and 11 deletions
+62 -10
View File
@@ -199,9 +199,9 @@ def apply_depth_verify_refine_postprocess(
# If pooled result is much worse (e.g. < 50% of valid points of single frame), fallback
# This can happen if frames are misaligned or pooling logic fails
if n_valid_pooled < (n_valid_best * 0.5):
if n_valid_pooled < n_valid_best:
click.echo(
f"Camera {serial}: Pooled depth has too few valid points ({n_valid_pooled} vs {n_valid_best}). "
f"Camera {serial}: Pooled depth has fewer valid points ({n_valid_pooled} vs {n_valid_best}). "
"Falling back to best single frame."
)
final_depth = best_depth
@@ -213,16 +213,68 @@ def apply_depth_verify_refine_postprocess(
"fallback_reason": "insufficient_valid_points",
}
else:
final_depth = pooled_depth
final_conf = pooled_conf
pool_metadata = {
"pool_size_requested": depth_pool_size,
"pool_size_actual": len(depth_maps),
"pooled": True,
# A/B Test: Compare RMSE of pooled vs best single frame
# We need to compute RMSE for both using the current T_mean
pose_str = results[str(serial)]["pose"]
T_mean = np.fromstring(pose_str, sep=" ").reshape(4, 4)
cam_matrix = camera_matrices[serial]
marker_corners_world = {
int(mid): marker_geometry[int(mid)]
for mid in ids.flatten()
if int(mid) in marker_geometry
}
click.echo(
f"Camera {serial}: Using pooled depth from {len(depth_maps)} frames."
# Verify pooled
verify_pooled = verify_extrinsics_with_depth(
T_mean,
marker_corners_world,
pooled_depth,
cam_matrix,
confidence_map=pooled_conf,
confidence_thresh=depth_confidence_threshold,
)
# Verify best single frame
verify_best = verify_extrinsics_with_depth(
T_mean,
marker_corners_world,
best_depth,
cam_matrix,
confidence_map=best_conf,
confidence_thresh=depth_confidence_threshold,
)
# If pooled RMSE is worse than best single frame, fallback
# We use a small epsilon to avoid flipping on noise, but generally strict
if verify_pooled.rmse > verify_best.rmse:
click.echo(
f"Camera {serial}: Pooled depth RMSE ({verify_pooled.rmse:.4f}m) worse than single frame ({verify_best.rmse:.4f}m). "
"Falling back to best single frame."
)
final_depth = best_depth
final_conf = best_conf
pool_metadata = {
"pool_size_requested": depth_pool_size,
"pool_size_actual": len(depth_maps),
"pooled": False,
"fallback_reason": "worse_verify_rmse",
"pooled_rmse": verify_pooled.rmse,
"single_rmse": verify_best.rmse,
}
else:
final_depth = pooled_depth
final_conf = pooled_conf
pool_metadata = {
"pool_size_requested": depth_pool_size,
"pool_size_actual": len(depth_maps),
"pooled": True,
"pooled_rmse": verify_pooled.rmse,
"single_rmse": verify_best.rmse,
}
click.echo(
f"Camera {serial}: Using pooled depth from {len(depth_maps)} frames (RMSE {verify_pooled.rmse:.4f}m vs {verify_best.rmse:.4f}m)."
)
except Exception as e:
click.echo(
f"Camera {serial}: Pooling failed with error: {e}. Falling back to single frame.",