使用 Amazon SageMaker 地理空间功能检测和高频监测甲烷排放点源
甲烷(CH4)是一种主要的人为温室气体,是石油和天然气开采、煤炭开采、大规模动物养殖和废物处理等来源的副产品。甲
尽早发现和持续监测甲烷源是对甲烷采取有意义行动的关键组成部分,因此已成为决策者和组织都关注的问题。大规模实施经济实惠、有效的甲烷检测解决方案,例如现场甲烷探测器或
在这篇博客文章中,我们将向您展示如何使用
传统上,进行复杂的地理空间分析是一项困难、耗时和资源密集型的工作。 Ama@@
使用多光谱卫星图像对甲烷点源进行遥感
基于卫星的甲烷传感方法通常依赖于甲烷的独特透射率特性。在可见光谱中,CH4 的透射率值等于或接近 1,这意味着肉眼无法检测到。但是,在某些波长下,甲烷确实会吸收光线(透射率<1),这一特性可以用于探测目的。为此,通常选择短波长红外 (SWIR) 光谱(1500—2500 nm 光谱范围),这是最容易检测到甲烷的地方。超光谱和多光谱卫星任务(即使用光学仪器捕获电磁频谱多个波长范围(波段)内的图像数据的任务)涵盖这些短波红外范围,因此是潜在的探测仪器。
图 1 — SWIR 光谱和 Sentinel-2 多光谱任务覆盖范围中甲烷的透射率特性
许多多谱段卫星任务要么受到重访频率低(例如,
我们在本篇博文中实现的检测方法结合了这两种方法。我们借鉴了
其中 ² 是 Sentinel-2 测量的 TOA 反射率,c 监视器 和 c base 是通过将整个场景中波段 12 的 TOA 反射值与波段 11 的 TOA 反射值进行回归计算得出的(即 q b11 = c * β b12)。 更多详情,请参阅这份关于通过
使用 SageMaker 地理空间功能实现甲烷检测算法
为了实现甲烷检测算法,我们在亚马逊 SageMaker Studio 中使用了 SageMaker 地理空间笔记本。地理空间笔记本内核预装了基本的地理空间库,例如
searchRasterDataCollection
依赖于以下输入参数:
-
Arn
:查询的栅格数据集合的亚马逊资源名称 (ARN) -
areaoFinterest
:代表搜索查询感兴趣区域的多边形对象(采用 GeoJSON 格式) -
timeRangeFilter
:定义感兴趣的时间范围,表示为
{startTime:,endTime:}
-
Property
Filters :还可以纳入补充属性过滤器,例如最大可接受云量的规范
此方法支持从各种栅格数据源进行查询,可以通过调用
我们的甲烷探测实现使用
此 ARN 代表 Sentinel-2 图像,该图像已处理到 2A 级(表面反射率,经过大气校正)。出于甲烷探测的目的,我们将使用大气顶部 (TOA) 反射率数据(1C 级),其中不包括表面水平的大气校正,这些校正会使气溶胶成分和密度的变化(即甲烷泄漏)无法检测到。
为了识别来自特定点源的潜在排放,我们需要两个输入参数:可疑点源的坐标和甲烷排放监测的指定时间戳。 鉴于
searchRasterDataCollection
API 使用多边形或多面体来定义感兴趣区域 (AOI),我们的方法包括先将点坐标扩展为边界框,然后使用该多边形使用 SearchRasterDateCollection 查询 Sentinel-2 图像。
在此示例中,我们监测了源自北非油田的已知甲烷泄漏事件。这是遥感文献中的标准验证案例,例如
我们首先初始化示例案例的坐标和目标监控日期。
#coordinates and date for North Africa oil field
#see here for reference: https://doi.org/10.5194/amt-14-2771-2021
point_longitude = 5.9053
point_latitude = 31.6585
target_date = '2019-11-20'
#size of bounding box in each direction around point
distance_offset_meters = 1500
以下代码片段为给定的点坐标生成边界框,然后根据边界框和指定的监控日期搜索可用的 Sentinel-2 图像:
def bbox_around_point(lon, lat, distance_offset_meters):
#Equatorial radius (km) taken from https://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html
earth_radius_meters = 6378137
lat_offset = math.degrees(distance_offset_meters / earth_radius_meters)
lon_offset = math.degrees(distance_offset_meters / (earth_radius_meters * math.cos(math.radians(lat))))
return geometry.Polygon([
[lon - lon_offset, lat - lat_offset],
[lon - lon_offset, lat + lat_offset],
[lon + lon_offset, lat + lat_offset],
[lon + lon_offset, lat - lat_offset],
[lon - lon_offset, lat - lat_offset],
])
#generate bounding box and extract polygon coordinates
aoi_geometry = bbox_around_point(point_longitude, point_latitude, distance_offset_meters)
aoi_polygon_coordinates = geometry.mapping(aoi_geometry)['coordinates']
#set search parameters
search_params = {
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/nmqj48dcu3g7ayw8", # Sentinel-2 L2 data
"RasterDataCollectionQuery": {
"AreaOfInterest": {
"AreaOfInterestGeometry": {
"PolygonGeometry": {
"Coordinates": aoi_polygon_coordinates
}
}
},
"TimeRangeFilter": {
"StartTime": "{}T00:00:00Z".format(as_iso_date(target_date)),
"EndTime": "{}T23:59:59Z".format(as_iso_date(target_date))
}
},
}
#query raster data using SageMaker geospatial capabilities
sentinel2_items = geospatial_client.search_raster_data_collection(**search_params)
响应包含匹配的 Sentinel-2 项目及其相应元数据的列表。其中包括 适用于所有
如前所述,我们的探测方法依赖于大气顶部 (TOA) SWIR 反射率的部分变化。要使之奏效,确定良好的基准至关重要。寻找良好的基准可能很快就会成为一个繁琐的过程,需要进行大量的反复试验。但是,良好的启发式方法可以大大促进搜索过程的自动化。以下是对过去调查过的案例非常有效的搜索启发式方法:在过去的 day_offset=n
天内,检索所有卫星图像,移除所有云层,然后将图像剪辑到 AOI 范围内。然后计算 AOI 上的平均波段 12 反射率。返回波段 12 中平均反射率最高的图像的 Sentinel 图块 ID。
此逻辑在以下代码摘录中实现。其理由取决于波段12对甲烷吸收高度敏感的事实(见图 1)。平均反射率值越大,甲烷排放等来源的吸收率越低,因此为无排放基线场景提供了有力的指示。
def approximate_best_reference_date(lon, lat, date_to_monitor, distance_offset=1500, cloud_mask=True, day_offset=30):
#initialize AOI and other parameters
aoi_geometry = bbox_around_point(lon, lat, distance_offset)
BAND_12_SWIR22 = "B12"
max_mean_swir = None
ref_s2_tile_id = None
ref_target_date = date_to_monitor
#loop over n=day_offset previous days
for day_delta in range(-1 * day_offset, 0):
date_time_obj = datetime.strptime(date_to_monitor, '%Y-%m-%d')
target_date = (date_time_obj + timedelta(days=day_delta)).strftime('%Y-%m-%d')
#get Sentinel-2 tiles for current date
s2_tiles_for_target_date = get_sentinel2_meta_data(target_date, aoi_geometry)
#loop over available tiles for current date
for s2_tile_meta in s2_tiles_for_target_date:
s2_tile_id_to_test = s2_tile_meta['Id']
#retrieve cloud-masked (optional) L1C band 12
target_band_data = get_s2l1c_band_data_xarray(s2_tile_id_to_test, BAND_12_SWIR22, clip_geometry=aoi_geometry, cloud_mask=cloud_mask)
#compute mean reflectance of SWIR band
mean_swir = target_band_data.sum() / target_band_data.count()
#ensure the visible/non-clouded area is adequately large
visible_area_ratio = target_band_data.count() / (target_band_data.shape[1] * target_band_data.shape[2])
if visible_area_ratio <= 0.7: #<-- ensure acceptable cloud cover
continue
#update maximum ref_s2_tile_id and ref_target_date if applicable
if max_mean_swir is None or mean_swir > max_mean_swir:
max_mean_swir = mean_swir
ref_s2_tile_id = s2_tile_id_to_test
ref_target_date = target_date
return (ref_s2_tile_id, ref_target_date)
使用这种方法,我们可以估算出合适的基准日期和相应的 Sentinel-2 图块 ID。Sentinel-2 图块 ID 包含任务 ID(Sentinel-2A/Sentinel-2B)、唯一图块编号(例如 32SKA)和图像拍摄日期等信息,可以唯一标识观测点(即场景)。在我们的示例中,近似过程表明,2019年10月6日(Sentinel-2方块: S2B_32SKA_20191006_0_L2A
)是最合适的候选基线。
接下来,我们可以计算出基准日期和要监控的日期之间反射率的修正部分变化。校正系数 c(参见前面的方程 1)可以使用以下代码计算:
def compute_correction_factor(tif_y, tif_x):
#get flattened arrays for regression
y = np.array(tif_y.values.flatten())
x = np.array(tif_x.values.flatten())
np.nan_to_num(y, copy=False)
np.nan_to_num(x, copy=False)
#fit linear model using least squares regression
x = x[:,np.newaxis] #reshape
c, _, _, _ = np.linalg.lstsq(x, y, rcond=None)
return c[0]
方程 1 的完整实现见以下代码片段:
def compute_corrected_fractional_reflectance_change(l1_b11_base, l1_b12_base, l1_b11_monitor, l1_b12_monitor):
#get correction factors
c_monitor = compute_correction_factor(tif_y=l1_b11_monitor, tif_x=l1_b12_monitor)
c_base = compute_correction_factor(tif_y=l1_b11_base, tif_x=l1_b12_base)
#get corrected fractional reflectance change
frac_change = ((c_monitor*l1_b12_monitor-l1_b11_monitor)/l1_b11_monitor)-((c_base*l1_b12_base-l1_b11_base)/l1_b11_base)
return frac_change
最后,我们可以将上述方法整合到一个端到端的例程中,该例程可以识别给定经度和纬度的 AOI,监控日期和基线方块,获取所需的卫星图像,并执行分数反射率变化计算。
def run_full_fractional_reflectance_change_routine(lon, lat, date_monitor, baseline_s2_tile_id, distance_offset=1500, cloud_mask=True):
#get bounding box
aoi_geometry = bbox_around_point(lon, lat, distance_offset)
#get S2 metadata
s2_meta_monitor = get_sentinel2_meta_data(date_monitor, aoi_geometry)
#get tile id
grid_id = baseline_s2_tile_id.split("_")[1]
s2_tile_id_monitor = list(filter(lambda x: f"_{grid_id}_" in x["Id"], s2_meta_monitor))[0]["Id"]
#retrieve band 11 and 12 of the Sentinel L1C product for the given S2 tiles
l1_swir16_b11_base = get_s2l1c_band_data_xarray(baseline_s2_tile_id, BAND_11_SWIR16, clip_geometry=aoi_geometry, cloud_mask=cloud_mask)
l1_swir22_b12_base = get_s2l1c_band_data_xarray(baseline_s2_tile_id, BAND_12_SWIR22, clip_geometry=aoi_geometry, cloud_mask=cloud_mask)
l1_swir16_b11_monitor = get_s2l1c_band_data_xarray(s2_tile_id_monitor, BAND_11_SWIR16, clip_geometry=aoi_geometry, cloud_mask=cloud_mask)
l1_swir22_b12_monitor = get_s2l1c_band_data_xarray(s2_tile_id_monitor, BAND_12_SWIR22, clip_geometry=aoi_geometry, cloud_mask=cloud_mask)
#compute corrected fractional reflectance change
frac_change = compute_corrected_fractional_reflectance_change(
l1_swir16_b11_base,
l1_swir22_b12_base,
l1_swir16_b11_monitor,
l1_swir22_b12_monitor
)
return frac_change
t ()
作为最后一步,我们提取已识别的甲烷羽流,并将其叠加在原始的 RGB 卫星图像上,以提供重要的地理背景。这是通过阈值来实现的,其实现方式如下所示:
def get_plume_mask(change_in_reflectance_tif, threshold_value):
cr_masked = change_in_reflectance_tif.copy()
#set values above threshold to nan
cr_masked[cr_masked > treshold_value] = np.nan
#apply mask on nan values
plume_tif = np.ma.array(cr_masked, mask=cr_masked==np.nan)
return plume_tif
就我们的案例而言,阈值为 -0.02 的反射率小数变化会产生不错的结果,但这可能会因场景而异,因此您必须针对您的特定用例进行校准。下面的图 4 说明了如何通过将 AOI 的原始卫星图像与被掩盖的羽流合并为显示甲烷羽流在其地理环境中的单个合成图像来生成羽流叠加层。
图 4 — RGB 图像、TOA 反射率(SWIR 光谱)的分数反射率变化以及 AOI 的甲烷羽流叠加
使用真实世界的甲烷排放事件进行解决方案验证
作为最后一步,我们将评估我们的方法是否能够正确检测和查明来自不同来源和地区的甲烷泄漏情况。首先,我们使用专为
我们的探测方法可以清楚地识别控制释放期间产生的羽流。来自东亚垃圾填埋场(左)或北美石油和天然气设施(右)等来源的其他已知现实世界泄漏事件(如下图6所示)也是如此。
总而言之,我们的方法可以帮助识别来自控制释放和全球各种现实世界点源的甲烷排放。这最适合周围植被有限的陆上点源。它不适用于海上场景,因为水对短
清理
为避免甲烷监测任务完成后产生不必要的费用,请确保终止 SageMaker 实例并删除所有不需要的本地文件。
结论
通过将 SageMaker 地理空间功能与开放的地理空间数据源相结合,您可以大规模实施自己的高度定制的远程监控解决方案。这篇博文重点关注甲烷检测,这是寻求检测并最终避免有害甲烷排放的政府、非政府组织和其他组织的重点领域。通过使用 SageMaker 地理空间内核启动笔记本并实现自己的检测解决方案,您可以立即开始自己的地理空间分析之旅。查看
作者简介
卡斯滕·施罗尔博士 是 AW S 的解决方案架构师。他支持客户利用数据和技术来推动其IT基础设施的可持续性,并构建云原生数据驱动的解决方案,从而在各自的垂直领域实现可持续运营。Karsten 在应用机器学习和运营管理领域攻读博士学位后加入 亚马逊云科技。他对以技术为基础的社会挑战解决方案充满热情,并且喜欢深入研究构成这些解决方案基础的方法和应用架构。
Janosch Woschitz 是 亚马逊云科技 的高级解决方案架构师,专门研究地理空间 AI/ML。凭借超过 15 年的经验,他支持全球客户利用 AI 和 ML 开发利用地理空间数据的创新解决方案。他的专业知识涵盖机器学习、数据工程和可扩展的分布式系统,再加上强大的软件工程背景和自动驾驶等复杂领域的行业专业知识。