Yeni Amazon SageMaker jeo-uzamsal yeteneklerini kullanarak Lake Mead kuraklığını izleme

Yeni Amazon SageMaker jeo-uzamsal yeteneklerini kullanarak Lake Mead kuraklığını izleme

Dünyanın değişen iklimi, küresel ısınma nedeniyle artan bir kuraklık riski oluşturmaktadır. 1880'den bu yana, küresel sıcaklık 1.01 °C arttı. 1993'ten beri deniz seviyeleri 102.5 milimetre yükseldi. 2002'den beri Antarktika'daki kara buz tabakaları yılda 151.0 milyar mt oranında kütle kaybediyor. 2022'de Dünya'nın atmosferi milyonda 400 parçadan fazla karbondioksit içeriyor ki bu 50'de olduğundan %1750 daha fazla. son 10,000 yıl [1].

Bu gönderide, Mead Gölü'ndeki iklim değişikliğinin neden olduğu kuraklığı izlemek için Amazon SageMaker'daki yeni jeo-uzamsal yetenekleri kullanıyoruz. Mead Gölü, ABD'deki en büyük rezervuardır. Nevada, Arizona ve California eyaletlerinde 25 milyon kişiye su sağlıyor [2]. Araştırmalar, Mead Gölü'ndeki su seviyesinin 1937'den beri en düşük seviyede olduğunu gösteriyor [3]. Uydu görüntülerini kullanarak Mead Gölü'ndeki su seviyelerindeki değişiklikleri ölçmek için SageMaker'daki jeo-uzamsal yetenekleri kullanıyoruz.

Veri erişimi

SageMaker'daki yeni jeo-uzamsal yetenekler, Sentinel-2 ve Landsat 8 gibi coğrafi verilere kolay erişim sağlar. Yerleşik coğrafi veri kümesi erişimi, aksi halde çeşitli veri sağlayıcılardan ve satıcılardan veri toplamak için kaybedilen haftalarca harcanan çabayı azaltır.

Öncelikle, SageMaker jeo-uzamsal görüntüsüne sahip bir Amazon SageMaker Studio not defterini şu bölümde açıklanan adımları izleyerek kullanacağız. Amazon SageMaker jeo-uzamsal yeteneklerini kullanmaya başlama. Analizimiz için bir SageMaker coğrafi uzamsal görüntüsüne sahip bir SageMaker Studio not defteri kullanıyoruz.

Bu yazıda kullanılan not defteri şu adreste bulunabilir: amazon-sagemaker-örnekler GitHub deposu. SageMaker geospatial, veri sorgulamayı son derece kolaylaştırır. Uydu verilerinin konumunu ve zaman dilimini belirtmek için aşağıdaki kodu kullanacağız.

Aşağıdaki kod parçacığında, önce bir tanımlıyoruz AreaOfInterest (AOI) Mead Gölü çevresinde bir sınırlayıcı kutu ile. biz kullanıyoruz TimeRangeFilter Ocak 2021'den Temmuz 2022'ye kadar olan verileri seçmek için. Ancak, incelediğimiz alan bulutlar tarafından gizlenmiş olabilir. Çoğunlukla bulutsuz görüntüler elde etmek için, bulut kapsama üst sınırını %1 olarak ayarlayarak görüntülerin bir alt kümesini seçiyoruz.

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

model çıkarımı

Verileri belirledikten sonraki adım, uydu görüntülerinden su kütlelerini çıkarmaktır. Tipik olarak, su kütleleri, bitki örtüsü, kar vb. gibi dünya yüzeyindeki farklı fiziksel malzeme kategorilerini tanımlamak için sıfırdan bir arazi örtüsü segmentasyon modeli geliştirmemiz gerekir. Bir modeli sıfırdan eğitmek zaman alıcı ve pahalıdır. Veri etiketleme, model eğitimi ve konuşlandırmayı içerir. SageMaker jeo-uzamsal yetenekleri, önceden eğitilmiş bir arazi örtüsü segmentasyon modeli sağlar. Bu arazi örtüsü segmentasyon modeli, basit bir API çağrısı ile çalıştırılabilir.

Çıkarımlar için verileri yerel bir makineye indirmek yerine, SageMaker tüm ağır işleri sizin yerinize yapar. Bir Dünya Gözlem İşinde (EOJ) veri yapılandırmasını ve model yapılandırmasını belirlememiz yeterlidir. SageMaker, EOJ için uydu görüntüsü verilerini otomatik olarak indirir ve önceden işler, böylece çıkarım için hazır hale gelir. Ardından SageMaker, EOJ için model çıkarımını otomatik olarak çalıştırır. İş yüküne bağlı olarak (model çıkarımı yoluyla yürütülen görüntülerin sayısı), EOJ'nin tamamlanması birkaç dakika ila birkaç saat sürebilir. kullanarak iş durumunu izleyebilirsiniz. get_earth_observation_job fonksiyonu.

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

