ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于LLM智能体框架的城市遥感图像变化分析:从像素到业务报告

基于LLM智能体框架的城市遥感图像变化分析:从像素到业务报告

“去年接手一个城市扩张监测的活儿,甲方要求每月出一期变化图斑,用的还是传统的两期遥感影像对比加人工目视解译。干了两个月我就意识到,真正耗时间的根本不是算法精度,而是把‘像素差异’翻译成‘业务语言’的过程。后来我把大语言模型智能体框架接进了整个流程,让智能体去调度分割模型、分类模型,再把栅格检测结果换算成自然语言结论和报告——这套‘基于LLM智能体框架的城市遥感图像变化分析’方案才真正跑顺。这篇文章就是把那段实践完整拆开,从架构设计、多模态接入、工作流编排到干扰项排查,一步步讲清楚哪些地方能省力、哪些坑必须避开,适合刚接触遥感与LLM结合的开发者,以及想评估这套技术路线值不值得投入的技术负责人。”

1. 遥感变化分析的旧流程痛点,和LLM智能体的切入点

1.1 传统做法到底卡在哪

很多人以为遥感变化分析就是“拿两期影像做个差值,把变化的像元标出来”,实际操作过的人才知道,这里面有一个很大的断层:像素级算法只能输出变化掩膜(change mask),但业务上需要的是“哪个地块发生了违建”“哪个片区植被退化”“哪条道路施工进展如何”这样的语义结论。完成这个翻译,传统上靠的是遥感解译员逐屏查看。

具体来说,传统工作流分这么几步:先做影像预处理(辐射定标、大气校正、几何配准),然后用指数差值、主成分分析或者深度学习变化检测网络输出变化概率图,接着解译员把图斑逐块和底图、实地照片比对,判断变化类型、变化性质,最后写报告。这套流程里,前两步已经高度自动化,可恰恰是第三步“判读”,人力投入最大、周期最长。一张覆盖几十平方公里的0.5米分辨率影像,变化图斑动辄上千块,解译员要看两三天才能完成定性。

我曾经统计过一组数据:传统流程里,算法自动检测只占整个工作周期的30%,剩下70%全部花在人工判读、核查、填表写报告上。这也是LLM智能体框架切入的根本原因——它不跟传统算法抢像素级精度,而是解掉“像素结果到语义知识”之间的翻译难题。

1.2 LLM智能体的定位:认知调度中枢,而非检测器

把LLM放进遥感流程时,最容易犯的误区是把大模型当成“更强力的变化检测器”,拿它直接跟专门的深度学习变化检测网络比精度。这么比没有意义。变化检测这个任务,卷积神经网络或Transformer分割网络在像素级指标上仍然是有优势的,大模型的价值不在这层。

真正合适的位置,是让LLM智能体承担“认知调度中枢”的角色:它理解任务目标,把“分析某区域的城市扩张情况”拆成“选择数据、预处理、调用检测算法、读取结果、判读图斑、撰写报告”这样一系列原子动作,再通过工具调用的方式一步步执行,并在执行之后反思纠错。这本质上是一个编排层。

打个比方:传统算法堆栈是一台精密的机床,能加工零件,但需要老师傅在旁边看图纸做决策;LLM智能体则是那个能看懂图纸、会操作机床、还会在加工完后写质量报告的老师傅。虽然老师傅不能比机床更精细地切割,但整条产线离开了他就转不起来。

1.3 什么时候这套方案真正划算

也不是所有项目都非得引入LLM智能体。我对这点的判断很简单:如果项目只是两期影像比一次、图斑数量小、报告要求简单,传统人工流程更快;但凡是高频监测、多批次对比、报告标准化程度需求高、或者分析人员不够用的场景,这套方案的优势会指数级放大。

尤其是“城市级、月更新、自动出报告”这种需求,传统人工流程几乎不可持续。智能体的好处不仅在于提效——它还能把原来老师傅脑子里的判读经验固化成可调用的知识库和工具链,降低人员流动对项目稳定性的冲击。

2. 系统架构设计:Agent负责认知,管线负责像素

2.1 三层架构拆解

