【论文阅读 | TPAMI 2026 | CDTFusion:跨域与跨任务协同的红外-可见光图像融合方法】
[TOC]
01 论文信息
- 论文题目: CDTFusion: Crossing Domain and Task for Infrared and Visible Image Fusion
- 论文作者: Wenda Zhao, Wenbo Wang, Haipeng Wang, You He, Huchuan Lu
- 发表单位:
- School of Information and Communication Engineering, Dalian University of Technology, Dalian, China
- Unit 92728 of PLA, Shanghai, China
- Research Institute of Information Fusion, Naval Aviation University, Yantai, China
- 发表会议\期刊: IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI, Vol.48, No.2, 2026)
- DOI:
10.1109/TPAMI.2025.3614704 - 论文状态:Received 2024-07-30 · Revised 2025-09-04 · Accepted 2025-09-22 · Published 2025-09-26
- 代码链接: https://github.com/wangwenbo26/CDTFusion
02 论文主要贡献
2.1 关键判断
- 问题定义层判断:这篇工作真正处理的不是单一融合质量问题,而是把两个长期并存的矛盾同时纳入统一框架,即红外与可见光之间的跨域特征差异,以及融合任务与分割任务之间的跨任务特征鸿沟。
- 方法层判断:作者采用明显的二段式设计。第一阶段用 SITS 将双模态特征拉入共享适配域,第二阶段用 TIQM 让分割特征以可查询、可映射的方式反哺融合特征。
- 实证层判断:论文没有把结论停留在融合图“更清晰”这一层,而是进一步用分割与检测结果验证融合表示的可迁移性。这使得文章的证据链比单纯报融合指标更完整。
03 论文创新点
- 跨域与跨任务联合建模:同时对齐成像域差异与任务特征差异。
- SITS 共享适配域设计:通过 swap image translation、域判别与局部统计约束,把红外与可见光特征压向同一中间域,减少直接融合带来的纹理细节损失。
- TIQM 细粒度任务映射:不直接拼接分割特征,而是先建模融合/分割交互,再由融合特征主动查询交互信息,实现更细粒度的跨任务映射。
- 两阶段训练闭环:先解决跨域问题,再处理跨任务交互,训练逻辑与网络职责划分较清楚,便于解释其收益来源。
04 方法
4.1 工作定位
CDTFusion 处理的是两个彼此纠缠的结构性矛盾。其一,红外与可见光在成像机理上的天然差异会导致特征分布失配,若直接在原始域内融合,容易出现细节被抹平、纹理表达不稳定等问题;其二,融合任务追求的低层视觉保真,与分割任务依赖的高层语义结构并不天然一致,因此即便融合图在视觉上更清楚,也未必真正利于后续语义理解。
CDTFusion 的方法定位正是同时处理这两个矛盾。作者没有把它们混在一起端到端硬解,而是按“先跨域、后跨任务”的顺序拆开处理。这也决定了全文的方法组织与证据链组织方式。

4.2 方法总览
整套 CDTFusion 是一个很典型的两阶段流水框架。论文 Fig.3 给出的总览非常清楚:上半部分的 SITS 负责跨域对齐,下半部分的 TIQM 负责跨任务桥接。前者回答“如何把双模态特征拉进共享适配域”,后者回答“如何把分割语义转成融合分支可用的信息”。

