Estrazione automatica della linea di riva

Il monitoraggio della linea di riva

La linea di riva rappresenta il confine istantaneo tra la spiaggia e il mare. La sua posizione varia nel tempo sotto l'effetto delle maree, del moto ondoso e dei processi erosivi o deposizionali di lungo periodo. Monitorare sistematicamente questa posizione permette di rilevare tendenze di arretramento o avanzamento della spiaggia, di valutare l'effetto di eventi meteo-marini estremi e di supportare la gestione integrata delle coste.

Il sistema MOVICO (MOnitoraggio VIdeo COstiero) acquisisce continuamente immagini dalle stazioni di videomonitoraggio RVMC distribuite lungo le coste italiane. A partire da queste immagini, una procedura automatica estrae la posizione della linea di riva con cadenza oraria, produce serie temporali e converte le misure in coordinate geografiche reali, rendendo i dati immediatamente confrontabili con misure di campo e integrabili in sistemi GIS.


Schema della procedura di estrazione

Il processo si articola in quattro fasi: una fase preparatoria di costruzione del modello (eseguita una tantum) e tre fasi operative eseguite in sequenza su ogni immagine disponibile.

0. Costruzione del dataset e addestramento — selezione e annotazione manuale di immagini storiche stratificate per stato del mare; addestramento del modello di segmentazione su GPU.

1. Segmentazione semantica — il modello di deep learning classifica ogni pixel dell'immagine come acqua o non-acqua, producendo una maschera binaria.

2. Estrazione della linea di riva — il contorno della maschera viene analizzato geometricamente per isolare il tratto di riva pertinente e misurarne la posizione lungo transetti predefiniti.

3. Georeferenziazione — le coordinate pixel vengono convertite in coordinate metriche UTM tramite back-projection con vincolo di quota, utilizzando la calibrazione ottica della camera e punti di controllo a terra (GCP).


Fase 0 — Costruzione del dataset e addestramento del modello

Il concetto

Prima di poter analizzare automaticamente le immagini, il sistema deve essere “addestrato”: un insieme di immagini viene selezionato e annotato manualmente da esperti, che tracciano con precisione il confine tra acqua e sabbia. Queste immagini costituiscono il dataset di riferimento da cui il modello impara a riconoscere la linea di riva in modo autonomo.

Per garantire che il modello funzioni bene in tutte le condizioni meteo-marine, le immagini sono state selezionate in modo equilibrato: una quota simile proviene da giornate di mare calmo, mosso, molto mosso e agitato. Questa strategia — detta campionamento stratificato — evita che il modello impari a riconoscere la riva solo nelle condizioni più frequenti, risultando poi impreciso durante le mareggiate.

Approfondimento tecnico

Le immagini sono state selezionate dall'archivio storico MOVICO tramite lo script select_training_images_waveboy.py, che stratifica per stato del mare secondo la scala di Douglas semplificata, utilizzando l'altezza d'onda significativa Hs dal modello ondametrico CMEMS (waveboy):

ClasseSoglia HsDescrizioneImmagini%
CALMHs < 0.5 mMare calmo16830.9%
MODERATE0.5 m ≤ Hs < 1.5 mMare poco mosso / mosso16330.0%
ROUGH1.5 m ≤ Hs < 2.5 mMare molto mosso13023.9%
STORMHs ≥ 2.5 mMare agitato / molto agitato8215.1%
TOTALE543100%

Le annotazioni sono state prodotte con il tool CVAT (Computer Vision Annotation Tool), tracciando maschere binarie acqua/non-acqua in formato polygon e RLE su 543 immagini provenienti da 7 stazioni della rete RVMC: TorreCerrano01, acciaroli01, battipaglia01, fogliano01, kufra, senigallia, torresole01.

Il dataset è stato suddiviso in training e validation con split stratificato per stazione (80/20, seed=42), garantendo che ogni stazione sia rappresentata in entrambi i set:

