资讯详情

雾天多模态检测如何提升?YOLOv13+CEM颜色增强实战解析

📅 2026/10/19 8:44:36 | 华诺云谱 👁 阅读
雾天多模态检测如何提升?YOLOv13+CEM颜色增强实战解析
雾天跑检测模型谁跑谁知道。晴天90%的精度一到雾天能直接掉到70%以下而且掉的不是几个百分点的事是那种“明明看着有目标模型就是不敢给高置信度”的玄学问题。最近我在做YOLOv13多模态主线相关工作时结合AAAI 2025上关于颜色增强的思路重点改进了一个专门针对雾天场景的多模态融合检测方案核心是加了一个颜色增强模块CEM利用双色引导保真色、轻量调制提对比度最终在不显著增加算力的情况下把雾天检测的mAP拉回来一大截。这篇文章把整个思路、结构改动、训练细节和踩坑记录完整拆一遍给正在搞检测算法优化、多模态感知和工程落地的同学做一个参考。先说清楚一个事文中提到的YOLOv13是社区主线迭代的延续版本号本身不是重点关键是你拿到一套多模态输入比如可见光RGB加红外IR之后怎么把颜色保真和对比度增强做进网络里而不是在输入端挂一堆预处理算子。这个思路对当前主流YOLO系列都适用。1. 雾天检测为什么难退化模型与多模态的机遇1.1 先搞懂雾到底对图像做了什么大气散射模型雾天图像退化不是简单地“加一层白纱”它体现了大气散射模型的物理过程物体反射的光在传播到相机的过程中一部分被大气散射掉同时大气光环境光在雾中的散射会被加进图像里。用公式表示就是[ I(x) J(x) \cdot t(x) A \cdot (1 - t(x)) ]这里J(x)是清晰场景t(x)是透射率它随着景深指数衰减t(x) exp(-βd(x))A是大气光。翻译成人话就是同一个场景里近处目标衰减少、比较清晰远处目标衰减多、对比度低、颜色都被“压扁”了。而且这个衰减对每个像素是不一样的所以雾天检测难就难在目标与背景之间的边界会变模糊原本可靠的纹理和颜色特征会失去区分度。我最初做雾天检测时犯过一个错误在推理前先把图像做一遍去雾增强然后送检测器。后来发现这样效果很不稳定因为去雾本身是个病态问题估计透射率一旦出错会引入伪影、halo效应和偏色检测器反而被带偏。这也是现在更倾向于把“增强”做进模型内部甚至在特征层面做而不是在输入层面单独搞一个预处理模块的原因。1.2 单模态增强的天花板为什么去雾不是万能药传统去雾算法比如暗通道先验、大气光估计这些方法在实验室环境下效果不错但在实际工程场景里有几个很致命的问题第一暗通道先验在天空区域和高亮目标上会失效导致透射率估计出错第二大气光估计不准会产生明显的色彩偏移尤其是白墙、车灯这类区域第三去雾算法算力开销不小要在边缘设备上对每一帧都做增强延迟和功耗都扛不住。另一个思路是端到端学习训练一个网络同时完成去雾和检测。但这样做通常需要大量配对的有雾/无雾数据而且去雾分支的误差会累积到检测头。更麻烦的是在雾特别浓或者目标本来就很小的场景下RGB信息本身已经退化到几乎没有纹理可学单靠RGB增强无论如何也补不回来。真正让我决定走多模态路线的是红外的特性红外成像主要依赖物体热辐射受大气散射影响远小于可见光。浓雾里可见光图像白茫茫一片但红外图像里车辆、行人、动物的轮廓依然能看得到。不过红外也有先天短板——几乎没有颜色和纹理细节分辨不出红绿灯、车身颜色这类语义信息。所以RGB和IR天然互补RGB给你颜色和纹理IR给你衰减后的结构轮廓。1.3 多模态融合的正确姿势中期特征级交互多模态融合按融合位置可以分为像素级早期、特征级中期和决策级晚期三类。像素级直接把RGB和IR图像拼接或加权叠加再送检测器优点是实现简单缺点是模态间没有对齐、噪声叠加效果很难好决策级各模态单独跑检测器再融合结果缺点是算力翻倍而且两个模态的置信度怎么加权又是一个头疼的问题。工程上最划算的是特征级融合也就是在backbone提取特征之后、检测头之前把RGB和IR的特征图做交互。YOLOv13主线的neck部分本身就有跨尺度特征融合结构多模态正好可以挂在这个地方。我最终选择的方案是双流backboneRGB和IR各走一条特征提取分支在下采样到P3/P4/P5层后分别做融合再把融合后的特征交给neck继续做多尺度交互。这样每个模态的特征先各自提炼再融合避免了早期拼接带来的模态干扰。融合本身也不只是简单地concat。我试过直接拼接、加权求和、注意力加权等方式后面发现还是需要专门的模块来处理颜色和对比度这两个“雾天重灾区”。这就是CEM模块存在的意义——不是去重建清晰图像而是直接在特征层面对颜色信息和对比度信息做针对性增强。2. CEM模块拆解用双色引导保真色、用轻量调制提对比度2.1 双色引导颜色不是复制粘贴而是重分配先解释“双色”到底指什么一路颜色参考来自RGB模态的色度统计信息负责告诉模型“当前场景的颜色基调是什么”另一路来自IR模态的强度分布负责告诉模型“哪里有结构、哪里有轮廓”。两个参考信息经过一个小型注意力网络生成一组特征重校准参数。具体实现不算复杂。对融合后的特征F_fused我会同时计算RGB特征F_rgb的通道均值和标准差以及IR特征F_ir的通道均值和标准差把这四组统计量拼成一个全局描述向量然后过两层全连接得到两个分支γ分支和β分支。γ被约束在[0.5, 1.5]范围内β初始化为0这样初始状态下CEM就是一个恒等映射不会破坏训练初期已经学好的特征分布。[ F_{color} \gamma \cdot F_{fused} \beta ]这个操作本质上是在通道维度上做一次仿射变换。为什么能保真色因为γ和β是从RGB统计信息里算出来的当某一颜色通道的均值偏低雾天偏灰、饱和度下降时网络会自动补偿该通道的增益而当IR结构信息突出时网络会放大对应空间位置的结构响应。这样得到的颜色是“重分配”过的不是简单把RGB搬过来盖在融合特征上。2.2 轻量调制在特征空间做自适应对比度拉升对比度增强是另一条独立分支。我在实际测试中发现仅仅做颜色校准还不够雾天目标的边缘响应很弱特征图上的目标峰值不明显。于是再加了一路轻量调制把F_rgb经过一个深度可分离卷积压缩到单通道再经过sigmoid得到一个空间注意力图用来衡量每个位置需要多大程度的对比度增强。调制公式可以写成[ F_{out} F_{fused} \alpha \cdot S \cdot F_{fused} ]其中S是sigmoid输出α是一个可学习缩放参数初始为0。为什么要带残差连接因为如果一开始调制得太多训练早期梯度会把特征拉偏让α从0开始网络自己学“该增强多少”比固定一个强度要稳妥得多。这套设计和通道注意力机制比如SE有个本质区别SE是在通道维度上做全局压缩再激励而这里是在空间维度上做逐像素的自适应对比度门控并且结合了IR的结构先验。实际效果表现为目标区域的响应峰值更突出背景雾霾区域的响应被压得更低检测头的正负样本区分度自然就上去了。2.3 算账CEM有多轻多模态融合到底贵在哪从参数和算力上看CEM比很多人想象中轻。以P3层特征80x80通道256为例双色统计池化部分只涉及几层全连接约几万参数轻量调制分支的深度可分离卷积在80x80分辨率下计算量也很小。整个CEM模块在512×512输入下大概只增加0.3~0.5 GFLOPs参数量增加不到0.8M。真正贵的是双流backbone本身。RGB和IR各一条分支对比单模态YOLOv13主干参数量和计算量会明显增加。所以我的建议是backbone的权重初始化可以分别用预训练模型冻结前几个stage只训练neck和融合部分这样可以省下不少训练时间和显存。CEM模块虽然便宜但它对梯度流动的影响很大值得花精力调整位置和超参。3. 把CEM接进YOLOv13结构改动与训练配置3.1 接入位置怎么选颈上、头上还是Backbone里很多同学做模块改进时会纠结一个问题新模块应该接在哪。我一开始试过三个位置backbone末端、neck的不同层级、检测头前。最后实测下来neck里的P4和P5层接CEM收益最大P3层次之三个层级同时接反而会带来轻微掉点。为什么不是越早越好因为P3层的语义信息还不充分这个阶段的RGB和IR差异比较大强行做颜色校准容易引入模态噪声而P4、P5层语义更丰富且分辨率依然足够保留目标细节。另一个原因是早层做增强可能会影响backbone本身的特征学习尤其是训练初期梯度不稳定时容易把整个特征空间扭歪。所以我的默认做法是在P4和P5两个尺度的融合特征后各接一个CEM两个模块共享权重。接入位置的选择可以用一个简单的对比实验来决策固定其他条件不变分别训练三个模型观察验证集mAP。哪个组合涨点最多就保留哪个。这种试错方式不费多少算力但能帮你省下后面大量调参时间。3.2 双流输入对齐与数据增广的同步问题双流输入最关键的是对齐。这里的对齐不只是分辨率一致还包括配准RGB和IR相机视角和焦段不同采集的像素对应关系会有偏差。如果直接送进网络融合时特征图彼此“打架”模块怎么设计都白搭。数据集准备上我用的是一套公开的雾天驾驶多模态数据RGB和IR图像已经做过配准分辨率统一到640×640训练。为了模拟不同浓度的雾我在训练时使用在线仿真基于深度图按大气散射模型随机生成雾浓度参数β和大气光A。这样每个epoch都在看不同的雾泛化性比固定雾度好很多。数据增广有个特别容易犯的坑对RGB翻转、缩放、mosaic时IR一定要做完全相同的变换。我一开始分别写了两套增广管道结果RGB翻转了而IR没翻转模型直接乱掉。正确做法是把一张图的所有模态作为整体统一生成变换参数再用同一套参数分别作用到RGB和IR上。3.3 训练细节仿真雾、损失配比和EMA训练损失不是简单只算检测损失。我在标准检测头输出分类损失、CIoU回归损失、DFL损失基础上额外加了两个辅助损失来约束CEM的行为颜色一致性损失把CEM增强后的特征通过一个小解码头还原成伪RGB图和输入RGB图做L1和SSIM损失。这个损失帮CEM保住颜色真实感防止为了堆高对比度把整体色调扭成奇怪的样子。对比度损失计算增强后特征图局部区域的标准差鼓励目标区域方差尽量大。这个损失系数要调小一点否则网络会偷懒把所有特征响应整体放大那对检测没有任何帮助。我自己最终用的损失配比为检测损失权重1.0颜色一致性损失0.1对比度损失0.05。训练超参方面初始学习率0.001warm-up 3个epoch使用EMA更新权重。EMA的动量在0.999附近比较稳从一开始就开比训到一半再开效果好因为CEM的训练早期很容易因为辅助损失抖动。这里多说一句CEM模块的初始化很重要。γ卷积权重初始化为0、β初始化为0、调制分支α初始化为0保证训练开始时CEM就是一个恒等映射整个模型退化成普通的多模态YOLOv13。这样网络先学会基本的多模态检测之后CEM才慢慢开始起效。如果一开始就让CEM大权重输出伴随辅助损失一起上训练必炸。4. 实测效果与消融CEM值不值得加4.1 对比实验加了CEM之后到底涨多少我在测试集上做了几组对比简单摆一下数据。测试数据集是未参与训练的浓雾场景包含车辆和行人评测指标用mAP50和mAP50:95。数据如下均为相对稳定的单次实验结果误差在±0.3以内模型mAP50mAP50:95参数量(M)单帧耗时(ms)单模态RGB YOLOv13基线68.242.723.624.5RGBIR多模态融合(不带CEM)74.548.925.330.1RGBIR多模态融合输入前去雾去雾后检测72.846.427.152.7RGBIR多模态融合CEM(本文方案)80.955.425.831.2带CEM的方案对比不带CEM的多模态融合mAP50涨了6.4个点mAP50:95涨了6.5个点。对比“输入前去雾检测”的方案不仅精度涨得更多单帧耗时还少了一大截算力优势非常明显。这说明增强做在特征层面而不是输入层面性价比确实高。4.2 消融实验双色分支和调制分支各自做了什么为了搞清楚CEM的每一部分到底贡献了什么我把CEM拆开做了消融配置双色引导轻量调制mAP50mAP50:95多模态基线无无74.548.9只加双色引导有无77.251.3只加轻量调制无有76.450.2同时加两个分支有有80.955.4单独看双色引导分支的收益比轻量调制略高一点说明雾天检测中颜色保真比对比度增强更重要。但两个分支一起用的时候收益并不是简单的加法叠加而是互相促进双色引导把特征颜色校准到正常范围后轻量调制才能更准确地判断哪些位置需要加强对比度如果颜色没校准调制出来的空间注意力图也会被偏色信息干扰。4.3 看特征图说话增强到底发生在哪个环节有时候指标涨了你还是心里没底这时候特征可视化是最直接的证据。我把CEM前后的P4层特征图各取一组通道叠加展示增强前目标区域的特征响应和背景雾霾区域的差距并不明显整体特征图灰蒙蒙的有点像图像上蒙了一层雾增强后目标区域的响应被明显激活峰值轮廓清晰背景区域则被压制得更暗。更明显的是预测框的变化。增强前雾中一个较远处的行人模型给出的置信度往往在0.3~0.5之间徘徊容易漏检增强后同一目标的置信度能稳定拉到0.7以上误检也变少了。这说明CEM确实让检测头更容易区分目标和背景而不是单纯地把所有特征变大。我个人做一般不会只看最终指标还会在训练过程中定期保存增强前后的特征图快照。如果发现某个epoch开始特征图出现明显的区域性过曝或者块状噪声基本可以断定辅助损失权重设得太大了马上回调。5. 实战踩坑记录与排查清单5.1 颜色漂移双色引导的权重没约束好第一次跑通CEM时验证集mAP没涨反掉我一度怀疑模块设计有问题。后来可视化发现增强后的伪RGB图像整个偏绿车辆和天空都带上一层不自然的色调。问题出在γ分支没有加约束网络为了让颜色一致性损失降得更低直接通过调γ把整个特征色温拉向一个奇怪的方向。解决办法是给γ加硬约束全连接输出后经过tanh再乘0.5加1最终落到[0.5, 1.5]β层初始化为0。这个改动之后颜色漂移问题基本消失mAP也恢复正常。做颜色相关模块时约束比你想的更重要务必在代码里显式写清楚取值范围。5.2 红外过曝导致的调制闪烁红外图像里车灯、排气管、暖气这些高亮热源在近距离拍摄时很容易过曝。这种过曝区域在IR特征里对应极高的激活值会误导轻量调制分支让S空间注意力图在热源附近出现“闪烁”——不是稳定的高响应而是随帧抖动的脉冲式响应导致检测框的置信度忽高忽低。我的处理方法是在IR分支进入融合之前对IR特征做一个截断式归一化把激活值从超过上限的分位点拉回来同时在训练增强数据里对IR图像模拟高光灼烧让网络学会对过曝区域不那么敏感CEM调制分支就不会轻易被这些区域带节奏了。5.3 对齐误差让融合特征“打架”有段时间我的实验全部使用自采数据自己做了简易的RGB-IR配准标定裁剪但精度不够存在几个像素的平移误差。结果多模态融合后目标在RGB和IR特征里的位置对不上CEM在颜色重分配时会把IR的结构信息嵌到错的像素位置上去反而破坏了RGB原本清晰的边缘。针对这个问题技术上最有效的方案是加一个辅助配准网络或可变形卷积在融合前做特征级对齐但工程成本比较高。更实用的做法是训练时对其中一个模态做微小的随机偏移增强让网络学会容忍未对齐推理时如果时间预算紧张可以先用标定参数粗略对齐再用CEM的自适应能力兜底。5.4 训练掉点的常见原因增广、EMA和损失配比新增多模态输入后最容易出问题的其实是基础训练配置。我在加CEM之前也遇到过模型完全训不起来的状况排查了一圈发现是两路增广没同步。这里把常见原因和排查优先级整理成了表格现象排查方向处理方案mAP始终不涨双流增广是否一致统一变换参数同时作用RGB和IR训练开始就崩溃CEM是否恒等初始化γ1、β0、α0颜色异常辅助损失权重过大颜色一致性损失降到0.1以下后期过拟合EMA动量过小提升到0.999特征图整体过曝对比度损失权重太大降为0.05或更低还有一个容易被忽略的点增强后的IR图和RGB图同步做mosaic拼接时拼接边界可能产生模态串扰。我在mosaic边界处对两路的特征各自做局部归一化能有效减少这种串扰带来的边界伪影。5.5 快速排查问题速查表如果你也在复现类似方案我把调试顺序整理成一份速查表先确认输入数据RGB和IR是否一一对应、分辨率一致、增广同步。再确认初始化CEM是否恒等映射打印γ、β、α初始值。过程中监控三样东西训练loss曲线、增强前后特征可视化、验证集预测置信度分布。如果掉点先不看模块设计回退到不带CEM的多模态基线确认基线没问题再加模块。加模块后先关掉辅助损失只跑检测损失确认模块本身不破坏训练再逐步加回颜色和对比度损失。这套排查流程帮我避开了很多无效调参时间至少在我测试过的数据规模下表现稳定。6. 从实验到落地部署与场景适配经验6.1 算力预算CEM在端侧的性价比很多实际业务场景里多模态传感器本身已经存在车载前视有红外夜视、无人机有可见光加红外相机加双流backbone的算力开销不算额外增加因为两个模态的数据本来就要处理。CEM带来的新增算力很有限主要增加的是两组全连接和深度可分离卷积。在嵌入式平台上CEM运算可以合并到特征融合之后做不需要单独开另外的kernel。如果算力实在紧张可以在导出模型时把CEM折叠到前后卷积层里γ、β的仿射变换本质上是对特征图做逐通道缩放和偏移可以和相邻的BN层合并轻量调制的深度可分离卷积虽然没法只靠算子折叠削掉但量化到INT8之后开销几乎可以忽略。6.2 模型导出与量化CEM算子兼容性模型导出时常见的一个坑是双色引导分支里的全局池化和全连接在转换到ONNX时会固化成固定shape训练时的分辨率如果和部署分辨率不一致导出就报错。我的做法是让CEM里的全局池化使用全局统计而非固定尺寸的flatten或者部署时统一分辨率确保一致。量化方面CEM的sigmoid和tanh算子在不同加速库上的支持程度不一建议先用INT8量化跑一遍验证集如果精度掉点超过1个点就把CEM这部分保留为FP16或者采用混合精度量化。实测下来CEM量化的敏感点主要在调制的空间注意力计算上建议对该层使用per-channel量化而非per-tensor量化。6.3 场景扩展雾天之外的低照度与雨雪天气这个方案虽然是为雾天设计的但我在夜间低照度和雨雪场景下也做过验证效果同样不错。原因是夜间RGB图像颜色信息本来就弱红外补足了亮度结构CEM的双色引导相当于在“缺色”的情况下辅助补充颜色参考雨雪天气虽然退化机理不同但同样存在对比度下降和颜色偏灰的问题CEM的轻量调制对这类退化也有一定鲁棒性。当然雨雪的动态条纹干扰和镜面反光会让IR模态也更不稳定需要在训练数据里加入对应的退化仿真CEM本身不能完全替你去解决所有恶劣天气问题。但从架构层面看双色引导保真色、轻量调制提对比度这套组合对一切“颜色退化对比度下降”场景都是一个通用的增强范式。最后再分享一个我自己在调试中总结出来的经验做这种增强模块时永远不要试图把它设计得太“聪明”。CEM之所以稳定就是因为它的两个子分支逻辑足够简单、行为足够可解释。调参的时候输出特征可视化一眼能看出问题部署之后遇到badcase也容易定位。如果一开始就上一个复杂的生成式网络去重建清晰图像精度提升不一定更多但踩坑和排查的时间成本会高一个量级。这是我在这个项目里最大的体会。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