feat: add RMSE-based fallback for depth pooling
This commit is contained in:
@@ -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.",
|
||||
|
||||
Reference in New Issue
Block a user