
红外与可见光图像融合这个方向我从2021年前后开始持续跟踪最初是为了做电力设备巡检的缺陷识别后来陆续在安防监控、无人机巡检、车载夜视几个场景里都落地过。说实话这个领域最让人头疼的从来不是融合算法本身而是数据。你算法再花哨没有配准好的红外-可见光图像对一切都是空谈。2025年这个时间节点上公开可用的融合数据集比三年前丰富了不少但坑也更多了——很多数据集标注质量参差不齐有些甚至连基本的空间对齐都没做好直接拿来训练模型收敛都成问题。这篇内容我打算把红外与可见光图像融合数据集这件事彻底讲透。从数据集的核心构成、主流公开数据集的横向对比、怎么判断一个数据集能不能用、到实际训练中的预处理流程和踩坑记录全部基于我自己和团队的真实操作经验来写。无论你是刚入门做多模态融合的研究生还是需要在工程中落地红外可见光融合方案的工程师应该都能从中找到可以直接复用的东西。1. 红外与可见光图像融合数据集到底在解决什么问题1.1 两种模态的本质差异与互补逻辑要理解融合数据集的价值得先搞清楚红外和可见光这两种成像模态到底差在哪。可见光图像靠的是反射光成像分辨率高、纹理细节丰富、色彩信息完整但它的致命弱点是在低照度、烟雾、雨雪等恶劣条件下几乎失效。红外图像靠的是目标自身的热辐射成像不受光照条件影响能穿透烟雾和部分遮挡但分辨率通常较低、纹理细节少、对比度差。这两种模态的互补性非常强。举个例子在夜间安防场景中可见光摄像头拍到的画面基本是一片漆黑但红外摄像头能清晰捕捉到人体热源。反过来在白天场景中红外图像可能因为环境温度与目标温度接近而丢失细节但可见光图像能提供完整的场景纹理。融合的目标就是把两者的优势叠加到一张图上让这张图既有红外的热目标信息又有可见光的纹理细节。注意融合不是简单的像素叠加。早期有人直接用加权平均做融合结果就是红外目标被可见光的亮区淹没或者可见光细节被红外的低分辨率拖累。真正有效的融合需要在特征层面做选择性保留。1.2 数据集的核心构成要素一个合格的红外与可见光图像融合数据集至少需要满足以下几个条件。第一空间配准。红外和可见光摄像头的光轴、视场角、分辨率都不同必须经过严格的几何配准确保同一像素位置对应同一物理点。第二时间同步。对于动态场景两路摄像头的曝光时刻必须对齐否则运动物体会出现鬼影。第三场景多样性。需要覆盖不同光照条件、不同天气、不同场景类型城市、野外、室内等。第四标注信息。如果下游任务是目标检测或语义分割还需要对应的边界框或像素级标注。很多人在找数据集时只看图像数量和分辨率忽略了配准精度这个最关键的指标。我见过不少数据集图像对看起来是对齐的但放大到像素级别就能发现边缘有2-3个像素的偏移。这种数据集拿去训练融合网络网络会学到错误的对应关系最终融合结果在边缘处出现明显的重影。1.3 2025年数据集生态的变化趋势2025年这个领域最大的变化是数据集规模化和场景细分化。早期数据集大多只有几十到几百对图像现在主流数据集动辄上千对甚至上万对。同时针对特定场景的专用数据集越来越多比如专门针对电力巡检的、专门针对自动驾驶夜间的、专门针对工业缺陷检测的。另一个趋势是多任务标注的整合。以前融合数据集只提供图像对现在很多数据集同时提供目标检测标注、语义分割掩码、甚至深度信息。这对做端到端多任务学习的团队来说省了大量标注成本。还有一个值得关注的变化是合成数据的引入。通过物理渲染引擎生成红外-可见光配对数据可以低成本扩充数据集规模。但合成数据与真实数据之间存在域差距直接用合成数据训练、真实数据测试性能下降通常很明显。目前比较务实的做法是合成数据做预训练真实数据做微调。2. 主流公开数据集横向对比与选型建议2.1 几个绕不开的经典数据集说到红外与可见光融合数据集有几个名字是绕不开的。TNO数据集是这个领域最经典的公开数据集之一主要包含军事和 surveillance 场景的红外-可见光图像对图像经过配准场景涵盖白天、夜间、不同天气。它的优点是场景典型、配准质量较好缺点是图像数量有限分辨率也不算高。RoadScene数据集偏向自动驾驶场景包含大量道路、车辆、行人相关的图像对。这个数据集的特点是场景重复度较高适合做驾驶场景的专项研究但如果你要做通用融合它的场景多样性就不够。MSRS数据集是近年来使用较多的一个全称是Multi-Spectral Road Scenes包含红外和可见光图像对同时提供语义分割标注。它的优势在于标注质量高、场景丰富适合做融合加分割的联合任务。FMB数据集是一个比较新的数据集提供了多光谱图像对以及对应的融合结果参考适合做融合质量评估的研究。数据集名称图像对数量分辨率场景类型标注类型适用方向TNO约200中低军事/监控无通用融合研究RoadScene约200中高自动驾驶无驾驶场景融合MSRS约1400高道路场景语义分割融合分割FMB约1000高多场景融合参考融合评估M3FD约4200高多场景目标检测融合检测2.2 选型时最容易踩的三个坑第一个坑是只看数量不看质量。有些数据集号称有上万对图像但仔细一看大量图像对之间存在严重的配准误差或者场景高度重复。这种数据集训练出来的模型泛化能力很差。第二个坑是忽略标注格式的兼容性。不同数据集的标注格式五花八门有的是COCO格式有的是VOC格式有的是自定义格式。如果你要做多数据集联合训练格式转换的工作量可能比你想象的大得多。第三个坑是忽视数据集的许可协议。有些数据集只允许学术研究使用商业项目中使用会涉及侵权。这一点在工程落地时尤其重要我见过团队因为这个问题被迫在项目后期更换数据集导致大量返工。提示选数据集之前先明确你的下游任务是什么。如果只是做融合质量的主观评价TNO和FMB够用如果要做检测或分割优先选带标注的MSRS或M3FD。2.3 怎么给横向对比的红外数据集定相同基线这是热词里出现的一个问题也是实际研究中非常关键的一点。当你拿多个数据集做横向对比时如果基线不一致结论完全不可信。定基线主要从三个维度入手。分辨率基线。不同数据集的分辨率不同直接缩放会引入插值伪影。建议统一缩放到一个中间分辨率比如256x256或512x512并且对所有数据集使用相同的插值算法。我通常用双三次插值因为它在细节保留和伪影控制之间平衡得比较好。配准基线。如果数据集本身的配准精度不同需要做二次配准。常用的方法是基于互信息的配准或者用光流法做精细对齐。这一步很耗时但不做的话对比结果没有意义。评价指标基线。融合质量的评价指标有很多比如EN信息熵、MI互信息、SCD差异相关和、VIFF视觉信息保真度等。不同指标对不同数据集的敏感度不同建议至少用三个指标交叉验证避免单一指标带来的偏差。3. 数据预处理与融合训练实操流程3.1 从原始数据到可训练格式的完整链路拿到一个数据集之后不能直接丢进网络训练。完整的预处理链路包括以下几个步骤。第一步是数据清洗。检查图像对是否存在配准误差过大、曝光异常、损坏等问题。我通常写一个脚本批量计算图像对的互信息值低于阈值的直接剔除。第二步是格式统一。把所有图像统一为相同的格式和位深。红外图像常见的是16位灰度图可见光是8位RGB图。训练时需要决定是保留16位还是转8位。如果保留16位网络输入层需要相应调整如果转8位会损失一部分动态范围。我的经验是对于融合任务保留16位红外信息效果更好但需要做归一化处理。第三步是数据增强。融合任务的数据增强需要特别注意因为红外和可见光图像对必须做相同的几何变换。随机裁剪、旋转、翻转都可以用但颜色抖动只能对可见光做不能对红外做。import cv2 import numpy as np from skimage.metrics import mutual_info_score def check_registration(ir_img, vis_img, threshold0.3): 基于互信息检查配准质量 ir_gray cv2.cvtColor(ir_img, cv2.COLOR_BGR2GRAY) if len(ir_img.shape) 3 else ir_img vis_gray cv2.cvtColor(vis_img, cv2.COLOR_BGR2GRAY) # 统一尺寸 h, w 256, 256 ir_resized cv2.resize(ir_gray, (w, h)) vis_resized cv2.resize(vis_gray, (w, h)) # 计算互信息 hist_2d, _, _ np.histogram2d(ir_resized.ravel(), vis_resized.ravel(), bins50) mi mutual_info_score(None, None, contingencyhist_2d) return mi threshold def paired_augment(ir_img, vis_img): 配对数据增强几何变换同步 # 随机水平翻转 if np.random.rand() 0.5: ir_img cv2.flip(ir_img, 1) vis_img cv2.flip(vis_img, 1) # 随机裁剪 h, w ir_img.shape[:2] crop_size int(min(h, w) * 0.8) x np.random.randint(0, w - crop_size) y np.random.randint(0, h - crop_size) ir_img ir_img[y:ycrop_size, x:xcrop_size] vis_img vis_img[y:ycrop_size, x:xcrop_size] return ir_img, vis_img3.2 融合网络训练的关键参数设置融合网络的训练和普通分类检测网络有很大不同。损失函数的设计是核心通常需要组合多个损失项。常见的组合是像素级损失加结构相似性损失加梯度损失。像素级损失保证融合结果与源图像在像素层面接近结构相似性损失保证结构信息不丢失梯度损失保证边缘清晰。学习率方面融合网络通常比检测网络更敏感。我一般从1e-4开始用余弦退火策略逐步降到1e-6。batch size不宜太大8到16比较合适因为融合任务的图像对通常分辨率较高显存占用大。训练轮数方面如果是从头训练通常需要100到200个epoch才能收敛。如果用预训练骨干网络50到80个epoch基本够了。判断收敛的标准不是看训练损失而是看验证集上的融合质量指标是否稳定。注意融合任务很容易过拟合。如果训练损失持续下降但验证集指标开始恶化说明模型在记忆训练集的特定配对关系而不是学习通用的融合规律。这时候需要加强数据增强或引入正则化。3.3 融合结果的质量评估方法融合质量的评估分主观和客观两条路。主观评估就是人眼看看融合图像是否自然、红外目标是否突出、可见光细节是否保留。客观评估靠指标计算。常用的客观指标包括信息熵EN、互信息MI、峰值信噪比PSNR、结构相似性SSIM、视觉信息保真度VIFF等。但要注意这些指标各有偏向。信息熵高的图像不一定视觉效果好互信息高也不代表融合结果对下游任务有利。我的做法是客观指标只作为参考最终以下游任务性能为准。比如你做的是融合加检测那就看融合后的图像送进检测器mAP是多少。这个指标比任何融合质量指标都更有说服力。4. 实际训练中的常见问题与排查技巧4.1 配准误差导致的鬼影问题这是最常见也最棘手的问题。表现是融合结果在物体边缘出现明显的重影或模糊。排查方法是把红外和可见光图像分别用不同颜色通道叠加显示如果边缘出现彩色条纹说明存在配准误差。解决方法分两种情况。如果是数据集本身的配准问题需要做二次配准。常用的工具是OpenCV的配准模块或者基于深度学习的配准网络。如果是训练过程中数据增强引入的误差检查增强代码是否对两路图像做了完全相同的几何变换。我踩过的一个坑是用了某个开源数据加载库它默认对图像做随机缩放但没有同步缩放红外和可见光。结果训练出来的模型在测试时融合效果很差排查了两天才发现是数据加载的问题。4.2 模态不平衡导致的融合偏向模态不平衡是指两路输入的信息量差异过大导致网络偏向于某一模态。比如在夜间场景中可见光图像几乎全黑信息量极低网络会倾向于完全依赖红外图像融合结果就退化成红外图像。解决这个问题的方法有几个。一是在损失函数中给两路图像不同的权重信息量低的那一路权重降低。二是在网络结构中引入模态注意力机制让网络自适应地调整两路输入的贡献。三是在数据层面做平衡确保训练集中不同光照条件的样本比例合理。4.3 训练不收敛或指标震荡融合网络训练不收敛的原因通常有三个。学习率太大导致损失在最优值附近震荡损失函数权重设置不合理某一项损失主导了梯度数据集中存在大量低质量样本干扰了训练。排查步骤是这样的。先把学习率降低一个数量级看损失是否稳定下降。如果还不行把损失函数简化为只有像素级损失看能否收敛。如果能收敛说明是损失权重的问题逐步加回其他损失项并调整权重。如果还是不行检查数据集随机抽取一些样本可视化看是否存在明显的异常样本。问题现象可能原因排查方法解决方案边缘重影配准误差彩色通道叠加检查二次配准或修正增强代码融合偏向单模态模态不平衡分别遮挡两路输入测试调整损失权重或加注意力损失震荡学习率过大降低学习率观察余弦退火或阶梯衰减验证指标恶化过拟合对比训练/验证损失加强增强或加正则化输出全黑或全白归一化错误检查输入范围统一归一化到[0,1]4.4 数据集持续更新带来的版本管理问题2025年的数据集很多都是持续更新的比如标题里提到的这个数据集就是持续更新状态。这带来一个实际问题你今天训练的模型下个月数据集更新了新增了样本你还能复现之前的结果吗我的做法是每次训练时记录数据集的版本号或快照哈希值。如果数据集没有提供版本信息就自己维护一个本地副本不要直接指向在线更新目录。另外训练脚本中要固定随机种子确保数据划分可复现。提示对于持续更新的数据集建议每季度做一次全量评估看新增数据是否改变了模型的性能分布。如果新增数据集中在某个特定场景可能需要针对性地做微调。5. 下游任务适配与扩展思路5.1 融合加检测的联合优化很多实际项目不是只要融合图像而是要基于融合图像做检测。这时候有两种策略。一种是先融合再检测两阶段独立优化。另一种是端到端联合训练融合网络和检测网络一起优化。两阶段的好处是灵活融合网络可以用无标注数据训练检测网络用标注数据训练。缺点是融合网络的目标和检测网络的目标可能不一致融合结果对人眼好看但对检测不一定最优。端到端联合训练可以解决这个问题但需要大量带检测标注的融合数据训练成本也更高。我的经验是如果标注数据充足优先端到端如果标注数据有限先做两阶段再用少量标注数据做联合微调。5.2 从融合数据集到自定义场景的迁移公开数据集再好最终还是要落到自己的场景。迁移的关键是域适应。公开数据集和你的场景之间的差异可能包括成像设备不同、场景类型不同、光照条件不同等。迁移的策略分三步。第一步用公开数据集预训练融合网络。第二步采集少量自己场景的数据做无监督或半监督微调。第三步如果下游任务有标注用标注数据做端到端微调。采集自己场景数据时最大的难点是配准。如果用的是双目或多目相机模组出厂时通常已经做了硬件配准但实际使用中可能因为震动、温度变化导致配准漂移。建议定期做配准校准或者在软件层面做在线配准。5.3 数据集扩展与标注效率提升如果你需要自己扩展数据集标注效率是个大问题。像素级的融合质量标注几乎不可能大规模做但目标检测的边界框标注相对可行。提升标注效率的方法有几个。一是用预训练模型做预标注人工只做修正。二是用主动学习策略只标注模型不确定的样本。三是用半自动标注工具比如基于SAM的交互式分割可以大幅减少标注时间。我自己团队的做法是先用公开数据集训练一个基线检测模型然后用这个模型对新采集的数据做预标注人工修正后再加入训练集。这样一轮下来标注效率大概能提升3到4倍。6. 一些实操中的零散经验关于红外图像的16位处理我再补充一点。很多开源代码默认把红外图像当8位处理直接除以255归一化。但16位红外图像的动态范围是0到65535直接除以255会截断大量信息。正确的做法是先统计图像的直方图做自适应的范围裁剪比如取1%到99%分位数作为有效范围然后再归一化到0到1。关于融合结果的保存格式如果后续要做检测建议保存为PNG或无损格式不要用JPEG。JPEG的压缩伪影会影响检测器的性能尤其是对小目标的检测。关于多数据集联合训练不同数据集的图像风格差异很大直接混合训练可能导致模型在某个数据集上过拟合。我的做法是给每个数据集一个可学习的域嵌入向量让网络知道当前样本来自哪个域这样可以在一定程度上缓解域冲突。最后说一个关于评估的心态问题。融合质量这件事客观指标和主观感受经常不一致。我见过指标很高但人眼看着很别扭的融合结果也见过指标一般但视觉效果很自然的。如果你的项目最终是给人看的主观评估的权重应该更高如果是给机器做下游任务那就以下游指标为准。不要为了刷指标而牺牲实际效果这是我在多个项目里反复验证过的教训。