SCOPE › Ocean colour anomaly detection

Finding unusual water from space

Algal blooms, sediment plumes and turbidity events are rare and unlabelled, which rules out supervised classification. SCOPE learns what ordinary water looks like and reports what departs from it — then checks that answer against classical methods and publishes the comparison, including the parts where the simple methods hold their own.

How it works

Sentinel-3's Ocean and Land Colour Instrument measures water-leaving reflectance in 21 bands at 300 m. The eleven visible bands carry the biogeochemical signal; the rest are dominated by atmosphere over water. An undercomplete autoencoder (11 → 16 → 8 → 3 and back) is trained only on the cleanest 30% of water pixels in a scene. Every pixel is then scored by how badly the model reconstructs its spectrum: a spectrum unlike anything in the training set reconstructs poorly, and that error is the anomaly score.

Two independent checks corroborate it — a Quasi-Analytical Algorithm inversion for the inherent optical properties, and a climatology z-score against a multi-year baseline.

Does the autoencoder earn its complexity?

A detector is only worth its machinery if it beats a simpler one, and a single number from a single random seed is not evidence. Every method below sees identical pixels, normalisation, training set and thresholding rule, across ten independent scenes with known ground truth. Only the detector differs.

detectorROC-AUCF1 (strict)F1 (±3 px)recall
Autoencoder0.980 ± 0.015 0.590 ± 0.0610.808 ± 0.0240.989 ± 0.023
Mahalanobis distance0.982 ± 0.016 0.507 ± 0.0640.719 ± 0.0480.997 ± 0.009
PCA reconstruction0.959 ± 0.039 0.538 ± 0.0650.746 ± 0.0430.930 ± 0.106
Chlorophyll band ratio0.956 ± 0.030 0.248 ± 0.0850.383 ± 0.0920.995 ± 0.006

Mean ± standard deviation over ten independent synthetic scenes. The threshold is the 99.5th percentile of the training-pixel score, and that percentile is the false-alarm rate accepted on normal water. Strict F1 scores against the labelled event core only; each synthetic event is a Gaussian blob but only its centre is labelled, so a detector that senses the plume edge is counted wrong. The ±3 px column accepts a flag within three pixels of a labelled event.

Read honestly: on ranking, the autoencoder and Mahalanobis distance are statistically indistinguishable, and we do not claim a win there. The autoencoder's advantage is at the operating point, where the threshold actually sits: F1 0.808 against 0.719. The non-linearity does not rank better; it separates better in the tail.

What we found along the way

The first benchmark had the autoencoder losing to Mahalanobis distance, 0.883 against 0.984. Rather than retune until it won, we looked for the cause. The “normal water” training set was 2% contaminated with the very anomalies it was meant to exclude.

A reconstruction model learns to reproduce whatever it is trained on, so leaked anomalies get taught to the model and then fail to flag. Reducing contamination from 2.0% to 0.2% moved ROC-AUC from 0.903 ± 0.082 to 0.982 ± 0.021. The Gaussian baseline did not move at all: a mean and a covariance barely shift when 2% of the sample is odd, whereas a flexible model absorbs the outliers entirely.

On real data

Synthetic scenes are the only setting where detection can be scored, because real ocean colour has no pixel-level labels. So on real imagery we claim nothing about detection accuracy and validate the physics instead.

Against ESA's own operational neural-net chlorophyll product, on 38,582 matched pixels from a Sentinel-3 OLCI Level-2 granule over the Arabian Sea (27 February 2026), the retrieval correlates at r = 0.719 in log10 space, with a +0.271 log10 bias — reading about 1.87× high, which is characteristic of band-ratio algorithms against a neural-net product in coastal water — and RMSE 0.300 log10. That figure is uncalibrated: a bias correction cannot manufacture correlation.

What it will not do

Run the comparison yourself

The benchmark is in the product. Open Ocean AI, press Run live, and it trains fresh autoencoders on fresh scenes and fills that table while you watch.

Open SCOPE