Monitoraggio della siccità del Lago Mead utilizzando le nuove funzionalità geospaziali di Amazon SageMaker

Monitoraggio della siccità del Lago Mead utilizzando le nuove funzionalità geospaziali di Amazon SageMaker

Il cambiamento climatico della Terra comporta un aumento del rischio di siccità a causa del riscaldamento globale. Dal 1880, la temperatura globale è aumentata di 1.01 °C. Dal 1993, il livello del mare è aumentato di 102.5 millimetri. Dal 2002, le calotte glaciali terrestri in Antartide hanno perso massa a un ritmo di 151.0 miliardi di tonnellate all'anno. Nel 2022, l'atmosfera terrestre contiene più di 400 parti per milione di anidride carbonica, ovvero il 50% in più rispetto al 1750. Sebbene questi numeri possano sembrare lontani dalla nostra vita quotidiana, la Terra si è riscaldata a un ritmo senza precedenti nel corso degli ultimi anni. ultimi 10,000 anni [1].

In questo post, utilizziamo le nuove funzionalità geospaziali di Amazon SageMaker per monitorare la siccità causata dai cambiamenti climatici nel lago Mead. Il lago Mead è il più grande bacino idrico degli Stati Uniti. Fornisce acqua a 25 milioni di persone negli stati del Nevada, dell'Arizona e della California [2]. La ricerca mostra che i livelli dell'acqua nel lago Mead sono al livello più basso dal 1937 [3]. Utilizziamo le funzionalità geospaziali di SageMaker per misurare i cambiamenti nei livelli dell'acqua nel lago Mead utilizzando immagini satellitari.

Accesso ai dati

Le nuove funzionalità geospaziali di SageMaker offrono un facile accesso ai dati geospaziali come Sentinel-2 e Landsat 8. L'accesso integrato ai set di dati geospaziali consente di risparmiare settimane di sforzi altrimenti persi nella raccolta di dati da vari fornitori e fornitori di dati.

Innanzitutto, utilizzeremo un notebook Amazon SageMaker Studio con un'immagine geospaziale SageMaker seguendo i passaggi descritti in Nozioni di base sulle funzionalità geospaziali di Amazon SageMaker. Utilizziamo un notebook SageMaker Studio con un'immagine geospaziale SageMaker per la nostra analisi.

Il taccuino utilizzato in questo post si trova nel amazon-sagemaker-esempi Repository GitHub. SageMaker geospaziale rende la query dei dati estremamente semplice. Useremo il seguente codice per specificare la posizione e l'intervallo di tempo per i dati satellitari.

Nel seguente frammento di codice, per prima cosa definiamo an AreaOfInterest (AOI) con un riquadro di delimitazione attorno all'area del Lago Mead. Noi usiamo il TimeRangeFilter per selezionare i dati da gennaio 2021 a luglio 2022. Tuttavia, l'area che stiamo studiando potrebbe essere oscurata dalle nuvole. Per ottenere immagini principalmente prive di cloud, scegliamo un sottoinsieme di immagini impostando il limite superiore per la copertura del cloud all'1%.

import boto3
import sagemaker
import sagemaker_geospatial_map session = boto3.Session()
execution_role = sagemaker.get_execution_role()
sg_client = session.client(service_name="sagemaker-geospatial") search_rdc_args = { "Arn": "arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/nmqj48dcu3g7ayw8", # sentinel-2 L2A COG "RasterDataCollectionQuery": { "AreaOfInterest": { "AreaOfInterestGeometry": { "PolygonGeometry": { "Coordinates": [ [ [-114.529, 36.142], [-114.373, 36.142], [-114.373, 36.411], [-114.529, 36.411], [-114.529, 36.142], ] ] } } # data location }, "TimeRangeFilter": { "StartTime": "2021-01-01T00:00:00Z", "EndTime": "2022-07-10T23:59:59Z", }, # timeframe "PropertyFilters": { "Properties": [{"Property": {"EoCloudCover": {"LowerBound": 0, "UpperBound": 1}}}], "LogicalOperator": "AND", }, "BandFilter": ["visual"], },
} tci_urls = []
data_manifests = []
while search_rdc_args.get("NextToken", True): search_result = sg_client.search_raster_data_collection(**search_rdc_args) if search_result.get("NextToken"): data_manifests.append(search_result) for item in search_result["Items"]: tci_url = item["Assets"]["visual"]["Href"] print(tci_url) tci_urls.append(tci_url) search_rdc_args["NextToken"] = search_result.get("NextToken")

