
凌晨四点海面浮着薄雾岸基监控画面里小船只剩一个模糊的灰影。值班人员盯着屏幕分不清那是渔船还是漂浮物直到十分钟后画面才清晰——已经来不及了。这就是雾天水域监控最现实的问题人眼都看不清传统视觉算法更是一团浆糊。我接手某水域监测项目时甲方提的需求很直接大雾天气下船只检测不能停漏检率要压到最低同时还要能区分船与背景杂物。最初试过普通目标检测模型雾天直接掉点后来换到YOLO11-seg做实例分割配合去雾预处理效果才真正稳定下来。这篇博客就围绕这套方案把原理、实现和调优过程完整过一遍包括参数怎么设、数据怎么标、哪些坑必须绕开。适合谁看凡是做水上交通监管、港口安防、渔业管理这类视觉项目的或者单纯想了解YOLO11-seg在恶劣天气下怎么落地、怎么跟传统检测模型对比的都可以参考。基础要求不高只要用过YOLO系列、懂一点Python和PyTorch就够用每个环节我都会把关键参数和背后的理由讲清楚。1. 项目背景与模型选型思路1.1 雾天水域检测到底难在哪里雾对视觉感知的影响本质上是成像过程中大气散射造成的对比度衰减。光线经过雾层时一部分被微粒吸收一部分被散射导致进入摄像机的反射光强度下降同时大气光天空、太阳的散射光叠加在前景上形成灰白色遮挡。简单理解船的边缘信息被雾“抹平”了颜色和背景混在一起纹理细节丢失目标在图像中的信噪比大幅下降。这个物理过程具体反映在图像数据上暗通道强度升高梯度幅值降低HSV空间中的饱和度下降。对检测模型而言最直接的后果就是特征提取困难尤其是船舶这种外观变化大的目标——货轮、渔船、快艇、工程船大小和形态差异巨大雾天更是把差异进一步模糊。再加上水面本身有波纹反光、波浪造成局部灰度起伏容易把浪花误判成船头。我实测过的数据也验证了这一点在能见度低于500米的雾天下同一批船只图像YOLOv8检测模型的mAP50从晴朗条件下的0.92掉到0.73漏检率上升约15%。原因很简单——检测模型依赖边界框内的纹理信息雾天框内一片灰白特征自然没法有效提取置信度普遍偏低超过阈值才算检测到于是大量目标被漏掉。1.2 为什么最终选择了YOLO11-segYOLO11-seg是YOLO系列中支持实例分割任务的模型分支。它和普通目标检测模型的区别在于检测模型输出的是“框”——一个矩形包围盒加上类别标签而实例分割输出的是“掩膜”——目标像素级别的轮廓加上类别标签和置信度。后者多出的这一步在雾天水域场景里是决定性优势。举个实际例子一条小船和一段波浪纹理在普通检测模型看来都是“有边缘特征的区域”容易混淆因为检测模型只能看到框内的整体特征。而实例分割模型会逐像素判断“船身”“背景”船的轮廓和背景波浪在像素级特征上差异更大——船体通常是连续的、颜色分布相对均匀的连通区域而波浪是离散的点状纹理。YOLO11-seg能利用这种空间连续性把两者分开误检率明显降低。另外一个重要原因是部署效率。YOLO11-seg是单阶段实例分割模型在推理速度上远快于两阶段模型比如Mask R-CNN系列。水域监控通常是多路视频流并行处理单路推理耗时直接决定需要几块GPU。模型推理速度FPSBatch1mAP50参数量是否支持实时Mask R-CNN8~120.91约44M否YOLOv5-seg45~550.88约7.3M是YOLOv8-seg60~700.90约11.4M是YOLO11-seg80~900.92约9.6M是以上数据基于同批次自采数据测试具体值随硬件和图像分辨率略有浮动但相对趋势是稳定的最终选了YOLO11-seg因为它在精度、速度和部署便捷性之间平衡得最好尤其后处理代码生态成熟接TensorRT非常顺。不过这里想先提醒一句模型选型没有绝对最优如果项目部署的是老旧工控机CPU推理为主那YOLO11-seg未必是最优选可能得退回轻量化分支后面优化章节会细讲怎么取舍。2. YOLO11-seg核心原理拆解2.1 模型结构骨架从CSP到C3k2YOLO11-seg的网络结构沿用了YOLO系列的整体风格由主干网络Backbone、颈部Neck、头部Head三部分组成。主干网络负责提取图像特征颈部负责多尺度特征融合头部负责最终的目标分类、框回归和掩膜生成。主干网络最重要的改动是引入了C3k2模块。C3k2本质上是CSPNet的变体通过跨阶段层次结构将梯度流拆分成两条路径一条走主干计算一条走旁路恒等映射最后融合。这样做的好处有两个一是减少计算量因为旁路不参与卷积运算梯度可以更顺畅地回传二是丰富特征表达能力多路径特征拼接等于在特征图上做了一次特征重组合。相比之前的C2f结构C3k2在通道数处理上做了进一步调整降低了冗余计算让模型在保持精度的前提下更快。以640×640输入为例YOLO11-seg的主干网络在P3、P4、P5三个尺度上输出特征图尺寸分别为80×80、40×40、20×20小特征图负责大目标大特征图负责小目标。雾天场景下远处小船在图像中通常只占很小像素面积可能只有20×20像素主要靠80×80尺度的特征图来捕捉所以浅层特征质量直接影响远小目标的漏检率。我个人的理解是C3k2最核心的价值不是单个模块的计算效率而是让深层和浅层特征融合得更充分这对雾天低对比度特征特别重要。因为雾天图像的高频细节被衰减浅层特征可能已经比较弱了如果融合机制不够好到了深层这些信号就完全丢失了模型就只能靠“猜”。2.2 检测头与回归策略无锚框设计的实际意义YOLO11-seg在检测头上采用了无锚框Anchor-Free设计不再像旧版YOLO那样预定义一组形状各异的锚框Anchor Boxes而是直接预测目标框的中心点坐标和宽高。无锚框设计的直接收益是简化了训练流程。锚框方案需要根据数据集统计选择合适的Anchor尺寸——K-means聚类算出来的锚框只对特定数据集有效换个数据集比如雾天船只和常规COCO目标比例差异很大就得重新聚类非常麻烦。无锚框把这一步骤彻底去掉只需预测中心点加宽高回归部署和训练都更省心。回归目标的处理上YOLO11-seg沿用IOU-aware的设计思想——分类分支和回归分支共享一个特征但通过Decoupled Head解耦头分开输出类别和框参数。解耦的意义在于分类和回归任务对特征的需求是不同的分类需要全局语义信息回归需要精确的边缘信息共用同一组特征会产生任务冲突。解耦后每个任务有独立的卷积层提取各自特征精度提升比较明显。2.3 掩膜分支从框到轮廓的关键一步YOLO11-seg的掩膜分支借鉴了YOLOv5-seg的方案核心思路是在检测头输出的基础上额外增加一条并行分支输出原始尺寸/4缩放的掩膜系数和原型掩膜。具体流程可以分为三步第一步在特征融合后颈部输出一组特征图何其中P3级别的特征图分辨率最高被单独引出去做掩膜系数预测这部分特征包含丰富的边缘细节适合做像素级分割。第二步定义一组原型掩膜Prototype Masks数量一般为32个。可以简单理解成32张“基础特征模板”每张模板上突出某种特定形状或纹理模式——有些偏向水平边缘、有些偏向大面积填充区域。第三步把原型掩膜和每个检测到的目标对应的掩膜系数做线性加权求和得到该目标的最终掩膜再经过上采样恢复到原始分辨率。权重计算过程就是一个矩阵乘法掩膜系数向量长度32乘以32个原型掩膜每个大小为特征图分辨率输出就是该目标的二值掩膜。这个方法在速度上很讨巧——相比逐像素直接预测全分辨率掩膜等于先压缩到低维原型再重组计算量小了不止一个量级。雾天船只场景中掩膜分支提供的重要信息是“轮廓完整性”。普通的检测框无法告诉系统目标的俯仰角、半浸没状态、还有多少船体在水面以上而掩膜可以。对后续的船型分类、目标跟踪遮拦判断、甚至流量统计掩膜都能提供更细的数据支撑。2.4 损失函数组合与训练机制YOLO11-seg的损失函数由三个部分构成分类损失、框回归损失、掩膜损失。整体损失是它们的加权和权重配比大约为分类0.5、框回归0.05~0.1、掩膜0.05~0.1但这并不是固定的需根据训练收敛情况调整。分类损失使用BCE二元交叉熵变体配合logits处理每个类别独立判断是否出现。这在多标签场景下更灵活。框回归损失则用了CIoU Loss相比原始的IOU LossCIoU不仅关注框的覆盖程度还加入中心点距离和宽高比差异——两个框IOU相同时中心点离得远或形状差异大的损失更高这促使模型更精确地定位目标。雾天中目标边缘模糊CIoU的“中心点距离”约束非常关键能避免预测框因为边缘不清而偏移。掩膜损失使用BCE Loss逐像素计算将预测掩膜的每个像素与真实掩膜对应像素做二值交叉熵。这个损失项保证掩膜分支输出的轮廓能尽量贴合真实标注。训练时常用的一些策略包括马赛克增强Mosaic Augmentation、随机透视变换Random Perspective、HSV色域扰动等。马赛克增强对雾天场景是把双刃剑一面是它把四张图拼接在一起训练丰富了上下文信息让模型适应小目标另一面是雾天图像和正常图像混在一起可能导致模型对雾的特征建模不稳定。我的处理方式是雾天训练集占比超过60%时关掉马赛克增强或将其概率降低到0.3把增强重心放在亮度扰动和模糊模拟上专门模拟雾气降低清晰度的效果。3. 数据准备与标注方案3.1 数据采集自行采集和公开数据集如何取舍训练一个能用的雾天船只检测模型数据来源无外乎两种公开数据集和自己采集。公开数据集的优点是成本低、标准化程度高但问题也很突出——水面船只类目严重不足。通用的分割数据集里船只是一个小类别图片主体多为陆地场景雾天船只图片更是少得可怜。我曾经统计过一个常用公开数据集的船只类别数量全部加起来不到2000张还包含大量近景游轮、港口货船和监控场景下的远景小船完全是两种分布。自采数据更可控但成本不低。我的经验是优先使用目标水域的监控录像作为主力数据源。这类数据有几个天然优点视角固定监控摄像头基本不动、光照变化有规律早晨逆光、中午顺光、傍晚低照度、雾天和晴天的对比对齐全。自采数据的标注工作量需要提前评估。实例分割标注比目标检测标注贵得多——检测框只需要拉一个矩形实例分割需要逐像素描轮廓。我当时的bodget有限就采用“检测框先自动标注、分割掩膜人工修正”的混合流程先用一个训练好的YOLOv8检测模型生成粗标签再用标注工具微调框位置最后在分割标注工具里沿着边缘画掩膜。这样一条龙下来单张图片的标注耗时从20分钟压到10分钟以内。3.2 标注标准与类的设计不只要标“船”类别设计直接决定模型上限。一开始我偷懒只定义一个“船”类结果训练出来的模型在雾天把浮标、岸边岩石、甚至大片反光区域都识别成船输出一堆无用掩膜。原因是监控画面中船的形态差异太大如果只有一个大类模型会尝试用一个泛化的特征空间去覆盖所有形态容易被非目标区域的特征“带跑”。后来调整成四个类别货船、渔船、工程船、其他船。这样分的好处是模型能学到各类船更具体的特征。货船体积大、甲板平坦渔船通常有桅杆和渔具结构复杂工程船有吊臂、橙色涂装特征。这些结构性差异在雾天虽然会被弱化但残留下来的特征仍然比“混合类”更有辨识度。标注时有三个细节很容易翻车第一半遮挡船只的掩膜标注要小心。船体部分被桥墩、岸边建筑遮挡时标注到底画到遮挡边界还是完整画如果画完整掩膜模型会学习预测被遮挡的区域推理时会在遮挡物后面“脑补”出完整船身如果画到遮挡边界模型天然只输出可见部分更符合监控需求。我的选择是画可见部分因为下游跟踪模块需要的是真实可见目标位置而非想象位置。第二岸边部分的背景很关键。很多标注工具允许设置“忽略区域”Ignore Region在雾天监控画面中岸边固定的背景区域如堤坝、防波堤应当在标注时设置为忽略区域以免模型把岸边纹理当作正样本或难例。第三远小目标别合并。船离镜头远时在图像中可能只有十几个像素肉眼都难分辨。有人图省事把这种目标跳过不标这会直接影响模型对远小船只的召回率。正确的做法是利用图像序列用最近几帧的目标位置作为参考来标注这些模糊小目标。3.3 数据增强策略怎样让模型学会“看雾”数据增强是雾天模型训练成功的关键手段之一因为它直接解决训练数据不足的根本问题。常规增强手段之外我重点用了三类针对性的方法雾气模拟增强。我写了一套脚本基于大气散射模型公式来合成雾天图像。对清晰图像随机估计深度图基于图像梯度或简单假设深度随坐标线性变化然后按散射系数和大气光值合成雾图。这样能生成不同浓度的雾既扩展了数据量又让模型见识更多“雾的浓度分布”。模糊增强模拟雾对边缘的破坏。用高斯模糊加少量噪声模拟雾气对高频细节的衰减。这个增强手段很像给模型打预防针让它提前适应边缘不清的输入。局部对比度扰动。雾天不同区域的浓度不一样对图像局部对比度做随机拉伸或压缩让模型学会在动态对比度下提取目标特征。需要说明的是增强策略要适度。我曾用雾浓度上限过高的参数训练结果模型学习到的特征严重依赖“灰白色块”反而把无雾图像上的船只漏检了。正确做法是让增强后的训练集包含从无雾到重雾的完整梯度而不是集中在重雾端。4. 雾天图像预处理给模型一双好眼睛4.1 经典去雾算法怎么选暗通道先验DCP雾天图像直接喂给模型能不能训练出可用模型能但精度上限低。我的实测数据显示直接用原始雾图训练YOLO11-segmAP50达到0.83如果先做去雾再训练同条件下mAP50能到0.89。原因是去雾可以恢复部分被衰减的边缘和纹理信息相当于给模型提供更高质量的特征输入。去雾算法选择上我优先用了暗通道先验Dark Channel PriorDCP。DCP的核心观察是在无雾清晰图像的局部区域中至少有一个颜色通道的强度值非常低接近0。而在有雾图像中大气光会提升这些暗通道的亮度值提升幅度跟雾浓度正相关。利用这个差异可以估算透射率图进而反推出去雾后的清晰图像。公式层面的原理是这样的设观测图像为清晰图像为大气光为透射率为则大气散射模型可写为其中是雾对图像的干扰项。通过暗通道估算透射率后可反解出清晰图像。实际处理时DCP算法分为三步第一步计算暗通道图。对每个像素取RGB三个通道的最小值再对局部区域做最小值滤波。窗口大小选15×15到30×30比较合适太小了暗通道不准确太大了边缘泛白。第二步估算大气光值。取暗通道图中亮度最高的一小部分像素通常取前0.1%找到它们在原始图像中的最大亮度值作为大气光估计。第三步计算透射率图并恢复。透射率公式略加修正加入一个下限防止t(x)过小导致噪点放大最后用公式恢复清晰图像。DCP的优点是效果显著、计算快对中等浓度雾非常有效。但它的缺陷也很明显对于大面积天空或白色船体的区域暗通道先验会失效——因为这些区域本身的暗通道值就不低容易被误判为“有雾”导致去雾过度颜色失真。监控画面中天空和水面都大面积存在这种情况很常见。4.2 AI去雾网络与数据驱动的选择为了解决DCP的局限我测试了几种基于深度学习的去雾网络比如AOD-Net、FFA-Net、GridDehazeNet。整体结论是AI去雾在视觉上限上确实更好天空区域和白色物体区域的颜色还原更自然但代价是推理延迟增加。在这里需要算一笔账。如果去雾也要跑神经网络去雾耗时加上YOLO11-seg推理耗时必须控制在监控系统允许的单帧延迟内。以一台部署了TensorRT的GPU服务器为例去雾网络轻量级单帧耗时约8~12msYOLO11-seg推理约10~15ms两个加起来不到30ms可以接受。但如果去雾网络选重了如FFA-Net单帧耗时飙到50ms以上叠加起来就会拖累整体帧率跑不动实时。权衡之后我的方案是如果去雾质量要求高、硬件算力充足用AI去雾如果追求最低延迟用DCP加针对性修正。项目里最终用了折中做法默认关闭去雾当能见度检测模块判断当前画面雾浓度超过阈值通过暗通道均值判断才动态开启去雾预处理。这样晴天时零开销雾天时才付出计算代价。4.3 去雾效果评估不仅要人眼好看更要模型好用去雾并不是“效果越彻底越好”。我在参数调优过程中发现一个反直觉的现象去雾过于彻底会让船体颜色变得饱和度过高、明暗对比过强这种视觉上“更清晰”的图像模型检测精度反而下降。原因可能是模型训练时见到的正常图像分布中目标边缘是柔和的、带环境光影响的而去雾过猛后的图像特征分布偏离了训练分布。所以去雾环节的调优不应只关注视觉效果要结合模型的mAP和召回率指标来评估。我建议的评估流程是收集同一场景下100张雾天船只图像分别用“不去雾”“DCP”“AI去雾”三种方式处理跑通YOLO11-seg推理统计漏检率和误检率。哪个方案让漏检率最低哪个就是当前场景的最优而不是SSIM或PSNR最高。5. 训练配置与参数调优实录5.1 预训练权重与超参数选择训练YOLO11-seg时强烈建议从官方发布的YOLO11-seg预训练权重开始而不是从零训练。预训练权重已经在COCO数据集上见过大量目标形态包括船只、水面、天空等基础特征迁移到自己的雾天场景数据后收敛速度快很多最终精度也更高。我的实验里从零训练在100轮时mAP50为0.78而迁移学习在同样100轮时达到0.87。超参数方面从ultralytics默认参数出发我重点调了这样几项超参数初始值调整后调整理由输入图像尺寸640×640800×800监控视频中小目标占比高提高输入分辨率直接提升小目标特征分辨率batch size168800分辨率下显存占用翻倍需下调控制显存初始学习率0.010.005雾天数据分布复杂过大的学习率容易震荡不收敛权重衰减0.00050.001增强泛化能力减少背景过拟合训练轮数100200数据量有限长训练让模型充分收敛seg_mask分支还有一个需要特别说明的点输入分辨率不是越高越好。我曾把输入调到1280×1280mAP小幅提升从0.89到0.90但推理耗时从12ms涨到40ms以上翻了3倍多对实时监控完全不可接受。小目标检测的收益远小于算力成本最后卡在800分辨率的平衡点。5.2 训练过程记录收敛曲线与瓶颈分析我训练时用了一批约8000张自采标注图像其中雾天图像约5000张晴天图像约3000张按8∶1∶1划分为训练、验证、测试集。训练过程中记录了几个关键现象前20轮loss下降平稳mAP50快速从0.1升到0.7这个阶段模型主要在学习基本的目标定位能力。20轮到40轮loss下降斜率明显放缓mAP50从0.7涨到0.82是精度爬坡的主要阶段。40轮到100轮mAP50缓慢升到0.87掩膜损失下降尤为明显说明分割轮廓越来越准。100轮之后mAP50几乎不再上升但掩膜质量的MSE还在微降说明分割分支还没完全收敛这也是设置200轮训练的原因。训练过程中的一个插曲第一次训练到第50轮时验证集的loss突然升高mAP50反而在涨典型的过拟合前兆。排查原因是马赛克增强比例过高导致验证集中没有对应的增强分布。降到0.3后验证集loss回落mAP稳定增长。5.3 多尺度训练与难例挖掘策略除了超参数调整两招训练技巧对雾天目标检测提升显著第一招是多尺度训练。每次迭代时输入图像的尺寸在一定范围内动态变化比如550到900像素使模型适配不同距离目标的大小变化。这在船只监控里尤其关键——同一条船在画面远处可能只有30像素高驶近后有300像素高模型应该在不同尺度下都能识别出它。多尺度训练相当于强迫模型学到的特征具备尺度不变性。第二招是难例挖掘Hard Example Mining。如果训练完模型后把测试集里所有漏检样本汇总分析会发现它们高度集中——大多是远方极小的船、部分浸没水中的低轮廓船只、以及雾特别浓的场景。把这些难例单独提出来标注好追加到训练集里再微调模型第二个epoch的难例召回率能有明显提升。这是水涨船高的方法比盲目增加随机数据更高效。6. 模型部署与推理性能优化6.1 模型导出从PyTorch到TensorRT训练完成的模型只是“半成品”要在监控系统里实时跑起来必须经过部署优化。我的部署链路是PyTorch模型 → ONNX → TensorRT引擎。第一步把PyTorch模型导出为ONNX格式。注意Ultralytics的导出功能可以直接做但要指定opset17并开启dynamic批处理支持如果输入尺寸是固定的可以关闭dynamic以提升速度。检查ONNX输出的张量形状YOLO11-seg的输出应该包含检测输出和掩膜相关输出两部分务必确认掩膜分支的维度正确。第二步用TensorRT将ONNX转成引擎。这里有几个优化开关需要开启FP16精度半精度浮点这是性能最大的来源几乎可以把推理速度翻倍还可以选择开启INT8量化理论上能再快20%但精度损失需要验证。我的实测数据FP16相对FP32速度提升约1.8倍INT8再提升约1.2倍但mAP下降1.5个百分点考虑到精度损失最终选了FP16。第三步后处理阶段。YOLO11-seg输出后需要经过非极大值抑制NMS筛选出最终的目标框再通过原型掩膜重组和上采样生成掩膜。ultralytics库自带完整的后处理代码但在C部署时通常要把NMS和掩膜重组逻辑单独实现这部分容易出性能瓶颈。我建议把掩膜上采样提前到输入分辨率的一半而不是直接上采样到原始4K分辨率再通过ROI区域截取目标掩膜能省一大截计算量。6.2 帧间优化与跳帧策略在实际监控项目中一个经常被忽视的性能优化方向是“少算无关帧”。全时段对每一帧做完整推理没有必要尤其是夜间画面几乎没有船只活动的时间段完全可以降低推理频率。我采用了一个简单的策略基于背景建模的快速变化检测。每隔30帧做一次轻量级背景差分统计画面中变化区域的面积。如果变化小于阈值说明场景基本静止把后续帧的检测频率降到每秒2次一旦变化超过阈值立即恢复全帧率检测。这个策略在保持检测召回率的同时整体GPU负载下降了约40%。另外可以做时间维度的目标关联。检测结果按跟踪ID缓存如果同一ID的目标在连续5帧内位置变化很小可以每3帧才对该ID所在区域做一次掩膜更新而不是每一帧都重新生成掩膜。这个优化对静止船只很友好能显著减少无效计算。6.3 边缘设备与低算力的适配思路如果项目部署在嵌入式设备如Jetson系列或者老式工控机上硬件资源有限就需要在模型层面做取舍。可以依次按这样的优先级考虑优先用YOLO11-seg的轻量版本——n或s规模。我拿YOLO11n-seg测试过在Jetson Orin Nano上配合TensorRT FP16800分辨率下能达到35FPS以上精度比官方m模型低3-5个百分点但实时性完全够用。如果精度实在不达标再考虑升级到s或m。其次是输入分辨率妥协。降到640×640推理耗时会有明显下降只损失部分远小目标精度。第三个档位是关闭掩膜分支只保留检测框输出模型结构上直接把掩膜分支剪掉相当于降级成普通目标检测模型耗时再降30%但失去了实例分割能力。核心原则是不要一开始就追求最高的分割精度先跑通流程看实际漏检瓶颈在哪一环再有针对性地优化。7. 模型优化进阶剪枝、蒸馏与二次训练7.1 剪枝减少通道冗余对YOLO11-seg做通道剪枝可以把模型参数量和推理耗时进一步压下来而不损伤太多精度。剪枝的基本原理是模型中很多卷积通道贡献不大权重接近0或对最终输出影响微弱把这类通道删除后重新微调模型恢复精度。剪枝实操中最重要的一点是“结构化剪枝微调”。直接删除单个权重非结构化剪枝虽然在理论上压缩效果好但在实际部署框架中往往难以加速因为张量形状不平整。结构化剪枝则按通道整组删除TensorRT可以直接少算一组卷积。剪枝比例控制在30%以内时我的实验里mAP50下降不超过1%超过50%后精度断崖式下跌。剪枝后需要重新微调训练。先解锁剪枝后的网络在原始训练集上用小学习率0.001训练20轮恢复损失的精度。这是“剪枝-微调”的通用流程比一次性剪完直接部署靠谱得多。7.2 知识蒸馏用大模型教小模型如果部署目标必须用到轻量级模型又希望精度接近大模型可以用知识蒸馏。思路很简单训练好的YOLO11m-seg当“老师”让YOLO11n-seg“学生”学习老师输出的soft标签包括分类置信度分布、回归框坐标和掩膜概率图从而把大模型的“知识”迁移给轻量模型。蒸馏的损失函数由两部分组成一部分是学生的分类/回归/掩膜损失另一部分是学生和老师输出的距离损失KL散度或者MSE。weighting比例上蒸馏损失的权重通常设置在0.1~0.5之间过高会导致学生过度模仿老师而忽略真实标注。我实测的知识蒸馏结果蒸馏后的YOLO11n-seg在雾天测试集上mAP50为0.84比直接从零训练的0.79提升5个点而推理速度比m模型快2倍以上。如果推理设备性能有限这个方案是真正能落地的优化路径。7.3 半监督与自训练扩展数据标注开销是实例分割落地最大的成本之一。在数据量有限的情况下可以利用半监督学习扩展训练数据先用已标注数据集训练一个种子模型对大量未标注视频帧做伪标注只保留置信度高的预测结果把伪标注图像加入训练集继续迭代。这个方法的可行性基于两点假设一是模型对简单场景的预测足够可靠二是新加入的数据能覆盖模型在简单场景之外的分布盲区。实际操作时只挑置信度大于0.9的预测结果作为伪标签可以最大限度减少噪声污染。两轮迭代后理想情况下数据集规模能扩展1.5倍以上mAP提升2-3个百分点。8. 常见问题与排查技巧实录8.1 漏检率高先检查数据别盲目调参雾天测试集上发现漏检率高第一时间不要动模型参数按下面的优先级排查第一检查雾天图像的去雾预处理是否实际生效。有时去雾算法的阈值判断写错了能见度检测模块未触发导致全部雾天帧都走了“无雾路径”。在调试模式下打印日志确认每帧图像实际走了哪些流程这是最容易忽略的问题。第二检查远小目标的标注数量。统计训练集中目标像素面积小于32×32的实例占比如果低于5%模型大概率对远小目标没有学习到足够特征漏检是必然的。解法是用视频序列补充小目标标注或者用雾气模拟增强在合成数据里加入远小目标。第三查看置信度阈值的取舍。推理时置信度阈值0.25是默认值但雾天图像模型的预测置信度普遍偏低如果阈值太高大量低置信度但正确的检测结果会被过滤。调低到0.1~0.15同时配合类别筛选和后处理能显著提高召回率。代价是误检率可能上升但监控场景中宁可多报几个疑似目标也不能漏掉真实船只。8.2 误检率高背景和干扰物的针对性抑制误检集中在岸边堤坝、浮标、大面积反光区域时从几个方向入手确认训练集的“忽略区域”是否正确设置。如果岸边背景没有标注为忽略区域模型很难区分“岸边的一部分”和“船”因为它看到的特征都是类似的边缘纹理。在标注工具中标记好忽略区域重新训练误检率通常能下降一半。引入负样本训练。收集一批完全没有船只的雾天监控画面只标注背景全部为背景类别喂给模型训练。模型会学到背景的一般特征从而降低误报。对特定的误检区域做后处理过滤。比如监控画面中某个固定位置的岸边岩石总是被误检可以手动添加禁检区域掩膜把该区域的检测结果直接丢弃。这个方法简单粗暴但非常有效尤其适用于固定摄像头的监控场景。8.3 掩膜质量差轮廓锯齿和断裂掩膜轮廓锯齿严重、边缘断裂、有孔洞主要原因和解决办法如下原因之一是输入分辨率不够高。掩膜质量直接受限于特征图分辨率800输入下掩膜边缘粗糙是正常的。如果业务对掩膜精度要求高比如用于船体积估算可以将输入分辨率提到960或更高同时接受推理耗时增加。或者在后处理环节做一次mask refine用OpenCV的轮廓平滑和闭运算填补孔洞。原因之二是原型掩膜数量不足。YOLO11-seg默认32个原型掩膜对复杂形状如带有吊臂的工程船可能表达不够。已有自定义C部署代码的话可以在训练配置里提高原型数量到64但训练耗时和模型大小都会增加需要权衡。原因之三是掩膜后处理的阈值选择。网络输出是浮点概率图最终生成二值掩膜时要做阈值分割。默认阈值0.5在雾天效果不佳可以降低到0.3让更多边缘像素进入掩膜减少边缘收缩现象。8.4 推理速度慢性能定位与瓶颈排查推理速度不达标时的排查顺序先用性能分析工具统计每个阶段的耗时。如果是预处理耗时高重点看去雾算法是否在线性滤波上开销过大用加速库替代自编的朴素实现如果是模型推理耗时高确认TensorRT引擎是否生效、是否误用了FP32精度如果是后处理耗时高重点排查NMS实现和掩膜上采样逻辑这两块在python和C之间的效率差距可能达到5倍以上。一个实用的优化技巧把掩膜上采样的尺寸从原图分辨率降为原图的1/2或1/4在后处理中用OpenCV的cv::resize放大到最终显示尺寸。这个改动对掩膜视觉影响很小但后处理耗时下降非常明显尤其在高分辨率视频流上。9. 效果评估与项目总结9.1 最终指标与评估维度模型定版前我做了全面的效果评估不只盯着一个mAP看。评估维度包括检测精度方面mAP50-95达到0.52mAP50为0.89相比最初的无去雾版本mAP50提升6个百分点。召回率方面测试集中雾天船只的召回率从0.78提升到0.93这是项目最关心的指标。误检率方面每1000帧平均误检目标数从41个降到12个剩余误检大部分来自漂浮垃圾和浪花反光。分割质量方面掩膜mIoU达到0.71满足下游的船体长度估算需求。推理性能方面在单张RTX 4090上800分辨率输入下FP16 TensorRT引擎达到85FPS在Jetson Orin NX上同样配置下约35FPS满足实时要求。冷启动耗时约1.8秒热启动约0.3秒。9.2 雾浓度分级下的表现差异这里特别想补充一组雾浓度分层评估的结果这组数据能帮大家理解模型在不同恶劣程度下的真实能力。按能见度分成三个等级轻雾能见度500~1000米、中雾200~500米、重雾小于200米。轻雾下模型mAP50达到0.91和晴天几乎无差别中雾下mAP50为0.84漏检率略有上升但还能接受重雾下mAP50掉到0.66漏检率超过15%。这个数据下山路清楚即使加了一系列优化模型在极低能见度下依然有明显局限。如果项目要求重雾天不漏检物理层面还需要补红外热成像相机或者雷达数据融合单靠可见光相机是无解的。9.3 复盘哪些做法有效哪些走了弯路回看整个项目几条经验值得记录下来从选型角度YOLO11-seg做雾天船只实例分割是成立的。关键在于数据准备阶段的针对性投入——雾天数据占比、标注规范、忽略区域设置这三点做到位后面所有环节都顺。去雾预处理带来的收益是显著的但要有条件地使用。动态开关去雾、结合能见度检测能很好平衡效果与算力消耗。一昧全时段开启去雾不仅费电在高浓度雾下还可能引入额外干扰。训练阶段的进步空间在于难例挖掘的持续迭代。每次跑完测试集分析漏检样本补充到训练集再训练这个循环建议坚持三轮以上。经过三轮难例挖掘模型的极端场景鲁棒性会有质的提升。另外多尺度训练在雾天场景中的收益高于普通场景。原因在于雾气对不同距离目标的衰减程度不同模型必须在多种尺度上学到“受雾影响的船”的多样性特征。9.4 后续可扩展的方向当前方案已稳定运行但如果继续投入资源几个方向值得考虑第一多光谱融合。晚间或重雾下可见光图像信息严重不足给监控系统增加红外热像仪通道同时用两个模态的数据做特征融合训练能有效扩展模型在极端天气下的可用性。第二时序模型增强。当前是单帧检测后续可以引入视频流时序信息利用相邻帧的目标运动连续性对突发的单帧误检做时间维度的过滤对暂时被遮挡的船做轨迹预测进一步降低误检和漏检。第三自监督预训练。面向大范围的未标注航拍、监控视频数据先做一个对比学习的预训练任务再迁移到船只分割任务理论上能缓解标注依赖。这个方向我也在实验中后续有了结果再单独分享。就我个人这些天调模型、跑数据的实际体会来说最大的心得是恶劣天气视觉项目算法能力只决定上限数据针对性才决定下限。把去雾预处理、难例挖掘、忽略区域这些属于“数据与场景适配”的工作做到位YOLO11-seg这样开箱即用的模型也能在雾天交出令人满意的答卷。每次看到雾天画面里稳定输出船只掩膜就会觉得前期那些逐帧标注、参数调整的辛苦没有白费。