Мониторинг засухи на озере Мид с помощью новых геопространственных возможностей Amazon SageMaker

Мониторинг засухи на озере Мид с помощью новых геопространственных возможностей Amazon SageMaker

Изменение климата Земли создает повышенный риск засухи из-за глобального потепления. С 1880 года глобальная температура повысилась на 1.01 °C. С 1993 года уровень моря поднялся на 102.5 миллиметра. С 2002 года наземные ледяные щиты в Антарктиде теряют массу со скоростью 151.0 миллиарда метрических тонн в год. В 2022 году атмосфера Земли содержит более 400 частей на миллион углекислого газа, что на 50% больше, чем в 1750 году. Хотя эти цифры могут показаться далекими от нашей повседневной жизни, Земля нагревается с беспрецедентной скоростью в течение последние 10,000 1 лет [XNUMX].

В этом посте мы используем новые геопространственные возможности Amazon SageMaker для мониторинга засухи, вызванной изменением климата в озере Мид. Озеро Мид является крупнейшим водохранилищем в США. Он снабжает водой 25 миллионов человек в штатах Невада, Аризона и Калифорния [2]. Исследования показывают, что уровень воды в озере Мид находится на самом низком уровне с 1937 года [3]. Мы используем геопространственные возможности SageMaker для измерения изменений уровня воды в озере Мид с помощью спутниковых снимков.

Доступ к данным

Новые геопространственные возможности в SageMaker обеспечивают легкий доступ к геопространственным данным, таким как Sentinel-2 и Landsat 8. Встроенный доступ к наборам геопространственных данных экономит недели усилий, которые в противном случае были бы потрачены на сбор данных от различных поставщиков данных и поставщиков.

Сначала мы будем использовать записную книжку Amazon SageMaker Studio с геопространственным изображением SageMaker, выполнив шаги, описанные в Начало работы с геопространственными возможностями Amazon SageMaker. Мы используем блокнот SageMaker Studio с геопространственным изображением SageMaker для нашего анализа.

Блокнот, использованный в этом посте, можно найти в amazon-sagemaker-примеры Репозиторий GitHub. SageMaker geospatial делает запрос данных чрезвычайно простым. Мы будем использовать следующий код, чтобы указать местоположение и временные рамки для спутниковых данных.

В следующем фрагменте кода мы сначала определяем 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
)

Мы можем убедиться, что область, отмеченная как вода (ярко-желтая на следующей карте), точно соответствует водоему в озере Мид, изменив непрозрачность выходного слоя.

Мониторинг засухи на озере Мид с использованием новых геопространственных возможностей Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Пост-анализ

Далее мы используем export_earth_observation_job для экспорта результатов EOJ в корзину Amazon Simple Storage Service (Amazon S3). Затем мы запускаем последующий анализ данных в Amazon S3, чтобы рассчитать площадь поверхности воды. Функция экспорта позволяет удобно обмениваться результатами между командами. SageMaker также упрощает управление наборами данных. Мы можем просто поделиться результатами EOJ, используя задание 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 с помощью пакета Tifffile. Создатель мудрецов Geospatial 1.0 Ядро также включает в себя другие широко используемые библиотеки, такие как GDAL и Rasterio.

Каждый пиксель в маске земного покрова имеет значение от 0 до 11. Каждое значение соответствует определенному классу земного покрова. Индекс класса воды равен 6. Мы можем использовать этот индекс класса для извлечения водной маски. Сначала мы подсчитываем количество пикселей, помеченных как вода. Затем мы умножаем это число на площадь, которую покрывает каждый пиксель, чтобы получить площадь поверхности воды. В зависимости от каналов пространственное разрешение изображения Sentinel-2 L2A составляет 10m, 20 mИли 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%.Мониторинг засухи на озере Мид с использованием новых геопространственных возможностей Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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 теперь поддерживает геопространственное машинное обучение (МО), упрощая специалистам по данным и инженерам по машинному обучению создание, обучение и развертывание моделей с использованием геопространственных данных. В этом посте мы показали, как получать данные, выполнять анализ и визуализировать изменения с помощью геопространственных сервисов SageMaker AI/ML. Вы можете найти код для этого поста в amazon-sagemaker-примеры Репозиторий 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. Его текущая область исследований включает компьютерное зрение и эффективное обучение моделей. В свободное время он любит бегать, играть в баскетбол и проводить время со своей семьей.

Анируд Вишванатан является старшим менеджером по продуктам, техническим специалистам по внешним услугам в группе геопространственного машинного обучения SageMaker. Он имеет степень магистра робототехники Университета Карнеги-Меллона, степень магистра делового администрирования Уортонской школы бизнеса и является изобретателем более 40 патентов. Увлекается бегом на длинные дистанции, посещением художественных галерей и бродвейских шоу.

Трентон Липскомб является главным инженером и частью команды, которая добавила геопространственные возможности в SageMaker. Он принимал участие в разработке решений для человека в цикле, работая над сервисами SageMaker Ground Truth, Augmented AI и Amazon Mechanical Turk.

Синцзянь Ши является старшим научным сотрудником и частью команды, которая добавила геопространственные возможности в SageMaker. Он также работает над глубоким обучением для наук о Земле и мультимодальным AutoML.

Ли Эрран Ли является менеджером по прикладным наукам в сервисах humain-in-the-loop, AWS AI, Amazon. Его исследовательские интересы включают глубокое 3D-обучение, а также обучение зрению и репрезентации языка. Ранее он был старшим научным сотрудником Alexa AI, главой отдела машинного обучения Scale AI и главным научным сотрудником Pony.ai. До этого он работал с командой восприятия в Uber ATG и командой платформы машинного обучения в Uber, работая над машинным обучением для автономного вождения, системами машинного обучения и стратегическими инициативами ИИ. Он начал свою карьеру в Bell Labs и был адъюнкт-профессором Колумбийского университета. Он преподавал учебные пособия на ICML'17 и ICCV'19, а также был соорганизатором нескольких семинаров в NeurIPS, ICML, CVPR, ICCV по машинному обучению для автономного вождения, трехмерному зрению и робототехнике, системам машинного обучения и противоборствующему машинному обучению. Он имеет докторскую степень в области компьютерных наук в Корнельском университете. Он является научным сотрудником ACM и IEEE.

Отметка времени:

Больше от Машинное обучение AWS