Inferenza del modello

Dopo aver identificato i dati, il passo successivo è estrarre i corpi idrici dalle immagini satellitari. In genere, dovremmo addestrare da zero un modello di segmentazione della copertura del suolo per identificare diverse categorie di materiali fisici sulla superficie terrestre come corpi idrici, vegetazione, neve e così via. L'addestramento di un modello da zero richiede tempo e denaro. Implica l'etichettatura dei dati, l'addestramento del modello e la distribuzione. Le funzionalità geospaziali di SageMaker forniscono un modello di segmentazione della copertura del suolo pre-addestrato. Questo modello di segmentazione della copertura del suolo può essere eseguito con una semplice chiamata API.

Invece di scaricare i dati su un computer locale per deduzioni, SageMaker fa tutto il lavoro pesante per te. Specifichiamo semplicemente la configurazione dei dati e la configurazione del modello in un lavoro di osservazione della terra (EOJ). SageMaker scarica e preelabora automaticamente i dati delle immagini satellitari per l'EOJ, rendendoli pronti per l'inferenza. Successivamente, SageMaker esegue automaticamente l'inferenza del modello per EOJ. A seconda del carico di lavoro (il numero di immagini eseguite attraverso l'inferenza del modello), il completamento dell'EOJ può richiedere da alcuni minuti a qualche ora. È possibile monitorare lo stato del lavoro utilizzando il file get_earth_observation_job funzione.

# Perform land cover segmentation on images returned from the sentinel dataset.
eoj_input_config = { "RasterDataCollectionQuery": { "RasterDataCollectionArn": "arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/nmqj48dcu3g7ayw8", "AreaOfInterest": { "AreaOfInterestGeometry": { "PolygonGeometry": { "Coordinates": [ [ [-114.529, 36.142], [-114.373, 36.142], [-114.373, 36.411], [-114.529, 36.411], [-114.529, 36.142], ] ] } } }, "TimeRangeFilter": { "StartTime": "2021-01-01T00:00:00Z", "EndTime": "2022-07-10T23:59:59Z", }, "PropertyFilters": { "Properties": [{"Property": {"EoCloudCover": {"LowerBound": 0, "UpperBound": 1}}}], "LogicalOperator": "AND", }, }
}
eoj_config = {"LandCoverSegmentationConfig": {}} response = sg_client.start_earth_observation_job( Name="lake-mead-landcover", InputConfig=eoj_input_config, JobConfig=eoj_config, ExecutionRoleArn=execution_role,
) # Monitor the EOJ status.
eoj_arn = response["Arn"]
job_details = sg_client.get_earth_observation_job(Arn=eoj_arn)
{k: v for k, v in job_details.items() if k in ["Arn", "Status", "DurationInSeconds"]}

Visualizza i risultati

Ora che abbiamo eseguito l'inferenza del modello, ispezioniamo visivamente i risultati. Sovrapponiamo i risultati dell'inferenza del modello alle immagini satellitari di input. Utilizziamo gli strumenti di Foursquare Studio preintegrati con SageMaker per visualizzare questi risultati. Innanzitutto, creiamo un'istanza di mappa utilizzando le funzionalità geospaziali di SageMaker per visualizzare le immagini di input e le previsioni del modello:

# Creates an instance of the map to add EOJ input/ouput layer.
map = sagemaker_geospatial_map.create_map({"is_raster": True})
map.set_sagemaker_geospatial_client(sg_client) # Render the map.
map.render()