StazioneImmagini annotateUsate nel training
TorreCerrano014848
acciaroli018078
battipaglia018685
fogliano018181
kufra5048
senigallia9897
torresole0110096
TOTALE543533

Le 10 immagini non utilizzate erano annotate in CVAT ma il corrispondente file immagine non era disponibile su disco al momento dell'addestramento. Split effettivo: 429 immagini training / 104 immagini validation.


Fase 1 — Segmentazione semantica con SegFormer

Il concetto

La camera acquisisce ogni ora un'immagine timex (media temporale di 15 minuti di video), che attenua il moto ondoso e rende visibile in modo stabile la zona di bagnasciuga. Un algoritmo di intelligenza artificiale analizza automaticamente questa immagine e identifica la zona occupata dall'acqua, distinguendola dalla sabbia asciutta e da altri elementi della scena (strutture, vegetazione, cielo).

Il risultato è una maschera binaria: ogni punto dell'immagine risulta classificato come acqua o non-acqua. Il confine tra le due aree corrisponde alla linea di riva.

Esempio di immagine timex con linea di riva sovrapposta

Fig. 1 — Immagine timex con la linea di riva estratta automaticamente sovrapposta (linea rossa). La timex e una media di 10 minuti di acquisizione video che attenua il moto ondoso.

Approfondimento tecnico

Il modello utilizzato è SegFormer-B1, un'architettura transformer per la segmentazione semantica di immagini, eseguita tramite runtime ONNX su CPU per massima portabilita e velocita di inferenza. Il modello è stato addestrato su un dataset di 533 immagini annotate manualmente provenienti da 7 stazioni della rete RVMC, con maschere binarie acqua/non-acqua prodotte con il software di annotazione CVAT.

Il preprocessing replica fedelmente le condizioni di training: ridimensionamento a 512×512 pixel, normalizzazione ImageNet (mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), riconversione alla risoluzione originale con interpolazione nearest-neighbor per la maschera.

Metriche sul set di validazione (104 immagini, 7 stazioni):

MetricaTraining (ep. 32)Validation
mIoU (mean Intersection over Union)0.97370.9743
IoU classe acqua0.9820
IoU classe non-acqua0.9653
Pixel Accuracy98.81%98.83%
Errore di confine (mediano)0.2 px
Errore di confine (medio)1.0 px
Errore di confine (90° percentile)2.9 px
Tempo di inferenza (ONNX CPU)~785 ms/immagine

Il mIoU sul set di validazione (0.9743) risulta leggermente superiore a quello di training (0.9737), indicando assenza di overfitting ed eccellente capacita di generalizzazione. L'errore mediano di confine di 0.2 pixel e compatibile con la precisione delle annotazioni manuali, a indicare che il modello ha appreso pattern di classificazione coerenti con gli annotatori umani.


Fase 2 — Estrazione della posizione lungo transetti

Il concetto

Una volta ottenuta la maschera acqua/non-acqua, il sistema individua automaticamente il contorno della zona bagnata e misura dove la linea di riva interseca dei segmenti predefiniti — detti transetti — che partono dalla spiaggia asciutta e puntano verso il mare. La posizione viene espressa come distanza in pixel dal punto iniziale del transetto (lato terra), e aggiornata ogni ora per costruire la serie temporale di posizione della riva.

Ogni camera puo avere fino a 10 transetti configurati indipendentemente, permettendo di monitorare diversi settori della spiaggia inquadrata.

Approfondimento tecnico

Il contorno della maschera binaria viene estratto con cv2.findContours e filtrato geometricamente tramite l'algoritmo "gomito" (curvatura locale massima lungo il profilo del contorno): questo passaggio separa il tratto di riva reale dalla linea dell'orizzonte, che apparirebbe anch'essa come confine acqua/cielo nelle camere con geometria laterale. Il criterio finale di selezione privilegia il segmento piu lungo tra i candidati.

I transetti sono definiti per ogni camera in file di configurazione YAML, con convenzione P1 = lato terra, P2 = lato mare. L'intersezione tra il contorno e ciascun transetto viene campionata con 1000 punti equidistanti. Il risultato viene archiviato in formato CSV con colonne timestamp, immagine, T01_dist, T01_status, T02_dist, T02_status, ... per ciascun transetto attivo.

