نظارت بر خشکسالی دریاچه مید با استفاده از قابلیت‌های جدید فضایی آمازون SageMaker

نظارت بر خشکسالی دریاچه مید با استفاده از قابلیت‌های جدید فضایی آمازون SageMaker

تغییر اقلیم زمین به دلیل گرم شدن کره زمین خطر خشکسالی را افزایش می دهد. از سال 1880 دمای کره زمین 1.01 درجه سانتیگراد افزایش یافته است. از سال 1993، سطح آب دریاها 102.5 میلی متر افزایش یافته است. از سال 2002، صفحات یخی قطب جنوب با سرعت 151.0 میلیارد تن در سال جرم خود را از دست داده اند. در سال 2022، جو زمین حاوی بیش از 400 قسمت در میلیون دی اکسید کربن است که 50 درصد بیشتر از سال 1750 است. در حالی که ممکن است این اعداد از زندگی روزمره ما حذف شده باشند، زمین با سرعت بی سابقه ای در حال گرم شدن بوده است. 10,000 سال گذشته [1].

در این پست، از قابلیت‌های جدید جغرافیایی در Amazon SageMaker برای نظارت بر خشکسالی ناشی از تغییرات آب و هوایی در دریاچه مید استفاده می‌کنیم. دریاچه مید بزرگترین مخزن در ایالات متحده است. آب 25 میلیون نفر در ایالت های نوادا، آریزونا و کالیفرنیا را تامین می کند [2]. تحقیقات نشان می دهد که سطح آب دریاچه مید در پایین ترین سطح خود از سال 1937 است [3]. ما از قابلیت‌های مکانی در SageMaker برای اندازه‌گیری تغییرات سطح آب در دریاچه مید با استفاده از تصاویر ماهواره‌ای استفاده می‌کنیم.

دسترسی به داده

قابلیت‌های جدید مکانی در SageMaker دسترسی آسان به داده‌های مکانی مانند Sentinel-2 و Landsat 8 را ارائه می‌دهند. دسترسی به داده‌های جغرافیایی داخلی هفته‌ها تلاش را صرفه‌جویی می‌کند وگرنه برای جمع‌آوری داده‌ها از ارائه‌دهندگان و فروشندگان مختلف داده‌ها از بین می‌رود.

ابتدا، ما از یک نوت بوک Amazon SageMaker Studio با تصویر فضایی SageMaker با انجام مراحل زیر استفاده خواهیم کرد. شروع کار با قابلیت های جغرافیایی Amazon SageMaker. ما از یک نوت بوک SageMaker Studio با تصویر جغرافیایی SageMaker برای تحلیل خود استفاده می کنیم.

نوت بوک استفاده شده در این پست را می توانید در amazon-sagemaker-examples مخزن GitHub. SageMaker geospatial پرس و جو داده را بسیار آسان می کند. از کد زیر برای تعیین مکان و بازه زمانی داده های ماهواره ای استفاده می کنیم.

در قطعه کد زیر ابتدا an را تعریف می کنیم AreaOfInterest (AOI) با یک جعبه محدود در اطراف منطقه دریاچه مید. ما استفاده می کنیم TimeRangeFilter برای انتخاب داده ها از ژانویه 2021 تا ژوئیه 2022. با این حال، منطقه ای که ما در حال مطالعه هستیم ممکن است توسط ابرها پوشیده شده باشد. برای به دست آوردن تصاویر عمدتاً بدون ابر، با تنظیم کران بالایی برای پوشش ابری روی 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")

استنتاج مدل

پس از شناسایی داده ها، مرحله بعدی استخراج آب از تصاویر ماهواره ای است. به طور معمول، ما باید یک مدل تقسیم‌بندی پوشش زمین را از ابتدا آموزش دهیم تا دسته‌های مختلف مواد فیزیکی روی سطح زمین مانند توده‌های آبی، پوشش گیاهی، برف و غیره را شناسایی کنیم. آموزش یک مدل از ابتدا زمان بر و پرهزینه است. این شامل برچسب گذاری داده ها، آموزش مدل و استقرار است. قابلیت های جغرافیایی SageMaker یک مدل تقسیم بندی پوشش زمین از پیش آموزش دیده ارائه می کند. این مدل تقسیم بندی پوشش زمین را می توان با یک فراخوانی ساده API اجرا کرد.

