Meadi järve põua jälgimine, kasutades uusi Amazon SageMakeri georuumilisi võimalusi

Meadi järve põua jälgimine, kasutades uusi Amazon SageMakeri georuumilisi võimalusi

Maa muutuv kliima suurendab globaalse soojenemise tõttu põua ohtu. Alates 1880. aastast on globaalne temperatuur tõusnud 1.01 °C. Alates 1993. aastast on merevee tase tõusnud 102.5 millimeetrit. Alates 2002. aastast on Antarktika maismaa jääkilbid kaotanud massi kiirusega 151.0 miljardit tonni aastas. Aastal 2022 sisaldab Maa atmosfäär enam kui 400 miljondikosa süsinikdioksiidi, mis on 50% rohkem kui 1750. aastal. Kuigi need numbrid võivad tunduda meie igapäevaelust eemale jäävat, on Maa soojenenud üle 10,000 aasta enneolematult kiiresti. viimase 1 XNUMX aasta jooksul [XNUMX].

Selles postituses kasutame Amazon SageMakeri uusi georuumilisi võimalusi, et jälgida Meadi järve kliimamuutustest põhjustatud põuda. Meadi järv on USA suurim veehoidla. See varustab veega 25 miljonit inimest Nevada, Arizona ja California osariikides [2]. Uuringud näitavad, et Meadi järve veetase on madalaimal tasemel alates 1937. aastast [3]. Me kasutame SageMakeri georuumilisi võimalusi, et mõõta Meadi järve veetaseme muutusi satelliidipiltide abil.

Juurdepääs andmetele

SageMakeri uued georuumilised võimalused pakuvad lihtsat juurdepääsu georuumilistele andmetele, nagu Sentinel-2 ja Landsat 8. Sisseehitatud georuumilise andmekogumi juurdepääs säästab nädalaid vaeva, mis muidu läheb erinevatelt andmepakkujatelt ja -müüjatelt andmete kogumisel kaotsi.

Esiteks kasutame SageMakeri georuumilise kujutisega Amazon SageMaker Studio sülearvutit, järgides artiklis kirjeldatud samme. Amazon SageMakeri georuumiliste võimalustega alustamine. Analüüsiks kasutame SageMakeri georuumilise kujutisega SageMaker Studio märkmikku.

Selles postituses kasutatud märkmiku leiate aadressilt amazon-sagemaker-näited GitHubi repo. SageMaker geospatial muudab andmepäringu äärmiselt lihtsaks. Kasutame satelliidiandmete asukoha ja ajakava täpsustamiseks järgmist koodi.

Järgmises koodilõigul määratleme esmalt an AreaOfInterest (AOI) piirdekastiga Meadi järve piirkonna ümber. Me kasutame TimeRangeFilter andmete valimiseks jaanuarist 2021 kuni juulini 2022. Uuritavat piirkonda võivad aga varjata pilved. Enamasti pilvevaba kujutise saamiseks valime piltide alamhulga, määrates pilvkatte ülempiiriks 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")

Mudeli järeldus

Pärast andmete tuvastamist on järgmiseks sammuks veekogude eraldamine satelliidipiltidest. Tavaliselt peaksime maakatte segmenteerimismudelit nullist välja õpetama, et tuvastada maapinnal erinevate füüsiliste materjalide kategooriad, nagu veekogud, taimestik, lumi jne. Modelli nullist väljaõpetamine on aeganõudev ja kulukas. See hõlmab andmete märgistamist, mudelikoolitust ja juurutamist. SageMakeri georuumilised võimalused pakuvad eelkoolitatud maakatte segmenteerimismudelit. Seda maakatte segmenteerimismudelit saab käivitada lihtsa API-kutsega.