第一阶段先缓和红外与可见光在统计分布、纹理表达和目标显著方式上的原生失配,为后续融合建立更稳定的输入空间;第二阶段再在这一基础上引入分割分支,通过 TIQM 把高层语义结构转化为融合分支可按需调用的结构先验。前一阶段解决的是“能否在同一空间里稳定对齐”,后一阶段解决的是“对齐之后如何把任务语义真正转化为融合收益”。这个顺序不能交换。若跨域问题尚未缓和,后续跨任务映射就会建立在失配特征之上;若只有跨域对齐而缺少任务桥接,则融合结果仍可能停留在视觉清晰而语义不可用的层面。
4.2.1 第一阶段
第一阶段的核心是 SITS(Swap Image Translation Strategy)。其任务不是直接生成最终融合图,而是先把红外特征和可见光特征拉到一个共享的适配域中。为此,论文引入三类约束:
- 全局域约束:通过域判别器约束 transferred features 进入共享域;
- 局部统计约束:通过均值与方差约束缩短局部域距离;
- 交叉重建约束:保证迁移后的特征仍保留足够的模态内容,不至于在对齐过程中洗掉有效信息。
4.2.2 第二阶段
第二阶段在冻结第一阶段跨域模块的基础上,进一步处理跨任务交互。作者分别构造融合分支与分割分支,然后引入 TIQM(Task Interaction & Query Module),让融合分支不是被动接收语义特征,而是主动从任务交互特征中查询对自己有用的语义信息。
这个设计的好处在于,分割特征不会被粗暴拼接到融合特征里,而是先经过交互建模,再做针对性映射。
4.3 代码对照 总体训练入口
这一节开始,代码展示标准统一改为:函数入口 → 输入输出含义 → 关键维度变化 → 逐行注释代码。这样写会更接近你给的模板,也更方便后续直接扩成最终稿。
论文中的两阶段逻辑,在仓库里是直接落地的。
4.3.1 第一阶段入口
fmb_train_step1.pypos_train_step1.pywhu_train_step1.py
这一阶段负责编码双模态特征、执行双向 transfer、训练域判别器、施加局部均值方差约束,并完成交叉重建。
4.3.2 第二阶段入口
fmb_train_step2.pypos_train_step2.pywhu_train_step2.py
这一阶段负责冻结跨域模块,构造融合/分割双分支,通过 TIQM 完成跨任务映射,并联合优化融合输出与分割输出。
4.4 SITS 从互换迁移到共享适配域
4.4.1 关键判断
SITS 在于它显式构造了一个位于红外域与可见光域之间的共享适配域。对于红外-可见光融合,最棘手的问题从来不是两种模态能否同时输入网络,而是两者在亮度分布、纹理表达和目标显著方式上的天然失配会在特征层持续累积,最终表现为细节变钝、边界混乱和局部伪增强。
SITS 的做法相当于先把两种模态从各自原生域中“拉出来”,压到一个更利于后续融合的中间空间里,再把跨任务语义映射建立在这个相对稳定的特征基础上。因此,它不是普通的预处理模块,而是整套框架成立的前提层。
4.4.2 共享适配域的目标函数
论文先用全局域判别器约束未迁移特征,再反过来逼迫迁移后的特征落入共享适配域。对应公式为:
其中 与 分别表示红外域和可见光域标签, 表示共享适配域标签。这里最关键的不是判别器本身,而是它在训练中扮演了“两步走”的角色:先学会区分原始域,再逼迫迁移后特征变得不可区分。
在局部层面,论文进一步把局部窗口特征的域定义为均值与方差之和:
这组公式把 SITS 的思路钉得很清楚:Eq.(1)-Eq.(2) 负责把双模态特征压向全局不可分的共享域,Eq.(3)-Eq.(6) 负责把这种不可分继续落实到局部窗口统计层面。 也正因为如此,SITS 不只是 feature transfer,而是一个完整的共享适配域构造过程。
4.4.3 编码器与迁移模块的代码对应
编码器位于:
util/encoder.py
主要类包括:
EncoderViEncoderIr
这两个编码器分别处理可见光与红外输入,并输出高维特征表示。随后,跨域迁移模块位于:
util/transfer.py
对应类:
transfer
从实现逻辑看,这个 transfer 模块不是典型的 image-to-image translator,而更像是一种跨模态条件重标定与卷积映射结构。它先拼接双模态特征,再生成 channel weights 去调制另一模态特征,最后输出 transferred feature。它更接近“条件式特征迁移”,而不是生成式翻译。
对应实现可以按张量维度拆开来看。设编码器输出的可见光特征与红外特征分别为 opt 与 sar,其典型尺寸均为 [B, 512, H, W]。那么 transfer 的前向过程可以写成:
# opt: [B, 512, H, W],可见光编码特征# sar: [B, 512, H, W],红外编码特征# 这里的 H、W 一般已经是编码器下采样后的空间尺寸
def forward(self, opt, sar):
# 1) 沿通道维拼接双模态特征 # [B, 512, H, W] + [B, 512, H, W] -> [B, 1024, H, W] x1 = self.concat([opt, sar])
# 2) 三层卷积提取联合上下文 # conv1: [B, 1024, H, W] -> [B, 1024, H, W] x1 = self.relu1(self.conv1(x1)) # conv2: [B, 1024, H, W] -> [B, 512, H, W] x1 = self.relu2(self.conv2(x1)) # conv3: [B, 512, H, W] -> [B, 512, H, W] x1 = self.relu3(self.conv3(x1))
# 3) 生成通道权重 # [B, 512, H, W] -> [B, 512, H, W] channel_weights = self.channel_weights_conv(x1)
# 4) 用联合上下文得到的权重去调制另一模态特征 # sar: [B, 512, H, W] # channel_weights: [B, 512, H, W] # 逐元素相乘后仍为 [B, 512, H, W] x2 = sar * channel_weights
# 5) 将原始参考特征 opt 与被调制后的 x2 再次拼接 # [B, 512, H, W] + [B, 512, H, W] -> [B, 1024, H, W] x3 = self.concat_x2([opt, x2])
# 6) 再经过三层卷积,输出迁移后的适配特征 # 最终输出尺寸恢复为 [B, 512, H, W] x3 = self.relu4(self.conv1(x3)) x3 = self.relu5(self.conv2(x3)) x3 = self.relu6(self.conv3(x3))
return x3这段实现说明得更彻底:SITS 里的 transfer 不是直接把一端特征“翻译成另一端”,而是先从双模态联合上下文中生成通道级调制,再把这种调制施加到另一模态特征上,最后输出共享适配域中的新表示。 因此,它更接近条件式特征重标定,而不是生成式翻译。
4.4.3 全局域约束与局部统计约束
SITS 能否真正形成共享域,关键并不只在 transfer 本身,还在后续约束。
全局域约束对应的实现主要位于:
util/discriminator.py
其中:
DomDiscriminator
负责区分原始红外域与可见光域特征。训练时,代码先让判别器学习区分真实域,再冻结判别器,把 transfer 后的双模态特征共同推向中间域标签。
第一阶段训练脚本中的相关写法:
domain_vi_labels = torch.ones(vi_features.size(0), 1).to(device)domain_ir_labels = torch.zeros(ir_features.size(0), 1).to(device)domain_un_labels = (domain_ir_labels + domain_vi_labels) / 2这比论文里的 adapted domain label 更直观。可见光记为 1,红外记为 0,而共享适配域直接压到 0.5。
局部统计约束则位于:
util/MeanVarianceLoss.py
对应类:
LocalMeanVarianceLoss
它通过局部窗口上的均值与方差差异,约束 transfer 后红外/可见光特征在局部统计意义上更接近。其实现思路基本就是:
mean1 = avg_pool(feature1)mean2 = avg_pool(feature2)variance1 = avg_pool(feature1**2) - mean1**2variance2 = avg_pool(feature2**2) - mean2**2简化地说:
- global constraint 负责让特征“进入同一个域”;
- local constraint 负责让它们在这个域里“贴得更近”。
两者一个偏分布级,一个偏局部统计级,是明显互补关系。
4.5 交叉重建 不是附属损失,而是保底机制
论文进一步要求迁移后的适配特征能够重建另一模态输入:
它的作用不是提升视觉观感,而是防止共享域对齐把模态特有信息一并抹平。Eq.(7) 不是附加修饰项,而是 SITS 成立所必需的保底机制。前面的全局与局部约束负责“拉近”,而交叉重建负责“别拉过头”。
如果只有域对齐约束,网络可能会为了缩小域差异,把模态特有信息也一起压平。交叉重建的作用,就是防止这种“对齐过头”的情况发生。
对应实现位于第一阶段训练脚本中。网络会将迁移后的特征分别送入解码头,重建红外图与可见光图。相关解码器定义在:
util/res_decoder.py
其中可见光和红外重建头分别对应不同输出通道。
这一步的意义不是最终生成融合图,而是保证 transfer 后的特征仍保留足够的可逆信息。它是 SITS 的保底机制,而不是附属装饰。
4.6 TIQM 从任务交互到查询式映射
4.6.1 关键判断
TIQM 的必要性来自一个常被忽视的事实:融合任务与分割任务虽然都处理同一场景,但它们在特征需求上并不一致。融合更关心亮度、纹理、边缘和局部连续性,分割更关心语义类别、区域一致性和目标边界。若直接把分割特征拼到融合特征上,高层语义很容易以过强的方式压制低层重建细节,导致融合图变成“语义更强,但观感更硬”的结果。
TIQM 选择了更克制的路径。它先显式建模融合任务与分割任务的交互关系,再由融合特征主动查询交互特征中的有用语义信息。这样一来,分割分支提供的不是整块灌入的高层语义,而是可被按需取用的结构先验。也正因此,TIQM 更接近一种桥接机制,而不是简单的特征融合技巧。
4.6.2 任务交互与查询的数学定义
TIQM 的前半段先用多头自注意力捕获融合特征与分割特征之间的交互关系:
其中 由 与 拼接得到, 表示归一化操作, 表示 MLP。论文真正想强调的是,这一步不是直接把两类特征混在一起,而是先学到“它们如何交互”。
随后,再以融合特征为参照生成 query:
并完成查询式映射:
最终融合图由解码器输出:
这组公式对应的核心思想很明确:Eq.(8)-Eq.(9) 先定义交互关系,Eq.(10)-Eq.(13) 再把交互关系变成融合分支可按需调用的语义增益。 这里不是让高层语义特征直接压到低层融合特征上,而是让融合分支带着自己的需求去查询交互特征。这也是 TIQM 比 concatenate 和 summation 更像“桥接机制”而不是“特征拼接技巧”的原因。
4.6.3 代码对应
相关实现位于:
util/taskinteraction.py
对应类:
TaskInteraction
从代码流程看,它会先把 fusion feature 和 segmentation feature 拼接并压回统一维度,再通过 self-attention 学习两任务之间的交互表示。随后,再以 fusion branch 为 query,对交互特征执行查询映射,得到更适合融合任务使用的语义增强结果。
对应实现同样可以按维度变化逐步展开。设融合分支特征 x1 与分割分支特征 x2 的典型尺寸均为 [B, 512, H, W],则 TIQM 的核心路径可以写成:
# x1: [B, 512, H, W],fusion branch 特征# x2: [B, 512, H, W],segmentation branch 特征
def forward(self, x1, x2):
# 1) 先沿通道维拼接两路特征 # [B, 512, H, W] + [B, 512, H, W] -> [B, 1024, H, W] x = torch.cat((x1, x2), dim=1)
# 2) 用 1x1 卷积把通道压回原维度,并与 fusion 特征做残差相加 # concat(x): [B, 1024, H, W] -> [B, 512, H, W] # x = x1 + concat(x) 后仍为 [B, 512, H, W] x = x1 + self.concat(x) x = self.bn(x)
# 3) 将二维特征图展平成 token 序列 # [B, 512, H, W] -> [B, 512, H*W] -> [H*W, B, 512] x = x.view(x.shape[0], x.shape[1], -1).permute(2, 0, 1)
# 4) 用自注意力建模 fusion / segmentation 的交互关系 # 输入输出尺寸都为 [H*W, B, 512] x, _ = self.self_attention(x, x, x)
# 5) 再恢复成二维特征图 # [H*W, B, 512] -> [B, 512, H*W] -> [B, 512, H, W] x = x.permute(1, 2, 0).view(x1.shape)
# 6) 经 MLP 进一步整合交互特征 x = self.mlp(x)
# 7) 以 fusion 特征生成 query,以交互特征生成 key / value # 三者尺寸均保持 [B, 512, H, W] x1 = self.bn_x1(x1) x2 = self.bn_x2(x) q = self.linear_q(x1) k = self.linear_k(x2) v = self.linear_v(x2)
# 8) 再次展平,准备做 batch matrix multiplication # [B, 512, H, W] -> [B, 512, H*W] q = q.view(q.size(0), q.size(1), -1) k = k.view(k.size(0), k.size(1), -1) v = v.view(v.size(0), v.size(1), -1)
# 9) 计算 attention score # q^T: [B, H*W, 512] # k: [B, 512, H*W] # 输出 [B, H*W, H*W] attention_scores = torch.bmm(q.transpose(1, 2), k) attention_weights = torch.nn.functional.softmax(attention_scores, dim=2)
# 10) 用 attention 权重对 value 做加权汇聚 # attention_weights: [B, H*W, H*W] # v^T: [B, H*W, 512] # 输出 weighted_sum: [B, H*W, 512] weighted_sum = torch.bmm(attention_weights, v.transpose(1, 2))
# 11) 恢复成二维特征图 # [B, H*W, 512] -> [B, 512, H, W] weighted_sum = weighted_sum.view(weighted_sum.size(0), self.in_channels, x2.size(2), x2.size(3))
# 12) 与 fusion branch 做残差相加,得到最终增强后的融合特征 # 输出尺寸仍为 [B, 512, H, W] output = x1 + weighted_sum
return output这段实现比摘要式描述更清楚:TIQM 不是把分割特征直接贴到融合特征上,而是先把两者关系编码成交互特征,再让 fusion branch 以 query 的方式从中检索自己真正需要的结构线索。
4.7 第二阶段主干 Mixer 与双分支组织
在 TIQM 之前,论文先用两组并行 mixer 生成 与 。其通道混合与空间混合写作:
通过这组公式不难看出,作者明确区分了通道通信与空间上下文聚合两种职责。
第二阶段中,融合分支与分割分支都依赖 util/mixer.py 中的 Mixer。训练脚本中会实例化两份 mixer,分别服务于 segmentation branch 和 fusion branch。
从实现思路看,它并不是严格照搬标准 MLP-Mixer,而是采用更工程化的通道混合与空间混合组合。其核心仍然是两件事:一是做通道层面的混合与重标定,二是做空间或 token 层面的混合,最后再与原始特征残差融合。
4.8 两阶段训练损失 论文目标与工程实现之间的对应关系
论文把训练拆成两个阶段,并把这种拆分直接写成目标函数。第一阶段总目标为:
第二阶段总目标为:
其中分割损失写为:
融合损失写为:
这一组公式很重要,因为它表明两阶段训练不是实现技巧,而是作者对问题本身的拆解方式:Eq.(17)-Eq.(19) 对应共享适配域构造,Eq.(20)-Eq.(22) 对应跨任务桥接后的联合优化。第一阶段解决跨域,第二阶段解决跨任务,顺序不能随意交换。
4.8.1 第一阶段损失
第一阶段训练脚本中,总损失由三部分组成:recon_loss、domain_loss 和 m_v_loss。它们分别对应交叉重建约束、全局域约束和局部均值方差约束。
从代码实现看,论文里较为抽象的总目标,被拆成了更直接的工程版本。若按训练流程与维度变化去看,第一阶段脚本的关键路径可以概括为:
# vi_images: [B, 3, 512, 512],可见光输入# ir_images: [B, 1, 512, 512],红外输入
# 1) 编码器提取双模态特征# vi_features: [B, 512, H, W]# ir_features: [B, 512, H, W]vi_features = encoder_1(vi_images)ir_features = encoder_2(ir_images)
# 2) 双向 transfer,得到共享适配域特征# vi_allin: [B, 512, H, W],可见光 -> 适配域# ir_allin: [B, 512, H, W],红外 -> 适配域vi_allin = transfer_vi_to_ir(vi_features, ir_features)ir_allin = transfer_ir_to_vi(ir_features, vi_features)
# 3) 用适配特征重建对侧模态输入# ir_out: [B, 1, 512, 512]# vi_out: [B, 3, 512, 512]ir_out = decoder_2(vi_allin)vi_out = decoder_1(ir_allin)
# 4) 计算交叉重建损失reir_loss = F.l1_loss(ir_out, ir_images) + ssim_loss(ir_out, ir_images)revi_loss = F.l1_loss(vi_out, vi_images) + ssim_loss(vi_out, vi_images)recon_loss = revi_loss + reir_loss
# 5) 计算适配域上的全局判别损失# domain_vi_a_pred / domain_ir_a_pred 的尺寸一般为 [B, 1]domain_vi_a_pred = domain_discriminator(vi_allin)domain_ir_a_pred = domain_discriminator(ir_allin)domain_loss_fake = bce_loss(domain_vi_a_pred, domain_un_labels) + bce_loss(domain_ir_a_pred, domain_un_labels)domain_loss = domain_loss_fake
# 6) 计算局部均值方差损失mean_loss, variance_loss = loss_calculator(ir_allin, vi_allin)m_v_loss = mean_loss + variance_loss
# 7) 合成第一阶段总损失# total_loss = 重建 + 域对齐 + 局部统计对齐total_loss = recon_loss + lambda_domain * domain_loss + lambda_mean_vari * m_v_loss这里还有一个值得注意的细节:论文里的重建约束主要用结构相似性表述,但代码实现中实际混入了 L1 与 SSIM。
4.8.2 第二阶段损失
第二阶段训练时,总损失由 seg_loss 与 fus_loss 组成。其中分割损失由 Dice Loss 和 Cross Entropy 共同构成,这符合语义分割训练的常见设置。若按训练流程与维度变化去看,第二阶段脚本的关键路径可以写成:
# vi_images: [B, 3, 512, 512],可见光输入# ir_images: [B, 1, 512, 512],红外输入# seg_images: [B, 512, 512] 或 [B, H, W],语义标签
# 1) 先将可见光图像转换到 YCrCb,仅取亮度 Y 通道用于融合监督# rgb_images_ycrcb: [B, 3, 512, 512]# opt_images: [B, 1, 512, 512]rgb_images_ycrcb = RGB2YCrCb_Cuda1(vi_images)opt_images = rgb_images_ycrcb[:, 0:1, :, :]
# 2) 通过冻结的一阶段模块得到共享适配域特征# vi_allin / ir_allin: [B, 512, H, W]with torch.no_grad(): vi_features = encoder_1(vi_images) ir_features = encoder_2(ir_images) vi_allin = transfer_vi_to_ir(vi_features, ir_features) ir_allin = transfer_ir_to_vi(ir_features, vi_features)
# 3) segmentation branch# seg_features: [B, 512, H, W]# seg_out: [B, num_classes, 512, 512]seg_features = mixer(vi_allin, ir_allin)seg_out = decoder_3(seg_features)seg_loss = dice_loss(seg_out, seg_images) + 0.5 * criterion(seg_out, seg_images)
# 4) fusion branch# fus_features: [B, 512, H, W]# fus_features_taski: [B, 512, H, W]# fus_out: [B, 1, 512, 512]fus_features = mixer_f(vi_allin, ir_allin)fus_features_taski = taskinteraction(fus_features, seg_features)fus_out = decoder_4(fus_features_taski)fus_loss = fusionloss(opt_images, ir_images, fus_out)
# 5) 第二阶段总损失 = 分割监督 + 融合监督total_loss = seg_loss + fus_loss这段实现说明得很清楚:第二阶段不是简单地同时训练两个头,而是先用两路 mixer 分别形成 segmentation / fusion 表示,再通过 TIQM 把分割分支学到的结构信息重新注入 fusion branch。 也正因此,seg_loss + fus_loss 并不是并列的两个损失,而是共享适配域之上的联合优化。
融合损失则位于:
util/loss_ssim.py
从实现上看,代码不是直接照论文里的双源 SSIM 公式逐项写开,而是先构造一个由红外与可见光平均形成的 target,再对融合输出计算 SSIM 损失。
4.9 从训练到测试的一次完整前向路径
4.9.1 第一阶段前向
第一阶段的完整路径可以概括为:
- 用
EncoderVi提取可见光特征; - 用
EncoderIr提取红外特征; - 通过双向
transfer执行跨域迁移; - 通过
DomDiscriminator完成真实域判别和共享域约束; - 用局部均值方差损失约束迁移后特征接近;
- 通过两个重建头交叉重建红外与可见光图像。
第一阶段的职责是先完成跨域特征整理。
4.9.2 第二阶段前向
第二阶段在冻结第一阶段模块后,路径会变成:
- 获取已经对齐到共享域的双模态特征
vi_allin / ir_allin,其典型尺寸为[B, 512, H, W]; - 送入分割分支
mixer,得到seg_features,再由decoder_3输出seg_out,尺寸通常为[B, num_classes, 512, 512]; - 送入融合分支
mixer_f,得到fus_features,尺寸仍为[B, 512, H, W]; - 用
TaskInteraction建模跨任务交互并完成查询式映射,输出fus_features_taski,尺寸不变; - 由融合头
decoder_4输出单通道融合结果fus_out,典型尺寸为[B, 1, 512, 512]; - 联合优化
seg_loss + fus_loss。
如果按信息流理解,这一步真正完成的不是简单的多头输出,而是“共享适配域之上的跨任务桥接”。分割分支负责学习结构语义,融合分支负责保持低层细节,而 TIQM 负责把前者转化为后者可用的增益。
4.9.3 测试时的彩色图恢复策略
测试脚本如 fmb_test.py 中,网络并不是直接生成三通道彩色融合图,而是先预测单通道亮度结果,再把它回填到可见光图像的 HSV 空间中作为 V 通道,最后恢复 RGB 彩图。
如果按推理流程展开,关键路径是:
# rgb_image: 原始 RGB 图像,尺寸 [H0, W0, 3]# ir_image: 原始红外图像,尺寸 [H0, W0]# transform 后统一变为 512 x 512
# 1) 输入图像转张量# rgb_tensor: [1, 3, 512, 512]# ir_tensor: [1, 1, 512, 512]rgb_tensor = transform(rgb_image).unsqueeze(0).to(device)ir_tensor = transform(ir_image).unsqueeze(0).to(device)
# 2) 编码 + transfer# test_vi_allin / test_ir_allin: [1, 512, H, W]test_vi_features = encoder_1(rgb_tensor)test_ir_features = encoder_2(ir_tensor)test_vi_allin = transfer_vi_to_ir(test_vi_features, test_ir_features)test_ir_allin = transfer_ir_to_vi(test_ir_features, test_vi_features)
# 3) segmentation branch 与 fusion branch# test_seg_features / test_fus_features: [1, 512, H, W]test_seg_features = mixer(test_vi_allin, test_ir_allin)test_fus_features = mixer_f(test_vi_allin, test_ir_allin)
# 4) 通过 TIQM 获得增强后的融合特征# test_fus_features_taski: [1, 512, H, W]test_fus_features_taski = taskinteraction(test_fus_features, test_seg_features)
# 5) 输出单通道融合亮度图# generated_fus_images: [1, 1, 512, 512]generated_fus_images = decoder_4(test_fus_features_taski)
# 6) 截断到 [0, 1] 并转成 uint8# fus_img_pred: [512, 512]fus_img_pred = generated_fus_images.cpu().detach().numpy().squeeze()fus_img_pred = np.uint8(255.0 * fus_img_pred)
# 7) 回填到 HSV 的 V 通道,再转回 RGBimg_hsv[:, :, 2] = fus_img_predmodifited_rgb_img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2RGB)网络本体负责预测融合亮度主结果,而彩色外观则由可见光图像原有的色度信息配合 HSV-V 通道回填来恢复。因此,源码里 fusion head 的输出通道不必直接对应完整 RGB,但最终仍然能得到彩色融合结果。
05 实验分析
5.1 实验设置与评测协议
5.1.1 数据集覆盖
论文主要在三套数据集上验证方法:
- FMB,14 类,训练集 4880 对,测试集 1120 对
- Potsdam,6 类,训练集 3388 对,测试集 1089 对
- WHU-OPT-IR,7 类,训练集 5460 对,测试集 1540 对
这三套数据既覆盖常见红外-可见光融合场景,也包含后续分割任务需要的语义标注,因此适合验证“融合质量 + 下游任务可用性”这条主线。
5.1.2 训练配置
论文给出的设置包括:
- batch size = 4
- 总 epoch = 50
- 其中 stage1 为 20 epoch
- stage2 为 30 epoch
- 初始学习率为 1e-4
- 超参数设置为
α=1, β=0.5, δ=0.5, λ=0.5 - 模型参数量为 142.87M
- 3090 上 512×512 输入的推理速度为 13.23 FPS
5.1.3 指标体系
论文同时报告融合指标与分割指标。融合侧主要包括:
- EN
- SD
- SF
- AG
分割侧主要包括:
- mAcc
- mIoU
此外,论文还给出额外的检测验证,用于说明方法的迁移性不只局限于分割任务。
5.2 主实验结果 结论与证据链
5.2.1 主结论
作者提到:
只优化融合视觉质量是不够的。只有同时处理跨域差异与跨任务特征鸿沟,才能得到既保留细节、又有利于后续语义理解的融合结果。
因此,这部分结果不能拆开看。Table IV 负责证明融合质量提升,Tables V-VII 负责证明这种提升能迁移到分割任务,Table VIII 则进一步说明这种迁移并非只对一个下游任务成立。三组结果合起来,才构成文章真正的主证据链。
5.2.2 融合主实验

