基于AlphaEarth Embeddings的10米分辨率森林群落分类实践
先交代一下背景去年接了个林业类的制图需求需要在10米分辨率下把一个保护区的森林群落类型分布“画”出来。按老套路走了一遍监督分类结果针叶林、针阔混交林和落叶阔叶林之间混得一塌糊涂。后来换成以AlphaEarth Embeddings作为核心特征来驱动分类才把群落边界拉到可以交付的水平。这篇就把整个技术链路拆开讲清楚从特征原理、数据准备、分类流程到精度评估和踩坑记录全部按实操顺序来。想把这套方法搬到自己项目里的可以直接照着做。1. 为什么森林群落分类不能只靠原始光谱先说一个反直觉的事很多人觉得Sentinel-2有13个波段分辨率又到了10米做森林分类应该绰绰有余。但在“森林群落”这个尺度上光看波段反射率远远不够。1.1 传统光谱特征在群落尺度上的失效过程森林群落分类难在哪难在“种间差异小、种内差异大”。比如同样一片落叶阔叶林7月中旬和9月中旬的光谱曲线能差出半个“类别”的距离而同一季节下某些针叶树种的光谱反射率可能比同一张影像里不同龄组的阔叶树还要接近。再加上地形起伏带来的光照差异同一个树种长在阴坡和阳坡像元值能差出一大截。用原始波段做随机森林或者最大似然分类模型学到的往往是“光照分层”而不是“树种分层”。这就是为什么很多人做出来的森林分布图斑块边界跟等高线似的山顶一片色、山腰一片色、沟谷又一片色——那不是群落分布那是光照分区。传统的补救方法是加植被指数比如NDVI、EVI、红边指数。这些指数确实能在一定程度上压制光照影响但信息量有限。NDVI在高植被覆盖区很容易饱和森林群落的生物量到一定水平后再往上长NDVI基本不变了。红边指数好一些但它们本质上还是“波段组合”描述的是光谱曲线的形态而不是像元的完整语义上下文。纹理特征也常被用来救场GLCM纹理、灰度共生矩阵这些。可纹理计算对窗口大小非常敏感窗口小了噪声大窗口大了把边界抹平。而且纹理特征在不同影像、不同地形条件下的响应并不一致模型迁移性很差。1.2 AlphaEarth Embeddings到底在提取什么AlphaEarth Embeddings可以理解为一套遥感基础模型输出的“语义特征向量”。跟传统波段反射率相比它最大的区别在于波段反射率记录的是“这一个像元反射了多少光”而嵌入特征记录的是“这一个像元在这个空间上下文里像什么”。打个比方原始波段像是你看一张照片上的单个像素颜色而嵌入特征是让一个看过海量遥感影像的模型告诉你——以这个像元为中心的一整片区域大概率是什么地表形态、什么植被结构、处在什么环境背景里。具体实现上AlphaEarth Embeddings是基于大尺度遥感影像自监督预训练得到的编码器把影像块映射成一个高维向量。这个向量不是人手工设计的而是模型在海量样本上学出来的“通用地表特征表达”。做森林群落分类时模型输出的嵌入特征天然包含了光谱、纹理、空间上下文、甚至一些物候结构的抽象信息。有一点需要提前说明不同版本AlphaEarth的Embeddings输出维度和接口细节可能不完全一样实际使用时以你手上的版本为准。文章后半部分我会把流程性的东西讲清楚接口名和参数以你自己的套件为准即可思路不依赖具体版本。1.3 嵌入特征与传统特征的对比把常用的几类特征放在一张表里看优劣势就很明显了特征类型信息层次主要优势主要短板原始波段单像元光谱直接、物理意义明确易受地形光照干扰种间可分性差植被指数光谱组合形态可压制部分环境噪声高覆盖区易饱和信息量有限纹理特征局部窗口关系能表达空间异质性窗口参数敏感跨影像迁移差AlphaEarth Embeddings全局语义上下文信息密度高通用性强能描述“像什么”维度高需要一定计算资源黑盒特征可解释性弱从实践结果看嵌入特征在森林群落分类中的提升不是一点半点。后面会列出具体对比数据。1.4 10米分辨率的独特价值标题里特意写了10m这很重要。10米分辨率对应的是Sentinel-2的多光谱波段这个尺度对森林群落而言正处于一个很关键的区间——比30米Landsat能看见更多群落内部的边界细节又不至于像亚米级影像那样对单棵树产生过分的纹理噪声。在10米尺度下群落斑块的边界、林窗、林缘过渡带都能被比较清晰地表达出来。配合嵌入特征对上下文语义的建模分类结果在地理空间上的连续性也明显更好不会出现单像元椒盐噪声满天飞的情况。2. 数据准备底图、样本点与验证集的三张清单很多人在这一步栽跟头。特征再强数据准备阶段出了问题后面全白搭。2.1 Sentinel-2底图影像的获取与预处理要点获取Sentinel-2 L2A产品建议直接走官方渠道或者通过GEEGoogle Earth Engine批量筛选下载。筛选条件要注意几点云量控制在10%以下研究区域关键位置的云一定要彻底排除尤其是地形复杂的山区薄云和山体阴影经常混在一起难分辨。优先选择植被生长盛期的影像。北方温带地区一般选7月中旬到8月中旬这个时段阔叶树和针叶树的光谱差异最大南方常绿阔叶林区域可以考虑秋末或冬春季根据不同树种的物候窗口来确定。如果单景影像覆盖不全优先做多时相合成而不是硬拼接。取生长季内多期云掩膜后的中值合成可以在最大程度上消除残留云影点和单期异常值。预处理链路上我建议至少做这几步云掩膜、地形阴影遮蔽情况检查、20米波段重采样到10米。关于重采样要多说一句Sentinel-2原生10米波段是B2、B3、B4、B820米波段包括B5、B6、B7、B8A、B11、B12。森林群落分类里红边和短波红外恰恰非常重要不能丢掉。把这几个20米波段用双线性插值重采样到10米然后和原生10米波段叠加成一个多波段影像。重采样方法我实测下来双线性比最近邻更稳定最近邻会让地物边界出现明显的锯齿状阶梯。2.2 群落类别体系与样本点设计类别体系怎么定直接决定分类结果能不能用。林业上常见的做法是按优势树种或者优势树种组来划分群落类型比如“落叶松林”“桦木林”“针阔混交林”“灌丛”这样。个人经验是类别层级的粗细要跟10米分辨率匹配。如果你把每个单一树种都单独列出来在北方混交林区10米像元里可能同时存在三四种树标注样本时自己都拿不准模型更学不会。建议先按“群落类型”这个尺度来做亚优势树种可以通过后续的精细分类或者野外调查补充。训练样本数量方面我最低可接受的底线是每类300个像元点建议做到500个以上。样本点布局不能只在小范围内密集采集要尽量在整个研究区均匀铺开覆盖不同的地形部位、不同海拔和不同坡向。这里有个很容易忽略的点样本要包含群落过渡带的分界信息吗不要。训练和验证样本都应该尽量选在“典型群落内部”避开过渡带和林缘因为这些位置的标签本身就不可靠。2.3 独立验证样本的生成原则验证样本绝对不能从训练样本里抽。很多人图省事随机森林训练完后直接在训练数据上算混淆矩阵OA高得离谱拿到野外一验证就崩。正确的做法是单独留下15%-20%的野外调查点或高分影像目视解译点作为独立验证集。生成独立验证样本时要确保这些点跟训练样本之间有一定空间距离。推荐的做法是把研究区分成规则格网在每个格网内分别抽取训练样本和验证样本或者做空间分块让训练集和验证集来自不同的空间区块。这样可以避免空间自相关导致精度虚高。2.4 数据组织建议整个流程中需要打交道的文件不少建议从一开始就建立清晰的文件目录结构底图目录存放掩膜后的Sentinel-2多波段影像、云掩膜文件、重采样中间产物样本目录存放训练样本点和验证样本点的矢量文件建议同时存GeoJSON和Shapefile两个格式方便不同工具读取特征目录存放从影像中提取的嵌入特征文件按波段时间命名结果目录模型文件、分类结果影像、精度评估报告3. 特征提取与分类器训练从嵌入向量到群落类别的完整链路这节是全文的核心把从影像到群落分布图的完整处理流程掰开讲。3.1 用AlphaEarth提取嵌入特征的操作流程不管你的AlphaEarth Embeddings是通过独立推理接口还是本地模型抽取核心操作逻辑都是类似的输入一个影像块输出一个表征这个影像块中心像元语义的向量。我建议的提取方式是切块加重叠窗口。具体来说把整幅研究区影像切成分块每块大小为256×256像素或512×512像素。太大显存压力大太小上下文信息不足。切块之间保留重叠区域。比如相邻块之间重叠32个像素推理完成后只保留每个块中心区域的预测或特征结果重叠边缘丢弃。这样能大大减少拼接区域的边缘伪影。波段顺序必须全程保持一致。训练时输入模型的波段顺序是B2, B3, B4, B8, B5, B6, B7, B8A, B11, B12预测时也必须完全一样。有些平台对输入做了标准化例如按照波段均值方差做Z-score那这个标准化参数要从训练侧统计好推理侧复用同一个参数不能两边各自单独标准化。提取完成后每个像元就对应一个高维嵌入向量。以常见的基础模型输出来看特征维度可能在几百维到上千维不等。这个高维向量先不急着直接扔进分类器先经过一层降维处理效果通常更稳定。3.2 特征归整与维度压缩嵌入特征一般是直接从神经网络中间层抽出来的数值分布并不一定是标准正态不同维度的量纲也可能有差异。建议先做两步处理第一步是特征标准化。按每一个特征维度计算训练样本的均值和标准差然后做Z-score标准化。这个操作对后续使用随机森林等树模型影响不大但如果要接支持向量机、MLP或者距离类模型标准化就是必须的。第二步是主成分分析降维。我自己实测的经验是直接在千维特征上训练随机森林也不是不能用但小样本场景下容易过拟合而且训练速度会明显变慢。做一次PCA保留95%的方差贡献通常能把特征降到30到60维左右。这样做既保留了绝大部分语义信息又让后面分类器学习更稳定。也有一种观点认为降维会丢失信息。从我的实践来看PCA截断对随机森林这类模型的分类精度几乎没有负面影响反而在样本量不够大时提升了泛化能力。如果后面要用深度学习分类头那另说深度学习可以直接吃原始高维特征靠网络自己学特征组合。3.3 分类器选型先从随机森林说起森林群落分类任务样本量一般几百到几千类别数量5到10个这类场景我最常用的分类器就是随机森林。随机森林的优势在于能天然处理类别特征和数值特征的混杂输入对特征量纲不敏感不容易过拟合训练速度快还能输出特征重要性用于事后分析。它由多棵决策树组成每棵树在训练时随机抽样样本和特征最后通过投票得到分类结果。每一棵决策树可以理解成一组“光谱嵌入特征划分规则”多棵树平均下来大大降低了单棵树的方差。在这个场景下我不建议直接用SVM。SVM在几千个样本上千维特征上训练速度很慢而且调参成本高非线性核函数的超参对最终结果影响非常大。那什么时候可以考虑深度学习分类头如果研究区非常大、样本量充足每类上千点以上可以考虑直接把嵌入特征接一个两到三层的MLP做分类效果会比随机森林更高。但训练成本和调参复杂度都上去了。多数项目做到随机森林这一层就已经能拿到一个相当不错的分布图了。3.4 核心实现训练与推理脚本下面是我在项目里实际跑通过的一个流程按步骤列出来供参考。首先需要从样本点位置提取嵌入特征。如果嵌入特征已经以栅格或瓦片形式保存这一步就转化为“按点取像元值”的常规操作。import geopandas as gpd import numpy as np import rasterio # 读取训练样本点 sample_gdf gpd.read_file(train_samples.shp) # 假设嵌入特征已经保存为多波段GeoTIFF波段数为特征维度 with rasterio.open(embeddings.tif) as src: # 按样本点位置提取特征向量 coords [(geom.x, geom.y) for geom in sample_gdf.geometry] sampled np.array([src.sample([coord], indexeslist(range(1, src.count 1))).__next__() for coord in coords]) # 提取对应标签 labels sample_gdf[class_code].values特征提取部分如果是在推理服务上在线调用那流程会变成把样本点附近的影像块裁剪下来依次请求特征服务返回向量后按同样的顺序拼成特征矩阵。接着做标准化与降维from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA scaler StandardScaler() sampled_scaled scaler.fit_transform(sampled) pca PCA(n_components0.95) sampled_pca pca.fit_transform(sampled_scaled)然后训练随机森林from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val train_test_split( sampled_pca, labels, test_size0.2, stratifylabels, random_state42 ) rf RandomForestClassifier( n_estimators500, max_featuressqrt, min_samples_leaf2, n_jobs-1, random_state42 ) rf.fit(X_train, y_train) val_acc rf.score(X_val, y_val) print(f验证集总体精度: {val_acc:.4f})完整影像的预测逻辑也类似先对整幅影像做标准化和PCA投影然后逐块输入模型预测with rasterio.open(embeddings.tif) as src: profile src.profile profile.update(count1, dtypeuint8) with rasterio.open(forest_community_prediction.tif, w, **profile) as dst: for block in src.block_windows(1): _, transform block window block[1] emb_block src.read(1, windowwindow) # 实际应读取所有特征波段这里示意 # 对当前块做标准化与PCA投影后预测 # pred_block rf.predict(block_pca) # 得到该块的预测类别 # dst.write(np.expand_dims(pred_block, 0), 1, windowwindow)实际运行时需要读取全部分波段并保持切块之间有重叠处理这部分建议写成函数封装方便调试。3.5 超参数建议与特征重要性校验随机森林的超参数里最需要关注的是三个树的数量、特征采样方式和叶子节点最小样本数。n_estimators500棵树的量级通常足够超过1000提升很小徒增计算量。max_features分类任务选择sqrt是通用默认实际测下来也确实比较稳。min_samples_leaf设置在2到5之间可以防止叶子节点过细、模型对噪声过度敏感。如果分类结果出现严重的椒盐效应优先调大这个参数。训练完之后一定要看一眼特征重要性输出。随机森林模型自带的feature_importances_属性可以告诉你哪些特征维度贡献最大。如果主要信息集中在前面若干个主成分上说明PCA保留的信息是有效的如果特征重要性非常均匀地散在几十个维度上说明类别可分性主要依赖特征组合这时可以考虑适当增加PCA保留的维度比例。4. 制图输出与精度评估10米产品落地前必须做的几件事模型验证精度看起来不错不等于最终分布图一定可靠。从“样本精度”到“全图精度”中间还隔着推理性能、空间一致性和后处理三个关卡。4.1 全工作区推理策略与性能优化全图推理面临的首要问题就是计算量。研究区稍微大一点比如几百平方公里10米分辨率意味着几百万到几千万个像元每个像元都要经过特征提取和分类器推理。两块性能瓶颈需要提前规划。第一是嵌入特征提取阶段。如果是在线推理建议先确认每个切块请求的处理时长再乘以总切块数算一下总耗时。如果超过可接受范围就考虑本地化推理或者升级批处理接口配额。第二是随机森林预测阶段。预测时间跟特征维度和树数量成正比PCA降到50维以内、树数量500棵实测速度是很快的但如果直接拿千维特征配500棵树时间会长好几倍。存储也是容易被忽略的坑。嵌入特征全图保存成GeoTIFF的话文件体积可以到几个GB。建议保存成float32的多波段格式压缩方式选LZW或者DEFLATE体积能小不少读写速度也不会太受影响。重叠切块推理时的拼接逻辑要注意两个相邻块的预测结果在重叠区域如果有冲突不能简单取某个块的直接结果建议取概率最高的一侧。如果是随机森林predict_proba输出的概率值在拼接时可以保留下来作为后处理的重要输入。4.2 精度评估指标的正确打开方式制图完成后独立验证集是最终的裁判。常规的验证指标有总体精度、Kappa系数、F1值以及更细粒度的制图精度和用户精度但不同指标的含义和适用场景要理清楚。总体精度Overall Accuracy即正确分类的样本数占全部验证样本数的比例。它直观但对类别样本不均衡的情况有误导性。如果某个类别占了验证样本的70%哪怕其他类别全分错总体精度也会很好看。Kappa系数比OA多考虑了随机一致性适合不同分类结果之间的横向对比但其本身也有一些争议可以看但不必过于迷信。制图精度Producer‘s Accuracy对应漏分误差表示实际是A类的地面真值中有多少被正确识别了。制图精度低说明该类被大量漏判。用户精度User’s Accuracy对应错分误差表示分类器标为A类的像元里有多大比例确实是A类。用户精度低说明该类被大量误判。F1值单独看某一类时综合精度和召回率最实用的指标。指标计算公式关注的问题适用的场景总体精度正确分类数 / 总验证数整体正确程度宏观汇报Kappa(OA - 期望一致率) / (1 - 期望一致率)消除随机一致影响方案横向对比制图精度该类正确数 / 该类参考总数漏分关注特定类型是否被遗漏用户精度该类正确数 / 该类分类总数错分防止某类被过度扩张F12×(精确率×召回率)/(精确率召回率)综合平衡单个类别的综合能力我通常会生成一个完整的混淆矩阵逐类检查到底是谁和谁在互相混淆。森林群落分类中最常见的就是落叶阔叶林和针阔混交林互混这时候单纯看OA是看不出问题的一定要落到混淆矩阵上逐格分析。4.3 空间一致性检查精度验证是对“样本点”而言的空间一致性检查则是从整体格局上判断分类结果是否合理。建议做三件事第一把分类结果叠加到原始影像上目视检查大的群落斑块是否符合地形和植被分布规律。这一步不能省AI和服务再强也不能代替人眼对区域自然地理格局的判断。第二与已有的土地覆盖产品做对照。例如ESA WorldCover和GlobeLand30虽然它们的分类体系跟精细群落类型不一样但森林和非森林的边界可以作为参考。如果森林群落图里出现了把大片农地或水体划进了林地那大概率在特征提取或训练样本上出了问题。第三检查群落斑块的破碎化程度。10米分辨率下的森林群落不会像高分辨率城市用地那样出现离谱的碎斑。如果分类结果呈现出散点状随机分布通常是模型对某些像元的特征响应不稳定造成的需要做后处理。4.4 后处理众数滤波与最小制图单元约束分类结果的后处理我建议按以下顺序来先基于概率做平滑再做最小制图单元约束。概率平滑的核心思路是用分类概率而不是硬分类标签做空间滤波。假设拿到了模型输出的每个像元属于各个类别的概率用一个3×3或5×5窗口对各类的概率做均值滤波然后在滤波后的概率上重新取最大概率类。这样处理的好处是边界区域的类别归属由邻域共同决定比直接在标签图上做众数滤波要平滑得多而且不容易把细小的线性地物比如林间小路直接抹掉。最小制图单元约束是把面积过小的碎斑合并到相邻的最大类别中。一般森林群落制图的最小制图单元可设在0.5公顷左右对应10米分辨率大约是50个像元。具体阈值需要根据研究目的调整如果做的是精细生境制图可以缩小如果做宏观林业规划可以增大到1公顷以上。后处理的原则是要压制“不合理的小尺度噪声”但不能压制“真实存在的小尺度信息”。所以每次后处理参数调整后都要对照原始影像局部区域的主观判断防止矫枉过正。5. 实测中的坑与调优经验阴影、过渡带、样本外推最后这部分全是真金白银的实战经验。很多问题在方案设计阶段根本想不到跑到一半才冒出来。5.1 地形阴影区的特征漂移第一个坑就是地形阴影。保护区基本都落在山区山谷和阴坡常年有大片阴影区。Sentinel-2的光学影像在阴影区域的可用的光谱信息会大幅衰减嵌入特征也一样受影响——这些区域的嵌入特征向量会整体偏离无阴影区域的数据分布。第一次跑出来的结果阴坡的针叶林大面积被错分成暗色灌丛或草地就是因为训练样本里阴坡的样本太少。解决思路有三个一是在样本采集阶段就有意识地增加地形阴影区的样本数量让分类器见过这些“光照异常的同类”二是对明显的阴影区域单独设置类别或者掩膜后单独处理在成果图上标注为阴影区三是引入地形因子坡度、坡向、地形位置指数作为辅助特征参与分类让模型能在光照变化的情况下区分“反射率低是因为光照差”和“反射率低是因为植被类型不同”。实测下来第三种做法提升最明显前两种作为补充也能有效控制误差。5.2 过渡带样本标签不可靠的问题第二个坑更加隐蔽就是林缘过渡带的标签不可靠。森林群落之间的边界很少是一刀切的针阔混交林和落叶阔叶林之间有长达几十米甚至上百米的渐变过渡带。在这种位置采的样本地面调查看到的是一棵树一个样而10米像元里包含了多棵不同树种的混合信号。你给这个像元贴上“针阔混交林”标签但它实际可能是“偏向落叶阔叶的混交状态”标签和特征之间的对应关系从源头上就是模糊的。我的做法是所有训练样本和验证样本都尽量落在群落核心区离开过渡带至少50米以上。如果一定要研究过渡带本身单独做一类来处理不要混在典型群落样本里。这个坑最坑人的点在于它对训练精度的伤害不直接表现出来——过渡带样本会让模型学到一套“骑墙规则”表面上训练集准确率挺高但验证集和实际制图中过渡带附近会出现大量条带状错分非常影响成图质量。5.3 季节不一致导致特征分布漂移影像的获取时间直接影响嵌入特征的分布空间。同一个区域的Sentinel-2影像5月份的植被特征和8月份差别非常大。如果训练样本来自8月影像预测时却用了5月获取的影像特征分布整体偏移分类精度会明显下降。这个坑通常出现在跨年度或者多时相填充数据时。有些人为了填补云遮挡区域会用其他月份的影像来插补这会在拼接边界上形成明显的语义断层。对策是尽量统一物候窗口。影像缺失区域如果必须补充可以把补充影像单独切成区域做分类后续再用掩膜拼接而不是把所有影像混在一起统一喂给特征提取模型。实在要用多时相影像就在特征提取前确认你的AlphaEarth版本是否对物候变化具有鲁棒性或者先做一个小的测试集验证分布漂移程度再放全图。5.4 类别不平衡问题森林群落中各个类别面积天然不均衡常绿阔叶林可能占了60%的面积落叶松林只有5%。如果不做任何处理分类器会倾向于把少量样本的类别往大类里面推。我习惯在训练前先统计一下各训练类别的样本量。如果最大的类样本量是最小类的5倍以上就要做处理。随机森林里最直接的方式是设置class_weightbalanced让少数类的错分代价更高。实测比较下来这个参数在样本不均衡的森林分类场景里很有用。另外过采样少数类样本也可以但对空间的重复采样容易造成过拟合。我的建议是优先用class_weight效果不好再加过采样。还有一个跟类别平衡相关的点是如果某些群落类型的空间分布本身就特别集中比如只有山顶小范围存在那你需要在全区域均匀采样的基础上对这个类别适当增加样本密度然后再用class_weight做全局平衡。两个手段配合效果最好。5.5 特征组合的快赢技巧最后分享一个在多个项目中验证有效的经验不要只用嵌入特征把传统光谱特征也一起拼进去。具体来说我发现把嵌入特征PCA降维后的输出再拼接上几个核心光谱指数NDVI、EVI、红边NDVI、SWIR组合指数输入到随机森林里在某些场景下分类精度比纯粹用嵌入特征略高一点。尤其在区分草本灌丛和乔木林地时SWIR波段的光谱绝对值信息补充了对植被水分和冠层结构的判别能力。这种做法听起来像是开倒车——明明说嵌入特征包含了语义怎么还要拼传统特征原因是嵌入特征是从影像块中抽象编码出来的天然更偏重“上下文和形态语义”而对单像元上精细的光谱绝对值细节可能会压缩掉一部分。补上原始光谱指数等于把两个不同粒度的信息源做了互补。最终我们项目里的最优配置是嵌入特征PCA保留95%方差后的40~50维特征加NDVI、EVI、红边NDVI、短波红外比值指数四个传统特征一起输入随机森林。在这里记录一下这个配置说不定能帮你少走一段弯路。森林群落分类没有一步到位的银弹需要在特征组合、样本设计和后处理之间反复试才能拿到满意的分布图。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →