Geospatial ML · Live demo

Maps that know what they don't know.

Confidence-aware substrate mapping for low-cost side-scan sonar. We read the segmentation model's certainty on every patch of riverbed and flag the uncertain ones — so the map shows what it knows and admits what it doesn't.

Cheap sonar, honest maps

Recreational side-scan sonar makes riverbed surveys fast and repeatable. But an automated substrate classifier trained on one environment will confidently mislabel an unfamiliar one — producing clean-looking maps that are quietly wrong over coarse gravel, cobble, and shadow. This demo makes the model's uncertainty visible and actionable.

The problem

Confident, but wrong

Deep-learning substrate maps commit to a single class per patch — even where the model is barely guessing. Those false positives quietly corrupt downstream habitat and sediment analysis.

Our approach

Score every patch

We summarize the model's per-class probabilities into a confidence profile for each patch, then relabel low-confidence patches as Unknown using class-specific thresholds.

The payoff

Trust you can audit

Fewer false positives, explicit uncertainty, and a reproducible pipeline that runs from saved model outputs — no GPU needed to explore the result. Open the map to see it.

Interactive substrate map

Toggle between the raw sonar mosaic, the model's stock classification, and the confidence-thresholded map. Watch red Unknown patches appear where the model isn't sure.

Switch Stock → Confidence-thresholded: patches the model couldn't call with enough certainty become Unknown (red) instead of a confident wrong label.

How confident is the map?

Every patch carries a full probability profile across all substrate classes — not just a single label. That whole profile is what decides whether a patch is trusted or held back as Unknown.

Per-segment class probabilities

Each row is one patch; each column a substrate class; darker = higher mean probability. A row with no dominant column is ambiguous — exactly what thresholding holds back (patch id shown red). Click any row to inspect its full profile.

Distributions

Per-class confidence spread across all patches, and how the class mix shifts once low-confidence patches are set aside.

Per-patch detail

Every surveyed patch with its top predicted class, the confidence behind that call, and the label it was assigned after thresholding. Click a header to sort.

Class thresholds applied

Demo cutoffs for this sample area. In production these are tuned to your target substrate and survey conditions.

ClassConfidence cutoff

Under the hood

The deep-learning model is pre-trained and runs offline; everything you explore here is rendered from its saved outputs — no TensorFlow at view time. The confidence layer is a clean, open-source extension of the existing sonar pipeline.

Step 1

Read the probabilities

Capture the segmentation model's per-class softmax for every patch — the certainty it already computes but normally discards at the final label.

Step 2

Summarize confidence

Compute per-class mean / min / max / std across each patch and identify the leading class and how strongly it leads.

Step 3

Threshold to Unknown

Apply class-specific cutoffs; patches below their threshold become Unknown rather than a confident misclassification.

Open-source contribution

A small, upstreamable change that exposes per-patch confidence as a first-class output of the open-source sonar pipeline (MIT).


    

Built with