{ "schema": "multispec_module_params_v3", "saved_at": "2026-05-12 14:20:13", "frame_type": "RAW_BRUTO", "capture_mode_requested": "AUTO", "capture_mode_effective": "AUTO", "raw_policy": "allow_single", "sensor_width": 1280, "sensor_height": 800, "bayer_pattern": "BGGR", "rgb_processing": { "mode": "bayer_planes" }, "camera_settings": { "rgb": { "ae_enable": true, "awb_enable": true, "exposure_time_us": 2000, "analogue_gain": 1.0, "colour_gains": [ 1.0, 1.0 ] }, "re": { "ae_enable": true, "awb_enable": false, "exposure_time_us": 5000, "analogue_gain": 1.0, "colour_gains": null }, "nir": { "ae_enable": true, "awb_enable": false, "exposure_time_us": 5000, "analogue_gain": 1.0, "colour_gains": null } }, "fusion_config": { "alignment_mode": "homography", "baseline_mm": 75.0, "reference_camera": "rgb", "manual_offsets": { "re": { "dx": 0, "dy": 0, "theta_deg": 0.0 }, "nir": { "dx": 0, "dy": 1, "theta_deg": 0.0 } }, "homographies": { "re_to_rgb": [ [ 1.0103099557765387, 0.00879456142897448, -9.666692994320178 ], [ -0.00014434784827104316, 1.0214419841673288, 50.41247184630176 ], [ 6.270900951674823e-06, 1.788434277122896e-05, 1.0 ] ], "nir_to_rgb": [ [ 0.994769714806237, 0.005296878287321148, -6.433772056422987 ], [ -0.00092900679814922, 1.0017494877636166, 29.883379280823718 ], [ -5.35529902496836e-08, 7.331793189295934e-06, 1.0 ] ] }, "crop_valid_common": true, "resize_after_crop": true, "target_size": null }, "radiometric_config": { "enabled": false, "interval_s": 0.25, "verbose": true, "metering_mode": "reference_patches", "spectral_control_mode": "shared", "control_metric": "p50", "target_value": 0.5, "deadband": 0.055, "p95_limit": 0.975, "saturation_limit_pct": 5.0, "alpha": 0.18, "exp_step_gain": 0.55, "prefer_exposure": true, "exp_min_us": 100, "exp_max_us": 80000, "gain_min": 1.0, "gain_max": 4.0, "reference_patches": [ { "name": "black_reference", "type": "black", "roles": [ "rgb", "re", "nir" ], "roi_pct": { "x0": 0.26875, "y0": 0.8175, "x1": 0.328906, "y1": 0.985 }, "target_value": 0.08, "weight": 0.7, "roi_pct_by_role": { "rgb": { "x0": 0.26875, "y0": 0.8175, "x1": 0.328906, "y1": 0.985 }, "re": { "x0": 0.235156, "y0": 0.8175, "x1": 0.289062, "y1": 0.985 }, "nir": { "x0": 0.3, "y0": 0.83125, "x1": 0.360938, "y1": 0.9925 } }, "roi_list_by_role": { "rgb": [ { "name": "rgb_legacy_01", "enabled": true, "roi_pct": { "x0": 0.26875, "y0": 0.8175, "x1": 0.328906, "y1": 0.985 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:16:15" }, { "name": "black_rgb_02", "enabled": true, "roi_pct": { "x0": 0.813281, "y0": 0.8275, "x1": 0.873437, "y1": 0.9875 }, "created_at": "2026-05-12 14:16:20", "updated_at": "2026-05-12 14:16:32" } ], "re": [ { "name": "re_legacy_01", "enabled": true, "roi_pct": { "x0": 0.235156, "y0": 0.8175, "x1": 0.289062, "y1": 0.985 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:17:39" }, { "name": "black_re_02", "enabled": true, "roi_pct": { "x0": 0.79375, "y0": 0.83, "x1": 0.85625, "y1": 0.99125 }, "created_at": "2026-05-12 14:17:42", "updated_at": "2026-05-12 14:17:49" } ], "nir": [ { "name": "nir_legacy_01", "enabled": true, "roi_pct": { "x0": 0.3, "y0": 0.83125, "x1": 0.360938, "y1": 0.9925 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:19:03" }, { "name": "black_nir_02", "enabled": true, "roi_pct": { "x0": 0.851562, "y0": 0.82, "x1": 0.910156, "y1": 0.97625 }, "created_at": "2026-05-12 14:19:04", "updated_at": "2026-05-12 14:19:16" } ] } }, { "name": "gray_reference", "type": "gray", "roles": [ "rgb", "re", "nir" ], "roi_pct": { "x0": 0.198437, "y0": 0.82625, "x1": 0.257812, "y1": 0.985 }, "target_value": 0.35, "target_value_by_role": { "rgb": 0.285, "re": 0.22, "nir": 0.27 }, "weight": 1.0, "roi_pct_by_role": { "rgb": { "x0": 0.198437, "y0": 0.82625, "x1": 0.257812, "y1": 0.985 }, "re": { "x0": 0.163281, "y0": 0.8175, "x1": 0.221875, "y1": 0.98625 }, "nir": { "x0": 0.228906, "y0": 0.8325, "x1": 0.290625, "y1": 0.99125 } }, "roi_list_by_role": { "rgb": [ { "name": "rgb_legacy_01", "enabled": true, "roi_pct": { "x0": 0.198437, "y0": 0.82625, "x1": 0.257812, "y1": 0.985 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:16:46" }, { "name": "gray_rgb_02", "enabled": true, "roi_pct": { "x0": 0.744531, "y0": 0.8275, "x1": 0.804688, "y1": 0.98625 }, "created_at": "2026-05-12 14:16:48", "updated_at": "2026-05-12 14:16:59" } ], "re": [ { "name": "re_legacy_01", "enabled": true, "roi_pct": { "x0": 0.163281, "y0": 0.8175, "x1": 0.221875, "y1": 0.98625 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:18:03" }, { "name": "gray_re_02", "enabled": true, "roi_pct": { "x0": 0.722656, "y0": 0.83, "x1": 0.7875, "y1": 0.99125 }, "created_at": "2026-05-12 14:18:05", "updated_at": "2026-05-12 14:18:15" } ], "nir": [ { "name": "nir_legacy_01", "enabled": true, "roi_pct": { "x0": 0.228906, "y0": 0.8325, "x1": 0.290625, "y1": 0.99125 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:19:24" }, { "name": "gray_nir_02", "enabled": true, "roi_pct": { "x0": 0.782031, "y0": 0.8225, "x1": 0.84375, "y1": 0.98 }, "created_at": "2026-05-12 14:19:25", "updated_at": "2026-05-12 14:19:30" } ] } }, { "name": "white_reference", "type": "white", "roles": [ "rgb", "re", "nir" ], "roi_pct": { "x0": 0.126562, "y0": 0.8225, "x1": 0.189062, "y1": 0.9825 }, "target_value": 0.82, "weight": 0.8, "roi_pct_by_role": { "rgb": { "x0": 0.126562, "y0": 0.8225, "x1": 0.189062, "y1": 0.9825 }, "re": { "x0": 0.090625, "y0": 0.8175, "x1": 0.148438, "y1": 0.985 }, "nir": { "x0": 0.154688, "y0": 0.83125, "x1": 0.21875, "y1": 0.99625 } }, "roi_list_by_role": { "rgb": [ { "name": "rgb_legacy_01", "enabled": true, "roi_pct": { "x0": 0.126562, "y0": 0.8225, "x1": 0.189062, "y1": 0.9825 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:17:12" }, { "name": "white_rgb_02", "enabled": true, "roi_pct": { "x0": 0.675, "y0": 0.83, "x1": 0.735156, "y1": 0.985 }, "created_at": "2026-05-12 14:17:13", "updated_at": "2026-05-12 14:17:23" } ], "re": [ { "name": "re_legacy_01", "enabled": true, "roi_pct": { "x0": 0.090625, "y0": 0.8175, "x1": 0.148438, "y1": 0.985 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:18:29" }, { "name": "white_re_02", "enabled": true, "roi_pct": { "x0": 0.648438, "y0": 0.83, "x1": 0.714063, "y1": 0.99125 }, "created_at": "2026-05-12 14:18:31", "updated_at": "2026-05-12 14:18:45" } ], "nir": [ { "name": "nir_legacy_01", "enabled": true, "roi_pct": { "x0": 0.154688, "y0": 0.83125, "x1": 0.21875, "y1": 0.99625 }, "created_at": "2026-05-07 14:36:25", "updated_at": "2026-05-12 14:19:45" }, { "name": "white_nir_02", "enabled": true, "roi_pct": { "x0": 0.713281, "y0": 0.825, "x1": 0.775, "y1": 0.98125 }, "created_at": "2026-05-12 14:19:46", "updated_at": "2026-05-12 14:19:54" } ] } } ], "exp_apply_threshold_us": 15, "gain_apply_threshold": 0.05, "apply_same_spectral_to_both": true, "spectral_roles": [ "re", "nir" ], "dark_limit_pct": 35.0, "control_strategy": "ratio", "ratio_alpha": 0.42, "ratio_min": 0.72, "ratio_max": 1.38, "reduce_fast_factor": 0.8, "factor_min": 0.62, "factor_max": 1.42, "gain_return_enabled": true, "gain_reduce_on_saturation": true, "gain_increase_required_cycles": 3, "gain_decrease_required_cycles": 1, "gain_step_up": 0.3, "gain_step_down": 0.5, "gain_hard_reset_on_saturation": false, "exp_high_ratio_for_gain": 0.95, "exp_low_ratio_for_gain_return": 0.75, "role_limits": { "rgb": { "exp_min_us": 100, "exp_max_us": 80000, "gain_min": 1.0, "gain_max": 2.0 }, "re": { "exp_min_us": 100, "exp_max_us": 3500, "gain_min": 1.0, "gain_max": 2.0 }, "nir": { "exp_min_us": 100, "exp_max_us": 3500, "gain_min": 1.0, "gain_max": 2.0 } }, "ready_required_cycles": 3, "patch_control_mode": "gray_primary", "patch_require_order": true, "patch_min_separation": 0.08, "patch_white_sat_limit_pct": 5.0, "patch_white_p95_limit": 0.985, "patch_black_dark_limit_pct": 80.0, "patch_black_max_p50": 0.2, "patch_gray_min_p50": 0.08, "patch_gray_max_p50": 0.85, "patch_roi_contract": "multi_roi_by_role_v1", "patch_roi_reduce_method": "median_valid_rois", "patch_roi_outlier_reject": true, "patch_roi_max_p50_delta": 0.12, "global_saturation_guard_enabled": true, "global_guard_roi_pct": { "x0": 0.05, "y0": 0.05, "x1": 0.95, "y1": 0.76 }, "global_guard_sat_threshold": 0.985, "global_guard_near_sat_threshold": 0.94, "global_guard_sat_pct_soft": 0.50, "global_guard_sat_pct_hard": 1.5, "global_guard_sat_pct_extreme": 5.0, "global_guard_blob_pct_soft": 0.20, "global_guard_blob_pct_hard": 0.80, "global_guard_blob_pct_extreme": 2.2, "global_guard_min_blob_px": 48, "global_guard_downsample_max_side": 320, "global_guard_reduce_factor_soft": 0.96, "global_guard_reduce_factor_hard": 0.82, "global_guard_reduce_factor_extreme": 0.62, "sun_guard_enabled": true, "sun_guard_p99_threshold": 0.96, "sun_guard_near_sat_pct_threshold": 2.0, "sun_guard_freeze_increase_cycles": 1, "sun_guard_allow_decrease": true, "guard_force_apply_enabled": true, "guard_force_apply_soft": false, "guard_force_apply_hard": true, "guard_force_apply_extreme": true, "guard_force_apply_on_patch_saturation": true, "guard_freeze_cycles_soft": 1, "guard_freeze_cycles_hard": 2, "guard_freeze_cycles_extreme": 3, "guard_reapply_min_exp_on_emergency": true, "guard_min_exp_margin_us": 80, "patch_two_roi_soften_risk": true, "patch_two_roi_white_risk_percentile": 75, "patch_two_roi_other_risk_percentile": 50, "patch_white_single_roi_saturation_reject": true, "patch_white_roi_reject_sat_pct": 5.0, "patch_white_roi_reject_p95": 0.995 }, "radiometric_normalization": { "enabled": true, "method": "oak_ae_frame_controls_v1", "apply_stage": "after_dark_before_flat_gain", "control_source": "stream_meta.frame_controls", "role_mapping_source": "camera_info", "factor_model": "exposure_time_us_x_iso", "iso_base": 100.0, "reference_mode": "fixed", "reference_controls": { "rgb": { "exposure_time_us": 10000, "sensitivity_iso": 400 }, "re": { "exposure_time_us": 15000, "sensitivity_iso": 400 }, "nir": { "exposure_time_us": 15000, "sensitivity_iso": 400 } }, "scale_limits": { "default": { "min": 0.15, "max": 6.0 }, "rgb": { "min": 0.15, "max": 6.0 }, "re": { "min": 0.15, "max": 8.0 }, "nir": { "min": 0.15, "max": 8.0 } }, "missing_controls_policy": "skip", "invalid_controls_policy": "skip", "clip_output": false, "save_debug": true }, "patch_normalization": { "enabled": false, "apply_when_metering_mode": "reference_patches", "apply_stage": "after_fusion", "method": "gray_scale_with_white_guard", "space": "multispec_tensor", "targets_by_patch_channel": { "black": { "R": 0.06, "G": 0.06, "B": 0.06, "RE": 0.06, "NIR": 0.06 }, "gray": { "R": 0.34, "G": 0.34, "B": 0.34, "RE": 0.24, "NIR": 0.30 }, "white": { "R": 0.78, "G": 0.78, "B": 0.78, "RE": 0.78, "NIR": 0.78 } }, "white_guard_max": 0.92, "white_guard_max_by_channel": { "R": 0.92, "G": 0.92, "B": 0.92, "RE": 0.88, "NIR": 0.88 }, "scale_min": 0.35, "scale_max": 2.5, "clip_output": true, "require_valid_gray": true, "use_black_for_offset": false, "save_patch_stats": true, "rgb_saturation_guard_enabled": true, "rgb_saturation_guard_mode": "fade_strength", "rgb_saturation_soft_start": 0.88, "rgb_saturation_hard": 0.97, "rgb_saturation_threshold": 0.97 }, "rgb_calibration": { "enabled": true, "gains": { "R": 1.2500000000000002, "G": 1.0, "B": 1.5500000000000005 } }, "flatfield_config": { "enabled": true, "subtract_dark": true, "schema": "multispec_flatfield_v1", "created_at": "2026-05-08 15:26:18", "json_file": "calibration/flatfield_maps_v1.json", "npz_file": "calibration/flatfield_maps_v1.npz", "apply_before_fusion": true, "apply_after_decode": true, "apply_space": "native_camera_space", "map_type": "gain", "formula": "channel_corrected = max(channel_linear - dark, 0) * gain_map", "channels": [ "R", "G", "B", "RE", "NIR" ], "channel_maps": { "R": { "gain_key": "gain_R", "flat_norm_key": "flat_norm_R", "white_median_key": "white_median_R", "dark_median_key": "dark_median_R", "shape": [ 400, 640 ], "gain_min": 0.6047894954681396, "gain_max": 1.7825754880905151, "gain_mean": 1.077973484992981, "gain_std": 0.3330462872982025 }, "G": { "gain_key": "gain_G", "flat_norm_key": "flat_norm_G", "white_median_key": "white_median_G", "dark_median_key": "dark_median_G", "shape": [ 400, 640 ], "gain_min": 0.535053014755249, "gain_max": 1.6048510074615479, "gain_mean": 1.0092605352401733, "gain_std": 0.29722487926483154 }, "B": { "gain_key": "gain_B", "flat_norm_key": "flat_norm_B", "white_median_key": "white_median_B", "dark_median_key": "dark_median_B", "shape": [ 400, 640 ], "gain_min": 0.5684313178062439, "gain_max": 1.6688997745513916, "gain_mean": 1.0110775232315063, "gain_std": 0.3016279637813568 }, "RE": { "gain_key": "gain_RE", "flat_norm_key": "flat_norm_RE", "white_median_key": "white_median_RE", "dark_median_key": "dark_median_RE", "shape": [ 800, 1280 ], "gain_min": 0.7832612991333008, "gain_max": 1.8540745973587036, "gain_mean": 1.099328637123108, "gain_std": 0.259878933429718 }, "NIR": { "gain_key": "gain_NIR", "flat_norm_key": "flat_norm_NIR", "white_median_key": "white_median_NIR", "dark_median_key": "dark_median_NIR", "shape": [ 800, 1280 ], "gain_min": 0.7467380166053772, "gain_max": 1.8378677368164062, "gain_mean": 1.0630955696105957, "gain_std": 0.23178784549236298 } }, "exp_gain_correct_during_flat_capture": false, "smooth_ksize": 31, "min_gain": 0.25, "max_gain": 4.0, "notes": "", "strength": 0.35, "strength_by_channel": { "R": 0.9, "G": 0.9, "B": 0.9, "RE": 0.25, "NIR": 0.25 }, "gain_min_runtime": 0.75, "gain_max_runtime": 1.35, "runtime_smooth_ksize": 81, "saturation_guard_enabled": true, "saturation_guard_mode": "fade_strength", "saturation_guard_threshold": 0.97, "saturation_guard_soft_start": 0.88, "saturation_guard_hard": 0.97 } }