Quando la mappa interattiva è pronta, possiamo eseguire il rendering delle immagini di input e degli output del modello come livelli di mappa senza dover scaricare i dati. Inoltre, possiamo assegnare a ciascun livello un'etichetta e selezionare i dati per una data particolare utilizzando TimeRangeFilter:

# Visualize AOI
config = {"label": "Lake Mead AOI"}
aoi_layer = map.visualize_eoj_aoi(Arn=eoj_arn, config=config) # Visualize input.
time_range_filter = { "start_date": "2022-07-01T00:00:00Z", "end_date": "2022-07-10T23:59:59Z",
}
config = {"label": "Input"}
input_layer = map.visualize_eoj_input( Arn=eoj_arn, config=config, time_range_filter=time_range_filter
) # Visualize output, EOJ needs to be in completed status.
time_range_filter = { "start_date": "2022-07-01T00:00:00Z", "end_date": "2022-07-10T23:59:59Z",
}
config = {"preset": "singleBand", "band_name": "mask"}
output_layer = map.visualize_eoj_output( Arn=eoj_arn, config=config, time_range_filter=time_range_filter
)

Possiamo verificare che l'area contrassegnata come acqua (in giallo brillante nella mappa seguente) corrisponda accuratamente al corpo idrico del lago Mead modificando l'opacità del livello di output.

Monitoraggio della siccità del Lago Mead utilizzando le nuove funzionalità geospaziali di Amazon SageMaker PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Analisi post

Successivamente, usiamo il export_earth_observation_job funzione per esportare i risultati EOJ in un bucket Amazon Simple Storage Service (Amazon S3). Quindi eseguiamo un'analisi successiva sui dati in Amazon S3 per calcolare la superficie dell'acqua. La funzione di esportazione rende conveniente condividere i risultati tra i team. SageMaker semplifica anche la gestione dei set di dati. Possiamo semplicemente condividere i risultati EOJ utilizzando l'ARN del lavoro, invece di eseguire la scansione di migliaia di file nel bucket S3. Ogni EOJ diventa una risorsa nel catalogo dati, in quanto i risultati possono essere raggruppati in base all'ARN del lavoro.

sagemaker_session = sagemaker.Session()
s3_bucket_name = sagemaker_session.default_bucket() # Replace with your own bucket if needed
s3_bucket = session.resource("s3").Bucket(s3_bucket_name)
prefix = "eoj_lakemead" # Replace with the S3 prefix desired
export_bucket_and_key = f"s3://{s3_bucket_name}/{prefix}/" eoj_output_config = {"S3Data": {"S3Uri": export_bucket_and_key}}
export_response = sg_client.export_earth_observation_job( Arn=eoj_arn, ExecutionRoleArn=execution_role, OutputConfig=eoj_output_config, ExportSourceImages=False,
)

Successivamente, analizziamo i cambiamenti nel livello dell'acqua nel lago Mead. Scarichiamo le maschere di copertura del suolo nella nostra istanza locale per calcolare la superficie dell'acqua utilizzando librerie open source. SageMaker salva gli output del modello nel formato Cloud Optimized GeoTiff (COG). In questo esempio, carichiamo queste maschere come array NumPy utilizzando il pacchetto Tifffile. Il SaggioMaker Geospatial 1.0 kernel include anche altre librerie ampiamente utilizzate come GDAL e Rasterio.

Ogni pixel nella maschera di copertura del suolo ha un valore compreso tra 0 e 11. Ogni valore corrisponde a una particolare classe di copertura del suolo. L'indice di classe dell'acqua è 6. Possiamo usare questo indice di classe per estrarre la maschera dell'acqua. Innanzitutto, contiamo il numero di pixel contrassegnati come acqua. Successivamente, moltiplichiamo quel numero per l'area coperta da ciascun pixel per ottenere la superficie dell'acqua. A seconda delle bande, la risoluzione spaziale di un'immagine Sentinel-2 L2A è 10m, 20m, O 60m. Tutte le bande sono sottocampionate a una risoluzione spaziale di 60 metri per l'inferenza del modello di segmentazione della copertura del suolo. Di conseguenza, ogni pixel nella maschera di copertura del suolo rappresenta un'area del suolo di 3600 m2, O 0.0036 km2.