在动手搭建时,我采用了三个层次的分工模式,简单说就是:数据层管“喂”,工具层管“算”,智能体层管“想”。

数据层负责把原始遥感影像统一转换成适合算法消费的格式,包括两期影像的几何配准、辐射归一化、云掩膜生成、切片切块。这一层不需要LLM介入,纯粹是传统的栅格处理,可以预先做成流水线。

工具层暴露一组可被智能体调用的“能力接口”,比如“读取影像元数据”“执行变化检测”“提取图斑属性”“查询历史图斑”“生成统计图表”等等。每个接口背后是一个确定性的算法模块,输出结构化的JSON或GeoJSON,方便智能体直接解析。

智能体层则是核心编排中心,由主控智能体、若干专业子智能体(数据智能体、检测智能体、报告智能体)和一个轻量记忆库组成。主控智能体接收用户指令后做任务规划,把任务拆给子智能体,子智能体通过工具层执行具体动作,再把执行结果回传给主控。

用户请求 ↓ 主控智能体(任务规划 / 进度跟踪 / 结果汇总) ↓ 分配 [数据子智能体] → [检测子智能体] → [判定子智能体] → [报告子智能体] ↓ ↓ ↓ 工具层接口 变化检测算法 规则引擎 / 知识库 ↓ 数据层(栅格预处理、切片、存储)

这个架构的好处是:每个子智能体的职责单一,提示词上下文清晰;工具层保持确定性输出,不怕模型“幻觉”;即便未来换掉某个检测算法,只需要改工具接口,上层智能体逻辑不变。

2.2 关键设计决策:让智能体远离原始栅格

我在最初的试验版本里犯过一个错误:直接把一张512×512的三波段影像以base64形式塞给多模态大模型,让它“判断有没有变化”。结果有三方面问题。

第一是Token开销大得惊人。一张512×512的RGB影像,按常见视觉编码器的分块方式,可能要消耗上千Token,如果叠加多波段、多时期、多切片,一次分析的Token数量直接让成本失去控制。

第二是几何精度不可靠。大模型可以告诉你“右下角区域有明显变化”,但如果需要输出变化图斑的边界坐标,模型给出的多边形通常是粗糙甚至无效的,很难用于后续的图斑入库和实地核查。

第三是栅格数据的动态范围问题。遥感影像往往需要做大气校正、拉伸增强之后才能被视觉模型理解,直接喂原始DN值,很多视觉模型看到的是一张灰蒙蒙的图,判断能力大打折扣。

所以我的设计原则变成了:智能体永远不直接处理原始栅格,一切像素级工作交给工具层;智能体接触的都是文本化的结果——统计数值、图斑属性、裁剪后的缩略图(仅用于视觉辅助判读)。这让系统在精度、成本、可追溯性三个维度上都处于可控状态。

2.3 环境与工具链选型

做这套系统我用的是Python技术栈,核心依赖包括:栅格处理用Rasterio和GDAL,变化检测算法用现成的深度学习分割模型(如基于UNet或Transformer的语义分割变体),LLM接入使用支持函数调用(function calling)的对话模型接口,智能体框架层面没有绑定现成的Agent框架,而是自己用状态机加工具注册表实现了一套极简编排——这样后续替换组件更灵活,也更容易排查问题。

如果只是做原型验证,建议选一个支持函数调用的通用大模型API,配合LangChain或自写的Agent Runner即可。真正复杂的是工具层的封装,尤其是把遥感影像处理算法包装成“以自然语言可解释、以JSON可解析”的接口,这一步对代码能力和遥感领域知识的重合度要求比较高。

# 工具注册表的简化示意 class GeoToolRegistry: def __init__(self): self.tools = {} def register(self, name, description, parameters, executor): self.tools[name] = { "description": description, "parameters": parameters, "executor": executor, } def run(self, name, **kwargs): if name not in self.tools: raise ValueError(f"Unknown tool: {name}") return self.tools[name]["executor"](**kwargs)

我给每个工具都写清了“描述、参数、输出结构”,并强制要求返回结果带一个schema字段。这套做法看起来多写了代码,但在智能体调用稳定性上收益极大——模型知道工具返回值长什么样,下一步的推理才能稳定。

