简介
Google 的 AlphaEarth Foundations 是一种地理空间嵌入模型,使用各种地球观测 (EO) 数据集进行训练。该模型已在年度时序图像上运行,生成的嵌入内容可作为 Earth Engine 中可供分析的数据集使用。借助此数据集,用户可以构建任意数量的微调应用或其他任务,而无需运行计算成本高昂的深度学习模型。最终获得的是一个通用数据集,可用于许多不同的下游任务,例如:土地分类、回归分析、变化监测和相似性分析!
卫星嵌入Satellite Embedding
嵌入是一种将大量信息压缩为一组较小的特征的方法,这些特征代表有意义的语义。AlphaEarth Foundations 模型会获取来自传感器(包括 Sentinel-2、Sentinel-1 和 Landsat)的时间序列图像,并学习如何仅使用 64 个数字来唯一表示来源和目标之间的互信息。输入数据流包含来自多个传感器的大量图像波段,模型会获取此高维输入并将其转换为低维表示形式。简而言之就是利用多源遥感数据进行的一个融合,最后后表征为一个低维度的向量。这里的姜维过程主要是通过PCA一个过程,一般我们在使用过PCA的时候,特别是在进行特征筛选的时候一般前三个就可以涵盖超过97%的特征
若要了解 AlphaEarth Foundations 的运作方式,可以参考一种称为主成分分析 (PCA) 的技术。PCA 还有助于降低机器学习应用的数据维度。虽然 PCA 是一种统计技术,可以将数十个输入波段压缩为少数几个主成分,但 AlphaEarth Foundations 是一种深度学习模型,可以处理数千个输入维度的多传感器时间序列数据集,并学习创建 64 波段表示,从而以独特的方式捕获相应像素的空间和时间可变性(目的)。
嵌入字段是学习到的嵌入的连续数组或“字段”。嵌入字段集合中的图片表示覆盖整个一年的时空轨迹,并具有 64 个波段(每个嵌入维度一个波段)。
从嵌入字段中抽样的 n 维嵌入向量
卫星嵌入数据集
每年的图片都会拆分为图块,以便于访问。我们应用过滤条件,找到所选年份和区域的图片。
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
卫星嵌入图片会网格化为最大尺寸为 163,840 米 x 163,840 米的图块,并以图块的 UTM 带区投影进行提供。这样一来,我们便可获得覆盖感兴趣区域的多个卫星嵌入图块。我们可以使用 mosaic() 函数将多个图块合并为一张图片。我们来打印生成的图片,看看这些条带。
提示: 使用 mosaic() 会丢失原始 UTM 投影,并且生成的图片将设置为默认投影(即比例为 1 度的 WGS84)。在大多数情况下,这都没问题,您可以在对数据进行抽样或导出结果时指定适合您所在区域的比例和投影。例如,如果您将 crs 指定为 EPSG:3857,并将 scale 指定为 10 米,Earth Engine 会将所有输入重新投影到该投影,并确保操作在该投影中进行。不过,在某些情况下(尤其是对于全球范围的分析,其中不存在理想的投影,并且您不希望地理 CRS 中存在像素),通过在集合上使用 map() 来利用内置的平铺结构可能更有效。这种方法保留了每个图块的原始 UTM 投影,可以产生更准确的结果。
这里我们在使用mosaic之后产生的结果,丢失了UTM投用,转化为WGS84
该图片有 64 个波段,分别命名为 A00、A01、…、A63。每个频段都包含相应维度或轴上指定年份的嵌入向量值。与光谱波段或指数不同,各个波段没有独立的含义,而是表示嵌入空间的一个轴。您将使用所有 64 个频段作为下游应用的输入。
直观呈现卫星嵌入数据集
正如我们刚才所见,我们的图片包含 64 个波段。由于我们一次只能查看三个频段的组合,因此无法轻松直观地呈现所有频段中包含的所有信息。
我们可以选择任意三个波段,将嵌入空间的三个轴可视化为 RGB 图像。
var visParams = {min: -0.3, max: 0.3, bands: ['A01', 'A16', 'A59']};Map.addLayer(embeddingsImage.clip(geometry), visParams, 'Embeddings Image');
另一种直观呈现此信息的方式是,使用它来对具有相似嵌入的像素进行分组,并使用这些分组来了解模型如何学习景观的空间和时间可变性。
我们可以使用无监督聚类分析技术,将 64 维空间中的像素分组为具有相似值的组或“聚类”。为此,我们首先对一些像素值进行抽样,然后训练一个 ee.Clusterer聚类训练。
var training = embeddingsImage.sample({
region: geometry,
scale: 10,
numPixels: 1000,
seed: 100});print(training.first());
如果打印第一个样本的值,您会看到它有 64 个频段值,用于定义相应像素的嵌入向量。嵌入向量的设计长度为单位长度(即从原点 (0,0,…0) 到向量值的向量长度为 1)。
在这里插入图片描述
我们可以训练一个非监督式模型,将样本分组为所需数量的聚类。每个聚类都将代表具有相似嵌入的像素。
// Function to train a model for desired number of clustersvar 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 和许多其他传感器的图片)都已用于学习最终的嵌入内容。
在这里插入图片描述
聚类:3分类
var cluster3 = getClusters(3);Map.addLayer(cluster3.randomVisualizer().clip(geometry), {}, '3 clusters');
在这里插入图片描述
生成的聚类具有非常清晰的边界。这是因为嵌入本身就包含空间背景信息,同一对象内的像素应具有相对相似的嵌入向量。此外,其中一个聚类包含主水库周围有季节性水域的区域。这是因为嵌入向量中捕获了时间背景信息,因此我们可以检测到具有相似时间模式的像素。
看看能否通过将像素分组为 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分类聚类效果
var cluster10 = getClusters(15);Map.addLayer(cluster10.randomVisualizer().clip(geometry), {}, ' 15 clusters');
15聚类后基本可以看出水域浅滩和季节性水位的差异
全部代码
卫星影像嵌入数据集分析与聚类
定义研究区域
// 定义多边形几何区域(青色边框,初始不显示)var geometry = ee.Geometry.Polygon(
[[[76.39785822673605, 12.55214289495541],
[76.39785822673605, 12.35501910277075],
[76.65191706462667, 12.35501910277075],
[76.65191706462667, 12.55214289495541]]], null, false);
数据准备
// 加载Google卫星影像嵌入数据集var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');// 设置卫星底图Map.setOptions('SATELLITE');// 将地图中心定位到研究区域,缩放级别12Map.centerObject(geometry, 12);// 准备2024年的卫星嵌入数据var year = 2024;var startDate = ee.Date.fromYMD(year, 1, 1); // 2024年1月1日var endDate = startDate.advance(1, 'year'); // 2025年1月1日// 过滤出2024年且在研究区域内的数据var filteredEmbeddings = embeddings .filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.bounds(geometry));// 将影像集合拼接为单幅影像var embeddingsImage = filteredEmbeddings.mosaic();// 打印嵌入影像信息print('卫星嵌入影像', embeddingsImage);
数据可视化
// 可视化参数设置:将嵌入空间的三个轴(A01,A16,A09)显示为RGBvar visParams = {min: -0.3, max: 0.3, bands: ['A01', 'A16', 'A09']};// 添加裁剪后的嵌入影像图层Map.addLayer(embeddingsImage.clip(geometry), visParams, '嵌入影像');
无监督聚类分析
// 创建训练数据集(1000个样本点)var nSamples = 1000;var training = embeddingsImage.sample({
region: geometry, // 采样区域
scale: 10, // 10米分辨率
numPixels: nSamples, // 样本数量
seed: 100 // 随机种子});print(training.first()); // 打印第一个样本点// 定义聚类函数(输入聚类数量,返回聚类结果)var getClusters = function(nClusters) {
// 使用Weka K-means算法创建聚类器
var clusterer = ee.Clusterer.wekaKMeans({nClusters: nClusters})
.train(training);
// 对整个影像进行聚类
var clustered = embeddingsImage.cluster(clusterer);
return clustered;};// 不同聚类数量的结果可视化var cluster3 = getClusters(3); // 3类聚类Map.addLayer(cluster3.randomVisualizer().clip(geometry), {}, '3类聚类结果');var cluster5 = getClusters(5); // 5类聚类Map.addLayer(cluster5.randomVisualizer().clip(geometry), {}, '5类聚类结果');var cluster10 = getClusters(10); // 10类聚类Map.addLayer(cluster10.randomVisualizer().clip(geometry), {}, '10类聚类结果');var cluster15 = getClusters(15); // 15类聚类Map.addLayer(cluster15.randomVisualizer().clip(geometry), {}, '15类聚类结果');
代码说明
研究区域:定义一个矩形区域(约76.4°E,12.4°N)
数据源:使用Google的年度卫星影像嵌入数据集(V1版本),包含多维特征空间
分析方法:
首先可视化原始嵌入空间的三个维度
然后使用K-means算法进行无监督聚类
比较不同聚类数量(3/5/10/15类)的结果
技术特点:
10米空间分辨率采样
Weka机器学习库的K-means实现
随机颜色可视化不同类别