import os
from glob import glob
import cv2
import numpy as np
import tifffile
import matplotlib.pyplot as plt
from urllib.parse import urlparse
from botocore import UNSIGNED
from botocore.config import Config # Download land cover masks
mask_dir = "./masks/lake_mead"
os.makedirs(mask_dir, exist_ok=True)
image_paths = []
for s3_object in s3_bucket.objects.filter(Prefix=prefix).all(): path, filename = os.path.split(s3_object.key) if "output" in path: mask_name = mask_dir + "/" + filename s3_bucket.download_file(s3_object.key, mask_name) print("Downloaded mask: " + mask_name) # Download source images for visualization
for tci_url in tci_urls: url_parts = urlparse(tci_url) img_id = url_parts.path.split("/")[-2] tci_download_path = image_dir + "/" + img_id + "_TCI.tif" cogs_bucket = session.resource( "s3", config=Config(signature_version=UNSIGNED, region_name="us-west-2") ).Bucket(url_parts.hostname.split(".")[0]) cogs_bucket.download_file(url_parts.path[1:], tci_download_path) print("Downloaded image: " + img_id) print("Downloads complete.") image_files = glob("images/lake_mead/*.tif")
mask_files = glob("masks/lake_mead/*.tif")
image_files.sort(key=lambda x: x.split("SQA_")[1])
mask_files.sort(key=lambda x: x.split("SQA_")[1])
overlay_dir = "./masks/lake_mead_overlay"
os.makedirs(overlay_dir, exist_ok=True)
lake_areas = []
mask_dates = [] for image_file, mask_file in zip(image_files, mask_files): image_id = image_file.split("/")[-1].split("_TCI")[0] mask_id = mask_file.split("/")[-1].split(".tif")[0] mask_date = mask_id.split("_")[2] mask_dates.append(mask_date) assert image_id == mask_id image = tifffile.imread(image_file) image_ds = cv2.resize(image, (1830, 1830), interpolation=cv2.INTER_LINEAR) mask = tifffile.imread(mask_file) water_mask = np.isin(mask, [6]).astype(np.uint8) # water has a class index 6 lake_mask = water_mask[1000:, :1100] lake_area = lake_mask.sum() * 60 * 60 / (1000 * 1000) # calculate the surface area lake_areas.append(lake_area) contour, _ = cv2.findContours(water_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) combined = cv2.drawContours(image_ds, contour, -1, (255, 0, 0), 4) lake_crop = combined[1000:, :1100] cv2.putText(lake_crop, f"{mask_date}", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 0), 3, cv2.LINE_AA) cv2.putText(lake_crop, f"{lake_area} [sq km]", (10,100), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 0), 3, cv2.LINE_AA) overlay_file = overlay_dir + '/' + mask_date + '.png' cv2.imwrite(overlay_file, cv2.cvtColor(lake_crop, cv2.COLOR_RGB2BGR)) # Plot water surface area vs. time.
plt.figure(figsize=(20,10))
plt.title('Lake Mead surface area for the 2021.02 - 2022.07 period.', fontsize=20)
plt.xticks(rotation=45)
plt.ylabel('Water surface area [sq km]', fontsize=14)
plt.plot(mask_dates, lake_areas, marker='o')
plt.grid('on')
plt.ylim(240, 320)
for i, v in enumerate(lake_areas): plt.text(i, v+2, "%d" %v, ha='center')
plt.show()

Tracciamo la superficie dell'acqua nel tempo nella figura seguente. La superficie dell'acqua è nettamente diminuita tra febbraio 2021 e luglio 2022. In meno di 2 anni, la superficie del lago Mead è diminuita da oltre 300 km2 a meno di 250 km2, una variazione relativa del 18%.Monitoraggio della siccità del Lago Mead utilizzando le nuove funzionalità geospaziali di Amazon SageMaker PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