3. 让智能体“看见”变化:多模态接入的三种实现路线

3.1 路线一:多模态大模型直接读影像切片

这条路线最直观,就是让LLM直接看图片。适合的场景是“概览级判断”:比如把城市分成若干公里级网格,每个网格裁剪一张低分辨率预览图,让模型快速判断“这个区域有没有明显新增建筑”。

实现上要严格控制影像的视觉质量:先做直方图匹配和线性拉伸,再把切片缩放到期望尺寸。我一般用RGB三波段合成,空间分辨率控制在2米到5米之间,这样一张切片的视觉语义比较完整,也不会因为细节太多而引入噪声。

提示词也需要设计,不能笼统地问“有没有变化”,而是应该给出明确的判读规则,例如:两期影像对比,注意是否有新增建筑轮廓、是否有大面积植被转裸露地、是否有道路形态改变,回答时输出‘无变化’‘疑似新增建筑’‘疑似植被退化’等固定标签,并附一句依据。固定标签的输出对后续自动汇总非常关键。

这条路线的问题也很明显:只能用于粗筛,精度不足以支撑业务级图斑管理。另外,当前开源多模态模型的遥感影像理解能力参差不齐,有些模型面对航拍图时会把阴影、云影误认为变化目标,需要引入规则过滤。

3.2 路线二:变化检测算法输出被翻译为文本

这一路线的思路正好反过来:像素级判断完全交给专门的深度学习检测网络,LLM只负责解读检测结果。

具体流程是:检测网络输出变化概率图和实例图斑掩膜,然后用后处理脚本提取每个图斑的面积、长宽比、位置坐标、光谱统计特征、前后期NDVI差值等属性;把这些属性转成结构化的文本描述,交给LLM进行变化类型的语义判定——比如判定“图斑A可能是建筑工地,因为其矩形特征明显、NDVI显著下降、纹理粗糙度较高”。

这条路线最大的优势是可靠。所有几何信息来自确定性算法,LLM只做“判断题”和“简答题”,幻觉空间被压缩到极致。适合对图斑精度要求高的业务场景。

但相应的代价是:检测算法本身的准确率直接决定了系统上限。如果检测网络漏检了,LLM再聪明也补不回来。所以在这一路线的实践中,我通常会在检测网络后面接一个召回优先的阈值调整策略,宁可多检出一些候选图斑,也不要漏检,然后让LLM做二次筛选。

3.3 路线三:混合编排(实测最稳的组合)

我最终采用的是混合式:先用浅层规则(如波段差值、指数变化)自动圈定一批候选区域,再把每个候选区域的影像缩略图和相关统计特征同时提供给多模态模型,让模型基于“视觉证据+数值证据”做综合判定。

在这种模式下,视觉证据解决了“这是什么变化”的开放性问题,数值证据解决了“变化幅度有多大”的量化问题,两者互为校验。比如一个候选图斑,NDVI前后差值很大、但影像上看颜色变化不明显,模型结合两个信息后,比单纯用哪一个都更可靠。

实测下来,混合模式在关键业务指标上表现稳定:变化图斑的召回率前前后后能提升十个百分点,同时误检率下降明显——主要原因是统计特征帮助模型排除了大量视觉上相似但实际没有显著变化的云影和耕作差异。

4. 核心智能体工作流:从区域框选到报告生成的完整编排

4.1 工作流五阶段拆分

真正跑通一个“城市变化分析”任务,最少需要经历五个阶段:区域划定、数据准备、变化检测、图斑判定、报告生成。下面以“分析某城市主城区2024年新增建设用地变化”为例拆开讲。

区域划定阶段,主控智能体先从用户描述中解析出研究范围(行政区名称、经纬度范围或道路边界),然后调用地理编码工具把自然语言范围转成GeoJSON边界。这个步骤的关键在于,边界解析错误会直接导致后续所有计算作废,因此我要求工具层返回边界时附带面积校验,一旦面积超出合理阈值就触发重新解析。

数据准备阶段调用预处理工具,对研究区做影像裁剪、投影统一和云掩膜处理,并输出两期影像的质量统计(云覆盖率、像元缺失率)。如果影像质量不达标,数据子智能体会主动上报主控,由主控决定是换数据源还是提示用户。

