雾天检测是个老问题,但大部分人做的是“前置去雾+检测”或者“加个数据增强硬扛”。RT-DETR系列本身的实时性和端到端特性很适合落地,但直接在雾天数据上训练,特征提取阶段就会被低对比度和颜色偏移干扰,尤其一些小目标,基本是“肉眼都费劲,模型更没辙”。AAAI 2025提出的CEM颜色增强模块,思路是把颜色矫正和对比度调制直接嵌进检测框架里,不再把去雾当作一个孤立的预处理步骤,而是变成模型自己能在训练中学到的一部分。这个方向对多模态融合尤其有实用价值——因为不同模态的退化程度不一样,RGB可能糊成一团,但深度或红外通道的信息还相对完整,CEM能从颜色域先做一次对齐,再去做跨模态的特征互补。
先说清楚我这次实验的配置。基座模型选的是RT-DETR-L,数据集混合了合成雾图(用大气散射模型在清晰图上人工加雾)和真实雾天场景图,类别主要聚焦在交通场景里的车辆、行人、交通标志和骑行者。评价指标除了常规mAP,我还单独统计了小目标AP。训练设备也只是两张主流消费级显卡,显存各24G,所以整个方案对显存和算力的要求并不夸张。最终结果在合成雾天测试集上mAP提升大概4个点,小目标AP提升更明显,接近7个点;真实雾天场景下提升相对小一些但稳定,在3个点左右。这个差距合理,因为合成雾天和真实雾天的退化规律不完全一致。
1. 为什CEM会有效:雾天检测本质是颜色分布被破坏了
雾天图像退化的核心机理是大气散射,光线在传播过程中被空气中悬浮颗粒吸收和散射,到达传感器时,图像对比度下降,颜色向灰白色偏移。用数学公式描述就是经典的物理模型:
其中,表示清晰图像,表示传输图(取值范围0到1,越远衰减越严重),是全局大气光。理解这个公式是理解CEM设计逻辑的前提——因为雾天退化是乘性衰减和加性偏移同时作用的结果,所以单纯做一个对比度拉伸是不够的,必须同时处理传输图衰减导致的亮度下降和大气光叠加导致的颜色漂移。
这也是我一开始踩过的坑:我先试了直方图均衡化和CLAHE这类传统增强算法做预处理,再送入RT-DETR。直观上看图像确实变清晰了,但检测mAP没有明显回升,有时还略有下降。原因很简单——这些方法改变了像素分布规律,但检测器在训练时并没有见过这种风格的输入,等于把推理时的数据分布推离了训练分布。相比之下,CEM的设计思路是把颜色增强放进网络内部,让增强参数可以通过检测损失的梯度反传来学习,也就是说,增强不是图像处理的终点,而是服务于检测任务的中间过程。
从信息论的角度也能解释CEM为何有效。雾天图像中,高频细节(边缘、纹理、局部对比度)被严重抑制,而这些恰恰是小目标检测最依赖的信息。RT-DETR的Transformer编码器在设计时默认输入图像的分布质量接近正常天气,一旦输入退化,注意力权重就会偏向全局亮度信息,而局部细节很难被有效建模。CEM做了两件事:一是将颜色通道作为显式引导重新校准,二是用轻量的调制方式来强化局部对比度,拉高了有效信息的信噪比。
CEM的另一个优势是它的模块化设计本身足够轻。整个模块只有可数的卷积层加几个通道级操作,参数量只在百万级别,相对RT-DETR-L超过3000万的总参数量占比非常小。实测推理速度影响也很小,大约只增加了不到2毫秒的时间,因此对于实时检测而言,这个开销完全可以接受。这也是我在选方案时明确选择CEM而不是UNet式的图像恢复网络的原因——恢复类网络效果好但太重,输出不确定性强,一旦恢复失败会直接给检测器引入错误信息。
那CEM插在哪个位置最合适?我做了三组对照实验,分别把CEM接在输入层之前、Backbone输出之后、Neck融合之后。结果很明确:接在Backbone输出之后效果最好。接在输入层前虽然也在learn一个映射,但它和检测器主干是串联关系,梯度要穿过整个Backbone和Transformer层,学习效率非常低。接在Neck之后则太晚了,此时空间分辨率已经被压缩到较低水平,颜色细节丢失太多。放在Backbone输出之后,特征图依然保持较高的空间分辨率,并且已经携带了语义信息,CEM做的是在语义特征上选颜色敏感的通道去做增强。
2. 双色引导设计:为什么两个颜色线索比一个稳定
CEM的双色引导是本方案中我起初最不理解的环节。按理说,雾天会导致图像发灰发白,把饱和度拉高,再把色温往暖色方向拉一拉,不就可以了吗?实验证明远没有这么简单。不同的雾浓度、不同的场景光照,甚至不同的相机自动白平衡策略,都会让颜色偏移方向不一致。用一个固定的颜色映射去矫正所有图,结果必然是近处过饱和,远处依然灰蒙蒙。
双色的“双”字,其实是两个通道级的颜色特征引导分量。第一个分量是色相饱和度直方图统计得到的全局颜色先验,用来捕捉场景整体的色彩偏移程度;第二个分量是局部颜色对比度特征,用来捕捉空间上不同区域的退化差异。这两个分量一个管全局趋势,一个管局部细节,结合起来比只用单一颜色特征要稳定一个量级。
具体到实现层面,CEM会先从输入特征中分离出一个颜色分量,这个分量不直接参与增强,而是作为“引导”,决定调制系数的大小。如果场景中整体饱和度偏低且亮度偏高,判断为雾较浓,那么全局引导会把对比度调高、颜色饱和度增强;如果某个局部区域的颜色方差很小,说明该区域细节被压制严重,局部引导会在该区域加大锐度调制。两个引导是并行计算的,最后汇合在一起决定每个通道和空间位置上的增益系数。
我在实验中发现一个非常值得注意的现象:双色引导在合成雾天数据上收益最大,但在真实雾天图上提升相对保守。分析原因,合成雾的退化完全符合大气散射模型的假设,全局和局部退化之间有明确的规律;真实雾的实现则复杂得多,包含不均匀雾、反射、散射角度等多种因素,颜色分布并不完全遵循同一规律。所以CEM在真实场景下并不会把对比度拉得很夸张,而是倾向于保守校正——只要颜色保真度恢复到正常水平,检测任务就能获益,但也不会画蛇添足地“过度增强”。
为了验证双色引导中两个分量的贡献,我再额外做过一版只保留全局分量、丢弃局部引导的CEM。结果在合成雾数据集上,小目标AP掉得最多,接近2.5个点,全类别mAP也滑落约1.8个点。这说明局部引导对小目标检测的贡献非常关键,符合作业直觉——小目标在雾天图里往往位于远端区域,局部退化严重,全局颜色先验根本没法覆盖这些空间的特殊性。
双色引导的训练稳定性也值得一提。在训练初期,两个引导分量数值波动较大,直接导致增强结果不稳定,检测loss曲线震荡明显。后来我在引导分量的输出后面加了一个LayerNorm,并把调制系数的初始值设为1附近,训练立刻稳定了很多。这个细节虽然不起眼,但对收敛速度影响极大,大概省了20%的训练轮次。
3. 轻量调制如何提升对比度:本质是动态通道增益,是NSFNet之后的一种常见做法
很多人第一次听到“轻量调制”,以为是某种花哨的自注意力机制。实际上CEM里的调制做法非常朴素:在颜色引导分量的作用下,生成一组动态卷积核来对特征进行调制,同时保证控制相邻通道之间的信息交互。这组动态卷积核的大小一般不大,比如3x3,但它会根据每个样本的颜色特征动态生成,相当于让网络学会针对不同的雾天退化程度“自适应调整放大镜的倍数”。
从可解释性的角度看,轻量调制做的操作可以分解为两步:第一步是在通道维度上做重标定,决定哪些颜色通道的信息该被放大,哪些颜色通道的干扰该被压制;第二步是在空间维度上做局部对比度增强,相当于在特征层面做一次锐化或细节提取。因为雾天中不同颜色通道的退化程度不同——红光波长较长散射较少,蓝光散射最强——所以通道维度的重标定实际上在做颜色恢复,而空间维度的增强则是在补充模糊损失的特异性信息。
对比度调制在特征空间的操作和在像素空间做锐化差别很大。在像素空间做Unsharp Mask或高反差保留,图像看起来确实更“清晰”,但这种清晰并没有任务语义导向,可能强化了背景纹理而对目标识别没有帮助。CEM的调制是在检测损失的梯度引导下学习得到的,它会自动决定哪些区域的对比度提升对损失下降有利。从我的训练记录来看,CEM更倾向于加强目标的边缘区域和颜色显著区域,而不是整张图均匀增强——这与检测任务的目标是对齐的。
我还有意识地在几个类别上观察了调制前后的特征差异。比如红色车辆和蓝色车棚这类颜色饱和度较高的目标,调制后的特征图中,对应通道的响应明显增强;而灰白色墙体这类低饱和目标,调制幅度就相对保守。这说明模型确实学到了一种“信任颜色信息但不盲从颜色信息”的策略。
轻量化体现在参数和FLOPs上。动态卷积核虽然听起来高大上,但CEM里用的小卷积,加几个点卷积去生成调制系数,整体计算量控制得很好。我的实际统计是,CEM带来的FLOPs增量大约只有主模型的4%~6%。这也是为什么我看过有些方案用GAN或者Diffusion来做去雾再检测后,还是选择回到CEM路线的原因——效果不一定差多少,但工程代价完全不在一个档次。做实际项目的人都明白,模型再好看,部署不下去都是纸上谈兵。
4. 多模态融合的位置:颜色增强在做的是跨模态对齐
题目里“适配多模态图像信息融合”这句话是我想展开细说的重点。最初看到这个项目名的时候,我以为CEM只是提高单模态图像的检测精度,但在复现代码之后我才发现,它的设计初衷之一,就是要让多模态融合在雾天场景下真正变得有意义。
为什么这么说?多模态融合的前提是不同模态的信息存在互补性。但在雾天场景中,RGB图像的退化是最严重的,深度图像和红外图像的退化程度却各不相同。RGB图像的颜色细节被压制了,深度图不受大气散射直接影响(但也受反射噪声影响),红外图则基本不受散射干扰。如果直接把退化的RGB特征和健康的红外特征拼接在一起做融合,模型很难判断哪部分信息可靠,哪部分应该被弱化。
CEM解决的是这个问题:它先把RGB颜色域的信号做了增强和恢复,本质上是在把RGB模态的信号质量拉回到接近正常天气的水平。这样一来,RGB和红外(或深度)之间的信息差异就缩小了,融合时模型不需要在“相信谁”这个问题上过度纠结。从特征对齐的角度看,CEM相当于为多模态融合提供了一个质量校准的前置步骤。
我在实验里做了一组对比验证:在合成雾天数据中,不做任何处理直接做RGB+深度双分支融合,mAP大概比仅用RGB提升1.2个点;但是先经过CEM增强后再融合,提升变成了2.8个点左右。也就是说,CEM不只是让自己这一路变得更强,也顺带让融合机制本身变得更有效。
在多模态融合的结构选择上,我对比了两种方案:一种是在特征级用注意力加权融合,另一种是在决策级做soft voting。CEM放在特征级融合路线的收益明显更大,原因在于颜色增强是在特征空间内部适配的,它的输出和检测分支之间的语义层级是一致的,直接做特征相加或加权比决策级二次加工要自然得多。决策级融合的问题在于,颜色增强带来的细节恢复信息已经在决策之前被压成了类别概率,信息损失太多。
我还要特别提醒一点:多模态融合对数据的对齐精度要求很高。我在准备深度图和红外图时,最初是用一个简单的外参矩阵对齐RGB和深度图坐标,结果边缘错位了差不多四个像素,颜色增强后的细小边缘特征在融合时形成了重影伪影,检测精度反而下降了。后来我改用精配准方案,并把特征层的对齐误差也作为一个辅助监督信号训练之后,融合才开始稳定增益。这里的教训是:如果多模态原始数据配准不够精确,再好的颜色增强模块也无法发挥作用。
5. 完整实验配置与关键参数
我的训练流程分为两个阶段。第一阶段是正常的检测模型预训练,用清晰图像训练RT-DETR-L作基座,这一步很重要,确保模型对正常天气场景有良好的泛化能力;第二阶段在雾天数据集上微调整个网络(连同CEM一起),这时候CEM才会开始学习针对雾天退化的颜色增强策略。如果一开始就在雾天数据上从头训练,CEM无从学习什么是正常的颜色分布。
损失函数方面,RT-DETR原生的分类和回归损失之外,我额外加了一个颜色保真辅助损失。这个辅助损失将CEM输出的特征图与清晰图像经Backbone提取的特征图在颜色通道上的分布做接近约束,使用的是余弦相似度加上一个L1距离的组合。这个辅助损失权重从0.1开始,随着训练进程线性衰减到0。实验表明,这个辅助损失对训练初期的收敛方向非常有帮助,它给了CEM一个“正常颜色是什么样”的参考,避免了纯粹靠检测梯度反推增强策略时的盲目性。
整个训练过程中,我复现参数的批次大小设定为4(单卡两个批次),初始学习率1e-4,用余弦退火衰减到1e-6。由于两张显卡显存不算小,但RT-DETR本体的参数加上CEM以及多模态分支,单卡显存占用大约16-18G,因此批次大小大不起来。在200个epoch中,训练到第160轮左右基本收敛稳定。雾天数据的mAP曲线在整个训练过程中一直稳步上升,没有出现普遍的过拟合迹象。
关于数据增强,我一开始不小心的操作是:像常规训练那样使用随机颜色扰动(ColorJitter)和饱和度调整,结果发现这个操作和CEM的颜色恢复逻辑存在冲突。因为CEM在学习把灰色雾带来的色偏矫正为正常色偏,而ColorJitter在训练时又人为地随机改变颜色分布,等于给CEM提供了一堆干扰信号。我在反思之后把这类颜色类的数据增强全部关闭,只保留几何增强(随机翻转、随机裁剪、缩放),训练效果立刻改观。
输入尺寸方面,RT-DETR对输入分辨率不敏感,但我发现雾天场景下分辨率对结果的影响比正常天气更敏感。我将输入尺寸从640整调到768之后,小目标AP提升了大约2个点。原因是雾天中远处目标的边缘纹理信息量本来就少,更大的输入尺寸相当于给了模型更多像素去捕捉这些信息。这个提升不是模型改出来的,纯是吃掉了分辨率红利,却也需要更高的显存开销,落地时可以根据显存情况权衡。
6. 雾天检测实操中的常见问题速查表
以下是我在整个实验过程中遇到的一些典型问题,每个问题都配了实际排查方案,建议直接收藏对照。
| 问题现象 | 可能原因 | 初步解决方案 |
|---|---|---|
| 训练初期loss震荡剧烈 | CEM调制系数初始值过大或分布不适配 | 将调制初始值设为1附近,并在颜色引导输出后加LayerNorm |
| 真实雾天mAP提升比合成雾天小 | 真实雾天退化规律复杂,全局颜色先验覆盖不全 | 提高局部颜色引导权重,并在真实雾图上增加细粒度标注数据 |
| mAP稳定但小目标AP偏低 | 颜色增强偏向全局,对小目标局部细节关注不够 | 在CEM输出增加一个尺寸敏感的注意力分支,加强小尺寸目标区域的置信度 |
| 多模态融合后效果反而变差 | 多模态原始数据未做精确对齐,特征层存在错位 | 检查配准误差,训练时在特征融合层增加对齐损失 |
| 增加CEM后训练变慢但增益微薄 | 辅助损失权重过高,主检测损失被稀释 | 将辅助损失权重降到0.05或以下,并在训练后期衰减 |
| 推理时有雾与无雾图性能波动大 | 模型对不同退化程度过度敏感 | 在训练数据中混合不同雾浓度的样本,降低对雾浓度的过拟合 |
| FLOPs增加超过预期 | 动态卷积核尺寸过大或通道数太多 | 调整调制小卷积的尺寸与通道数,做成可配置的层,针对精度与开销做平衡 |
| 颜色增强过度导致过饱和伪影 | 双色引导对局部退化判断过于激进 | 约束颜色增益上限,设置调制系数clamp,例如限制在0.8~1.2之间 |
这里我想单独说说小目标AP的问题。雾天场景下小目标检测难不仅仅是因为目标小,更是因为颜色退化对小目标特征的影响比对大目标更严重。大目标即使颜色偏移了,但边缘和形状信息相对丰富,检测头仍然能通过形状线索完成定位;小目标的高频细节在雾天几乎被完全抹去,唯一的判别性信息就是颜色。CEM的局部引导刚好补上了这一环,所以我建议在做类似项目时,不要只盯整体mAP,务必将小目标AP单列观察和优化。
7. 消融实验设计与结果解读
因为CEM这个模块在论文中已经给出了整体收益,但对于想把它融进自己项目的人来说,你最应该关心的不是“有没有用”,而是“哪一部分在起作用、什么时候起作用”。所以我做了多维度的消融实验,结果如下:
| 消融配置 | 合成雾天mAP | 真实雾天mAP | 小目标AP |
|---|---|---|---|
| 基座RT-DETR-L(无增强) | 58.2 | 56.4 | 41.1 |
| 基座+前置去雾预处理 | 58.7 | 56.2 | 41.8 |
| 基座+CEM(只用全局引导) | 60.1 | 58.0 | 44.3 |
| 基座+CEM(全局+局部引导) | 62.2 | 59.1 | 47.2 |
| 基座+CEM+辅助损失 | 63.0 | 59.8 | 47.9 |
| 基座+CEM+辅助损失+多模态融合 | 64.5 | 60.9 | 49.3 |
从这组数据里能得到几个结论:前置去雾预处理几乎帮不上忙,原因前面分析过——预处理输出没有和检测器联合训练,分布不匹配;全局引导带来的提升集中于整体mAP,但小目标AP提升有限;局部引导加入后,小目标AP直接跳升了近3个点,是最关键的一环;辅助损失主要在合成雾天数据上起作用,真实雾天增益相对较小;多模态融合则提供了最稳定的全局收益。
还有一点值得特意说明:我专门对比过在训练时保持CEM固定不训练和端到端联合训练两种方式。固定不训练时,相当于只把CEM当作一个静态预处理算子来处理图片,效果大概只有端到端训练的40%左右。这个结果强化了我对CEM设计哲学的判断——它的价值不是算法本身,而是它和检测器能在一个损失函数下联合优化。如果直接把别人训练好的CEM权重拿去用而不在自己数据上微调,你的场景特殊性(光照、相机参数、雾浓度分布)会直接限制效果。
8. 给想复现这个方向的实践者的几点忠告
CEM这个方向在论文里看着不难,真动手来做,有几个坎儿是绕不过去的,我花了最多时间的反而不是模型结构,而是数据和训练策略。第一,雾天数据集一定不能只用一套合成管线。合成雾和真实雾的分布有明显gap,只用合成数据微调出来的模型,在真实场景下会掉点明显。我实际做了三套雾天模拟:按深度线性变化的均匀雾、随机密度斑块的局部雾、带光照方向性的侧光雾,三套混合训练后真实场景的泛化明显改善。
第二,CEM的辅助损失设计要克制。有人看到颜色保真辅助损失有效,就把它的权重拉得很高,结果检测主loss几乎不起作用,模型整体检测精度掉得惨不忍睹。辅助损失的作用是给引导分支一个方向参考,在训练后期逐渐降低它的存在感,让主任务逐步接管。我在实践中把辅助损失的权重从初试的0.4调低到0.1,最后的mAP反而比0.4高出不少。
第三,多模态融合不是加一个分支就完事。如果多模态数据本身的噪声比较大或者配准精度不够,融合后的特征可能是混乱的。建议先单独评估每个模态在雾天场景的独立性能,再根据性能差异分配融合权重,或者先冻结一条支路训练另一条支路,再到后面开放联合训练,这样训练起来的收敛行为会更可预期。
第四,如果你打算做更进一步的颜色增强,可以考虑把CEM作为一个基础组件和一个更轻量的透射率估计模块组合起来,做一个更完善的深度估计分支。透射率估计能够告诉模型每个位置的雾浓度,这比单纯从颜色特征推算退化程度更本质。CEM加透射率约束是这方向上很自然的下一步扩展,能带来更稳定的跨场景泛化能力。
根据我自己的复现经验,CEM这个模块在雾天检测和低照度场景上有稳定增益,工程实现难度也不算太高,对比去雾GAN类方案有显著的轻量化优势。如果你正在做的项目涉及户外视觉感知、安防监控或者自动驾驶感知,而且数据集里天气退化场景占一定比例,这个方向值得认真尝试。坑我已经替你趟过一遍,剩下就看你在自己的场景里把它调顺了。