今天来简单分享下如何在GEE中利用Satellite Embedding V1数据进行随机森林分类

Satellite Embedding V1数据集介绍

这个数据集的介绍很多公众号都介绍过,我就不再一一赘述了。简单讲Google Satellite Embedding 数据集是一个全球性的、可用于分析的地理空间嵌入学习集合。此数据集中的每个 10 米像素都是一个 64 维表示形式,或“嵌入向量”,用于编码单个日历年内各种地球观测仪器和数据集在相应像素及其周围测量的地表条件的时间轨迹。与波段对应于物理测量的传统光谱输入和指数不同,嵌入是特征向量,以不太直观但更强大的方式总结多源、多模态观测结果之间的关系。(ps:说实话:这段话我不太懂)最后查了查,他就是将一年的多源卫星数据压缩到每个 10 米像素中,从而实现更快、更强大的地理空间分析。所以他只能筛选年为单位的数据(ps:我自己理解的哈)。

该数据集涵盖陆地表面和浅水区,包括潮间带和珊瑚礁带、内陆水道和沿海水道。极地地区的覆盖范围受卫星轨道和仪器覆盖范围的限制。

该数据集包含的图片覆盖了大约 163,840 米 x 163,840 米的区域,每张图片有 64 个波段 {A00, A01, …, A63},对应于 64 维嵌入空间的每个轴。

嵌入向量的长度为单位长度,这意味着它们的模为 1,不需要任何额外的归一化处理,并且分布在单位球体上,因此非常适合与聚类算法和基于树的分类器搭配使用。嵌入空间在不同年份之间也保持一致,并且可以通过考虑两个嵌入向量之间的点积或角度,将不同年份的嵌入用于条件变化检测。此外,这些嵌入还具有线性可组合性,也就是说,它们可以聚合以生成空间分辨率较低的嵌入,也可以通过向量算术进行转换,但仍会保留其语义含义和距离关系。

卫星嵌入数据集由 Alpha Earth Foundations 生成,这是一个地理空间嵌入模型,可同化多个数据流,包括光学、雷达、LiDAR 和其他来源。该模型整合了来自不同地理空间信息来源的观测数据,包括Sentinel-2和Landsat卫星的光学和热成像图像、可穿透云层的雷达数据、地表特性的 3D 测量数据、全球高程模型、气候信息、重力场以及描述性文本。与传统的深度学习模型不同,传统的深度学习模型需要用户在高端计算机集群上微调权重并自行运行推理,Alpha Earth Foundations旨在生成信息丰富的 64 维地理空间“嵌入”,适用于 Earth Engine 内置的机器学习分类器和其他基于像素的分析。

由于表示形式是通过多个传感器和图像学习的,因此嵌入表示形式通常可以克服云、扫描线、传感器伪影或数据缺失等常见问题,从而提供可直接用于分类、回归和变化检测分析的无缝分析就绪型特征,以替代其他地球观测图像源。嵌入层已准备好进行分析;无需大气校正、云层遮罩、光谱变换、斑点滤波或其他特征化技术——只需减少影像处理工作量。

嵌入向量指的是什么

Alpha Earth Foundations生成的地理空间嵌入是从 Earth Engine 数据目录和地理时间定位文本标签等不同数据源中学习而来的。该模型采用自监督方法,可以同时从多种类型的数据中学习,而无需手动注释的训练数据。通过吸收来自多个来源和描述模式的信息,包括Sentinel-1 C 波段 SAR、多光谱Sentinel-2以及来自Landsat 8和Landsat 9 的多光谱、全色和热观测、 GEDI 栅格冠层高度指标、GLO-30 DEM、ERA5-Land 再分析月度聚合、ALOS PALSAR-2 ScanSAR、GRACE 月度质量网格和多个文本来源,Alpha Earth Foundations 能够学习更紧凑的像素属性和语义表示。(其实就是AI帮我们选了样本点,直接转换成特征向量)