变化检测阶段是计算密集区。检测工具会输出形如{图斑ID, 几何边界, 面积, 均值差异, 纹理特征}的JSON列表,每个图斑附带一个裁剪后的对比缩略图。为了避免一次传给LLM的内容过多,我在这里做了分块——先传批量图斑统计表,让模型做一轮整体判断,挑出重点图斑后,再逐个传详情。

4.2 规划-执行-反思循环的落地

智能体编排中,“规划-执行-反思”是个绕不开的机制。我的实现方式是:主控智能体先输出一个包含步骤序列JSON的任务计划,然后逐步执行;每完成一步,检查结果是否满足预期,如果不满足,主控会重新规划局部步骤。

# 一个精简的规划执行示意 plan = [ {"step": 1, "tool": "geocode_boundary", "params": {"region": "某城区", "year": 2024}}, {"step": 2, "tool": "load_imagery", "params": {"time_range": ["2023-08", "2024-08"], "cloud_threshold": 0.1}}, {"step": 3, "tool": "run_change_detection", "params": {"model": "unet-resnet50", "stride": 256}}, {"step": 4, "tool": "summarize_patches", "params": {"top_k": 50}}, {"step": 5, "tool": "generate_report", "params": {"format": "docx"}}, ]

实际运行时,我会在每一步后面加一个状态校验器。比如检测工具返回的图斑数量如果为0,校验器会标记“疑似参数错误,需要重新执行并降低检测阈值”,这时候主控会调低阈值重新发起检测。这比让智能体“自由发挥”要稳得多,因为自由发挥容易陷入无意义的循环。

4.3 提示词中必须写清楚什么

给主控智能体写的系统提示词,我建议至少包含四块核心信息:任务边界(只用提供的工具完成任务,不得虚构数据)、输出格式(所有结论必须引用图斑ID作为证据)、质量要求(统计结果必须与实际数据一致,不得编造数字)、异常处理策略(遇到工具报错时先尝试重试,重试两次仍失败则跳过并说明原因)。

“结论必须引用证据”这一条是整条工作流的生命线。没有它,模型很容易在各种模糊描述中自说自话,生成的报告看起来头头是道,实际每个数字都对不上。有了它,报告中的任何一个变化图斑都能回溯到对应的算法检测结果,用户才敢拿这份报告做决策依据。

5. 实测中的干扰项:那些“假变化”比真变化还难缠

5.1 六大干扰源逐一排查

城市遥感变化分析里面,最让我头疼的从来不是算法模型的效果,而是那些来自自然和人为因素的“假变化”。我按出现频率总结了六大干扰源,有实际项目经验的人应该一看就懂。

云影和阴影是第一大干扰。两期影像如果拍摄季节、太阳高度角不同,建筑物阴影的形状和位置会完全变样,算法很容易把阴影变化当建筑变化。植被物候变化也很常见——同一个公园,夏季绿意盎然,冬季枯黄一片,NDVI差值会非常高,可实际上并没有发生任何建成区变化。水体波动同样能骗过很多检测网络,河湖面积随季节涨落,变化图斑形状还不规则,跟违法填湖的表征极其相似。还有施工围挡与临时堆料,这类变化是真实的,但对“城市扩张监测”这类业务来说属于无效变化,需要排除;数据配准误差则是硬伤,哪怕只差半个像元,边缘的高反差物体(屋顶、道路标线)都会产生大量假图斑。最后是土地利用类型的正当轮换,比如耕地变裸地,到底是正常农作还是违规占地,光靠影像很难判断。

5.2 一次真实的误报排查过程

我记得有次跑某区域的季度监测,算法一次性报告了四十多块“新增不透水面”。系统第一版直接把所有图斑都送进报告,结果现场核查发现,将近一半都是附近农田的灌渠两侧裸土——因为那个季度刚好是收割翻耕期,土壤光谱跟建筑地面非常接近。

