ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

eCognition多尺度分割与面向对象分类:规则集与机器学习实战指南

eCognition多尺度分割与面向对象分类:规则集与机器学习实战指南 做遥感分类这些年我手里迭代最频繁的工具就是易康eCognition 9.0尤其是它的面向对象多尺度分割分类流程。以前我也迷信像素级算法后来被高分辨率影像上的“椒盐噪声”折腾够了才彻底转向基于对象的思路。这套流程里规则集和机器学习是两条核心分类路线但两条路线都建立在一个共同的地基上——多尺度分割。这篇文章我就把实际项目里摸出来的经验完整讲一遍从分割参数到底层原理从规则集调试到机器学习特征工程最后再说说两条路线怎么结合尽量让刚开始接触eCognition的人少走弯路。如果你正准备做土地利用分类、地表覆盖制图、水体/建筑/植被提取或者手里拿到了亚米级或米级的高分辨率影像这篇文章会比较对胃口。我不会把界面按钮一个个列出来那是软件手册的事我更想讲清楚每个参数背后的逻辑以及遇到问题时的排查思路。这些内容往往是我在项目上反复撞墙之后才总结出来的。1. 先搞清楚为什么是“对象”而不是“像素”1.1 像素分类的痛点椒盐噪声与语义缺失刚入行时我用ENVI做最大似然分类后来又试过基于像素的随机森林。看混淆矩阵总体精度能做到85%甚至90%感觉很成功。但图一放大就露馅了——明明是连成片的水泥路面结果中间突然冒出一堆绿色、蓝色的小点整个图全是“麻子”。这就是大家常说的椒盐噪声。为什么会出现这种现象因为像素分类器只关心单个像元的光谱值完全不管这个像元和周围像元是什么关系。哪怕相邻两个像素光谱差异非常小分类器也可能因为概率曲线的细微波动把它们分到不同类别里。另一个更深层的问题是“语义缺失”。一条宽度3米的道路在0.5米分辨率的影像上大约占6个像素宽你凭肉眼很容易认出来它是一条道路因为你能看到它是连续的长条状结构、宽度基本一致、两侧大概率是植被或者建筑。但对像素分类器来说它只看到零零散散的一堆点根本没有“形状”“上下文”这些概念自然很难把这条路完整地提出来。1.2 影像对象到底是什么一个可以“讲道理”的单位eCognition的解法是把相邻且相似的像素合并成一个个“影像对象”Image Object。你可以把它理解成把乐高小颗粒拼成了大积木块后续所有分析都基于这些积木块展开。一个影像对象有自己的平均光谱、面积、长宽比、纹理特征还能知道自己的邻居是谁、自己是不是被水包围的岛等等。这样一来分类器面对的不再是几十万个孤立的像素而是几千个有完整语义的对象信息密度一下子高了很多。有一点我看到不少新人会绕晕——面向对象里的“对象”指的不是Java、C里那个“对象”而是“影像对象”。当然你可以用面向对象的编程思想来理解它每个影像对象都是一组属性和方法的封装体。但在eCognition里你不写代码也能直接操作这些对象所以重点还是放在“对象承载了光谱、形状、纹理、上下文关系”这件事上。1.3 面向对象分析OBIA真正擅长的场景面向对象分析最适合高分辨率影像因为地物细节丰富单个像元难以承载语义。比如GF-2、WorldView、无人机正射影像这类数据分辨率通常在2米以内每个地物都由大量像元构成对象化之后优势非常明显。对于30米分辨率的Landsat这种中等分辨率数据如果只是做大尺度的植被指数分析像素分类和对象分类的差距就没那么大但如果你想区分不同森林类型、或者做复杂破碎地表的分类对象化依然能带来收益。我在项目里见过一个很典型的例子两块相邻农田一块种的是玉米一块种的是大豆。像素级分类器经常把两种作物的光谱混在一团而对象化之后每块农田变成一个或几个完整对象纹理特征、光谱均值和邻域关系一起参与判断区分度明显提升。这就是面向对象的核心价值——它让分类器有更多维度的依据可以用。2. 多尺度分割所有分类的地基2.1 多尺度分割在做什么面向对象分析的第一步通常就是多尺度分割Multiresolution Segmentation。这个算法的核心思想是自下而上的区域生长从一个像元开始不断把光谱相似、空间相邻的像元合并进同一个对象直到合并后对象的异质性超过设定阈值才停下来。阈值对应一个核心参数——尺度Scale Parameter。这个尺度参数非常直观尺度越大对象允许的异质性越大生成的图斑就越大尺度越小图斑越碎。很多刚上手的人容易把“尺度”当成一个分辨率的概念其实它更准确的理解是“允许对象内部差异的上限”。就好比筛子孔径越大漏过去的颗粒越粗筛出来的块越大。2.2 分割参数拆解尺度、形状、紧致度分割过程中到底什么能合并、什么不能合并核心由两股力量博弈光谱异质性和形状异质性。eCognition里对应了三个主要参数参数取值范围作用我常用的初始值Scale尺度正数越大对象越大控制对象整体大小根据影像分辨率从30开始试Shape形状权重0到1越大越看重形状在光谱相似度和形状相似度之间做权衡0.1到0.3Compactness紧致度0到1影响对象边界的紧凑程度0.5Shape权重特别值得说。如果你把Shape设成0分割时完全只看光谱差异对象边界会很贴合光谱变化但形状可能又碎又杂把Shape调高分割会优先考虑让对象形状规整但代价是可能把光谱差异比较大的区域也硬揉进来。我的经验是对于房屋、道路这类人工地物占主导的场景Shape可以稍微调到0.3左右能减少碎斑对于森林、农田这类自然边界不规则的场景Shape保持0.1就够了优先让光谱说话。紧致度则更多是“审美调节”。Compactness接近1对象会更紧凑接近圆形接近0对象边界会拉得比较开。如果你想提取建筑物可以把紧致度适当调低一点让对象更好地贴合建筑物直角轮廓如果提取的是湖泊或圆形林地紧致度可以适当调高。当然它和Shape一样不是越大越好我一般不会让Shape和Compactness的总权重占据明显优势否则会牺牲光谱纯度。2.3 尺度参数怎么试一组实测对比分割参数没有绝对标准答案必须针对影像实际情况来调。但新手最容易犯的错是拿一幅全图直接跑一次分割看一眼结果就开始做分类。我的建议是先裁剪出一块包含典型地物的小范围测试区用不同尺度分别跑分割逐个对比。以我做过的一个0.5米分辨率无人机影像项目为例我分别在Scale15、30、60、100下测试。Scale15时对象非常细碎一栋建筑的屋顶被拆成了二三十个对象边缘出现了大量细小图斑这属于明显的过分割Scale30时建筑、道路、树冠基本能完整落在同一个对象里边界也能贴合地物轮廓效果最好Scale60时相邻的建筑和阴影开始被合并进同一个对象里对象内部已经有明显的光谱混杂Scale100时整片城区和不透水面都快糊成一块了完全没法用来做精细分类。Scale取值对象大小目视效果是否推荐15很小过碎建筑被切碎出现大量碎斑不推荐用于建筑提取30适中边界贴合地物屋顶、道路基本完整最推荐作为起点60偏大建筑与阴影开始粘连地物混杂不推荐精细分类100很大欠分割多种地物合并语义混乱仅适合大范围粗分如果你不想靠肉眼反复试可以用ESPEstimation of Scale Parameter工具辅助。这个工具的核心思路是分割尺度的局部方差LV在尺度变化时会有一个拐点拐点对应的尺度往往就是对象从“内部同质”切换到“开始混杂”的临界值。把LV曲线拉出来看曲线突然转折的那个位置附近通常就是适合当前影像的初始尺度。不过我实际操作中还是会更依赖目视检查因为ESP只能提供候选最终还得结合地物类型来定。2.4 分割结果质量怎么看分割完不要急着欣喜先做三件事。第一把分割图层叠加到原始影像上透明度调到50%左右看对象边界是否贴合真实地物轮廓第二放大到几栋建筑、一块林地、几条道路的区域检查这些典型地物是否各自落在独立对象里第三点击几个对象检查它们的内部光谱方差如果对象内部同时包含深色阴影和亮色屋顶说明这个尺度下对象已经过度合并了。分割完成后对象边界一旦确定后面分类的准确率上限就已经被锁定了。分割做得烂后面规则集写得再漂亮、机器学习模型调得再好都是空中楼阁。这是我认为整个面向对象流程里最重要的一步。3. 规则集分类把专业知识翻译成判断条件3.1 规则集的本质是一棵决策树规则集Ruleset是eCognition里最经典的分类方式。它的本质是把你对地物的理解逐步编码成“如果……那么……”的判断规则。比如你要提取水体你心里知道水体在近红外波段反射率很低、NDWI值偏高、形状往往比较光滑、面积通常不会太小。规则集就是把这些知识一条条列出来让软件按顺序执行。规则集在eCognition里表现为一个过程树。你可以在根节点下创建子规则让不同的判断分支并行或串行执行。有一点需要特别注意规则是有逻辑顺序的先执行的规则会改变后执行时的上下文。比如你先用NDWI0.1提取出水体那么当后续规则再去判断“与水体相邻的对象”时它看到的就是已经分类好的对象集合。合理利用这个顺序能写出非常强大的规则但也容易因为顺序搞错导致结果失控。3.2 特征库怎么选光谱、形状、纹理、上下文规则集的原材料是特征Features。eCognition的特征库非常庞大常被我用到的可以归成四类光谱特征波段均值、标准差、亮度、各波段的比值关系还有归一化指数如NDVI、NDWI。这是最基础也是最稳定的特征。形状特征面积、周长、长宽比、形状指数Shape Index越接近1越接近正方形、边界指数Border Index、密度。这类特征对区分建筑物、道路、水域很有用。纹理特征GLCM同质性、GLCM对比度、GLCM熵等。主要用来区分光谱相似但纹理不同的对象比如林地与草地、农田与裸土。上下文与类关系特征与相邻对象的关系、与父对象或子对象的关系、到指定类别的距离等。这类特征经常能解决“光谱长得差不多但位置关系完全不同”的问题。特征不是越多越好。规则集越简洁越好调试、越好迁移到新影像。我见过有人一个规则集里堆了四五十个条件结果只要换一景影像整棵规则树就崩溃。合理的做法是每个类别的判断条件控制在3到6个特征以内而且尽量选有物理意义、不容易受光照波动影响的特征。3.3 一个水体提取规则集的完整拆解拿一个我实际写过的水体提取规则集来举例。我当时的流程分了三步。第一步分割。用多尺度分割得到对象层然后用光谱差异分割Spectral Difference Segmentation把过碎的对象合并掉。为什么加这一步因为水体在清澈水库里光谱非常均一但分割时水面波纹可能导致一个小对象被切成很多片光谱差异分割可以把它们重新拼起来。第二步在规则集里写一个assign class节点把满足条件的对象先粗分为水体候选if NDWI 0.15 and Mean Layer 4 200 then 水体候选这个判断里NDWI负责把水体信号顶起来近红外均值做二次确认降低山体阴影被误判成水的概率。第三步对水体候选做细分和修正。用面积和形状规则把误判的细小阴影剔除if 面积 500 m2 and 长宽比 3 then 非水体当时实际跑下来这个规则集在山体阴影严重的区域还是有接近一成的误判。后来我加了上下文规则只有与已确认水体相邻、且光谱差异小于指定阈值的水体候选才保留为水体。这个小小的改动一下子把精度拉到了95%以上。这就是规则集比纯机器学习的优势——你可以把“水体是连通的”这种常识直接写成规则。3.4 规则集调试技巧特征空间优化与分离度写规则集最痛苦的事情就是某个类别的特征阈值定不准。比如NDVI到底取0.2还是0.3你肉眼在图上看到两类地物分得很开但阈值就是怎么试都不对。我比较推荐先利用样本算分离度。方法是先对每个类别采集一些代表性对象样本然后用特征空间优化工具或分离度矩阵让软件自动计算哪些特征组合能把样本分得最开。它本质上是穷举特征组合计算不同组合下的分离度指标最后输出一张排序表。你会惊喜地发现原本你以为最好用的NDVI可能不是第一位的反而是某个纹理特征或者形状特征贡献更大。另外一个调试技巧是灵活使用对象查看器Object Viewer。分类完成后再点开某个误分对象直接查看它的所有特征值把它和正确类别对象的特征值做对比很快就能找出差异最大的特征。这个操作在电子表格里做也行但eCognition里直接看更直观。4. 机器学习分类让模型自己学规律4.1 为什么面向对象框架下还要机器学习规则集虽然可解释性强但有两个致命伤。第一阈值是人工拍脑袋定的很难在复杂场景里把所有组合照顾周全第二场景一换规则集往往需要重新调参维护成本高。所以我在很多项目里会换一条路线——基于分割后的对象用机器学习分类器来做分类。机器学习的思路是分割完成后把每个对象的特征光谱均值、纹理、形状、指数等提取出来构成一个特征向量。然后你给一部分对象打上类别标签比如“建筑”“水体”“植被”“道路”让分类器从这些带标签样本里学习特征和类别之间的映射关系。这就像一个从没见过猫的小孩你反复指着图片告诉他“这是猫”他慢慢就学会了认猫。4.2 特征工程把分割结果变成模型吃得懂的数字很多人在eCognition里跑机器学习最容易犯的错是不做特征筛选一股脑把所有特征全扔给分类器。特征数量越多模型需要拟合的维度就越高训练样本没跟上就很容易过拟合。我自己的经验是同一类特征只要选一两个代表就行。以GLCM纹理特征为例eCognition里能算出一大串同质性、对比度、相异性、熵、角二阶矩、相关性……这些特征很多彼此高度相关。我会优先保留同质性和对比度这两个对区分植被、建筑、道路比较有效。形状特征方面常用的就是面积、长宽比、形状指数、边界指数。光谱特征方面各波段的均值、标准差和两个关键指数就够了。我做过一个实验同样用随机森林分类特征从60个精简到25个之后总体精度反而从88.4%升到了90.1%训练时间也缩短了接近一半。这就是特征冗余直接拖后腿的例子。精简特征之后还有个附带好处——模型更稳换到相邻区域的影像上精度掉得没那么狠。4.3 样本标注与分类器选择随机森林实测样本质量直接决定模型上限。在eCognition里你需要先在分割结果上手动选择代表性对象作为训练样本。三个要求每个类别样本量至少够用我一般每类不少于100到150个样本分布要覆盖影像不同区域不能只从一小块地方采同类别内要包含边界场景的样本比如水体要涵盖清澈与浑浊两种状态。分类器方面我实测下来最稳的是随机森林在eCognition里对应Random Trees。随机森林鲁棒、对特征缩放不敏感、不容易过拟合而且它能输出特征重要性用来辅助特征删减非常方便。SVM理论上精度也可以但它对参数和核函数更敏感调起来费时样本量大了之后训练速度也明显慢。KNN最直观但对高维特征和样本分布很敏感结果稳定性略差。我在某个0.8米分辨率影像上做过对比用的样本每类200个左右特征25个。随机森林总体精度90.2%Kappa系数0.87SVM总体精度88.5%Kappa 0.85KNN总体精度85.9%Kappa 0.82。所以只要不是特殊需求我默认先跑随机森林。4.4 精度评价别只看训练集要看泛化能力机器学习分类跑完不能只看训练集里的混淆矩阵就收工。训练集精度高不代表模型真学会了它可能只是把样本背下来了。真正的检验是用一个独立验证集——也就是模型训练时从没见过的样本来评估精度。这就是机器学期课里常说的“泛化能力”放在你的数据上就是一个朴素的道理训练精度高、验证精度低说明过拟合了需要减少特征、增加样本或者简化模型。eCognition里可以直接生成分类结果的混淆矩阵、总体精度、Kappa系数和各类别的制图精度与用户精度。验证样本一定要单独采集不能和训练样本混在一起。我经常看到有人随手用刚才训练用的样本再验证一遍然后报出99%的精度这种数字没有任何参考价值。正确做法是训练区选一块验证区选完全独立的另一块或者把样本按7比3拆开用30%没参加训练的对象做验证。另外样本不均衡问题也要重视。比如整体影像里水体只占不到5%但训练样本里水体占了40%模型会拼命去拟合水体特征结果把大量植被误分成水体。解决办法是控制每类样本数量基本均衡或者在分类后处理阶段再加约束。5. 规则集和机器学习怎么选、怎么混5.1 三条路线对比精度、效率、可迁移性规则集、机器学习、以及规则集加机器学习的混合方案我都有实际应用。整理成表格给你参考维度规则集机器学习混合方案分类精度依赖经验和调试上限高但方差大样本质量够时比较稳定通常最高可解释性高每条规则都能讲清原因黑盒难以解释具体判断中高样本需求基本不需要训练样本需要大量高质量样本需要样本但量可少一些迁移性换影像后常需重新调阈值换区域后若训练数据有代表性仍可用相对最灵活调试门槛需要地学知识写规则耗时需要懂特征和分类器但门槛不高高两条路线都要懂一句话总结如果项目周期短、地物类别少、场景简单直接用规则集如果地物复杂、类别多、样本容易获取用机器学习如果追求高精度且有你愿意投入时间调优混合方案是终极答案。5.2 混合方案先用机器学习粗分再用规则集精修我现在最常见的做法是先跑随机森林做一次初分类把复杂的地物大类先分开然后针对容易混的类别写规则集做精细化处理。举个例子一个城区土地利用项目里阴影和不透水面在全色波段上光谱很接近随机森林把近三成阴影错分成了不透水面。我没有去反复调整样本和模型而是直接写了一条规则所有被分为不透水面的对象如果亮度均值低于整幅影像不透水面亮度均值的0.8倍而且相邻对象中有大量高植被覆盖对象就重新划入阴影类。这个规则加入之后不透水面的用户精度从78%直接跳到了90%。这个过程就体现了“机器学习负责大面上的区分规则集负责解决领域知识中的特例”。混合方案对样本量和调试时间的压力也比纯机器学习小。因为粗分类阶段的机器学习模型不需要把每个细节都学对更细的纠错可以通过规则来处理同时规则也不需要写得面面俱到因为大问题已经被机器学习解决了。5.3 批量处理与工程化项目落地时还要想的事到了项目真正落地还有两个问题要提前考虑。第一是批量处理多期影像。如果你要处理同一地区不同月份的十几景影像手动一个一个跑就不现实了。eCognition支持把规则集或分类流程保存成模板再通过批处理模式统一执行也可以用Python按面向对象的方式封装一个处理流程把分割、分类、导出全部串起来一行命令跑完一整批。第二是成果导出。分类完成后我一般会先把结果导出成Shapefile或GeoPackage再到GIS软件里做后处理——比如把面积小于某个阈值的碎斑合并掉或者用ArcGIS的消除工具把孤立小图斑合并到相邻大类里。eCognition里的分类结果也可以直接输出为栅格但矢量形态保留的对象边界信息更完整后续编辑也更灵活。6. 常见问题与避坑实录6.1 过分割与欠分割现象、原因、处置过分割最典型的现象一栋建筑被拆成几十块一条路断成一节一节。原因基本就是尺度设得太小或者Shape权重太低导致对象边界过于细碎。处理办法是先增大Scale再把Shape权重适当调高最后可以用光谱差异分割把碎斑合并。欠分割的现象反过来一栋建筑和它的阴影变成一个对象或者一块林地和旁边的草地糊在一起。处理办法是降低Scale或降低Shape权重让光谱差异起更大作用。我在实际项目里通常不会只调一个参数而是用“Scale Shape Compactness”三个参数联动调整每次只改一个变量、对比结果逐步逼近最佳配置。6.2 规则集换一幅影像就崩溃这是规则集最让人头疼的问题。原因往往是阈值定得太绝对没有考虑不同时期影像的光照、大气条件、物候差异。解决思路有三个。第一尽量使用比值型特征比如NDVI、NDWI它们能抵消一部分绝对辐射差异第二把所有阈值写成变量参数放到规则集最前面统一管理换影像时只需要调几个全局变量第三把规则集设计成分层结构先做大数据范围的粗分类再逐层细化避免一上来就卡死在非常具体的阈值上。6.3 机器学习结果出现大量碎斑这种碎片化问题和分割参数有关也可能和分类器本身有关。一种常见做法是在分类完成后做一个“分类后合并”步骤把相邻且类别相同的对象合并起来再用“移除对象”工具把面积小于指定阈值的对象重新划归到它最大邻居的类别里。这相当于在结果层面做了空间平滑视觉上会干净很多但要注意如果阈值设得太大可能把一些真实的小地物例如小水塘、小建筑也一并抹掉了所以阈值宁可设得保守一些。6.4 数据格式、投影与内存问题eCognition对数据格式比较挑不认乱七八糟的投影。我踩过的坑是影像坐标系和后续要叠加的矢量边界坐标系不一致导致分割和分类结果在导出后对不上位置。这个很好解决所有数据在进eCognition之前先统一投影。内存不足是大影像作业的常见问题尤其是大范围无人机正射影像动辄几十GB。我的经验是先用切块工具把影像按图幅切成分块每块单独跑完流程之后再拼接成果如果有条件准备一台内存充足的工作站会省很多心。6.5 一个容易被忽略的点预处理最后我还想提醒一下影像预处理。分割对图像质量很敏感云雾遮挡、传感器坏线、拼接接缝处颜色跳变都会直接影响分割边界。所以进eCognition前先做好辐射定标、大气校正和匀色镶嵌能让后面的分割轻松很多。不要指望eCognition能替你完美处理输入数据前面省事后面全是坑。我个人现在接手一个新项目第一步永远是先花时间把分割参数调到位。分割不好后面规则集和机器学习都是空中楼阁。如果你也是从像素分类转过来建议先别急着跑分类器用一块小测试区把多尺度分割玩明白了再动手后面会顺很多。
返回列表