Alpha Earth Foundations 基于从全球超过 500 万个地点采样的超过 30 亿个独立图像帧进行训练。通过将特定地点随时间变化的卫星图像视为视频帧,该模型能够跨空间、时间和测量模式进行学习,从而生成能够捕捉空间背景并保留时间轨迹的嵌入向量。

64维地球:坐标和波段

卫星嵌入数据集中的图像有64 个波段,但它们与经典的光学反射或雷达回波不同。相反,我们的 AlphaEarth Foundations 嵌入中单个像素的 64 个“波段”代表 64 维“球体”表面上的 64 维坐标。类似于我们需要纬度、经度和海拔来最准确地描述我们在地球表面的位置,我们需要 AlphaEarth Foundations 表示的所有 64 个轴来精确定义卫星嵌入坐标——嵌入是通过深度学习模型学习而来的。

应用方面

  • 相似性搜索:可以在地球上的任何地方选择一个点 - 例如,在特定类型的农田或森林中 - 然后立即找到并绘制世界上任何地方具有相似表面和环境条件的所有其他位置。
  • 变化检测:通过比较不同年份的同一像素的嵌入向量,可以轻松发现变化并跟踪城市扩张、野火影响和恢复以及水库水位波动等过程。
  • 自动聚类:无需任何预先存在的标签,可以使用聚类算法自动将像素分组到不同的类别中。这种时空分割可以揭示景观中隐藏的模式,区分不同类型的森林、土壤或城市发展。(非监督分类)
  • 更智能的分类:可以用更少的训练数据创建精确的地图。例如,与使用更传统的输入来绘制作物类型地图相比,可能只需要每个类别几百个标记点,从而节省时间和计算量。(监督分类)

参考文章:

https://medium.com/google-earth/ai-powered-pixels-introducing-googles-satellite-embedding-dataset-31744c1f4650

那么接下来我们就用这个数据集做一下随机森林分类,然后用之前GEE做的分类,对比一下两者的精度吧。在之前的代码上改的:

Google Earth Engine(GEE)随机森林分类

2.GEE实现代码:

首先确定研究区和使用的数据集我选择的研究区为上次写的宁夏的部分区域,使用的数据集为

LANDSAT/LC08/C02/T1_L2

以下是实现代码:

var roi = ee.Geometry.Polygon(        [[[105.76168216373424, 38.90136066495491],          [105.76168216373424, 37.81375799864711],          [106.89327396060924, 37.81375799864711],          [106.89327396060924, 38.90136066495491]]], null, false);Map.centerObject(roi,10)

var year = 2021;var startDate = ee.Date.fromYMD(year, 1, 1);var endDate = startDate.advance(1, 'year');// 定义一个对 Landsat 8 表面反射率图像进行缩放和遮罩的函数。function prepSrL8(image) {  // Develop masks for unwanted pixels (fill, cloud, cloud shadow).  var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);  var saturationMask = image.select('QA_RADSAT').eq(0);
  // Apply the scaling factors to the appropriate bands.  var getFactorImg = function(factorNames) {    var factorList = image.toDictionary().select(factorNames).values();    return ee.Image.constant(factorList);  };  var scaleImg = getFactorImg([    'REFLECTANCE_MULT_BAND_.|TEMPERATURE_MULT_BAND_ST_B10']);  var offsetImg = getFactorImg([    'REFLECTANCE_ADD_BAND_.|TEMPERATURE_ADD_BAND_ST_B10']);  var scaled = image.select('SR_B.|ST_B10').multiply(scaleImg).add(offsetImg);
  // Replace original bands with scaled bands and apply masks.  return image.addBands(scaled, null, true)    .updateMask(qaMask).updateMask(saturationMask);}