排查过程是这样的:发现报告准确率偏低后,我先调出所有候选图斑的NDVI序列,发现误检图斑在前后期虽然都表现为“裸土化”,但同期不同月份的NDVI波动极大,不符合建筑的“光谱稳定”特征。随后我在判定智能体的提示词里加了一条:如果图斑面积小于阈值且周边土地利用属于农田,必须额外验证其跨季度光谱一致性才能判定为建筑变化。加了这条规则后,误检率从原来的45%降到了12%。

这个案例给我们的启示是:不要把智能体当成什么都知道的专家,要把它当成一个“可以快速理解并严格执行你领域规则的下属”。你编写的规则越贴合业务场景,它实际表现越好。

5.3 止损手段:规则兜底与提示词约束

在实践中,我形成了“三层止损”的策略。第一层是算法层止损,对检测输出做形态学过滤——面积小于阈值的图斑直接丢弃、狭长图斑做剔除(因为建筑和道路通常是规则的块状或带状,云影边缘常常是不规则狭长状)。第二层是提示词层止损,在判定提示词里明确列出需要排除的干扰类型,要求模型输出“疑似原因”字段,这个字段会让模型主动对干扰因素做一次审视。第三层是数据层止损,把历史监测数据做成参考库,当新图斑与历史图斑位置重叠且类型一致时,输出“延续性变化”标签而不是“新增变化”。

需要特别提一句:规则兜底不等于“用规则绕开智能体”。对很多数据特征干净、变化类型单一的场景,纯规则其实已经能完成判断;但城市环境极其复杂,规则写不尽的例外情况才是主流,智能体在兜底规则之上做语义补全,才是正确的使用姿势。

6. 资源开销与落地门槛:哪些场景真的值得投入

6.1 算力、Token成本与延迟的实测估算

很多人在立项阶段最关心的就是成本。以我的实测数据做一个粗略参考:覆盖面积约100平方公里、空间分辨率2米、单期影像约25亿像元的任务,预处理加检测推理阶段如果用单张48GB显存的GPU跑,需要大约6到8小时;LLM智能体调度阶段,因为只处理汇总后的图斑,总Token消耗通常在50万以内(含工具返回内容),按当前主流API价格折算,一次完整分析调度的推理成本约几十元人民币,远低于一个解译员一天的人力成本。

延迟方面,纯算法部分通常不是瓶颈,瓶颈往往出现在LLM多轮工具调用上——每个工具结果返回都要重新进入模型推理,一个复杂任务五六个步骤下来,等待时间可能超过十分钟。所以我的优化策略是:能用并行的工具调用绝不要串行;能一次返回多个图斑信息,不要分批反复提交。减少交互轮次是控制延迟最有效的手段。

6.2 最适合先落地的三类场景

结合实践看,最适合用这套方案落地的场景,我认为有三类。一类是“月度或季度常规监测报告”的自动化替代——这类任务报告模板固定、流程重复,今天跑完,下个月还要跑,智能体可以大幅压缩重复劳动。一类是“多源影像的快速初筛和疑点推送”——先靠智能体把大量自动检测出来的图斑筛选掉明显误检,再把剩下的少量疑似图斑推给人工核查,这比人工面对上千个图斑逐一看要高效得多。第三类是“应急响应期的高时效性评估”——例如汛期或灾害后的快速变化评估,传统流程根本等不起两三天的人工解译,智能体一套自动链路能在几个小时内给出初步结果。

6.3 给同行的一些实操建议

最后分享几条踩坑之后沉淀下来的建议。第一,不要把智能体塞进每一个环节——拿不准的环节用规则处理,规则处理不了的再交给模型,这样整体成本最低;第二,工具层返回数据必须带上版本号和参数快照,否则排查问题时,你根本不知道某次结果是用哪些参数跑出来的;第三,一定要为每次分析任务记录完整的“任务日志”,包括每步调用输入输出摘要和Token消耗统计,它既是排查问题的依据,也是后续优化的数据基础。

老实说,LLM智能体让遥感变化分析流程产生了质变——把解译员的“判断经验”变成了可复制、可扩展、可持续调优的软件能力。但也要清醒认识到,这套系统的上限仍然由算法精度和数据质量决定,智能体本身不会让低质量影像“变出”可靠结论。用对位置、管好成本、把好质量,这套组合拳在城市遥感监测里的价值会越来越不可替代。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进