Google 的 AlphaEarth Foundations 是一种地理空间嵌入模型,使用各种地球观测 (EO) 数据集进行训练。该模型已在年度时序图像上运行,生成的嵌入内容可作为 Earth Engine 中可供分析的数据集使用。借助此数据集,用户可以构建任意数量的微调应用或其他任务,而无需运行计算成本高昂的深度学习模型。最终获得的是一个通用数据集,可用于许多不同的下游任务,例如
- 分类
- 回归
- 变更检测
- 相似性搜索
在本教程中,我们将了解嵌入的运作方式,并学习如何访问和直观呈现卫星嵌入数据集。
了解嵌入
嵌入是一种将大量信息压缩为一组较小的特征的方法,这些特征代表有意义的语义。AlphaEarth Foundations 模型会获取来自传感器(包括 Sentinel-2、Sentinel-1 和 Landsat)的时间序列图像,并学习如何仅使用 64 个数字来唯一表示来源和目标之间的互信息(如需了解详情,请参阅论文)。输入数据流包含来自多个传感器的大量图像波段,模型会获取此高维输入并将其转换为低维表示形式。
若要了解 AlphaEarth Foundations 的运作方式,可以参考一种称为主成分分析 (PCA) 的技术。PCA 还有助于降低机器学习应用的数据维度。虽然 PCA 是一种统计技术,可以将数十个输入波段压缩为少数几个主成分,但 AlphaEarth Foundations 是一种深度学习模型,可以处理数千个输入维度的多传感器时间序列数据集,并学习创建 64 波段表示,从而以独特的方式捕获相应像素的空间和时间可变性。
嵌入字段是学习到的嵌入的连续数组或“字段”。嵌入字段集合中的图片表示覆盖整个一年的时空轨迹,并具有 64 个波段(每个嵌入维度一个波段)。
图:从嵌入字段中抽样的 n 维嵌入向量
访问卫星嵌入数据集
卫星嵌入数据集是一个图片集合,其中包含 2017 年至今的年度图片(例如,2017 年、2018 年、2019 年…)。每张图片都有 64 个波段,其中每个像素都是表示给定年份多传感器时间序列的嵌入向量。
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
选择区域
我们先来定义一个感兴趣的区域。在本教程中,我们将选择印度克里希纳拉贾萨加拉 (KRS) 水库附近的区域,并将多边形定义为几何变量。或者,您也可以使用代码编辑器中的绘图工具在感兴趣的区域周围绘制一个多边形,该多边形将作为 geometry
变量保存在“导入”中。
// Use the satellite basemap
Map.setOptions('SATELLITE');
var geometry = ee.Geometry.Polygon([[
[76.3978, 12.5521],
[76.3978, 12.3550],
[76.6519, 12.3550],
[76.6519, 12.5521]
]]);
Map.centerObject(geometry, 12);
图:选择感兴趣的区域
准备卫星嵌入数据集
每年的图片都会拆分为图块,以便于访问。我们应用过滤条件,找到所选年份和区域的图片。
var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
var filteredEmbeddings = embeddings
.filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.bounds(geometry));
卫星嵌入图片会网格化为最大尺寸为 163,840 米 x 163,840 米的图块,并以图块的 UTM 带区投影进行提供。这样一来,我们便可获得覆盖感兴趣区域的多个卫星嵌入图块。我们可以使用 mosaic()
函数将多个图块合并为一张图片。我们来打印生成的图片,看看这些条带。
var embeddingsImage = filteredEmbeddings.mosaic();
print('Satellite Embedding Image', embeddingsImage);
您会看到该图片有 64 个波段,分别命名为 A00、A01、…、A63。每个频段都包含相应维度或轴上指定年份的嵌入向量值。与光谱波段或指数不同,各个波段没有独立的含义,而是表示嵌入空间的一个轴。您将使用所有 64 个频段作为下游应用的输入。
图:卫星嵌入图像的 64 个波段
直观呈现卫星嵌入数据集
正如我们刚才所见,我们的图片包含 64 个波段。由于我们一次只能查看三个频段的组合,因此无法轻松直观地呈现所有频段中包含的所有信息。
我们可以选择任意三个波段,将嵌入空间的三个轴可视化为 RGB 图像。
var visParams = {min: -0.3, max: 0.3, bands: ['A01', 'A16', 'A09']};
Map.addLayer(embeddingsImage.clip(geometry), visParams, 'Embeddings Image');
图:嵌入空间的 3 个轴的 RGB 可视化
另一种直观呈现此信息的方式是,使用它来对具有相似嵌入的像素进行分组,并使用这些分组来了解模型如何学习景观的空间和时间可变性。
我们可以使用无监督聚类分析技术,将 64 维空间中的像素分组为具有相似值的组或“聚类”。为此,我们首先对一些像素值进行抽样,然后训练一个 ee.Clusterer
。
var nSamples = 1000;
var training = embeddingsImage.sample({
region: geometry,
scale: 10,
numPixels: nSamples,
seed: 100
});
print(training.first());
如果您打印第一个样本的值,您会看到它有 64 个频段值,用于定义相应像素的嵌入向量。嵌入向量的设计长度为单位长度(即从原点 (0,0,....0) 到向量值的向量长度为 1)。
图:提取的嵌入向量
现在,我们可以训练一个非监督式模型,将样本分组为所需数量的聚类。每个聚类都将代表具有相似嵌入的像素。
// Function to train a model for desired number of clusters
var getClusters = function(nClusters) {
var clusterer = ee.Clusterer.wekaKMeans({nClusters: nClusters})
.train(training);
// Cluster the image
var clustered = embeddingsImage.cluster(clusterer);
return clustered;
};
我们现在可以对较大的嵌入图片进行聚类,以查看具有相似嵌入的像素群组。在此之前,请务必了解模型已捕获一年中每个像素的完整时间轨迹 - 这意味着,如果两个像素在所有图片中具有相似的光谱值,但时间不同,则可以将其分开。
下图直观展示了 2024 年云掩蔽 Sentinel-2 图像所捕获的感兴趣区域。请注意,所有图片(包括来自 Sentinel-2、Landsat 8/9 和许多其他传感器的图片)都已用于学习最终的嵌入内容。
图:我们区域的 Sentinel-2 年度时间序列
我们来直观呈现卫星嵌入图片,将景观分割为 3 个聚类,
var cluster3 = getClusters(3);
Map.addLayer(cluster3.randomVisualizer().clip(geometry), {}, '3 clusters');
图:包含 3 个聚类的卫星嵌入图片
您会发现,生成的聚类具有非常清晰的边界。这是因为嵌入本身就包含空间背景信息,同一对象内的像素应具有相对相似的嵌入向量。此外,其中一个聚类包含主水库周围有季节性水域的区域。这是因为嵌入向量中捕获了时间背景信息,因此我们可以检测到具有相似时间模式的像素。
我们来看看能否通过将像素分组为 5 个聚类来进一步细化聚类。
var cluster5 = getClusters(5);
Map.addLayer(cluster5.randomVisualizer().clip(geometry), {}, '5 clusters');
图:包含 5 个聚类的卫星嵌入图片
我们可以继续操作,通过增加聚类数量,将图片细化为更专业的群组。下图显示了 10 个聚类的效果。
var cluster10 = getClusters(10);
Map.addLayer(cluster10.randomVisualizer().clip(geometry), {}, '10 clusters');
图:包含 10 个聚类的卫星嵌入图片
现在出现了许多细节,我们可以看到不同类型的农作物被归入不同的聚类。由于卫星嵌入可捕获作物物候以及气候变量,因此非常适合用于作物类型映射。在下一个教程(无监督分类)中,我们将了解如何使用卫星嵌入数据创建作物类型地图,而无需或只需少量田块级标签。