论文将 CDTFusion 与 FusionGAN、U2Fusion、TarDAL、SwinFusion、CDDFuse、MetaFusion、SegMif 等方法对比。Fig.8 的可视化首先给出两个直观现象:
- 跨域差异被更好抑制,因此车牌、树木、农田纹理等细节保留更完整;
- 跨任务桥接更有效,因此建筑、车辆、村庄等目标边缘更清晰。

对应的定量结果见 Table IV。作者特别强调,CDTFusion 的平均 SD 相比第二名 MetaFusion 提升 4.02%,平均 AG 提升 5.17%。这组结果表明,模型收益并非来自简单的亮度增强或对比度拉高,而是来自更稳定的细节保留与边缘表达。
若把可视化与定量结果合起来看,可以得到更准确的判断:SITS 主要缓解的是细节被跨域差异抹平的问题,TIQM 主要缓解的是目标边缘在跨任务映射中变糊的问题。 前者更偏纹理,后者更偏结构,这也是 Fig.8 与 Table IV 能彼此对上的原因。
5.2.3 分割主实验

分割结果才是这篇论文最关键的外部验证。因为如果融合图只是“看起来更好”,但对后续语义任务没有帮助,那么 crossing task 这一主张就站不住。



论文在 FMB、Potsdam 和 WHU-OPT-IR 三套数据上报告分割结果。Tables V-VII 给出的总结是:
- 在 FMB 上,mAcc 相比第二名提升 0.6%,mIoU 提升 2.4%
- 在 Potsdam 上,mAcc 提升 0.8%,mIoU 提升 1.2%
- 在 WHU-OPT-IR 上,mAcc 提升 1.7%,mIoU 提升 1.9%
这组结果说明,CDTFusion 的改进不是只停留在融合统计指标上,而是确实转化成了更强的语义判别能力。Fig.9 的可视化进一步补足了这一判断。作者特别指出,其他方法在相邻车辆之间更容易出现错误黏连,在森林与农田环带等结构复杂区域更容易出现边界混淆,而 CDTFusion 在统一分割框架下仍能保持更清晰的结构边界。
因此,这里的证据是:跨任务桥接确实把分割任务学到的结构信息,转化成了对融合结果有用的表示增益。
5.3 消融实验
如果说主实验回答的是“方法有没有用”,那么消融实验回答的就是“到底是哪一部分在起作用”。这篇论文的消融设计比较完整,分别对应跨域、域内约束和跨任务桥接三个层面,因此读起来应该沿着这一条逻辑线推进。
5.3.1 SITS 消融