SageMaker به جای دانلود داده ها در یک ماشین محلی برای استنباط، تمام کارهای سنگین را برای شما انجام می دهد. ما به سادگی پیکربندی داده و پیکربندی مدل را در یک کار مشاهده زمین (EOJ) مشخص می کنیم. SageMaker به طور خودکار داده های تصویر ماهواره ای را برای EOJ دانلود و پیش پردازش می کند و آن را برای استنباط آماده می کند. در مرحله بعد، SageMaker به طور خودکار استنتاج مدل را برای EOJ اجرا می کند. بسته به حجم کار (تعداد تصاویری که از طریق استنتاج مدل اجرا می‌شوند)، پایان EOJ می‌تواند چند دقیقه تا چند ساعت طول بکشد. شما می توانید وضعیت شغل را با استفاده از get_earth_observation_job تابع.

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

نتایج را تجسم کنید

اکنون که استنتاج مدل را اجرا کردیم، بیایید نتایج را به صورت بصری بررسی کنیم. ما نتایج استنتاج مدل را روی تصاویر ماهواره‌ای ورودی قرار می‌دهیم. ما از ابزارهای Foursquare Studio استفاده می کنیم که از قبل با SageMaker ادغام شده است تا این نتایج را تجسم کنیم. ابتدا یک نمونه نقشه با استفاده از قابلیت های جغرافیایی SageMaker برای تجسم تصاویر ورودی و پیش بینی های مدل ایجاد می کنیم:

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

وقتی نقشه تعاملی آماده شد، می‌توانیم تصاویر ورودی و خروجی‌های مدل را به صورت لایه‌های نقشه ارائه کنیم، بدون اینکه نیازی به دانلود داده‌ها باشد. علاوه بر این، ما می توانیم به هر لایه یک برچسب بدهیم و داده ها را برای یک تاریخ خاص با استفاده از آن انتخاب کنیم 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
)

می‌توانیم با تغییر کدورت لایه خروجی بررسی کنیم که ناحیه‌ای که به‌عنوان آب مشخص شده است (زرد روشن در نقشه زیر) دقیقاً با بدنه آبی دریاچه مید مطابقت دارد.

نظارت بر خشکسالی دریاچه مید با استفاده از قابلیت‌های جغرافیایی جدید آمازون SageMaker، فناوری اطلاعات پلاتوبلاک چین. جستجوی عمودی Ai.

تحلیل پست

بعد از آن استفاده می کنیم export_earth_observation_job عملکرد صادر کردن نتایج EOJ به سطل سرویس ذخیره سازی ساده آمازون (Amazon S3). سپس تجزیه و تحلیل بعدی را بر روی داده های آمازون S3 برای محاسبه سطح آب انجام می دهیم. تابع صادرات، اشتراک‌گذاری نتایج را در بین تیم‌ها راحت می‌کند. SageMaker همچنین مدیریت مجموعه داده ها را ساده می کند. ما می توانیم به سادگی نتایج EOJ را با استفاده از job ARN به اشتراک بگذاریم، به جای خزیدن هزاران فایل در سطل S3. هر EOJ به یک دارایی در کاتالوگ داده تبدیل می شود، زیرا نتایج را می توان بر اساس شغل ARN گروه بندی کرد.

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

در مرحله بعد، تغییرات سطح آب در دریاچه مید را تجزیه و تحلیل می کنیم. ما ماسک های پوشش زمین را در نمونه محلی خود دانلود می کنیم تا سطح آب را با استفاده از کتابخانه های منبع باز محاسبه کنیم. SageMaker خروجی های مدل را در قالب Cloud Optimized GeoTiff (COG) ذخیره می کند. در این مثال، ما این ماسک ها را به عنوان آرایه های NumPy با استفاده از بسته Tiffile بارگذاری می کنیم. SageMaker Geospatial 1.0 هسته همچنین شامل کتابخانه های پرکاربرد دیگری مانند GDAL و Rasterio است.

هر پیکسل در ماسک پوشش زمین دارای مقداری بین 0-11 است. هر مقدار مربوط به طبقه خاصی از پوشش زمین است. شاخص کلاس آب 6 است. می توانیم از این شاخص کلاس برای استخراج ماسک آب استفاده کنیم. ابتدا تعداد پیکسل هایی که به عنوان آب مشخص شده اند را می شماریم. سپس آن عدد را در مساحتی که هر پیکسل می پوشاند ضرب می کنیم تا سطح آب را بدست آوریم. بسته به باندها، وضوح فضایی یک تصویر Sentinel-2 L2A 10 است.m، 20mو یا 60m. برای استنباط مدل تقسیم‌بندی پوشش زمین، همه باندها تا وضوح فضایی 60 متر نمونه‌برداری می‌شوند. در نتیجه، هر پیکسل در ماسک پوشش زمین نشان دهنده سطح زمین 3600 است m2و یا 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()

