
前一阵子帮一个做管网运维的朋友处理堆积的CCTV检测录像十几公里管道几百段视频全靠人眼一帧一帧盯一个熟练的技术员一天能看完的都有限更别提裂缝、渗漏这些缺陷在画面里往往只占几个像素。后来我们决定上自动化检测就有了这套基于YOLO11改进的检测系统也就是标题里的YOLO11-EUCB-SC。这篇文章把从数据准备、模块设计、训练调参到最终落地的完整路径写出来都是实操过程里一步步踩出来的细节适合准备做管道缺陷识别、或者想在自己项目里尝试验证YOLO11改进思路的同学参考。1. 为什么排水管道缺陷检测需要定制版YOLO111.1 CCTV检测的现状与效率瓶颈排水管道的内检测目前主流手段还是CCTV检测就是让管道爬行器带着摄像头进入管内录制连续视频再由人工判读。整个流程的问题在于一是效率低一小时视频对应几公里的管段但判读往往要花两三倍时间二是主观性强同一个缺陷不同人给出的等级可能不同甚至同一人疲劳状态下前后判断也不一致三是漏检率高特别是细小的环向裂缝、接口渗漏在快速浏览时一扫而过就漏了。自动检测的价值就是把人力从逐帧寻找里解放出来让技术员只做复核和定级。但要满足这个目标目标检测模型不能只是能跑它必须同时做到高召回和低误报因为在实际工程里漏掉一处三级缺陷可能导致管段维护决策失误而误报太多又会消耗复核人力效果反而不好。1.2 管道图像中的核心难点我在一开始直接拿通用YOLO权重跑到管道画面上效果并不理想原因在于管道图像这个场景有几个天然难点难点类型具体表现对检测的影响小目标裂缝宽度在画面上可能只有2到5个像素长度也有限深层特征经过多次下采样后信息几乎丢失漏检严重光照与背景干扰灯照在管壁上形成高光积水反光泥浆纹理复杂高光区域容易被误检成裂缝或障碍物类间相似变形与错口边界模糊沉积与结垢外观接近分类置信度低类别之间混淆多这些难点不是单靠增加数据量就能解决的。通用检测头对中大型目标友好但管道缺陷的尺度跨度很大既有覆盖半个画面的树根侵入也有只有几十像素的细小环缝所以模型需要更强的多尺度特征表达以及对局部干扰的抑制能力。这也就是我在YOLO11基础上加入EUCB-SC模块的直接原因。2. EUCB-SC模块的设计思路与实现细节2.1 YOLO11基线具备的能力与短板YOLO11相对前代YOLOv8主干网络换成了C3k2结构在SPPF后还加入了C2PSA模块通过多头自注意力进一步扩大感受野整体在COCO类通用目标上表现是不错的而且模型体积和推理速度都有优化。但在排水管道这个专门场景里通用模型的问题很明显。首先是深层语义特征对细小裂缝不敏感一个轻度开裂在深层特征图里可能连一个像素响应都没有其次是通道和空间两个维度上模型无法有意识地区分管壁纹理和真实缺陷导致高光、水渍区域被当作目标。通用模型不是不能用而是没那么好用针对性改进的收益非常直接。2.2 EUCB面向小缺陷的多尺度上采样增强EUCB是Efficient Upsampling Convolution Block也就是高效上采样卷积块。设计动机很朴素YOLO11颈部虽然有FPN式的上采样融合但融合方式偏向于浅层特征和深层特征的直接拼接深层中小目标的细粒度空间信息已经不足。EUCB的做法是在融合前增加一条轻量上采样分支把主干的浅层高分辨率特征经过低延迟的最近邻上采样和3x3卷积后再与深层语义特征做逐元素加权融合。这样做的直观类比是一个熟悉管道整体结构的人在判断这个阴影是不是裂缝时会同时参考5米外的管壁纹理和眼前这几个像素的形状EUCB就是把这个参考能力显式地放进网络结构里。由于管道检测偶尔要跑在嵌入式设备上EUCB没有采用笨重的多分支结构而是尽量使用1x1卷积和分组卷积控制参数量。整个模块增加的计算量在5%以内但对小目标的召回率提升比较明显这个后面评估部分会给出数据。2.3 SC注意力通道与空间双维度筛选SC是Spatial-Channel Attention也就是空间-通道注意力模块。管道画面的干扰多来自空间上的局部高光和通道上的纹理混淆所以需要同时从两个维度做筛选。通道注意力部分使用全局平均池化获得通道描述再通过两个1x1卷积生成通道权重作用是把对裂缝敏感的特征通道放大把对水渍敏感的特征通道压低。空间注意力部分则对特征图做通道维度的压缩通过3x3卷积生成空间权重图相当于告诉网络画面右上角的高光是干扰左下角的那条短线更像缺陷。SC模块被插入到EUCB之后形成EUCB-SC整体模块。整个流程可以理解为先通过上采样增强补回小目标的空间细节再用注意力机制把增强后的特征筛选一遍压制背景响应。这个顺序很重要如果先做注意力再做上采样被压制的噪声可能会在上采样过程中扩散反过来做特征图更干净。2.4 改进模块如何写进模型配置实现上不需要改动太多源码YOLO系列支持通过yaml文件组合自定义模块。实际操作时我先在ultralytics的nn模块里注册了EUCB和SC两个类然后修改模型定义文件在主干层和检测头之间插入新模块。简化后的结构片段大致是这样# 在yolo11s结构基础上扩展 backbone: # ... 原有C3k2、SPPF、C2PSA层保持 ... head: # 新增针对65层特征图的小目标增强分支 - [-1, 4, EUCB, [320, 128]] # 上采样特征融合 - [-1, 1, SC, [128]] # 空间-通道注意力 # ... 后续保持原Concat、C3k2、Detect ...这里要注意的是张量维度的匹配EUCB内部需要知道输入来自主干哪个层的输出以及期望的输出通道数参数配置不匹配会直接报尺寸错误。建议把模块先用单张测试图跑一遍forward确认输出shape没问题再开始正式训练。3. 从零搭建数据采集、标注与环境配置3.1 数据从哪来CCTV视频抽帧与筛选排水管道缺陷检测的第一步不是模型而是数据。管道CCTV视频一般以mp4或avi格式保存需要用抽帧工具按照每秒若干帧提取图像。实际操作时我用了ffmpeg一条命令能把一小时的视频抽成上千帧但这里有个关键问题连续帧之间的画面高度相似直接全部拿去训练模型会严重过拟合于重复画面。更合理的做法是先按场景切分再在每段场景内间隔抽帧尽量保证同一处缺陷有不同角度和照明条件下的多张样本。抽帧之后一定要人工清洗剔除镜头被泥浆遮挡、紫外出错、严重模糊的帧否则脏数据会成为训练不收敛的隐患。3.2 标注规范与坑别小看这1万张图标注是整个流程里最费人力的环节也是最影响模型上限的环节。我在项目里定义了8个类别开裂(crack)、变形(deformation)、沉积(deposit)、障碍物(obstacle)、树根侵入(root)、渗漏(leakage)、错口(disjoint)、腐蚀(corrosion)覆盖了日常检测中绝大多数常见缺陷。标注时有几条规范必须提前定死同一缺陷出现在多帧中时每帧都要独立标注不要图省事只标最清晰的一帧。边界框要紧贴目标不要把周边水渍、泥浆包进去。遇到遮挡重叠比如树根和沉积同时出现禁止只标一个要分别标框。对于模糊边界宁可少标不可错标错标会向模型传递错误边界信息。工具方面我用的是开源的LabelImg格式直接输出YOLO所需的txt文件。为了规范类别建议先建好classes.txt再让标注人员严格按照编号操作。标注完成后抽了10%的图做交叉质检发现不同人对于变形和错口的边界判断差异很大于是又开了两次统一标准的评审会这也提醒我检测系统的上限很大程度在标注阶段就决定了。3.3 环境与训练工程一次跑通的配置训练机器的配置不必夸张一张显存12GB以上的显卡就够跑YOLO11s。软件环境建议使用PyTorch框架配合CUDA和OpenCV等基础库。我习惯创建独立的Python虚拟环境来隔离依赖先把ultralytics官方包安装好再做自定义模块的源码修改。数据集目录结构如下datasets/ pipe_defect/ images/ train/ val/ labels/ train/ val/ pipe_defect.yamldata.yaml里关键内容是类别名和路径写法比较简单path: ../datasets/pipe_defect train: images/train val: images/val names: 0: crack 1: deformation 2: deposit 3: obstacle 4: root 5: leakage 6: disjoint 7: corrosion启动训练的命令同样走官方接口yolo detect train modelyolo11s.yaml datapipe_defect.yaml epochs300 imgsz960 batch8输入分辨率我直接从640提到960这个调整很关键。管道缺陷的小目标占比很高分辨率上去之后特征图上的像素信息明显丰富代价是训练变慢但对最终精度有实打实的好处。4. 训练阶段的调参与避坑实录4.1 损失曲线怎么才算健康很多人训练YOLO系列习惯盯着总loss一直看到底其实分开看更有意义。YOLO11的损失包含box_loss边框损失、cls_loss分类损失和dfl_loss分布焦点损失三者的变化趋势应该大致同步下降。训练前几十轮loss快速下降是正常的但如果box_loss降到一定数值后开始反复震荡而cls_loss还在下降说明检测框回归已经趋于稳定模型主要在学分类这时候可以适当降低学习率或缩小增强强度。反过来如果cls_loss震荡但box_loss稳定多半是类别样本不均衡某个类被判错严重影响梯度方向。我还要特别提醒别看验证集的mAP在训练结束时还在涨就一味加轮数要结合训练集loss和验证集loss的差距判断是否过拟合。验证集loss开始反弹的那一轮基本就是最佳收敛点了。4.2 小目标漏检的专项处理训练中期我们遇到最头疼的问题是环缝开裂漏检。这类缺陷在960分辨率下也就几十个像素常规训练策略下召回率只有六成左右。针对这个问题我按顺序试了三种方案提高输入分辨率到960再叠加测试时的更大尺度推理召回有明显上升但显存压力增大训练速度几乎翻倍。关闭或调低mosaic增强的启用概率。mosaic增强虽然对多尺度有益但在管道场景里拼接出来的图像会产生大量假边界反而让模型学会关注交界线在小目标上的收益是负的。对包含小目标的样本提高采样权重。做法是把标注框面积小于一定阈值的样本在数据加载时提高出现概率让模型每个epoch都能稳定见到足够多的小目标样本。这三步叠下来裂缝召回率从六成提升到接近八成半效果显著。其中第一步是基础后两步是锦上添花。4.3 类不均衡与数据增强策略管道缺陷样本天然不均衡开裂和沉积样本可能上千张错口和渗漏可能只有几十张。直接训练少样本类别的mAP会非常难看。处理方式分两个层面数据层面对少样本类别做过采样同时合理复制粘贴这类目标到其他不含缺陷的管道图像上注意粘贴位置要避开高光区域模型层面可以对cls_loss做类别权重加权让少样本类别的分类错误产生更大梯度。数据增强方面我关闭了mosaic保留了轻微的随机旋转、平移和HSV扰动。管道图像的特性是纹理方向性强如果旋转角度太大会导致裂缝的方向语义失真所以我把旋转限制在正负10度以内左右翻转可以开但上下翻转不建议因为管道爬行器的视角是固定的上下翻转会让模型学到不真实的方向特征。4.4 评估指标到底看哪个训练完成后官方接口会输出一堆指标但工程判断不能只盯着mAP看。mAP50表示框与真实框的IoU超过0.5就算命中适合粗粒度评估mAP50-95则是从0.5到0.95取多个IoU阈值的平均值对小目标的定位精度更敏感。公用管道检测真正要重视的是漏检率也就是在可接受的置信度阈值下各类缺陷的召回水平。我按改进前后做了一个简单对比指标YOLO11s基线YOLO11-EUCB-SCmAP500.7830.826mAP50-950.5120.567小目标(裂缝)召回率62.4%83.1%误报帧占比11.3%6.8%可以看到mAP的提升幅度其实没有单项召回率那么夸张但对于工程应用来说小目标召回率和误报率的变化才是真正影响交付效果的指标。5. 部署与落地从模型权重到管道机器人5.1 模型量化与推理优化训练完的PyTorch权重不能直接扔到管道检测设备上第一步是导出ONNX再根据目标设备转成推理引擎格式。我在实验里分别做了FP32和FP16精度导出主要对比推理时间和精度损失。ONNX导出时要注意yaml里自定义模块如果用了不支持导出的操作需要提前把算子替换成兼容版本。实际跑下来FP16相比FP32的精度损失不超过0.5%但在低算力设备上推理速度几乎翻倍。更激进的INT8量化精度损失稍大对裂缝这类小目标不太友好所以我在要求高召回的核心场景里还是保留FP16INT8只用在快速初筛阶段。5.2 与爬行器系统的集成管道爬行器上运行检测本质上是把模型接进视频流做实时推理。由于现场设备算力有限我没法对每一帧都跑完整检测实际方案是每隔若干帧做一次检测中间帧通过前后帧结果做插值映射这样可以稳定输出缺陷警报但不会拖垮处理器。另外做了一个二次确认逻辑单帧检测到缺陷之后并不立即上报而是连续三帧都检测到才触发记录并保存片段。这个阈值很实用大幅降低了单帧误检造成的无效告警尤其是灯光扫过高光区域的瞬间误检。5.3 现场效果与后续迭代现场测试一个多月下来模型对沉积、树根、开裂三类主要缺陷的识别能力已经可用但仍有几个问题值得注意。一是新施工管道里的管壁非常干净模型偶尔会把管壁接缝误检成裂缝这需要采集更多负样本加入训练二是低光照段和强反光段的检测波动较大现场可以配合光源控制改善但不能完全依赖算法。这个系统并没有在一轮训练后就结束而是持续从现场回流筛选出的误检帧和漏检帧定期增量微调。第一次迭代增加了约2000张负样本后误报率下降了接近一半。模型改进和现场数据回流形成循环才是这类专用检测系统真正稳定的方式。最后分享一点个人体会这套YOLO11-EUCB-SC的改进本质上是围绕小目标复杂背景这两个管道场景痛点做的针对性设计。如果脱离场景谈模块名很容易变成为了改进而改进参数涨不涨全看运气。建议大家在自己的数据集上先跑一遍基线把误差来源拆清楚再决定改进方向否则一上来就堆模块最后只会得到一堆好看的消融实验表格和一个部署不动的大模型。