相关可视化见 Fig.5,定量对比见 Table I。作者将 SITS 与直接特征提取版本 DEFusion、加入自监督重建的 SEFusion 进行对比,并指出采用 swap image translation 的版本在 Potsdam 上相较第二名 SEFusion 带来 EN +0.8%、SD +3.6%、SF +2.3%、AG +2.8% 的提升。
这里最关键的结论不是“swap 有用”,而是:仅靠直接提特征或普通自监督重建,并不足以稳定构造共享适配域。 真正起作用的是双向 swap translation、全局域约束、局部统计约束与交叉重建共同组成的整套训练机制。
5.3.2 global-local constraint 消融


相关特征可视化见 Fig.6,定量结果见 Table III。论文比较了不使用域约束、只用 global constraint、只用 local constraint,以及二者联合使用四种设置,并报告 G-LC 相较第二名 GC 在 Potsdam 上带来 EN +0.3%、SD +0.8%、SF +4.1%、AG +2.9% 的提升。
这组结果说明,global 与 local 不是可互相替代的两个小技巧,而是职责不同的两层约束。global constraint 负责把特征推向共享域,解决的是域级可分性;local constraint 负责压缩窗口级统计差异,解决的是共享域内部是否足够贴合。两者联用,SITS 才真正成立。
5.3.3 TIQM 消融


