Un ricordo dal passato (2010)
Per scaricare in automatico i dati Sentinel ho utilizzato il progeto CDSETool
ho creato un file shape in coordinate WGS86 4236 nel folder dello script
ATTENZIONE: i files scaricati nonostante riportino una estensione nc in realta' sono zippati. Si devono quindi prima decomprimere e poi trattare come NetCDF.nc)
Per visualizzare in modo speditivo i dati si puo' usare Panoply. Alrimenti si puo' usare anche SNAP (per vedere i dati georiferiti https://www.youtube.com/watch?v=G8tVNbdu8-A)
il file nc puo' essere letto tramite xarray
in sintesi ci sono diversi array, uno contiene le misure, uno la longitudine del pixel ed uno la latitudine del pixel
La cosa piu' comoda per l'analisi e' salvare i dati in un database postgis. Attenzione che devono essere gestiti i valori nan che possono essere presenti
La vestizione puo' essere importata in Geoserver
Il prodotto finale puo' essere distribuito con Openlayers su web
per indicizzare un campo spaziale in postgis si puo' usare la sintassi
i dati in geoserver possono essere filtrati tramite il campo CQL basandosi su un box oppure tramite un buffer attorno ad un punto
BBOX(geom, 10, 42.5, 12, 44.5)
DWithin(geom,POINT(11.38 43.3),140000,meters)
Volevo sperimentare la libreria YDF (Decision Trees) ed ho preso i dati del post precedente (soil moisture su terreni naturali)
Non ho fatto nessuna ottimizzazione, ho usato l'esempio base della regressione
(da notare che i grafici funzionano su Colab non riesco a visualizzarli su jupyter notebook locali)
nel codice sottostante e' stato attivato il GradientBoostTreeLearner ma vi sono anche RandomForestLearner, CartLearner
La sintassi e' estremamente concisa ma il risultato della regressione e' ottimale
per vedere quale ' la feature che influenza il modello si puo' usare
Ho trovato su GitHub un dataset iperspettrale con data di taratura di umidita' su suoli naturali
Felix M. Riese and Sina Keller, “Introducing a Framework of Self-Organizing Maps for Regression of Soil Moisture with Hyperspectral Data,” in IGARSS 2018 - 2018 IEEE International Geoscience and Remote Sensing Symposium, Valencia, Spain, 2018, pp. 6151-6154. (Link)
@inproceedings{riese2018introducing,
author = {Riese, Felix~M. and Keller, Sina},
title = {{Introducing a Framework of Self-Organizing Maps for Regression of Soil Moisture with Hyperspectral Data}},
booktitle = {IGARSS 2018 - 2018 IEEE International Geoscience and Remote Sensing Symposium},
year = {2018},
month = {July},
address = {Valencia, Spain},
doi = {10.1109/IGARSS.2018.8517812},
ISSN = {2153-7003},
pages = {6151--6154},
}
Si tratta di circa 680 spettri con frequenze da 454 a 950 nm (125 bande). L'umidita' nel dataset varia da un minimo di 25.5% ad un massimo di 42.5% con un valore medio di 31.7%...purtroppo la variabilita' non e' enorme)
L'umidita' agisce sulla risposta spettrale non mediante un assorbimento localizzato su un picco ad una precisa lunghezza d'onda ma agisce su tutte le lunghezze d'onda abbasando la riflettanza all'aumentare dell'umidita'
Per questo motivo non e' banale fare una regressione tramite la rimozine del continuo
Ho provato ad usare lo script visto qui
dallo scatterplot dei dati realmente misurati e quelli del modello derivanti dagli spettri nel dataset di test si vede una buona correlazione
In dottorato avevo visto che si otteneva una buona correlazione fissando una lunghezza d'onda e misurando la riflettanza dopo la rimozione del continuo ma come si vede dal grafico sottostante i coefficienti sono in funzione della lunghezza d'onda presa in considerazione
Aggiornamento
Ho trovato che USGS Spectral library mette a disposizione anche degli spettri Fieldspec (2151 bande da 350 a 2500 nm) di campioni puri di specie mineralogiche e quindi sono stato in grado di avere gli spettri di tutti e 6 gli endmember mineralogici che descrivono per oltre il 95% la composizione dei campioni di suolo naturale. Ho provato a fare girare l'unmixing con tutte
Diciamo risultati piuttosto scarsi
-------------------------------------------------------------------------------------------
Sempre continuando a tirare fuori il materiale del dottorato da cui non avevo tirato fuori niente di significativo (vedi questo post e questo) ho ripreso la serie di spettri di campioni di terreno naturale del Mugello dei quali era stata fatta la caratterizzazione mineralogica quantitativa mediante XRD (analisi effettuata dal Dr. Lutterotti con il software https://luttero.github.io/maud/)
le specie mineralogiche erano indicate in 6 con a farla da padrone sono quarzo (26.7% wt medio) ed Illite (27.6% medio) seguiti da Montmorillonite (21.6% medio), Calcite (11.8% medio) e Kaolinite (3.07% medio)....da notare le concentrazioni perche' saranno determinanti per la discussione successiva
Dei campioni erano stati misurati spettri di laboratorio Fieldspec
Volevo vedere se era possibile fare l'unmixing spettrale mediante CLSU
Durante il dottorato avevo a disposizione dei campioni di standard naturale (illite, kaolinite, montmorillonite e calcite) ragionevolmente puri. Ho usato questi come endmember..il quarzo e' stato escluso perche' non ha assorbimenti significativi nel range del Fieldspec e l'albite e' stata esclusa per mancanza di standard (peraltro avrebbe anche assorbimenti molto modesti)
Per fare l'unmixing ho provato l'algoritmo Constrained LSU in SNAP. Con Octave mi sono create una immagine di 6x6 pixel e 2151 bande usando i primi 32 pixel per i campioni naturali e gli ultimi 4 per inserire di endmember per controllo
Dato che la somma di concentrazione in peso di calcite + montmorillonite + illite + kaolinite e' pari a circa il 43% (con un minimo del 29% ed un massimo del 60%) e visto che albite e quarzo non sono presi in considerazioni tra gli endmember dell'analisi spettrale sono state riscalate le concentrazioni di cal+mont+ill+kao a somma 100
I risultati non sono eccezionali..la correlazione della calcite e' similare a quanto ottenibile mediante la sola profondita' di picco a 2345 nm, per concentrazioni inferiori al 5% (come nel caso della Kaolinite) non c'e' nessun tipo di correlazione con il dato spettrale (questo aspetto e' stato uno dei risultati del dottorato)
AGGIORNAMENTO
ho provato ad usare questo metodo su campioni di miscele naturali di minerali argillosi (con concentrazioni determinate mediante XRD) ma ho miseramente fallito
Lo spettro dell'illite non viene estratto...anche forzando lo spettro puro nel dataset in modo da influenzare la VCA) non si ottengono risultati
=============================================
Per questo prova ho modificato lo script
https://github.com/ricardoborsoi/unmixing_spectral_variability
Non avendo Matlab gli script sono stati eseguiti in Octave con modestissime modifiche al codice per utilizzare i dati del fieldspec
Gli spettri sperimentali dei 3 endmember ssono stati ottenuti da campioni naturali acquistati con un grado di purezza mineralogica superiore al 90% (trattandosi di campioni naturali di minerali argillosi e' impossibile ottenere campioni puri) in condizioni di laboratorio
Da notare, nonostante siano tutti minerali argillosi, kaolinite e Montmorillonite hanno spettri simili mentre Illite e' molto dissimile.Si vedra' in seguito che cio' avra' ripercusssioni sull'unmixing
Esempio di spettro di sintesi
Lo script genera 2500 spettri di sintesi con differenti valori di concentrazione calcolate come modello Gaussiano random (mappa 50x50 pixel del 2151 bande)
La distribuzione delle concentrazioni dei 3 endmember e'risultata cosi' distribuita
Sugli spettri di sintesi viene applicato VCA per determinare gli endmembers
Gli spettri sono quindi elaborati mediante differenti algoritmi di unmixing (nella matrice A sono contenute le concentrazioni reali). Piu' punti stanno sulla retta y=x migliore e' l'algoritmo
ELMM
MESMA
RUSAL
In conclusione l'unico algoritmo che e' riuscito ad effettuare l'unmixing corretto e' stato MESMA
Oltre che con uno script Python come visto qui la calibrazione della camera si puo' fare anche con il programma in CPP Questo il proce...