Sonuçları görselleştirin

Artık model çıkarımını çalıştırdığımıza göre, sonuçları görsel olarak inceleyelim. Model çıkarım sonuçlarını girdi uydu görüntülerinin üzerine yerleştiriyoruz. Bu sonuçları görselleştirmek için SageMaker ile önceden entegre edilmiş olarak gelen Foursquare Studio araçlarını kullanıyoruz. İlk olarak, giriş görüntülerini görselleştirmek ve tahminleri modellemek için SageMaker jeo-uzamsal yeteneklerini kullanarak bir harita örneği oluşturuyoruz:

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

Etkileşimli harita hazır olduğunda, verileri indirmeye gerek kalmadan girdi görüntülerini ve model çıktılarını harita katmanları olarak işleyebiliriz. Ek olarak, her katmana bir etiket verebilir ve kullanarak belirli bir tarih için verileri seçebiliriz. 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
)

Su olarak işaretlenen alanın (aşağıdaki haritada parlak sarı), çıktı katmanının opaklığını değiştirerek Mead Gölü'ndeki su kütlesine tam olarak karşılık geldiğini doğrulayabiliriz.

Amazon SageMaker'ın yeni coğrafi yetenekleri PlatoBlockchain Veri Zekasını kullanarak Mead Gölü kuraklığını izleme. Dikey Arama. Ai.

Analiz sonrası

Sonra, kullanıyoruz export_earth_observation_job EOJ sonuçlarını bir Amazon Simple Storage Service (Amazon S3) klasörüne aktarma işlevi. Ardından, su yüzey alanını hesaplamak için Amazon S3'teki veriler üzerinde bir sonraki analiz gerçekleştiririz. Dışa aktarma işlevi, sonuçları ekipler arasında paylaşmayı kolaylaştırır. SageMaker ayrıca veri kümesi yönetimini basitleştirir. S3 klasöründeki binlerce dosyayı taramak yerine ARN işini kullanarak EOJ sonuçlarını kolayca paylaşabiliriz. Sonuçlar iş ARN'sine göre gruplandırılabildiğinden, her EOJ veri kataloğunda bir varlık haline gelir.

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

Ardından, Mead Gölü'ndeki su seviyesindeki değişiklikleri analiz ediyoruz. Açık kaynak kitaplıkları kullanarak su yüzey alanını hesaplamak için arazi örtüsü maskelerini yerel örneğimize indiriyoruz. SageMaker, model çıktılarını Bulut İçin Optimize Edilmiş GeoTiff (COG) formatında kaydeder. Bu örnekte, Tifffile paketini kullanarak bu maskeleri NumPy dizileri olarak yüklüyoruz. Bilge Yapıcı Geospatial 1.0 çekirdek ayrıca GDAL ve Rasterio gibi yaygın olarak kullanılan diğer kitaplıkları da içerir.

Arazi örtüsü maskesindeki her piksel 0-11 arasında bir değere sahiptir. Her değer, belirli bir arazi örtüsü sınıfına karşılık gelir. Suyun sınıf indeksi 6'dır. Bu sınıf indeksini su maskesini çıkarmak için kullanabiliriz. İlk olarak, su olarak işaretlenen piksel sayısını sayarız. Ardından, suyun yüzey alanını elde etmek için bu sayıyı her bir pikselin kapladığı alanla çarpıyoruz. Bantlara bağlı olarak, Sentinel-2 L2A görüntüsünün uzamsal çözünürlüğü 10'dur.m, 20mVeya 60m. Arazi örtüsü segmentasyon modeli çıkarımı için tüm bantlar 60 metrelik bir uzamsal çözünürlüğe altörneklenir. Sonuç olarak, arazi örtüsü maskesindeki her bir piksel, 3600'lük bir zemin alanını temsil eder. m2Veya 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()

Aşağıdaki şekilde su yüzey alanını zamana göre çiziyoruz. Su yüzey alanı, Şubat 2021 ile Temmuz 2022 arasında net bir şekilde azaldı. 2 yıldan kısa bir süre içinde, Mead Gölü'nün yüzey alanı 300'ün üzerine düştü. km2 250'den az km2, %18 göreli değişim.Amazon SageMaker'ın yeni coğrafi yetenekleri PlatoBlockchain Veri Zekasını kullanarak Mead Gölü kuraklığını izleme. Dikey Arama. 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">')