Selle asemel, et laadida andmeid järelduste tegemiseks kohalikku masinasse, teeb SageMaker kõik rasked tõstmised teie eest ära. Me lihtsalt täpsustame andmete konfiguratsiooni ja mudeli konfiguratsiooni maavaatlustöös (EOJ). SageMaker laadib automaatselt alla ja eeltöötleb satelliidipiltide andmed EOJ jaoks, muutes need järelduste tegemiseks valmis. Järgmisena käivitab SageMaker EOJ jaoks automaatselt mudeli järelduse. Sõltuvalt töökoormusest (mudeli järeldamise kaudu jooksvate piltide arv) võib EOJ-i lõpuleviimiseks kuluda mitu minutit kuni paar tundi. Töö olekut saate jälgida kasutades get_earth_observation_job funktsiooni.

# 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"]}

Visualiseerige tulemusi

Nüüd, kui oleme mudeli järelduse teinud, kontrollime tulemusi visuaalselt. Me katame mudeli järelduste tulemused sisend satelliidipiltidel. Nende tulemuste visualiseerimiseks kasutame Foursquare Studio tööriistu, mis on SageMakeriga eelintegreeritud. Esiteks loome kaardieksemplari, kasutades SageMakeri georuumilisi võimalusi, et visualiseerida sisendpilte ja modelleerida ennustusi:

# 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()

Kui interaktiivne kaart on valmis, saame renderdada sisendpilte ja mudeliväljundeid kaardikihtidena, ilma et peaksime andmeid alla laadima. Lisaks saame anda igale kihile sildi ja valida selle abil andmed konkreetse kuupäeva jaoks 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
)

Et veena märgitud ala (järgmisel kaardil erekollane) vastab täpselt Meadi järve veekogule, saame väljundkihi läbipaistmatust muutes kontrollida.

Lake Meadi põua jälgimine Amazon SageMakeri uue georuumilise võimekuse PlatoBlockchain Data Intelligence abil. Vertikaalne otsing. Ai.

Postitusanalüüs

Järgmisena kasutame export_earth_observation_job funktsioon EOJ tulemuste eksportimiseks Amazon Simple Storage Service (Amazon S3) ämbrisse. Seejärel teostame veepinna arvutamiseks Amazon S3 andmete hilisema analüüsi. Ekspordifunktsioon muudab tulemuste jagamise meeskondade vahel mugavaks. SageMaker lihtsustab ka andmekogumi haldamist. Saame EOJ-i tulemusi lihtsalt jagada, kasutades töö ARN-i, selle asemel, et indekseerida tuhandeid faile S3 ämbris. Igast EOJ-st saab andmekataloogi vara, kuna tulemusi saab rühmitada töö ARN järgi.

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,
)

Järgmisena analüüsime veetaseme muutusi Meadi järves. Laadime maakatte maskid alla oma kohalikku eksemplari, et arvutada avatud lähtekoodiga raamatukogude abil veepinna pindala. SageMaker salvestab mudeli väljundid Cloud Optimized GeoTiff (COG) vormingus. Selles näites laadime need maskid NumPy massiividena, kasutades Tifffile'i paketti. SageMaker Geospatial 1.0 kernel sisaldab ka teisi laialdaselt kasutatavaid teeke, nagu GDAL ja Rasterio.

Iga maakatte maski piksli väärtus on vahemikus 0–11. Iga väärtus vastab kindlale maakatte klassile. Vee klassiindeks on 6. Seda klassiindeksit saame kasutada veemaski eraldamiseks. Esiteks loendame veena märgitud pikslite arvu. Järgmisena korrutame selle arvu pindalaga, mida iga piksel katab, et saada vee pindala. Olenevalt ribadest on Sentinel-2 L2A kujutise ruumiline eraldusvõime 10m, 20mVõi 60m. Maakatte segmenteerimise mudeli järelduse tegemiseks võetakse kõik ribad alla 60-meetrise ruumilise eraldusvõimeni. Selle tulemusena esindab iga maakatte maski piksel 3600 maapinda m2Või 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()

Joonistame veepinna pindala ajas järgmisel joonisel. Veepindala vähenes selgelt ajavahemikus veebruarist 2021 kuni juulini 2022. Vähem kui kahe aastaga vähenes Meadi järve pindala enam kui 2-lt km2 alla 250 km2, suhteline muutus 18%.Lake Meadi põua jälgimine Amazon SageMakeri uue georuumilise võimekuse PlatoBlockchain Data Intelligence abil. Vertikaalne otsing. 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">')