var landsat8col = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')                  .filterDate(startDate, endDate)                  .filterBounds(roi)                  .filter(ee.Filter.lte('CLOUD_COVER',5))//云量设置                  .map(prepSrL8)                  .median();var clip_L8_ = landsat8col.clip(roi)Map.addLayer(clip_L8_,             {bands: ['SR_B5', 'SR_B4', 'SR_B3'], min: 0, max: 0.25},             '假彩色');var bands = ['SR_B2', 'SR_B3', 'SR_B4', 'SR_B5',             'SR_B6', 'SR_B7'];var clip_L8_ = landsat8col.clip(roi)
var train = Crop.merge(grassland).merge(Forest).merge(Urban).merge(Water).merge(Bareland);// Merge the collected training samples});

首先利用已有的样本点,嵌入

GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL向量

//样本嵌入向量var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL'); 
var embeddingsFiltered = embeddings  .filter(ee.Filter.date(startDate, endDate))  .filter(ee.Filter.bounds(roi));
var embeddingsImage = embeddingsFiltered.mosaic();
// 将样本叠加在图像上以获取训练数据。var EMtraining = embeddingsImage.sampleRegions({  collection: train,   properties: ['class'],   scale: 10});

// 随机森林训练分类器。var EMclassifier = ee.Classifier.smileRandomForest(50)    .train({      features: EMtraining,       classProperty: 'class',       inputProperties: embeddingsImage.bandNames()    });// 对卫星嵌入马赛克进行分类// ********************************************************
var emclassified = embeddingsImage.classify(EMclassifier);print(emclassified,'embeddingsclassified')Map.addLayer(emclassified.clip(roi),{min: 1, max: 6, palette: ['c0c220','26ff4a','7eff8d','ff4e28','319599',"989990"]},  'embeddingsclassifiedRF');

之后就是计算混淆矩阵,计算总体分类精度和kappa系数了

var trainingData = train.randomColumn('random')
var sample_training = trainingData.filter(ee.Filter.lte("random", 0.8));var sample_validate  = trainingData.filter(ee.Filter.gt("random", 0.8));Map.addLayer(sample_training,{color:'red'},'分类样本')Map.addLayer(sample_validate,{color:'blue'},'验证样本')
// 利用样本点拾取特征值用于模型训练和验证
var training = clip_L8_.sampleRegions({  collection: sample_training,   properties: ["class"],   scale: 30,  tileScale:16});
var validation = clip_L8_.sampleRegions({  collection: sample_validate,   properties: ["class"],   scale: 30,  tileScale:16});
var classifier = ee.Classifier.smileRandomForest(50)    .train({      features: training,       classProperty: 'class',       inputProperties: clip_L8_.bandNames()    });
var Classified_RF = clip_L8_ .classify(classifier).byte();print(Classified_RF,'RF')var dict = classifier.explain();
var variable_importance = ee.Feature(null, ee.Dictionary(dict).get('importance'));
Map.addLayer(Classified_RF.clip(roi),{min: 1, max: 6, palette: ['c0c220','26ff4a','7eff8d','ff4e28','319599',"989990"]},  'classified_RF');// 混淆矩阵法var validated = validation.classify(classifier);// 混淆矩阵var testAccuracy = validated.errorMatrix('class', 'classification');// 总体分类精度var accuracy = testAccuracy.accuracy();// 用户分类精度var userAccuracy = testAccuracy.consumersAccuracy();// 生产者精度var producersAccuracy = testAccuracy.producersAccuracy();// Kappa系数var kappa = testAccuracy.kappa();
print('RF混淆矩阵:', testAccuracy);//print('RF用户分类精度:', userAccuracy);//用户分类精度print('RF生产者精度:', producersAccuracy);//生产者精度print('RF总体分类精', accuracy);//总体分类精度print('RFKappa:', kappa);

结果显示:

2021年RF分类结果

2021年Satellite Embedding V1分类结果

2021年研究区真彩色影像

2021年RF分类精度

2021年RFSatellite Embedding分类精度

代码完整链接请在微信公众号后台私信

0923Satellite Embedding V1数据进行随机森林分类

感谢关注,欢迎转发!

声明:仅供学习使用!

希望关注的朋友们转发,如果对你有帮助的话记得给小编点个赞或者在看


Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