در شکل زیر سطح آب را در طول زمان رسم می کنیم. مساحت سطح آب به وضوح بین فوریه 2021 و ژوئیه 2022 کاهش یافت. در کمتر از 2 سال، مساحت سطح دریاچه مید از بیش از 300 کاهش یافت. km2 به کمتر از 250 km2، یک تغییر نسبی 18٪.نظارت بر خشکسالی دریاچه مید با استفاده از قابلیت‌های جغرافیایی جدید آمازون SageMaker، فناوری اطلاعات پلاتوبلاک چین. جستجوی عمودی 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">')

همچنین می‌توانیم مرزهای دریاچه را استخراج کرده و آنها را بر روی تصاویر ماهواره‌ای قرار دهیم تا تغییرات خط ساحلی دریاچه را بهتر تجسم کنیم. همانطور که در انیمیشن زیر نشان داده شده است، خط ساحلی شمال و جنوب شرقی در 2 سال گذشته کوچک شده است. در برخی از ماه ها، مساحت سطح سالانه بیش از 20 درصد کاهش یافته است.

انیمیشن سطح دریاچه مید

نتیجه

ما شاهد تاثیر تغییرات آب و هوایی بر روی خط ساحلی در حال کاهش دریاچه مید بوده ایم. SageMaker اکنون از یادگیری ماشین جغرافیایی (ML) پشتیبانی می‌کند و ساخت، آموزش و استقرار مدل‌ها را با استفاده از داده‌های مکانی برای دانشمندان داده و مهندسان ML آسان‌تر می‌کند. در این پست، نحوه جمع‌آوری داده‌ها، انجام تجزیه و تحلیل و تجسم تغییرات با سرویس‌های AI/ML جغرافیایی SageMaker را نشان دادیم. شما می توانید کد این پست را در سایت پیدا کنید amazon-sagemaker-examples مخزن GitHub. را ببینید قابلیت های جغرافیایی Amazon SageMaker برای کسب اطلاعات بیشتر.

منابع

[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


درباره نویسنده

 شیونگ ژو دانشمند ارشد کاربردی در AWS است. او تیم علمی قابلیت‌های جغرافیایی Amazon SageMaker را رهبری می‌کند. حوزه تحقیقاتی فعلی او شامل بینایی کامپیوتر و آموزش مدل کارآمد است. در اوقات فراغت از دویدن، بازی بسکتبال و گذراندن وقت با خانواده لذت می برد.

آنیرود ویشواناتان یک مدیر محصول Sr، خدمات فنی - خارجی با تیم ML جغرافیایی SageMaker است. او دارای مدرک کارشناسی ارشد در رباتیک از دانشگاه کارنگی ملون، MBA از دانشکده بازرگانی وارتون، و مخترع بیش از 40 حق ثبت اختراع است. او از دویدن در مسافت های طولانی، بازدید از گالری های هنری و نمایش های برادوی لذت می برد.

ترنتون لیپسکام یک مهندس اصلی و بخشی از تیمی است که قابلیت‌های مکانی را به SageMaker اضافه کرده است. او در راه‌حل‌های حلقه انسان درگیر بوده و روی سرویس‌های SageMaker Ground Truth، Augmented AI و Amazon Mechanical Turk کار کرده است.

شینگجیان شی یک دانشمند ارشد کاربردی و بخشی از تیمی است که قابلیت‌های مکانی را به SageMaker اضافه کرده است. او همچنین در حال کار بر روی یادگیری عمیق برای علوم زمین و AutoML چند وجهی است.

لی اران لی مدیر علوم کاربردی در خدمات انسانی در حلقه، AWS AI، آمازون است. علایق تحقیقاتی او یادگیری عمیق سه بعدی و یادگیری بازنمایی بینایی و زبان است. او قبلاً دانشمند ارشد Alexa AI، رئیس یادگیری ماشین در Scale AI و دانشمند ارشد در Pony.ai بود. قبل از آن، او با تیم ادراک Uber ATG و تیم پلتفرم یادگیری ماشین در Uber بود که بر روی یادگیری ماشین برای رانندگی خودکار، سیستم‌های یادگیری ماشین و ابتکارات استراتژیک هوش مصنوعی کار می‌کرد. او کار خود را در آزمایشگاه بل آغاز کرد و در دانشگاه کلمبیا استادیار بود. او آموزش‌های مشترکی را در ICML'3 و ICCV'17 تدریس کرد و چندین کارگاه آموزشی در NeurIPS، ICML، CVPR، ICCV در مورد یادگیری ماشین برای رانندگی مستقل، دید سه‌بعدی و روباتیک، سیستم‌های یادگیری ماشین و یادگیری ماشینی متخاصم سازمان‌دهی کرد. او دارای دکترای علوم کامپیوتر از دانشگاه کرنل است. او همکار ACM و همکار IEEE است.

تمبر زمان:

بیشتر از آموزش ماشین AWS