import imageio.v2 as imageio
from IPython.display import HTML frames = []
filenames = glob('./masks/lake_mead_overlay/*.png')
filenames.sort()
for filename in filenames: frames.append(imageio.imread(filename))
imageio.mimsave('lake_mead.gif', frames, duration=1)
HTML('<img src="./lake_mead.gif">')

Possiamo anche estrarre i confini del lago e sovrapporli alle immagini satellitari per visualizzare meglio i cambiamenti del litorale del lago. Come mostrato nella seguente animazione, la costa nord e sud-est si è ridotta negli ultimi 2 anni. In alcuni mesi la superficie si è ridotta di oltre il 20% anno su anno.

Animazione della superficie del lago Mead

Conclusione

Abbiamo assistito all'impatto del cambiamento climatico sul restringimento del litorale del Lago Mead. SageMaker ora supporta l'apprendimento automatico geospaziale (ML), rendendo più facile per data scientist e ingegneri ML creare, addestrare e distribuire modelli utilizzando dati geospaziali. In questo post, abbiamo mostrato come acquisire dati, eseguire analisi e visualizzare i cambiamenti con i servizi geospaziali AI/ML di SageMaker. Puoi trovare il codice per questo post nel file amazon-sagemaker-esempi Repository GitHub. Vedi il Funzionalità geospaziali di Amazon SageMaker per saperne di più.

Riferimenti

, https://climate.nasa.gov/

, https://www.nps.gov/lake/learn/nature/overview-of-lake-mead.htm

, https://earthobservatory.nasa.gov/images/150111/lake-mead-keeps-dropping


Informazioni sugli autori

 XiongZhou è Senior Applied Scientist presso AWS. Dirige il team scientifico per le capacità geospaziali di Amazon SageMaker. La sua attuale area di ricerca comprende la visione artificiale e l'addestramento efficiente dei modelli. Nel tempo libero ama correre, giocare a basket e passare il tempo con la sua famiglia.

Anirudh Viswanathan è Sr Product Manager, Technical – External Services con il team ML geospaziale di SageMaker. Ha conseguito un Master in Robotica presso la Carnegie Mellon University, un MBA presso la Wharton School of Business ed è nominato inventore di oltre 40 brevetti. Gli piace correre a lunga distanza, visitare gallerie d'arte e spettacoli di Broadway.

Cresta di labbra Trenton è un Principal Engineer e fa parte del team che ha aggiunto le funzionalità geospaziali a SageMaker. È stato coinvolto nelle soluzioni human in the loop, lavorando sui servizi SageMaker Ground Truth, Augmented AI e Amazon Mechanical Turk.

Xingjian Shi è un Senior Applied Scientist e fa parte del team che ha aggiunto le funzionalità geospaziali a SageMaker. Sta anche lavorando al deep learning per le scienze della Terra e all'AutoML multimodale.

Li Erran Li è il responsabile della scienza applicata presso i servizi humain-in-the-loop, AWS AI, Amazon. I suoi interessi di ricerca sono il deep learning 3D e l'apprendimento della rappresentazione della visione e del linguaggio. In precedenza è stato scienziato senior presso Alexa AI, capo del machine learning presso Scale AI e capo scienziato presso Pony.ai. Prima di allora, era con il team di percezione di Uber ATG e il team della piattaforma di apprendimento automatico di Uber lavorando sull'apprendimento automatico per la guida autonoma, sui sistemi di apprendimento automatico e sulle iniziative strategiche dell'IA. Ha iniziato la sua carriera presso i Bell Labs ed è stato professore a contratto presso la Columbia University. Ha co-insegnato tutorial presso ICML'17 e ICCV'19 e ha co-organizzato diversi workshop presso NeurIPS, ICML, CVPR, ICCV sull'apprendimento automatico per la guida autonoma, la visione 3D e la robotica, i sistemi di apprendimento automatico e l'apprendimento automatico avverso. Ha un dottorato di ricerca in informatica presso la Cornell University. È ACM Fellow e IEEE Fellow.

Timestamp:

Di più da Apprendimento automatico di AWS