Samuti saame eraldada järve piirid ja asetada need satelliidipiltidele, et paremini visualiseerida järve kaldajoone muutusi. Nagu näitab järgmine animatsioon, on põhja- ja kagurannik viimase 2 aasta jooksul kahanenud. Mõnel kuul on pindala aasta-aastalt vähenenud rohkem kui 20%.

Lake Mead pindala animatsioon

Järeldus

Oleme tunnistajaks kliimamuutuste mõjule Meadi järve kahanevale kaldajoonele. SageMaker toetab nüüd georuumilist masinõpet (ML), muutes andmeteadlastel ja ML-inseneridel georuumilisi andmeid kasutades mudelite loomise, koolitamise ja juurutamise lihtsamaks. Selles postituses näitasime, kuidas SageMakeri georuumiliste AI/ML teenustega andmeid hankida, analüüsi teha ja muudatusi visualiseerida. Selle postituse koodi leiate aadressilt amazon-sagemaker-näited GitHubi repo. Vaadake Amazon SageMakeri georuumilised võimalused rohkem teada saada.

viited

[1] https://climate.nasa.gov/

[2] https://www.nps.gov/lake/learn/nature/overview-of-lake-mead.htm

[3] https://earthobservatory.nasa.gov/images/150111/lake-mead-keeps-dropping


Autoritest

 Xiong Zhou on AWSi vanemrakendusteadlane. Ta juhib Amazon SageMakeri georuumiliste võimaluste teadusmeeskonda. Tema praegune uurimisvaldkond hõlmab arvutinägemist ja tõhusat mudelikoolitust. Vabal ajal meeldib talle joosta, korvpalli mängida ja perega aega veeta.

Anirudh Viswanathan on SageMakeri georuumilise ML meeskonna tehniliste välisteenuste tootejuht Sr. Tal on magistrikraad robootikas Carnegie Melloni ülikoolist, MBA kraad Whartoni ärikoolist ning teda on nimetatud leiutajaks enam kui 40 patendi puhul. Talle meeldib pikamaajooks, kunstigaleriide ja Broadway etenduste külastamine.

Trenton Lipscomb on peainsener ja osa meeskonnast, kes lisas SageMakerile georuumilised võimalused. Ta on tegelenud inimahela lahendustega, töötades teenustega SageMaker Ground Truth, Augmented AI ja Amazon Mechanical Turk.

Xingjian Shi on vanemrakendusteadlane ja osa meeskonnast, kes lisas SageMakerile georuumilised võimalused. Ta tegeleb ka maateaduse ja multimodaalse AutoML-i süvaõppega.

Li Erran Li on rakendusteaduste juht ettevõttes Humain-in-the-loop Services, AWS AI, Amazon. Tema uurimisvaldkonnad on 3D süvaõpe ning visiooni ja keele esituse õpe. Varem oli ta Alexa AI vanemteadur, Scale AI masinõppe juht ja Pony.ai peateadlane. Enne seda töötas ta Uber ATG tajumeeskonnas ja Uberi masinõppeplatvormi meeskonnas, kes töötas autonoomse sõidu masinõppe, masinõppesüsteemide ja tehisintellekti strateegiliste algatuste kallal. Ta alustas oma karjääri Bell Labsis ja oli Columbia ülikooli dotsent. Ta õpetas ICML'17 ja ICCV'19 õpetusi ning korraldas NeurIPS-is, ICML-is, CVPR-is ja ICCV-s mitmeid seminare autonoomse juhtimise masinõppe, 3D-nägemise ja robootika, masinõppesüsteemide ja võistleva masinõppe teemal. Tal on Cornelli ülikoolis arvutiteaduse doktorikraad. Ta on ACM Fellow ja IEEE Fellow.

Ajatempel:

Veel alates AWS-i masinõpe