资讯动态

遥感分类标签不确定性怎么办?多分辨率融合与权重策略详解

发布时间:2026/10/19 10:19:25 来源:尧图企业网站定制
这两年做遥感地物分类被“标签不确定性”折磨得不轻。某次拿一套人工标注好的种植结构数据做训练分类器换了好几种精度死活卡在七成上下起初以为是特征提取得不够多后来逐像元检查才发现问题根本不在算法而是标注本身——地块边界错位、混合像元误判、新旧地表状态不一致标签里全是“噪音”。当时我就意识到遥感分类这条流水线上标签不确定性才是藏得最深的那颗雷。解决这个问题的思路我落在了两件事上一是用多分辨率融合技术把特征空间从“单像元光谱”扩展成“多尺度空间上下文”二是把标签不确定性量化成样本权重让分类器自己学会“少信那些可疑标签”。整套流程用Matlab实现跑通之后精度提升非常明显。这篇文章就把完整的思路、原理和可复现代码整理出来给同样被标签问题卡住的朋友一个可以直接抄作业的方案。1. 为什么标签不确定性是遥感分类精度的最大隐形杀手1.1 现实中标签问题往往比算法问题更致命我见到很多项目组一遇到精度上不去第一反应是换更强的分类模型或者是堆更多特征。但真正的问题往往不在模型容量而在训练数据本身。拿那次种植结构调查项目来说目视解译的成果是以地块为单元勾绘的一条地块边界线偏差几个像元是常事。结果就是在边界附近同一组光谱曲线被贴上了两个完全不同的类别标签分类器被迫在特征空间里找一个“谁都不得罪”的决策边界精度自然上不去。更让人头疼的是这种噪声还不太容易被发现。你画混淆矩阵、看分类结果图整体效果好像是“差不多”但放大到具体地块到处是错分的碎斑。等你真正想找出原因时才发现训练标签本身就靠不住。1.2 标签不确定性的三个主要来源结合我做过的项目标签不确定性主要来自三个方面第一是标注单元和像元粒度不匹配。目视解译时人眼看到的是地物斑块标注软件记录的是边界矢量转成栅格后边界必然被“切割”切割处的像元到底算哪一类本身就没有标准答案。第二是混合像元问题。在中低分辨率影像上一个像元内可能同时包含耕地、田埂和少量林地这种混合光谱无论如何都无法严格贴上单一标签任何标注方式都是错的。第三是时间不同步和人工判读误差。影像获取时间是5月标注工作拖到8月才完成这期间作物可能已经收割、草地可能已经翻耕标签和影像对不上。再加上不同标注人员经验不同、标准掌握尺度不同同一类地物的标注边界经常冲突。这三种来源叠加起来标签里的“不确定性”根本不是小概率的孤立噪声而是成片出现、带有空间结构的系统性误差。1.3 标签不干净时复杂模型反而更容易“学歪”这里有一个反直觉的地方模型越复杂、参数量越大对噪声标签的记忆能力就越强。拿深度网络来说给它足够的迭代次数它能硬生生把错误标签对应的特征区域“背”下来决策树和随机森林稍好一些但样本权重完全均等时错误标签同样会干扰分裂点的选择。所以在标签不确定的情况下单纯堆模型复杂度是南辕北辙。真正有效的做法是两条路同时走在特征层面引入多尺度上下文让分类器看到的不只是一个孤立像元的光谱而是它周围的空间结构在训练层面给可疑样本更低的话语权别让它们带偏决策边界。这就是本文多分辨率融合和不确定性加权策略的出发点。2. 多分辨率融合技术它不只是图像融合更是特征空间的尺度扩展2.1 为什么选小波分解而不是拉普拉斯金字塔或导向滤波一提到多分辨率遥感圈子里很多人先想到的是图像融合比如全色锐化。但这里的目标完全不同我们不是要把低分辨率影像变清晰而是要在分类特征里加入多个尺度的空间信息。尺度怎么来通常有三类做法。拉普拉斯金字塔的思路是把图像逐层降采样再差分每一层都保留一部分频带信息但它的层间冗余度较高分解系数并不是完备的拿来做特征时需要额外考虑各层之间的相关性特征含义也不够直观。导向滤波擅长边缘保持平滑但它的输出更像“过滤后的图像”没有天然的尺度递进关系把它硬做成多尺度特征有点勉强。小波分解则是很自然的选择。小波基函数具有紧支撑和时频局部化特性一次分解就把图像分成一个近似分量和三个方向细节分量近似分量保留了低频主体结构细节分量记录了水平和垂直方向的边缘变化。而且Matlab的Wavelet Toolbox对二维小波分解有非常成熟的实现几行代码就能调用工程成本很低。具体到基函数选型我习惯用db4。它紧支撑、正交性好、计算量适中对地物纹理的刻画能力比较均衡。sym4也可以用但在我自己的实验里两者差异很小db4足够用。2.2 特征图构建整幅分解、局部统计、逐级拼接这里有一个非常关键的工程细节新手特别容易踩坑不要对每个像元单独做小波分解。那是教科书式的写法放到真实遥感影像上几百万个像元逐个分解计算量会大到怀疑人生。正确做法是先对整幅影像做一次小波分解然后在每个分解层的系数图上用滑动窗口计算局部统计量比如局部均值、局部标准差、细节子带局部能量得到多尺度统计图。因为窗口统计本身有平滑效应即使某个像元的原始光谱值因为标注错误而“异常”它在邻域统计中的影响也会被稀释这正好抵消了一部分标签噪声的影响。随后把不同尺度的统计图用插值恢复到原始像元尺寸再和原始波段层叠在一起就得到了一张多分辨率特征图。之后按照标签坐标去特征图里取值每个像元就对应一个融合了原始光谱和多尺度空间上下文的高维特征向量。这种写法好在哪所有操作都是矩阵化的整幅图像的处理过程用卷积和插值完成效率很高完全贴合“高效”这两个字。而且分了几层、用了多大窗口都是参数可以调的灵活性很强。2.3 原始光谱与多尺度特征缺一不可有些同行把“融合”理解成“替换”觉得有了多尺度特征原始波段就可以扔掉了。我的实验结论恰恰相反原始光谱特征绝对不能丢。原因不难理解。地物分类最本源的物理依据还是光谱反射率差异——水体在近红外波段吸收强、植被在红光波段吸收明显这些绝对辐射信息是任何空间结构特征都无法替代的。多尺度特征提供的是“这块区域是均质的还是破碎的”“边界是陡峭还是渐变”这类空间上下文信息两者是互补关系。真正动手时把每波段的原始灰度、每层近似分量的局部均值和局部标准差、细节分量的局部能量全部拼接起来特征维数大致是“波段数×(13×分解层数)”。6波段影像、分解2层时维度也就42维完全在经典机器学习分类器能应付的范围内。3. 标签不确定性如何被量化并转变成训练权重3.1 用多个子模型的预测分歧度量不确定性标签不确定性这东西看不见摸不着总不能一个像元一个像元去人工检查。我的做法是借助集成思想用一个变通的办法把不确定性“测”出来。思路是这样的对训练数据做多轮自助采样每一轮随机抽取80%的样本训练一个独立的基分类器。对于标签正确的样本来说无论哪一轮采样它的特征和标签之间的关系都是稳定的各个基分类器对它的预测结果会高度一致。但对于标签错误的样本它其实是“特征分布与标签不一致”的孤点某些基分类器没抽到它自然学到了正常的特征-标签关系回头再预测这个样本时就会和那些抽到它的分类器产生分歧。循环几轮之后每个样本都会得到一组预测序列。这个序列越混乱说明不同分类器对它的意见越不统一这个样本的标签也就越可疑。预测熵就是衡量这种混乱程度的天然指标。基分类器我选的是随机森林理由是它训练快、非线性强、对高维特征不敏感而且自带随机性非常适合这种多轮子采样配置。实际代码里不需要每轮都建一个完整随机森林控制树的棵数和轮数就可以在精度与时间之间取得平衡。3.2 从不确定性熵到样本权重的计算公式有了预测熵之后下一步是把熵转换成可以直接用于训练的样本权重。假设样本总类别数为K每个样本被预测为各类别的概率分布为p1到pK则该样本的预测熵H可以写成H -Σ pk·log2(pk)当预测概率完全平均分布时H达到最大值log2(K)说明分类器对这个样本完全“蒙圈”标签最不可信。当某个类别概率接近1时H接近0说明分类器对它的判断非常笃定标签大概率没问题。于是样本权重自然可以定义为w 1 - H / log2(K)这个权重是一个0到1之间的实数。熵越高权重越低熵越低权重越高。把它直接传给分类器做加权训练就等于在告诉模型这些样本可信多学一点那些样本可疑意思意思就行。别的先不管。3.3 权重压制优于硬删除很多人看到“标签不确定”第一反应是把这些样本删掉这种硬删除的做法我试过效果并不理想。原因有二一是低置信度样本往往集中在类别交界处这些区域恰恰是最难分类的地带删除得太狠会让模型完全没见过边界情况二是噪声分布往往不均衡把可疑样本全删了某些类别的有效样本数会骤减类别不平衡问题立刻浮出水面。权重压制的优势在于它保留了所有样本的位置分布只是降低了低置信度样本在损失函数或划分标准中的影响力。这是一条平滑的连续策略而不是一刀切的非黑即白。当然如果某些样本的权重被压到一个极低值以下——比如0.15——说明它确实已经成了严重离群点这时候再删也不迟就当做一个额外的过滤器使用。4. Matlab实现多分辨率特征提取与权重化分类的完整代码4.1 核心函数一多分辨率特征图提取下面这个函数接收一个单波段图像输出多分辨率特征图。分解层数和窗口大小都可以传参调整。function featMap multiResFeatureMap(band, level, winSize) % band: 单波段灰度图 (double类型) % level: 小波分解层数, 推荐2~3 % winSize: 局部统计窗口大小, 如3或5 % 输出: featMap, 通道数 1 3*level if ~isa(band, double) band double(band); end [rows, cols] size(band); % 对称延拓补齐保证行列数是2^level的整数倍 padRows 2^level - mod(rows, 2^level); padCols 2^level - mod(cols, 2^level); if padRows 2^level, padRows 0; end if padCols 2^level, padCols 0; end bandPad padarray(band, [padRows padCols], symmetric, post); % 二维离散小波分解 [C, S] wavedec2(bandPad, level, db4); featList {}; kernel ones(winSize, winSize) / (winSize^2); for k 1:level % 近似分量低频主体信息 LL appcoef2(C, S, db4, k); % 局部均值与局部标准差 localMean conv2(LL, kernel, same); localMeanSq conv2(LL.^2, kernel, same); localStd sqrt(max(localMeanSq - localMean.^2, 0)); % 恢复成原始像元尺寸 meanUp imresize(localMean, [rows, cols], bilinear); stdUp imresize(localStd, [rows, cols], bilinear); featList{end1} meanUp; featList{end1} stdUp; % 三个方向细节分量的局部能量 [cH, cV, cD] detcoef2(all, C, S, k); detailEnergy sqrt(conv2(cH.^2 cV.^2 cD.^2, kernel, same)); detailUp imresize(detailEnergy, [rows, cols], bilinear); featList{end1} detailUp; end % 第一通道为原始灰度后面依次是多尺度统计图 featMap cat(3, band, featList{:}); end这段代码有几个地方值得单独解释。wavedec2返回的C是列向量形式的系数S记录了每一层系数对应的矩阵尺寸后续的appcoef2和detcoef2就是依赖这两个变量来重构各层系数的。conv2做局部统计时用的是same选项这样输出尺寸和输入一致不需要手动对齐。imresize的作用是把低分辨率统计图还原到原始尺寸因为在第k层时LL子带的长和宽都是原始图像的大约2^(-k)倍。窗口大小winSize的选择很影响结果。设成3细节保留充分但局部方差对噪声更敏感设成5统计图更平滑边界会稍微糊一点。我的经验是先从3开始如果分类碎斑太多再调到5。4.2 核心函数二标签不确定性估计function [labelOut, weight] estimateLabelUncertainty(X, y, numRounds, nTrees) % X: 训练样本特征矩阵, NxD % y: 标签向量, Nx1, 类别编号从1开始 % numRounds: 自助采样轮数, 通常5~10 % nTrees: 每轮随机森林的树数量, 通常20~50 % 输出labelOut为原始标签, weight为样本权重 N size(X, 1); K length(unique(y)); predMat zeros(N, numRounds); rng(2024); for r 1:numRounds % 每轮随机抽取80%样本训练 idx randsample(N, round(0.8 * N)); mdl TreeBagger(nTrees, X(idx,:), y(idx), Method, classification); % 在全部训练样本上做预测 [~, pred] predict(mdl, X); predMat(:, r) str2double(pred); end % 统计每个样本的预测类别概率分布 probMat zeros(N, K); for i 1:N counts histcounts(predMat(i,:), 1:(K1)); probMat(i, :) counts / numRounds; end % 预测熵与权重 H -sum(probMat .* log2(probMat eps), 2); Hmax log2(K); weight 1 - H / Hmax; % 标签本身不修改只提供权重 labelOut y; end这里是先用多轮随机子采样训练多个随机森林然后统计每个样本被预测为各类别频率再换算成熵。这里TreeBagger输出的预测类别是字符串所以用了str2double再转回数值。有个细节如果样本类别数很多K偏大Hmax也大权重曲线的陡峭程度会发生变化。5类以内直接按公式算没问题如果类别数超过10类可以考虑把权重做一次非线性变换比如开根号避免大部分样本的权重都集中在0.3到0.6之间导致区分度不足。4.3 主流程从多光谱影像到加权分类结果有了上面两个函数主流程就非常清晰了。% 主流程示例 % 读取多光谱影像和标签图 [msImg, R] geotiffread(study_area_ms.tif); [labelImg, R2] geotiffread(study_area_label.tif); % 逐波段生成多分辨率特征图 numBands size(msImg, 3); featAll []; for b 1:numBands featMap multiResFeatureMap(msImg(:,:,b), 2, 3); featAll cat(3, featAll, featMap); end % 提取有标签位置的特征向量 maskValid labelImg 0; rows size(labelImg, 1); cols size(labelImg, 2); flatFeat reshape(featAll, rows*cols, []); idxValid find(maskValid); X flatFeat(idxValid, :); y labelImg(idxValid); % 假设地块编号图blockImg已经读入按地块划分训练和测试 trainMask false(rows, cols); testMask false(rows, cols); trainBlocks [1 3 5 7 9 11 13]; testBlocks [2 4 6 8 10 12 14]; trainMask ismember(blockImg, trainBlocks); testMask ismember(blockImg, testBlocks); trainIdx trainMask(idxValid); testIdx testMask(idxValid); % 估计标签不确定性权重 [yTrain, w] estimateLabelUncertainty(X(trainIdx,:), y(trainIdx), 5, 20); % 加权训练随机森林 mdl fitcensemble(X(trainIdx,:), y(trainIdx), ... Method, Bag, ... Weights, w, ... NumLearningCycles, 100, ... Learners, tree); % 测试与精度评估 yPred predict(mdl, X(testIdx,:)); yTest y(testIdx); [Cmat, order] confusionmat(yTest, yPred); OA sum(diag(Cmat)) / sum(Cmat(:));几个容易忽略的点需要提一下。第一geotiffread读取多波段tif时返回的是二维矩阵叠成三维波段数放在第三维。第二fitcensemble的Weights参数可以直接做样本加权我实测下来在分类任务里是正常生效的。第三如果用的是老版本Matlab可能不支持Weights参数可以退而求其次在estimateLabelUncertainty里按权重对训练样本做有放回重采样达到近似效果。4.4 参数设置建议与运行时间量级我把自己常用的参数列成下表方便大家起步时对照。参数推荐值说明分解层数level2~3分辨率越高可以取3中低分辨率取2窗口winSize3~5先3碎斑多就调5轮数numRounds5~105轮起步追求稳健可以加到10每轮树数nTrees20~50树太多收益递减最终分类器决策树数量100~200fitcensemble里设置运行时间上几十万像元级别的训练集特征维数42维左右5轮随机森林加最终100棵树的随机森林普通笔记本上整个流程大概几分钟量级。真正耗时的是特征图提取阶段尤其是图像尺寸较大的时候所以我在下一步会专门讲分块处理的优化方案。5. 三组对比实验融合特征与加权策略分别带来了多少增益5.1 实验设置与评价指标为了验证这整套方案的价值我设计了三组对比实验全部在同一个模拟标签噪声的某研究区数据集上进行。地物类别一共6类包含农田、草地、林地、水体、建筑和裸土。我从原始人工标注结果中随机翻转10%的标签用来模拟前文说的标签不确定性场景再分别做三组处理方案A只使用原始光谱特征训练普通随机森林这是基线。方案B在方案A基础上增加多分辨率融合特征但不做不确定性加权。方案C多分辨率融合特征加不确定性权重即本文完整方案。评价指标选用总体精度OA、Kappa系数和两个易混淆类别的F1分数。Kappa能反映剔除随机一致后的真实一致性比只看OA更严谨。5.2 实验结果精度呈阶梯式上升方案总体精度OA(%)Kappa农田F1草地F1A: 原始光谱 RF68.30.610.630.59B: 融合特征 RF75.60.690.710.67C: 融合特征 加权RF80.40.750.770.73方案B比方案A的OA高出7个百分点这证实了多分辨率融合特征对标签噪声确实有抑制作用。而方案C又在方案B基础上提升近5个百分点说明不确定性权重能进一步把“可疑样本”的影响力降下来让分类器把精力集中在干净样本上。细看Kappa系数从0.61升到0.75这个提升的意义在于说明分类结果不是偶然一致的产物而是模型真的学到了更可靠的特征-标签关系。农田和草地本来就容易混分两者的F1都有约14个百分点的累计提升恰好说明这套方法在最容易受标签噪声影响的类别上收益最大。5.3 结果背后的机制为什么特征融合和权重策略能带来这种阶梯式提升机制其实很清晰。多分辨率特征图里的局部均值和局部标准差天然带有空间“滤波”效果。一个被错误标注的孤立像元虽然在原始光谱特征上很突兀但放在5×5邻域的统计值里它的异常值只贡献了二十五分之一影响被大幅稀释。小波分解的近似分量更是只保留了低频主体结构高频噪声被自然隔离在外。不确定性权重则走在更前面一步。估出来的权重低的那些样本很大概率就是正好处于地块边界错位区、混合像元区的样本把它们在训练中的话语权压低后决策边界就不会为了迁就这些“错误记忆”而扭曲。两条机制叠加自然比单打独斗强。6. 我实际跑数据时踩过的坑和调整经验6.1 整幅小波分解内存直接爆掉第一次跑通流程图时我兴冲冲地拿全分辨率影像直接调multiResFeatureMap结果Matlab直接卡死内存占用飙升到十几个GB。原因很简单double类型的多波段影像本身就占内存小波分解的系数向量又是额外的开销。解决办法有两个。一是把影像cast成single类型内存直接减半精度几乎无损失。二是分块处理把影像切成512×512或1024×1024的图块分别做特征提取再拼接起来。切块时相邻块之间要留出重叠区域建议重叠winSize个像元避免边缘统计量失真。6.2 按像元随机划分训练集精度虚高得离谱一开始我图省事直接把全部有标签的像元随机分成80%训练、20%测试结果测试精度高达91%比后续按地块划分的结果高出不少。后来才意识到这是空间自相关在作怪训练集和测试集里大量像元是相邻的它们的特征高度相似相当于“开卷考试”。正确的做法是按地块划分训练集和测试集在地理空间上完全不重叠。这样测出来的精度才真正反映模型对未知地块的泛化能力。这个教训对遥感分类来说极其重要尤其是在评价方案增益时如果划分方式不严谨前面那组对比实验的结论根本不成立。6.3 权重压得过度差点把可靠样本也压没了加了权重之后分类精度一度提升得很漂亮。但后来我去检查低权重样本时发现有些薄云覆盖区域的可靠样本也被系统性地压低了权重。这些样本的光谱本来就因为云影遮挡而偏离正常范围子模型之间对其预测分歧自然大熵高、权重低可它们其实是“噪声物理来源”而非“标签错误”。处理办法是按类别做权重归一化。把每类样本的权重除以该类的权重均值让类别之间的平均权重回到同一水平线上避免某些受环境影响大的类别被整体边缘化。加了这个修正后分类结果更稳定了。6.4 让流程更快的两个优化习惯这套流程跑顺之后我还有两个习惯性的优化动作。一是特征图提取一次之后直接保存成mat文件后续调参、换分类器都不需要重新算特征。二是特征维度如果超过50维可以加一步PCA压缩到20维左右随机森林的训练时间能省近一半而精度几乎不掉。说到更深一层的体会把多分辨率融合和标签不确定性放在同一条流水线里处理比单方面追求模型复杂度有效得多。后来我又在另一批数据上复现过这套流程即使标签噪声比例略有不同权重策略带来的增益也稳定存在。如果你正被标签不准、精度上不去的死循环困住不妨先把这两步补上大概率会有惊喜。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