Downloads · 30 days
0
NexusDwin/sailswarm-fusion-scorer-v1b
sailswarm-fusion-scorer-v1b is a machine learning model from NexusDwin. Use it for the machine learning task on the model card, and read the license before you ship it in a product. It is set up for scikit-learn. The card lists the license as other.
The scorer the SailSwarm obstacle-detection box runs on the boat (University of Konstanz, Lake Constance; fisheye RGB + FLIR Lepton 3 thermal + TI AWR1843 mmWave radar on a Raspberry Pi 4). For each 15° bearing sector…
Downloads · 30 days
0
Access
Public
Updated Sep 15, 2026
Repo size
1.2 MB
Likes
0
Public
Click a slice to open those files.
.joblib1.2 MB · 84%
From the Hugging Face model README
The scorer the SailSwarm obstacle-detection box runs on the boat (University of
Konstanz, Lake Constance; fisheye RGB + FLIR Lepton 3 thermal + TI AWR1843 mmWave
radar on a Raspberry Pi 4). For each 15° bearing sector it emits a calibrated
probability that the sector holds a navigation-relevant obstacle. It replaced the
gated-mixture v1a (NexusDwin/sailswarm-fusion-scorer-v1a) on 2026-09-02 after the
first audited low-light truth showed the interactions matter: AP 0.883 vs 0.731
(incumbent n/3 vote) vs 0.639 (v1a) on the audited night holdout.
Three bundles, one per deployment mode of the box (deploy/shadow_mode.sh):
| file | mode on the box | columns | audited_v2 holdout (8 clips, 2026-08-26 dusk) |
|---|---|---|---|
fusion_scorer_live_v1b_oofcal.joblib | full (seg-primary, 1.2 Hz beside capture) | fisheye/thermal/radar evidence + context | AP 0.869 · ECE 0.108 · person [email protected] 0.887 |
fusion_scorer_tail_radar_v1b.joblib | tail (radar + IMU only, 3 Hz) | radar columns only | AP 0.811 · ECE 0.165 · person [email protected] 1.00 |
fusion_scorer_full_typed_v1b.joblib | typed (+ YOLOv8n boxes, 0.6 Hz on a Pi 4) | + yolo_* typed-evidence columns | AP 0.890 · ECE 0.144 |
Incumbent (rule-based n_sensors/3) on the same holdout: AP 0.673, ECE 0.212.
Full tables incl. day/dusk strata and the night set: reports/.
Calibration. The isotonic calibrator inside each bundle is fitted out of fold
(train.py --oof-calibration): the train-fit calibrator that shipped on 2026-09-02
read 0.803 AP / ECE 0.32 on the audited holdout against 0.886 / 0.14 out of fold.
Consume predict_proba_calibrated.
Known limit (measured on the 2026-09-08 lake trials). With no radar return the
scorer floors camera-only evidence at p ≈ 0.24: day marginal weights per sensor hit
fisheye +0.02 / thermal +0.02 / radar +0.23; inside the night trial window every
sensor's marginal weight is ≤ +0.04. The boat-side policy therefore takes the
per-sector max of this p and the fused vote (--evidence max). The next retrain
adds the audited night frames of that session.
import joblib # scikit-learn == 1.9.0 (the pin on the box)
bundle = joblib.load("fusion_scorer_live_v1b_oofcal.joblib") # GBTScorerBundle, see models.py
p = bundle.predict_proba_calibrated(X) # X: the bundle's own column list, bundle.columns
models.py and fusion_model.yaml are the exact versions the bundles were built
with (repo SailSwarm-ObstacleDetection, scripts/fusion_model/). Features come
from build_features.py (schema v4), targets from audited frames in bearing space.
The session-disjoint evaluation reported in the ICRA 2027 submission (its Table II)
and the night retrain that followed the 2026-09-08 lake trials. Models were trained on
the six earlier sessions with luminance-gated targets; the whole 2026-09-08 session is
held out (day 532 sector rows, twilight 917, night 1,561, of which 100 night boxes were
drawn on the thermal image). Source of the paper's numbers:
ablation_day_v3d_0908day.{md,json} (rows incumbent = rule-based vote, v1a_gate,
full_oofcal = GBT with context, rgb_only, thermal_only, radar_only; the
day/dusk/night AP columns are the table).
Headline: at true night the rule-based vote (AP 0.582) beats every learned variant
(at most 0.520), while thermal-only and radar-only GBTs recall 0.90 and 1.00 of the
audited persons against 0.17 for the vote. Leave-one-night-group-out cross-validation
(bakeoff_nightcv3d_*) preserves the ordering. retrain_report_ab_v3d.md is the
matched replay of the retrained bundle against the live one on the trial evening: the
retrained model raises the daytime base probability to about 0.56, which would have
turned 15 of the 20 closed-loop decisions into "blocked" under the 0.5 policy threshold,
so the live bundles in this repository are unchanged. Verdict: data-limited, not
model-limited; the binding need is audited night frames with obstacles inside the
radar's 9 m envelope.