1. 项目概述:GEE平台下的遥感地物分类实战
在遥感分析领域,Google Earth Engine(GEE)已经彻底改变了传统的工作流程。这个云端平台集成了PB级卫星影像数据和强大的计算能力,使得全球尺度的地物分类变得触手可及。我最近完成了一个典型的地物分类项目,重点识别水体和植被覆盖区域,过程中对比了随机森林、SVM等多种机器学习算法的表现。
与传统ENVI等桌面软件不同,GEE的最大优势在于:
- 免去了数据下载和本地处理的繁琐步骤
- 内置了从Landsat到Sentinel-2等主流遥感数据源
- 提供JavaScript和Python双API接口
- 支持分布式计算处理大范围区域
这个项目完整走通了从数据准备到结果输出的全流程,特别适合想要入门遥感AI分析的研究人员和工程师。下面我将详细拆解每个环节的技术要点和实操经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备与预处理
2.1 GEE数据源选择策略
在GEE中搜索"water"或"vegetation"会出现数十个相关数据集,选择时需考虑三个关键因素:
- 时空分辨率:水体识别推荐使用Sentinel-2 MSI(10米),植被分析可用Landsat 8/9(30米)
- 时间跨度:季节性水体需多年数据,常绿植被可缩短时间范围
- 云量筛选:添加
filterBounds()和filterDate()后务必用filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))
javascript复制// 典型数据加载示例
var sentinel2 = ee.ImageCollection('COPERNICUS/S2_SR')
.filterDate('2022-01-01', '2022-12-31')
.filterBounds(roi)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))
.median()
.clip(roi);
2.2 特征工程构建
地物分类效果70%取决于特征选择。除常规波段外,建议添加这些衍生特征:
- 水体指数:NDWI = (Green - NIR)/(Green + NIR)
- 植被指数:NDVI = (NIR - Red)/(NIR + Red)
- 纹理特征:使用
ee.Kernel.gaussian()计算GLCM纹理 - 地形特征:融合SRTM高程数据
javascript复制// 特征计算函数
function addIndices(img) {
var ndwi = img.normalizedDifference(['B3', 'B8']).rename('NDWI');
var ndvi = img.normalizedDifference(['B8', 'B4']).rename('NDVI');
return img.addBands(ndwi).addBands(ndvi);
}
2.3 样本数据集制作
样本质量直接决定模型上限。GEE中创建训练样本有三种方式:
- 手动绘制:使用
geometry工具直接标注 - 导入已有矢量:
ee.FeatureCollection加载Shapefile - 引用现有数据集:如
USGS/GFSAD1000_V0全球农田数据
关键技巧:各类别样本数量尽量均衡,水体/植被样本比例建议1:1到1:1.5之间。样本点应覆盖不同光照条件、季节变化和地形特征。
3. 机器学习模型实现
3.1 算法选型对比
在GEE中实现以下四种经典算法:
| 算法 | API调用 | 适用场景 | 调参重点 |
|---|---|---|---|
| 随机森林 | ee.Classifier.smileRandomForest() |
高维特征、非线性关系 | numberOfTrees, minLeafPopulation |
| SVM | ee.Classifier.libsvm() |
小样本、清晰边界 | kernelType, gamma |
| CART | ee.Classifier.smileCart() |
简单快速、可解释性 | minLeafPopulation |
| GTB | ee.Classifier.smileGradientTreeBoost() |
高精度需求 | shrinkage, samplingRate |
3.2 随机森林深度优化
随机森林在遥感分类中表现最为稳定,推荐配置:
javascript复制var classifier = ee.Classifier.smileRandomForest({
numberOfTrees: 100,
minLeafPopulation: 3,
bagFraction: 0.7,
seed: 42
});
// 训练模型
var trainedModel = classifier.train({
features: trainingData,
classProperty: 'class',
inputProperties: ['B2','B3','B4','B8','NDWI','NDVI']
});
重要参数说明:
numberOfTrees:超过100后收益递减minLeafPopulation:防止过拟合的关键参数bagFraction:样本采样比例,影响模型多样性
3.3 模型验证方法
GEE提供三种验证方式:
- 样本分拆:
trainingData.randomColumn()分割训练/验证集 - 交叉验证:手动实现k-fold
- 混淆矩阵:
errorMatrix计算OA、Kappa等指标
javascript复制// 典型验证流程
var validation = trainedModel.confusionMatrix({
truth: validationData,
actual: 'class',
predicted: 'classification'
});
print('Overall Accuracy:', validation.accuracy());
print('Kappa Coefficient:', validation.kappa());
4. 结果输出与应用
4.1 分类结果可视化
使用visualize()方法生成专题图时,注意色彩方案选择:
javascript复制// 分类结果渲染
var palette = {
'water': '1E90FF',
'vegetation': '32CD32',
'other': 'F5F5DC'
};
var result = image.classify(trainedModel);
Map.addLayer(result, {min: 0, max: 2, palette: Object.values(palette)}, 'Classification');
4.2 面积统计与变化检测
GEE强大的空间统计功能:
javascript复制// 计算各类别面积(平方米)
var areaStats = result.reduceRegion({
reducer: ee.Reducer.frequencyHistogram(),
geometry: roi,
scale: 10,
maxPixels: 1e13
});
// 转换为平方公里并打印
var waterArea = ee.Dictionary(areaStats.get('classification'))
.get('0')
.multiply(1e-6);
print('Water Area (km²):', waterArea);
4.3 结果导出策略
根据后续用途选择导出方式:
- GeoTIFF:
Export.image.toDrive() - 矢量边界:
reduceToVectors() - 直接使用:
getDownloadURL()
注意:导出大区域数据时,务必设置合适的
scale和maxPixels参数,避免内存溢出。
5. 实战经验与避坑指南
5.1 样本采集的黄金法则
- 空间分布:样本点应均匀分布在整个研究区
- 时间代表:跨季节样本对植被分类尤为重要
- 边界效应:各类别交界处需密集采样
- 质量控制:定期用
sample方法检查样本质量
5.2 特征选择的维度灾难
实测发现,当特征超过15个时,模型性能可能下降。推荐特征筛选方法:
- 相关性分析:
reduceRegion计算波段间相关性 - 重要性排序:随机森林的
explain方法 - 递归消除:逐步剔除贡献度低的特征
5.3 典型错误排查
-
分类结果全为某一类:
- 检查样本标签是否正确
- 验证特征数据是否有有效值
- 调整类别权重参数
-
模型训练报错:
- 确认所有特征为非空
- 检查样本属性名拼写
- 验证ROI范围有效性
-
导出结果异常:
- 检查坐标系设置
- 确认分辨率参数
- 验证存储权限
5.4 性能优化技巧
- 使用
clip提前限制处理范围 - 对大数据量采用
tileScale参数 - 优先选择
median()而非mosaic() - 利用
pyee库实现Python端批处理
这个项目让我深刻体会到,GEE+机器学习的组合正在 democratize 遥感分析。与传统方法相比,完成相同任务的时间从周级缩短到小时级。对于刚入门的同行,建议从Sentinel-2数据和小区域开始,逐步扩展到更复杂的应用场景。