Il success rate operativo e circa 85% (17 camere su 20 attive). I principali motivi di skip sono: file timex assente (~10%) e fallimento dell'algoritmo gomito in condizioni meteo-marine estreme (~5%).


Fase 3 — Georeferenziazione in coordinate UTM

Il concetto

Le posizioni in pixel sono utili per il monitoraggio relativo (la spiaggia si e allargata o ristretta?), ma per confrontare i dati con misurazioni di campo, rilievi LiDAR o immagini satellitari occorre esprimere la posizione in coordinate geografiche reali. Questo e l'obiettivo della fase di georeferenziazione: ogni punto della linea di riva viene convertito in coordinate metriche nel sistema di riferimento UTM, direttamente integrabili in GIS.

La conversione si basa sulla geometria della camera, nota grazie a una procedura di calibrazione che utilizza punti di controllo a terra (GCP): punti fisici ben identificabili nell'immagine di cui si conoscono le coordinate GPS precise.

Linea di riva georeferenziata in pianta UTM

Fig. 2 — Linea di riva georeferenziata rappresentata in coordinate UTM (pianta). I punti di controllo a terra (GCP) usati per la calibrazione sono indicati.

Approfondimento tecnico

Il metodo è la back-projection con vincolo di quota (DLT). Data la posa della camera — matrice di rotazione R e vettore di traslazione t, ricavati con cv2.solvePnP dai GCP — e la quota del piano spiaggia Zconst, per ogni pixel (u, v) si risolve il sistema:

s · [u, v, 1]T = K · (R · [X, Y, Z]T + t)
→ X, Y = f(u, v, Zconst, R, t, K)

La funzione pixel_to_world() e vettorizzata numpy e opera su tutti gli N punti del contorno con una singola moltiplicazione matriciale (3×N), circa 150 volte piu veloce di un loop Python equivalente.

La distanza metrica dal punto P1 del transetto viene calcolata come proiezione lungo l'asse del transetto (non distanza euclidea diretta), piu robusta in presenza di piccoli scarti laterali. Le coordinate UTM di P1 e P2 sono calcolate una sola volta per transetto e messe in cache.

La selezione dei GCP ottimali avviene automaticamente: tra tutte le combinazioni di 6 punti estratti dal set disponibile, il sistema sceglie la combinazione che minimizza l'errore di riproiezione e la salva per i run successivi. L'errore di riproiezione tipico e inferiore a 1 pixel.

Output prodotti per ogni immagine:

FileContenuto
*_georef_multi_*.csv Intersezioni transetti con coordinate UTM (x_world, y_world) e distanza in metri (distance_from_P1_m)
*_georef_contour_*.csv Contorno completo della linea di riva in coordinate UTM

Sistema operativo e aggiornamento dati

La procedura di analisi è in operativo sul server di elaborazione ISPRA (nominato ecap2). Un processo automatico (cron job) si attiva ogni ora, scarica l'ultima immagine timex disponibile da ciascuna delle ~20 camere attive, esegue l'intera sequenza segmentazione → estrazione → georeferenziazione e archivia i risultati sul server del portale RVMC (nominato ecap1).

Il tempo di elaborazione per camera e di circa 1-2 secondi (inferenza ONNX + estrazione), rendendo il sistema idoneo all'aggiornamento orario su hardware standard senza GPU dedicata. I dati di posizione della linea di riva sono consultabili nelle pagine delle singole stazioni e nella sezione Posizione della linea di riva.


Riferimenti metodologici principali:

  • - Xie et al. (2021) — SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers. NeurIPS 2021.
  • - Holman & Stanley (2007) — The history and technical capabilities of Argus. Coastal Engineering, 54(6-7), 477–491.
  • - Boak & Turner (2005) — Shoreline Definition and Detection: A Review. Journal of Coastal Research, 21(4), 688–703.