1. 项目概述
一晃用eCognition做遥感影像分类也有七八年了,从最初被老师丢了一套SPOT影像让我“自己看着办”开始,到后来经手上百个项目、带过好几个实习生,中间踩过的坑可以说砌起来能绕实验室一周。前阵子正好把手上一个用eCognition 9.0完成的项目做了收尾,项目本身不算特别难,但是正好把规则集和机器学习两条技术路线都走了一遍,所以想把整个思路、参数怎么调、坑在哪里,都整理成一篇东西分享出来,希望能帮到刚入门的师弟师妹,也给做类似项目的同行一个参考。
这套项目核心就一句话:基于eCognition 9.0平台,采用面向对象的多尺度分割方法,结合规则集和机器学习两种分类方式,完成高分辨率遥感影像的地物分类。高分辨率影像的分类,传统基于像元的做法已经明显不够用了,椒盐效应严重、地物边界破碎,这在业内已经是共识。而面向对象的方法先分割后分类,能充分利用影像的光谱、纹理、形状、上下文等信息,分类精度和成图效果都好得多。项目内容对应的场景非常广,不管你是做土地利用、植被覆盖、水体提取、违章建筑监测,还是做农业大棚识别、林业树种分类,这套技术路线基本都能复用。
文章适合这几类人群来看:刚接触eCognition、对面向对象分类只有模糊概念的新手;已经用eCognition做过一些简单分类、但总感觉规则集写不顺手、机器学习参数调不明白的人;以及想系统对比规则集和机器学习两种方法、计划在实际项目里选型落地的从业者。我会把项目中用到的具体参数、规则集写法和机器学习配置都尽量给出来,你拿去改改就能用。
2. 面向对象分类的核心逻辑:为什么“先分割再分类”是高分影像的正解
2.1 像元级分类的窘境:为什么你的分类结果总是“花”的
先花点篇幅聊一个基础但重要的问题:为什么高分辨率影像不适合用传统的像元级分类?
很多初学者拿到高分影像的第一反应就是直接扔进ENVI或者QGIS里做监督分类,这也是很多教程教的路径。但实际做下来你会发现,结果往往惨不忍睹。原因在于:高分辨率影像的空间分辨率越来越高(亚米级、米级已经非常普及),地物内部的光谱差异也被放大得很明显。一棵树在影像上不再是“一个像元”,而是由成百上千个像元组成的群体,不同部位的亮度值天然有差异;一片水面可能因为波纹、光照角度、悬浮物浓度的不同,呈现出不同的光谱特征。
在这种情况下,如果你还是按像素逐个分类,就会出现大量非常细碎的错分点。比如一片农田里,田埂、裸土、稍微枯黄的作物都会被分成不同类别,结果图上密密麻麻全是噪点,这就是业内常说的“椒盐效应”。更麻烦的是,很多地物本身从光谱上就很难区分,比如林地和草地在某些波段上的光谱曲线几乎是重叠的,单靠像元的光谱值根本分不开。
我在课堂上给学生打过一个比方:像元级分类就像用显微镜去观察城市,你看到的是无数细碎的砖块、玻璃、沥青颗粒,反而看不清“这到底是一栋楼还是一堵墙”。而面向对象的方法,是先把这些颗粒归并成有意义的整体,比如“这一片是一个屋顶”“这一片是停车场”,然后再去判断这些整体分别是什么。这个“先归并、再判断”的思路,正是面向对象分类的核心优势所在。
2.2 多尺度分割的原理:为什么说它是面向对象分类的灵魂
理解了为什么需要面向对象,接下来就得说清楚“对象从哪来”。对象不是天然存在于影像里的,而是通过分割算法生成的。eCognition的分割算法有很多种,最常用、也最核心的就是多尺度分割(Multiresolution Segmentation)。
多尺度分割的基本原理并不复杂:从单个像素出发,不断计算相邻像元或相邻小对象之间的异质性指标,如果异质性小于设定的阈值,就把它合并到一起,直到无法合并为止。这里的核心是一个“区域生长和合并”的过程,但是真正的关键是那个异质性阈值。阈值设得大,合并的尺度就大,生成的影像对象块头大、数量少;阈值设得小,对象就细碎、数量多。这个阈值,就是eCognition里的“Scale Parameter”(尺度参数)。
看起来好像就是调一个数值,但实际用起来学问很大。尺度参数的选择直接影响后续分类精度的上限。你想想,如果分割结果本身就把房顶和旁边的树合成了一个对象,那后面不管你分类器多厉害,也不可能把它们分开;反过来,如果分割把本来完整的一片水体切得稀碎,后续分类就要处理大量碎片对象,效率和精度都会受影响。
这也是“多尺度分割”里“多尺度”三个字的来源:不同地物类型,适用的最优分割尺度往往不同。比如大片的农田和养殖水面,尺度参数可以设大一些,比如30、50,甚至更高;但像城市里的建筑物、道路、独立树冠这些,尺度参数就得小一些,比如10、15。所以在实际项目中,很少一次性就把所有地物都分好,更多的情况是先做精细尺度分割用于提取小地物,再做粗糙尺度分割用于提取大地物,最后通过不同尺度获取的对象层次关系(父对象-子对象)来做上下文分析。
2.3 eCognition里的对象层次结构:很多人忽视的隐藏武器
这里要特别表扬一下eCognition的一个核心设计——影像对象层次结构(Image Object Hierarchy)。这是新手最容易忽略、但恰恰是最有价值的东西之一。
eCognition允许你在同一个项目里对不同尺度分别执行分割,分割结果会形成不同层级的对象层。低层级的小对象和高层级的大对象之间存在包含关系,小对象自动成为大对象的“子对象”,大对象是小对象的“父对象”。这意味着,你可以利用父对象的特征来辅助子对象的分类,也可以反过来用子对象的统计信息来修正父对象的属性。比如在小尺度分割层上,你可以提取每一个树冠对象;然后在上一层大尺度分割上,树冠群会落在“林地”父对象范围之内,拿父对象的均值或标准差信息反馈回来,就能进一步确认这些树冠到底属于林地还是孤立的行道树。
这种层次信息,规则集可以轻松利用,机器学习方法也可以通过特征工程的方式把它变成特征输入模型。明白这一点,你对eCognition的理解就已经超越了一大半人了。
3. 两种分类方法选型:规则集和机器学习各自的“用武之地”
3.1 规则集方法:可解释、可控、可迁移的“老法师”打法
规则集方法在eCognition里的本质,就是通过一系列“if-then”判断,利用影像对象的特征阈值来完成分类。你在对象特征里选择某个指标,比如NDVI(归一化植被指数)、亮度均值、形状指数、面积大小,设定一个或多个阈值,eCognition就会把所有满足条件的对象归到对应的类别里。
规则集最大的优势是逻辑透明、可解释性强。分类结果为什么是A不是B,你随时可以打开规则树逐条查看,也可以导出某条规则命中了哪些对象,做非常细致的排查和调整。这点对于需要向甲方、向评审专家解释成果的项目来说非常关键——你要能说得清楚每一步为什么这么分。
规则集还有个隐藏优势是可复用性。同一个地区的两个时相影像,只要数据源一致、大气条件类似,你完全可以把上一期的规则集直接拿来跑新影像,微调几个阈值就搞定了。项目做得多了你会明白,这个“规则库”是会越攒越厚的,这是很有价值的资产。
但规则集的短板也很明显:当目标类别多、地物光谱复杂、存在大量需要综合判别的场景时,人工去穷举和调试阈值会非常累。比如你要分20几个地类,每个地类可能要写3到5条规则,有些地物不管怎么调阈值总不能和别的完全分开,这种时候就很折磨人,规则集之间还可能打架,顾此失彼。
3.2 机器学习方法:让算法替你找特征的“数据驱动”路线
机器学习的路线则是另一套逻辑:你先定义好类别和样本,然后让算法从样本中自动学习特征和类别之间的映射关系。在eCognition 9.0里,机器学习分类主要通过两个途径实现:一是软件内置的分类器(KNN、SVM、随机森林、决策树等),二是通过特征空间(Feature Space)的方式定义输入特征,再由分类器完成训练和预测。
机器学习对复杂场景的适应能力要强得多。比如在林地分类中,你很难直观地找到一个阈值把“针叶林”和“阔叶林”分开,但如果你给随机森林喂入每个对象的光谱均值、标准差、纹理特征、几何特征,几十个特征组合在一起,算法往往能学到人眼不太容易发现的微妙规律。
而且机器学习方法的调优路径也比较标准化:调整样本、调整特征、调整模型参数。每个环节之间相对独立,出了问题容易排查,不像规则集那样牵一发而动全身。
但机器学习也有它的烦恼。最核心的一点是:结果的可解释性比较差。你可能训练出了一个精度90%的模型,但当别人问你“为什么这个对象被分成了裸地”,你很难给出一条清晰的规则来回答。这在一些需要严格合规、审计、评审的行业项目里会比较被动。另外,样本的质量和数量直接影响模型上限,标注几百个高质量样本的工程量其实一点都不小。
3.3 怎么选择:项目场景决定技术路线
说了这么多,你可能想问:那到底用哪个好?我的经验是,别把这两个方法对立起来看,它们更像两种不同的工具,适配不同的场景。
我一般这样决策:地物类别不多(五类以内)、光谱特征区分度明显、对结果可解释性要求高的项目,优先用规则集,速度快、逻辑清晰、方便向客户汇报。地物类别较多(七八类以上)、光谱重叠严重、几何和纹理特征复杂的项目,直接上机器学习,别跟自己的头发过不去。当然还有第三种选择:先用机器学习做大类粗分,再用规则集针对容易混淆的少数类别做精细化修正。这种混合策略我用过很多次,效果往往比我单用一种要好得多,常见于“先分建筑和非建筑,再对建筑做细分”一类的场景。
4. 多尺度分割参数详解:五组关键参数的取值逻辑与实际调试经验
4.1 五个核心参数逐个拆解
多尺度分割的对话框里参数不多,但每个都牵一发动全身。我听过太多人说“参数就是瞎试嘛”,这话听起来豪迈,实际上效率很低。这里把我的参数理解方式和调试经验分享出来。
Scale Parameter(尺度参数):这是最重要的一个参数,直接控制对象的大小。它其实是一个异质性的阈值,数值越大,允许合并的异质性越大,对象块头就越大。没有一个万能值,需要结合影像分辨率和目标地物大小去试探。一般经验是:目标地物在图上的尺寸,应该不低于对象尺寸的1.5到2倍,否则一个对象里会混入太多背景地物。
Shape(形状因子):权重范围0到1,控制分割时对形状的看重程度。它和下面的Compactness(紧致度)配合起来,牵涉到对象的几何形态偏好。形状因子设得越高,分割时越倾向于形成形状规整的对象,但也会在一定程度上牺牲光谱边界。
Compactness(紧致度):在形状权重已经确定的前提下,控制对象是偏向于“紧凑”(接近圆形)还是“松散”(细长形状)。紧致度越大,对象越接近圆形或方形;越小,越容易生成狭长、不规则的对象。
Smoothness(光滑度):和紧致度是一对互补的关系,数值上等于1减去紧致度。它更看重对象边界的平滑程度而不是紧凑程度。
Band Weights(波段权重):默认情况下每个波段权重都是1,但在实际项目中,我几乎一定会去调整它。比如做水体提取时,近红外波段对水体响应极其敏感,我会把它的权重提高;做建筑提取时,如果影像有DSM(数字表面模型)或者NDVI参与分割,也需要重点提高对应层的权重。
4.2 一套实用的参数调试流程
具体怎么调试参数?别人给你说再多也不如自己动手跑一遍,但跑一遍也是有方法论的。我的标准流程是:
第一步,先不追求完美,随便设一组初始参数(比如Scale=20,Shape=0.1,Compactness=0.5),执行分割后在Viewer里叠加上对象边界,肉眼观察几个典型地物(比如一块建筑厂房、一片林地、一条河流)的分割情况。
第二步,根据观察结果逐项调整。如果发现对象太大,把建筑屋顶和旁边道路黏在一起下不来,就调小Scale;如果发现一块完整的农田被切得七零八落,就调大Scale。Shape参数如果不是特殊情况一般不轻易动,保持在0.1-0.3之间就好。
第三步,针对特定地物微调。比如你的重点目标是提取建筑物,那就把“建筑屋顶内部不碎、边界贴合房檐”作为第一优先级来抉择参数。因为一个分割结果不可能满足所有地物的需求,你必须做出取舍。错位的“取”和“舍”选择,往往是项目成败的分水岭。
第四步,记录每一次参数组合的结果,导出为图层叠加对比。我强烈建议你养成记录参数的习惯,做多了之后你就能总结出适用于你常用数据源的参数先验值组合。比如我处理0.5米分辨率的航飞影像时,城市区域的常用参数就是Scale=15-25,Shape=0.2,Compactness=0.5,基本十拿九稳。
4.3 用ESP工具来辅助选尺度参数
如果你的项目里有很多不同类型的地物需要分别提取,那手工尝试尺度参数会很费精力。eCognition有一个内置的工具叫做ESP(Estimation of Scale Parameter,尺度参数估算工具),它通过计算不同尺度下对象异质性的局部方差变化,自动帮你找出“在当前尺度下分割质量最优”的几个候选尺度值。操作上就是在eCognition里加载ESP插件(9.0版本自带),设置好步长和起止范围,它会自动跑一遍并输出一张折线图,图中局部方差变化率最显著的点,对应的就是值得尝试的尺度参数。
我自己用ESP的经验是:它给出的点可以作为很好的初筛,但不能盲信。因为ESP衡量的是分割的“统计质量”,和你最终的分类目标并不完全一致。比如ESP推荐了19、31、47三个尺度,我还是会在19到47之间手动插值再测试几组,综合目视效果来决定最终值。
5. 规则集分类实操:从建规则到跑出成果的全过程
5.1 规则集的基本架构搭建
在eCognition里构建规则集,本质上是建立一个按顺序执行的决策树。每条规则包含一个或多个条件,条件成立则执行相应的类别分配或对象操作。良好的规则集设计,一般遵循“先粗后细、先简单后复杂”的原则。
以我这次项目的几个典型地类为例(项目区域主要是建筑区、林地、裸地、水体、草地五类),规则集的架构逻辑大致如下:
第一步,先快速提取特征最明确的地物,把好摘的果子先摘了。比如水体,在近红外波段上反射率极低,NDVI为负,用一条简单的条件就能高分出来。我这里的写法是:
- 选中所有对象,执行条件判断:Mean NIR < 阈值且 NDVI < 0,符合条件的对象归类为“水体”。
第二步,提取植被覆盖区。植被的最显著特征是NDVI高,但林地和草地需要细化区分。这里我引入了对象纹理特征来辅助,比如GLCM Homogeneity(灰度共生矩阵的同质性)。林地树冠纹理粗糙,同质性值偏低;草地纹理均匀,值偏高。通过NDVI阈值配合GLCM Homogeneity阈值就能把两者分开。
第三步,处理剩余对象。此时剩下的主要是建筑和裸地。建筑往往具有“面积大、边界直角转折多、亮度高”的特点,我用三个条件组合来判断;裸地则以亮度中等、纹理均匀为主要特征。
5.2 成员函数和阈值设置的实操心得
eCognition里条件判断的写法有两种风格:一种是直接在规则里用“大于/小于”逻辑表达式,简单粗暴;另一种是用成员函数(Membership Function),结果是一个0到1之间的隶属度值,配合模糊分类的思想来做判断。两种我都用过,实际项目中我更推荐成员函数这种方式,因为它是连续过渡的,不会出现“阈值一边是0一边是1”那种一刀切的问题。
举个例子,判断水体的时候,直接用“Mean NIR < 300”是硬性切分,但如果水体的近红外值在300附近波动,就会造成一部分水体对象被漏掉。用成员函数的话,我可以设置一个范围,比如在200以下隶属度为1,200到400之间从1渐变到0,超过400为0。这样水体边界处的对象会获得一个中等隶属度值,你可以在后续步骤里综合其他特征再做二次确认,容错率大大提高。
关于阈值的初始值怎么定,我一般习惯用eCognition自带的Feature View功能去看特征分布。选中一些已经知道是水体的对象样本,在Feature View里看它们Mean NIR的取值范围,再选中非水体对象,两者对比,重叠区域就知道阈值大概在哪里设。这个方法比你看直方图高效太多,也是我调阈值的主要手段。
5.3 一次完整规则集的运行与迭代
完整规则集写好之后,执行过程我建议分模块跑,不要一次性点“全部执行”。理由很实际:一旦某一步分类错乱,你很难定位到底是哪条规则出了问题。我的习惯是每条规则写好之后,单独在特定对象层上运行,运行完马上检查结果是否正确。检查方法很简单,就是把执行后归到这个类别的对象整体上色,和原始影像叠加对比,肉眼扫一遍基本能看出问题。
迭代优化时会遇到一种很典型的情况:某条规则在第一次运行时效果好,但操作了更多规则之后,某些之前被分出去的对象影响了后续步骤。这时候要善用eCognition的对象层级功能。对已经分类的对象,可以做一个“Lock”或“排除”操作,让后续规则不再处理它们。很多初学者容易忽略这个步骤,导致后面每一步都在重复处理已分类对象,结果自然是一团糟。
5.4 规则集调试:一个实测案例的全过程
拿我这次项目里“建筑区”和“道路”两个类别的分离来说,这个组合非常典型,它们的光谱特征高度接近(都是灰色调、高亮度),单纯靠光谱阈值基本分不开,我第一次调试时就用Mean Layer 1和Mean Layer 2的阈值写了一组规则,结果是建筑和道路互相混入的比例超过30%,完全不可用。
后来我重新分析了它们的差异,发现关键点在形状特征和上下文关系上。建筑对象通常面积较大、长宽比较为稳定,而道路是狭长的带状,长宽比往往大于5;另一方面,道路具有连续性,一个道路对象往往相邻很多个同为道路的对象。于是我调整思路:先用面积和亮度把“可能是建筑或道路”的对象选出来,然后用长宽比(Length/Width)大于4.5、面积与边界长度比值偏小作为道路的判断条件。跑完之后,道路提取效果好了很多,但有一部分弯曲道路段落的长宽比达不到阈值,又漏掉了一部分。
最终解法是引入上下文特征:在更高的分割层上先生成“大面积连接区域”父对象,然后在父对象范围内统计道路对象的连通性。这在eCognition里可以通过“Rel. Border to”特征来实现,即计算一个对象与相邻对象共享边界占自己总边界的比例。道路对象的Rel. Border to同为道路的对象通常都大于0.6,而一般建筑对象做不到这一点。通过这条规则,剩余漏网的道路也被捞了回来。
6. 机器学习分类实操:从样本到模型的完整链路
6.1 特征空间的设计:这是决定模型上限的关键
机器学习接管的不是分割,而是“分割之后的分类决策”。在eCognition 9.0里用机器学习做分类,基本路径是:先把分割好的对象生成一组特征表格,然后结合你的训练样本,用分类器去学一个映射模型,最后把模型套用到全部分类对象上完成预测。
上模型之前,最重要的是设计特征空间。项目里我用到的特征组大致有这么几类:
- 光谱特征:各波段的均值、标准差、亮度值(Brightness)、最大差值(Max. Diff)
- 指数特征:NDVI、NDWI(归一化水体指数)、SAVI(土壤调节植被指数)等
- 纹理特征:GLCM的均值、方差、同质性、对比度、熵。这里注意一个坑:GLCM特征和计算方向、灰度量化级别有很大关系,eCognition默认设置下算出来的纹理特征有时候并不稳定,建议你固定好参数再提取
- 几何特征:面积、长宽比、形状指数(Shape Index)、密度(Density)、边界长度
- 层次特征:父对象的光谱均值、子对象的光谱方差等
特征也不是越多越好。特征太多不仅会拖慢模型训练速度,还可能引入噪声,导致过拟合。我在项目里的经验是:初始特征选30个左右,然后通过特征重要性分析(用随机森林自带的Feature Importance输出)来做一轮筛选,剔除掉重要性很低的特征。通常筛选后保留15到20个特征就足够稳定了。这步优化做和不做,精度上可能差5个百分点,训练速度上能差几倍。
6.2 样本标注的正确姿势
样本是监督学习的老大难问题,谁标谁知道。我标样本的心得是“宁缺毋滥、分布均匀、覆盖变异性”。
“宁缺毋滥”很好理解:质量差的样本比没样本更可怕。我在标注时会在影像上均匀布点,每个类别标注至少80到120个样本对象,并且这些样本应该覆盖不同区域、不同光照条件下的同类地物。比如建筑类,不能只在影像中心选最亮的几栋楼做样本,那样模型只认识“亮楼”,遇到阴影遮挡的、颜色发暗的建筑就完全不认账了。“覆盖变异性”就是这个意思。
“分布均匀”是说训练集、验证集要分开。我一般按7:3的比例切分训练集和验证集,并且保证两个集合在空间分布上互不重叠(比如东半区做训练,西半区做验证),否则会出现空间自相关导致的精度虚高——这也是遥感领域做机器学习最容易踩的坑,学术上叫“空间数据泄漏”。
6.3 分类器选择与参数配置
eCognition 9.0自带的机器学习分类器包括KNN、SVM、随机森林和决策树,基本覆盖了常用的算法。项目里我主要用了随机森林,也对比过SVM,这里说说我的选型和调参经验。
随机森林本质上是通过构建大量决策树并综合投票来做分类。它的优点是抗过拟合能力强、对特征尺度不敏感、能输出特征重要性。eCognition里随机森林需要配置的主要参数是树的棵数(Number of Trees)和每棵树随机选取的特征数量(Number of Features)。默认参数是树=10,特征=3,这个配置在大多数情况下只能说勉强能用,效果不太行。我一般把树设到100到200棵,特征数根据总特征数量动态调整,总特征20个左右时选5到6个。
SVM在处理小样本、高维特征时有优势,我也试过。SVM的关键参数是核函数和惩罚系数C。在我的数据里,RBF核的表现优于线性核,但SVM对参数和特征标准化的敏感度明显高于随机森林,调参成本也更高。如果项目周期紧,我建议优先随机森林。
6.4 模型训练与精度评估实操
在eCognition里训练机器学习模型,界面操作本身并不复杂:切到Classification界面,选择监督分类,挑选特征,然后指定训练样本,选算法,点击训练即可。关键环节在训练完成后,一定要做精度评估。
eCognition提供混淆矩阵、总体精度(Overall Accuracy)、Kappa系数等评估指标。我建议在样本池里明确区分训练样本和验证样本,在eCognition中把两者的标签分开,训练只喂给模型训练样本,验证样本单独用于精度评估。这样出来的精度才真实可靠。还要提醒一点:eCognition有时会自动把全部样本都用于训练,导致最终精度虚高,这一点务必要在设置时看清楚。
我之前在另外一个项目里就吃过这个亏,训练完看误差矩阵精度高达98%,心里还挺高兴。后来自己单独拿一块未参与训练的区域做目视验证,实际精度只有80%左右,浪费了很多返工时间。所以现在我的习惯是,模型训练完之后,一定会把分类结果和原始影像叠加,在图上随机挑几个区域逐块目视检查,以人工目视结果为准,混淆矩阵只作为参考。
7. 规则集 vs 机器学习:项目中的实测对比与结果分析
7.1 两种方法的精度与效率对比
这次项目里我用了同一套分割结果,分别跑规则集和随机森林两种分类路线,最终做了一个比较系统性的对比。这里把数据列给大家参考:
| 对比维度 | 规则集方法 | 随机森林方法 |
|---|---|---|
| 总体分类精度 | 86.7% | 91.2% |
| Kappa系数 | 0.83 | 0.89 |
| 目标类别(建筑)精度 | 84.5% | 92.3% |
| 易混类别(建筑/道路)分离度 | 一般 | 较好 |
| 建模耗时(含调参) | 约半天 | 约一天半 |
| 结果可解释性 | 高,每条规则可溯源 | 低,依赖特征重要性 |
| 对新区域影像的迁移性 | 较好,微调阈值即可 | 相对较差,需重新采样 |
从精度上看,在类别较多、光谱部分重叠的数据集上,随机森林优势非常明显。尤其是在建筑和道路这类易混地物上,机器学习能够自动利用更多维度的特征组合,分离度远超手工阈值。但从“省时间”和“好交代”的角度,规则集仍有它的位置。这次项目中,我最终交付时用了机器学习的分类结果作为主产品,同时保留了一套规则集分类作为逻辑校验和解释支撑。
7.2 混合路线:在项目收尾阶段的实战操作
偶尔会有朋友问我:“就不能两个人一起上吗?”能,而且我强烈建议你尝试一下混合路线。
我在这次项目的收尾阶段,就用了一个“机器学习粗分+规则集修正”的组合拳:先用随机森林把全图分成了建筑、林地、裸地、水体、草地五大类,然后单独把“建筑”类别提取出来,在建筑对象子层上执行一个针对性规则,通过“面积不能过小且亮度上下限约束”把错分进建筑的零星阴影斑块清扫掉。这组规则逻辑简单、非常容易写,但是它解决的问题,直接让建筑类的制图精度从91%升到了94.8%。
混合路线的思路其实和项目管理里的“二八定律”很像:机器学习解决80%的自动化大面分类问题,剩下20%的尾巴用规则集去精修。陈词滥调但确实是香。
8. 常见问题与排查技巧实录
8.1 分割对象“过碎”或“过黏”的根本解法
分割结果过碎或者过黏,这两个问题在咨询里被问到最多。先说结论:你可能根本调错了参数。
对象过碎,很多人的第一反应是把Shape往大调,觉得“让对象更规整就不会碎了”,这是误区。真正的主导参数是Scale,Shape的主要作用是控制对象形态偏好,它并不能直接决定对象“碎不碎”。对象碎,优先把Scale调大;对象黏连,优先把Scale调小。Shape和Compactness更多是修正解剖形状问题。
另外还要注意波段权重的干扰。某个波段的信息如果噪声太大,且它参与分割时的权重很高,就会把分割结果带得特别碎。这种情况常见于夜间灯光影像或受云雾干扰的影像。解决办法是检查各波段的目视质量,把噪声大的波段权重降低,甚至直接设为0。
8.2 规则集怎么都分不开的两个类别
如果规则集怎么写都分不开两个类别,不要恋战。这时候该考虑两种情况:一是你选择的特征本身不具区分度,二是分割尺度不够合适。前者好办:在Feature View里同时选中两个类别的样本,逐一特征查看分布,找到分布差异最大的特征来写规则,基本就能解决。后者麻烦一点:说明当前分割尺度下对象太粗或太细,把两类地物粘在一起或切碎了,需要回到分割步骤重新调参。
还有一个偷师的技巧:用eCognition里“Classification Stability”和“Best Classification Result”两个特征来辅助排查。前者表示对象被分成当前类别的稳定程度,后者表示对象在各类别中的最大隶属度差。凡是稳定度低的对象,基本都处于类别边界上,是你可以重点审视调优的区域。
8.3 机器学习模型精度虚高的三种原因
模型训练时精度很高、验证时原形毕露,这是最多人吃亏的地方。总结下来无非三种原因:第一,训练样本和验证样本在空间上重叠或过近,导致了空间自相关带来的“假精度”;第二,训练集里某些类别的样本量远高于其他类别,模型学成了“多数类碾压”;第三,特征里混入了和分类目标直接相关的泄漏特征。比如你在分割后手动给所有已知类别贴了标签,然后这个标签不小心被当成了特征喂给模型。这类错误很隐蔽,排查时建议把特征列表逐个过一遍,确认没有“Label”相关字段。
9. 项目经验总结与进阶方向
这个项目完整跑下来,我最大的体会是:面向对象分类的技术框架,在eCognition里其实是很清晰的,但真正拉开差距的地方,往往在分割参数的调试耐心、特征选择的理解深度,以及对“为什么分类结果是这样”的追问能力上。
如果你手里有一批自己的数据,我建议按这个顺序来练:先别急着写规则,拿ESP工具摸几组候选尺度参数;然后用五类以内、光谱区分度高的简易数据,把规则集流程完整跑通;接着挑一个类别容易混淆的数据,开始尝试机器学习流程,并刻意记录下你为模型准备了多少个样本、抽了哪些特征、精度发生了什么变化。这样一轮跑下来,你再回头看eCognition,就会有一种“工具箱里所有工具都在哪儿、什么时候该用哪个”的掌控感。
最后再分享一个小技巧:eCognition的项目文件(.dpr)本质上是可以导出规则集、特征空间配置的,建议你养成项目结束时把规则集和特征空间导出为可复用模板的习惯。我电脑里有一个“标准流程模板”文件夹,里面存放着我这些年攒下的各种场景的模板文件,包括高分二号城市分类、哨兵2号土地利用、无人机可见光植被提取等。每次接到新项目,我会先从这些模板里找到最接近的一个做底子,再去适配新数据——实测下来,这能让项目开发周期至少缩短一半。