UniChange: Unifying Change Detection with Multimodal Large Language Model¶
会议: CVPR 2026
论文: CVF Open Access
代码: https://github.com/NKU-HLT/UniChange
领域: 遥感 / 多模态VLM
关键词: 变化检测, 多模态大模型, 特殊 token, 多源联合训练, 语义变化检测
一句话总结¶
UniChange 把二值变化检测(BCD)和语义变化检测(SCD)统一进一个基于 MLLM 的框架,靠 [T1]、[T2]、[CHANGE] 三个特殊 token 的嵌入作为"查询"去驱动分割解码器,用文本提示替代固定分类头,从而能在类别定义互相冲突的多源遥感数据集上联合训练,在 WHU-CD、S2Looking、LEVIR-CD+、SECOND 四个基准上 IoU 分别达 90.41 / 53.04 / 78.87 / 57.62,全面刷新 SOTA。
研究背景与动机¶
领域现状:遥感变化检测(CD)要对同一地区不同时间的两张影像做对比,找出地表覆盖的变化。它分两个子任务:BCD 只判断"哪里变了"(二值掩码),SCD 还要判断"从什么变成什么"(如森林→城市,from-to 语义转换)。十多年来主流范式是孪生网络(FC-Siam-diff、IFN)+ 双时相特征交互(BiT、ChangeFormer、Changer),近期开始把视觉基础模型 VFM(SAM、RSBuilding)搬进来。
现有痛点:作者点出领域里两个一直没被解决的结构性问题。其一是数据集不兼容——同一类地物在 A 数据集里是正样本(如"建筑"变化),在 B 数据集里却被当作负的背景(专做"植被"变化的数据集里建筑根本不标),这种语义冲突让传统模型没法把多个数据集放一起训。其二是架构不兼容——BCD 模型只需一个变化解码器,SCD 模型却要双编码器+双解码器+变化解码器(见原文 Fig. 2a/2b),结构上根本对不齐。
核心矛盾:因为这两个不兼容,领域里长出了一大堆"高度专用"的模型——每个模型只从单一标注类型(要么 BCD 要么 SCD)的单个数据集里学到有限知识,彼此独立、互不通用。结果就是泛化差、通用性弱,换个数据集就得重训一个专用模型。
本文目标:做一个既能同时支持 BCD 和 SCD、又能在语义冲突的多源数据集上联合训练的单一端到端模型。
切入角度:MLLM 自带语言先验和"统一不同任务"的能力——它本来就是用同一套自回归框架处理 caption、VQA、grounding 等异构任务。作者的观察是:变化检测的"任务差异"本质是"问什么"的差异,而这正好可以用语言提示来承载,用文本而非固定分类头来指定要找的变化类别。
核心 idea:提出 "embedding as change" 范式——把 BCD/SCD 都重述为"通过特殊 token 的嵌入去查询变化"。给 MLLM 词表加三个特殊 token [T1]、[T2]、[CHANGE],让 MLLM 按指令自回归地把它们生成在回答里,再取这些 token 的末层嵌入当作分割解码器的动态查询。这样不同任务、不同类别冲突的数据集都被"文本指令 + token 嵌入"这套统一接口接住了。
方法详解¶
整体框架¶
UniChange 由三大件构成:一个理解变化的 MLLM(LLaVA-7B)、一个从双时相影像抽特征的 Vision Backbone(RSBuilding-ViT-L,SAM 结构但用遥感影像预训练)、以及一个把 MLLM 的高层指令翻译成像素级掩码的 Token Driven Decoder。
整条流水线是这样转的:输入是一对双时相遥感影像 \(x_{img1}, x_{img2}\) 加一段文本指令 \(x_{txt}\)(如"请分割所有发生变化的区域,并给出变化区域的语义掩码")。MLLM 以这三者为输入,自回归生成回答序列 \(y_{txt} = F_{MLLM}(x_{img1}, x_{img2}, x_{txt})\);当它想为某个变化生成掩码时,会在回答里恰当位置吐出对应的特殊 token。然后系统从 \(y_{txt}\) 里抽出该 token 位置的 MLLM 末层嵌入 \(h_{task}\),过一个专用 MLP 投影到视觉空间 \(\hat{h}_{task} = \text{MLP}(h_{task})\),作为"指令驱动的稀疏查询"。与此同时 Vision Backbone 抽出双时相的四级多尺度特征 \(\{F_1^i\}, \{F_2^i\}\)。最后查询嵌入和多尺度视觉特征一起送进 Token Driven Decoder 解出最终掩码 \(\hat{M}_{task} = F_{dec}(\{F_1^i\}, \{F_2^i\}, \hat{h}_{task})\)。训练上只对 MLLM 的语言解码器做 LoRA 微调,其余组件全量微调。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
A["双时相影像 + 文本指令"] --> B["embedding as change<br/>三个特殊 token [T1]/[T2]/[CHANGE]"]
B --> C["MLLM 自回归生成回答<br/>取 token 末层嵌入→MLP 投影成查询"]
A --> D["Vision Backbone<br/>双时相四级多尺度特征"]
C --> E["Token Driven Decoder<br/>查询逐级精炼+爱因斯坦求和生成掩码"]
D --> E
E -->|BCD| F["变化掩码"]
E -->|SCD| G["变化掩码 + 双时相语义掩码"]
关键设计¶
1. embedding as change:用三个特殊 token 的嵌入统一 BCD 与 SCD
这一设计直击"BCD/SCD 架构不兼容"和"多源数据集语义冲突"两个痛点。做法是往 MLLM 词表里塞三个特殊 token:[T1]、[T2] 分别代表"在 T1 / T2 时相影像里的某类地物",[CHANGE] 代表"变化区域"。MLLM 在条件指令 \(x_{txt}\) 下自回归生成回答 \(y_{txt}\),并把这些 token 按任务需要嵌进句子里。比如 BCD 任务回答里只放 [CHANGE]("变化的建筑区域是 [CHANGE]");SCD 任务则会放一串带类别的 [T1]/[T2]("时刻 1 变化的建筑区域是 [T1],时刻 1 变化的低矮植被区域是 [T1]……时刻 2 的建筑区域是 [T2]……")。
关键在于用文本提示来指定要找的变化类别,彻底扔掉了固定分类头。传统模型靠一个预定义的 N 类分类头输出语义,N 一旦定死,A 数据集的"建筑=正类"和 B 数据集的"建筑=背景"就在同一个分类头上打架,没法联合训练。而 UniChange 里"找什么"完全由语言指令决定——同一个 [T1] token 配不同的文本就能指向不同类别,模型从多源数据集学到的是"如何根据指令查询变化"的统一能力,类别冲突在文本层面被天然化解。这就是 BCD(只生成 [CHANGE] 掩码)和 SCD(生成 [T1]/[T2] 语义掩码 + [CHANGE] 变化掩码)能共用一套端到端框架的原因。
2. Token Driven Decoder:让 token 嵌入作为查询,逐级精炼后用爱因斯坦求和"过滤"出掩码
光有 token 嵌入还不够,得把这些"高层语义查询"翻译成像素级掩码——这是 Token Driven Decoder(受 RSBuilding 启发)干的活。它先把三个投影后的查询拼接成初始查询 \(E^0 = \Phi_{Cat}(\hat{h}_{t1}, \hat{h}_{t2}, \hat{h}_{change})\),然后过四层 SAM 风格解码层逐级精炼。每一层把双时相的第 \(i\) 级特征 \(F_1^i, F_2^i\) 拉平并拼成统一视觉序列 \(T^i = \Phi_{Cat}(\Phi_{Flat}(F_1^i), \Phi_{Flat}(F_2^i))\),然后查询和视觉序列双向交互:
即查询先自注意、再交叉注意视觉序列、过 FFN;反过来视觉序列也被新查询更新(所有注意力都加位置编码)。四级精炼后,把各级精炼视觉序列 \(\{\hat{T}^i\}\) 拆回 2D 特征图 \(\{\hat{F}_1^i\}, \{\hat{F}_2^i\}\),再分别对 T1 特征、T2 特征、以及二者逐元素差 \(\hat{F}_1^i - \hat{F}_2^i\) 做上采样+拼接+融合,得到 \(F_{t1}, F_{t2}, F_{change}\)。最后把末级精炼查询 \(E^4\) 拆投影成 \(\hat{e}_{t1}, \hat{e}_{t2}, \hat{e}_{change}\),用每个查询去爱因斯坦求和过滤对应特征,生成最终掩码:\(\hat{M}_{task} = M_{gen}(F_{task}, \hat{e}_{task})\),\(task \in \{t1, t2, change\}\)。
这个设计巧在:变化信号 \(F_{change}\) 直接用双时相特征差构造(符合 CD 的物理直觉),而 T1/T2 的语义掩码和变化掩码共享同一套精炼后的查询和特征,三路输出从一个解码器里"按需"长出来——用户问 BCD 就只取 change 路,问 SCD 就三路全取。这正是"用一套结构灵活生成不同掩码"的落地方式。
3. 双时相语义监督 + 条件化的统一损失:BCD/SCD 用同一目标但语义项按需开关
要让一个模型同时学好二值和语义两种约束,损失必须能"一套接口、按数据集类型自适应"。总损失 \(L_{total} = L_{txt} + L_{mask}\):\(L_{txt}\) 是 MLLM 生成 token 序列的标准自回归交叉熵(保证它学会在对的位置吐对的 token);\(L_{mask}\) 是四项之和:
其中 \(L_{BCE}\)、\(L_{Dice}\)(权重 2.0 / 0.5)监督变化掩码;\(L_{SS}\)(语义分割交叉熵,权重 0.5)逐像素惩罚双时相语义误分类;\(L_{SC}\)(语义变化损失,权重 1.0)是亮点——它基于二值 GT 掩码在双时相语义特征图间算余弦嵌入距离,强制未变化区域特征相似、变化区域特征发散,从而拉开双时相表示的可判别性。
关键的工程取舍是条件化开关:在 BCD 数据集上训练时,\(L_{SS}\) 和 \(L_{SC}\) 直接置零,只有在 SCD 数据集上才计算。这一招让同一个损失框架既能吃只有变化标注的 BCD 数据,也能吃带语义标注的 SCD 数据——多源联合训练能跑通,正是靠损失项随数据类型自适应开关,而不是为每种数据单独设计目标。
损失函数 / 训练策略¶
基座为 LLaVA-7B-v1-1,视觉骨干 RSBuilding-ViT-L。在 4×H100(80G) 上训 10 epoch(每 epoch 400 步),AdamW,基础学习率 \(5\times10^{-5}\),per-device batch=1、梯度累积 8,用 DeepSpeed。仅语言解码器做 LoRA(rank=8,alpha=2×rank),其余全量微调。损失权重 \(\lambda_{BCE}=2.0\)、\(\lambda_{Dice}=0.5\)、\(\lambda_{SS}=0.5\)、\(\lambda_{SC}=1.0\)。
实验关键数据¶
主实验¶
BCD 在 WHU-CD / S2Looking / LEVIR-CD+ 上对比(IoU 为主):
| 数据集 | 指标 | UniChange | 之前最好 | 提升 |
|---|---|---|---|---|
| WHU-CD | IoU | 90.41 | 90.08 (ChangeCLIP) | +0.33 |
| WHU-CD | F1 | 94.96 | 94.78 (ChangeCLIP) | +0.18 |
| S2Looking | IoU | 53.04 | 50.96 (LSKNet) | +2.08 |
| S2Looking | F1 | 69.32 | 67.52 (LSKNet) | +1.80 |
| LEVIR-CD+ | IoU | 78.87 | 76.12 (SFCD-Net) | +2.75 |
| LEVIR-CD+ | F1 | 88.19 | 86.44 (SFCD-Net) | +1.75 |
SCD 在 SECOND 上对比(含二值 + 语义指标):
| 方法 | IoU | mIoU | Fscd | Fbcd | SeK |
|---|---|---|---|---|---|
| MambaSCD* | 57.24 | 72.73 | 62.83 | 72.81 | 21.31 |
| HGINet* | 56.13 | 71.73 | 62.88 | 71.90 | 21.83 |
| SCD-SAM* | 56.82 | 71.92 | 60.71 | 72.46 | 20.60 |
| UniChange | 57.62 | 72.85 | 63.50 | 73.12 | 23.02 |
UniChange 在 SECOND 上五个指标全部第一。值得注意的是 SeK(衡量语义判别力、抑制未变化类影响的硬指标)从次好的 21.83 跳到 23.02,提升最显著——说明它在最难的"语义判别"维度上优势最大,而非只靠二值定位刷分。
消融实验¶
| 配置 | 关键指标 (WHU-CD IoU / S2Looking IoU) | 说明 |
|---|---|---|
| 双时相语义监督 T1+T2 | 90.41 | 完整配置 |
| 仅 T2 监督 | 90.06 | 去掉 T1 监督 |
| 仅 T1 监督 | 89.74 | 去掉 T2 监督 |
| 无语义监督 | 89.46 | 基线,掉 0.95 |
| Vision Backbone: RSBuilding-ViT-L(ft) | 53.04 (S2L) | 完整配置,SeK 23.02 |
| SAM2(ft) | 50.85 (S2L) | 换骨干,SeK 22.82 |
| SAM(冻结) | 42.36 (S2L) | 冻结骨干,SeK 仅 14.63 |
| LoRA rank=8 | 90.41 / 53.04 | 最优 |
| LoRA rank=32 | 90.13 / 51.70 | 过大反掉点 |
关键发现¶
- 双时相语义监督有协同效应:同时监督 T1 和 T2(90.41)> 只监督 T2(90.06)> 只监督 T1(89.74)> 不监督(89.46),单调递增,说明两个时相的语义约束互补,一起用才把特征判别力拉满。
- 遥感预训练骨干 + 微调是关键:RSBuilding-ViT-L(ft) 全面优于 SAM/SAM2;且微调版始终碾压冻结版(冻结 SAM 的 SeK 只有 14.63,微调到 RSBuilding 后飙到 23.02),说明通用 VFM 直接拿来做遥感变化检测远不够,必须遥感预训练 + 解冻适配。
- LoRA rank 不是越大越好:rank=8 最优,加到 16/32 反而掉点,提示在这个规模下语言解码器只需小幅适配,过度微调会损害语言先验。
- 联合训练数据越多越好:A→A+B→A+B+C→A+B+C+D 逐步加数据集,所有指标单调上升(WHU-CD IoU 89.68→90.41),直接验证了"统一接口能跨语义冲突数据集联合受益"这一核心卖点。
亮点与洞察¶
- "embedding as change"是一个干净的统一抽象:把"BCD vs SCD 架构分裂"和"多源数据集类别冲突"两个看似无关的痛点,用"特殊 token 嵌入 + 文本指令查询"一招打通——因为分类语义被搬到了语言侧,固定分类头消失了,冲突自然化解。这种"用语言提示替代固定输出头"的思路可迁移到任何被"类别集合不一致"卡住联合训练的稠密预测任务(如跨数据集语义分割、开放词表检测)。
- 变化路用特征差显式构造很务实:\(F_{change}\) 直接来自 \(\hat{F}_1^i - \hat{F}_2^i\),把 CD 的物理先验(变化=两时相之差)硬编码进解码器,而不是指望模型自己学出来,省了样本也更稳。
- 损失项条件化开关是让异构标注数据共训的简单有效 trick:BCD 数据上关掉语义项,SCD 数据上打开,一套目标吃两类数据,比为每种数据设计独立 pipeline 优雅得多。
- SeK 提升最大这一点很说明问题:在最考验"语义判别"的硬指标上优势最明显,反驳了"MLLM 方法只是堆参数刷二值定位"的质疑。
局限与展望¶
- 作者未明确承认的局限:模型很重(LLaVA-7B + ViT-L + SAM 风格解码器,4×H100 训练),相比纯 CNN/Transformer 的轻量 CD 模型,推理成本和部署门槛高得多,论文没报推理速度/参数量对比。
- SCD 只在 SECOND 单一数据集上验证:语义变化检测的泛化结论建立在一个数据集上,跨域 SCD 能力存疑;BCD 虽测了三个数据集但都偏建筑/城市场景。
- 文本指令是人工模板化的:SCD 的指令需要逐类别枚举("建筑区域是
[T1],植被区域是[T1]……"),类别多时指令会很长,且依赖预先知道数据集有哪些类,离"真正开放词表"还有距离。 - 改进思路:可探索更轻量的基座(如 1-3B MLLM)+ 蒸馏;把指令生成自动化/层次化以支持更多类别;在跨域、跨传感器的零样本变化检测上验证"语言先验带来泛化"的承诺。
相关工作与启发¶
- vs 孪生网络 BCD(FC-Siam-diff / BiT / Changer):它们靠双时相特征做差/交互 + 固定分类头,每个数据集训一个专用模型;UniChange 用 MLLM + token 查询统一接口,能跨多源数据集联合训练,泛化更强,代价是模型重得多。
- vs SCD 专用架构(HRSCD / Bi-SRNet / SCD-SAM):它们为 SCD 设计双编码器双解码器的专用结构,与 BCD 架构对不齐;UniChange 用同一个 Token Driven Decoder 按需输出二值或语义掩码,架构层面真正统一。
- vs RSBuilding:RSBuilding 也用 VFM 做联合训练,但只局限于"建筑"相关任务,没法扩展到其他地物类别;UniChange 借鉴了它的 token 驱动解码思路,但靠语言指令把类别打开,覆盖任意地物变化。
- vs 遥感 MLLM(RSGPT / GeoChat / GeoPixel):这些主要做单图解读(caption/VQA/grounding),不适合双时相对比分析;UniChange 是首个把 MLLM 用于双时相像素级变化检测 grounding 的工作,填补了这一空白。
评分¶
- 新颖性: ⭐⭐⭐⭐⭐ 首个 MLLM 统一变化检测框架,"embedding as change"用语言提示化解多源类别冲突,抽象干净且打通了 BCD/SCD 两个长期分裂的子任务。
- 实验充分度: ⭐⭐⭐⭐ 四基准刷 SOTA + 五组消融(语义监督/骨干/LoRA/联合训练)扎实,但 SCD 仅验证单数据集、缺推理成本对比。
- 写作质量: ⭐⭐⭐⭐ 动机与公式推导清晰,框架图配合到位;部分组件(如各 \(\Phi\) 算子)符号略密集。
- 价值: ⭐⭐⭐⭐⭐ 给遥感变化检测提供了"统一接口 + 多源联合训练"的新范式,代码开源,对跨数据集稠密预测有迁移意义。