相关可视化见 Fig.7,定量结果见 Table II。论文将 TIQM 与简单拼接、简单相加以及不使用任务交互的版本比较,并报告 Task I&Q 相较第二名 Concatenate 在 Potsdam 上带来 mAcc +1.5%、mIoU +1.5%。
这组结果的意义在于,它把 TIQM 从“加了 attention 的模块”重新还原成“桥接机制”。直接拼接只是信息并置,直接相加只是信息叠加,只有 Task I&Q 明确回答了“融合分支究竟该从分割分支取什么”。因此,它证明的不是某种注意力写法更强,而是交互 + 查询这一结构逻辑本身更合理。
5.4 下游任务验证 融合质量是否可迁移
下游任务部分的关键问题是:融合结果是否真的能转化为机器可用的外部收益,而不仅是视觉观感更清晰。本文给出的直接验证主要落在分割与检测两条线上。
5.4.1 分割迁移
前文 Tables V-VII 与 Fig.9 已经表明,CDTFusion 在三套数据集上的分割指标与边界质量都具有稳定优势。这意味着本文的融合收益不是停留在图像统计层,而是能进一步转化为语义结构判别能力。
5.4.2 检测迁移


论文还在 M3FD 上给出目标检测验证,以说明方法不仅对分割有帮助,也对检测有帮助。对应可视化见 Fig.10,定量结果见 Table VIII。作者在正文中给出的结论是:mAP50 相比第二名方法提升 0.4%。
5.5 证据链交叉验证
从研究设计角度看,CDTFusion 的结论建立在三层证据的相互支撑上。第一层是融合主实验,Table IV 与 Fig.8 证明跨域整理和跨任务桥接能够共同提升融合图的细节保持与结构清晰度。第二层是结构消融,Table I-III 分别说明共享适配域构造、global-local 双约束和 TIQM 的交互-查询逻辑都具有独立可验证的贡献。第三层是迁移验证,Tables V-VIII 与 Fig.9-10 证明融合质量提升并非停留在视觉观感,而是能转化成分割与检测任务上的外部收益。
三层证据共同指向同一判断:CDTFusion 的改进不是某个局部模块碰巧带来的分数上涨,而是跨域与跨任务两条设计主线协同作用的结果。也正因为如此,本文真正值得借鉴的不是某个局部技巧,而是这种“主实验证明有效、消融解释因果、下游验证迁移”的完整研究组织方式。
5.6 参考
- Zhao W., Wang W., Wang H., He Y., Lu H., CDTFusion: Crossing Domain and Task for Infrared and Visible Image Fusion, IEEE TPAMI, 2026.
- 代码: https://github.com/wangwenbo26/CDTFusion
06 个人声明
本文为作者对原论文的学习笔记与心得分享,受个人学识与理解所限,文中对论文内容的解读或有不够周全之处,一切以原论文正式表述为准。本文仅用于学术交流与传播,内容均由作者独立整理完成,不代表本公众号立场。如文中所涉文字、图片等内容存在版权争议,请及时与作者联系,作者将在第一时间核实并妥善处理。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!