Ayrıca gölün kıyı şeridindeki değişiklikleri daha iyi görselleştirmek için gölün sınırlarını çıkarabilir ve bunları uydu görüntülerinin üzerine yerleştirebiliriz. Aşağıdaki animasyonda gösterildiği gibi, kuzey ve güneydoğu kıyı şeridi son 2 yılda küçülmüştür. Bazı aylarda, yüzey alanı yıldan yıla %20'den fazla azaldı.

Mead Gölü yüzey alanı animasyonu

Sonuç

Mead Gölü'nün daralan kıyı şeridinde iklim değişikliğinin etkisine tanık olduk. SageMaker artık jeo uzamsal makine öğrenimini (ML) destekleyerek veri bilimcilerin ve ML mühendislerinin jeo uzamsal verileri kullanarak modeller oluşturmasını, eğitmesini ve dağıtmasını kolaylaştırıyor. Bu gönderide, SageMaker jeo-uzamsal AI/ML hizmetleriyle nasıl veri elde edileceğini, analiz gerçekleştirileceğini ve değişikliklerin nasıl görselleştirileceğini gösterdik. Bu yazının kodunu şurada bulabilirsiniz: amazon-sagemaker-örnekler GitHub deposu. Bkz. Amazon SageMaker jeo-uzamsal yetenekleri daha fazla öğrenmek için.

Referanslar

[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


Yazarlar Hakkında

 Xiong Zhou AWS'de Kıdemli Uygulamalı Bilim Adamıdır. Amazon SageMaker jeo-uzamsal yetenekleri için bilim ekibine liderlik ediyor. Şu anki araştırma alanı, bilgisayarla görme ve verimli model eğitimini içermektedir. Boş zamanlarında koşmaktan, basketbol oynamaktan ve ailesiyle vakit geçirmekten hoşlanır.

Anirudh Viswanathan SageMaker jeo-uzamsal ML ekibinde Kıdemli Ürün Müdürü, Teknik – Harici Hizmetler'dir. Carnegie Mellon Üniversitesi'nden Robotik alanında Master derecesine, Wharton School of Business'tan MBA derecesine sahiptir ve 40'tan fazla patentle mucit olarak adlandırılmıştır. Uzun mesafe koşmaktan, sanat galerilerini ve Broadway şovlarını ziyaret etmekten hoşlanıyor.

Trenton Dudak Tarağı Baş Mühendistir ve SageMaker'a jeo-uzamsal yetenekler ekleyen ekibin bir parçasıdır. SageMaker Ground Truth, Augmented AI ve Amazon Mechanical Turk hizmetlerinde çalışan insan döngü çözümlerinde yer almıştır.

Xingjian Shi Kıdemli Uygulamalı Bilim İnsanı ve SageMaker'a jeo-uzamsal yetenekler ekleyen ekibin bir parçasıdır. Ayrıca Yer bilimi ve çok modlu AutoML için derin öğrenme üzerinde çalışıyor.

li erran li humain-in-the-loop hizmetlerinde, AWS AI, Amazon'da uygulamalı bilim yöneticisidir. Araştırma ilgi alanları, 3D derin öğrenme ve vizyon ve dil temsili öğrenmedir. Daha önce Alexa AI'da kıdemli bilim insanı, Scale AI'da makine öğrenimi başkanı ve Pony.ai'de baş bilim insanıydı. Bundan önce, otonom sürüş için makine öğrenimi, makine öğrenimi sistemleri ve yapay zekanın stratejik girişimleri üzerinde çalışan Uber ATG'deki algı ekibi ve Uber'deki makine öğrenimi platformu ekibiyle birlikteydi. Kariyerine Bell Laboratuarlarında başladı ve Columbia Üniversitesi'nde yardımcı profesördü. ICML'17 ve ICCV'19'da ortak eğitimler verdi ve NeurIPS, ICML, CVPR, ICCV'de otonom sürüş için makine öğrenimi, 3D görüş ve robotik, makine öğrenimi sistemleri ve çekişmeli makine öğrenimi üzerine birkaç çalıştayın eş düzenleyicisi oldu. Cornell Üniversitesi'nde bilgisayar bilimi alanında doktorası var. Kendisi bir ACM Üyesi ve IEEE Üyesidir.

Zaman Damgası:

Den fazla AWS Makine Öğrenimi