
简介本资源为面向YOLO系列目标检测算法的下水管道缺陷检测数据集适用于yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流框架可直接用于模型训练与验证测试。数据集共980张图像覆盖关节偏移、障碍物、裂纹、带扣、洞、公用设施入侵、碎片等典型管道缺陷类别适合从事市政管网巡检、工业质检及计算机视觉方向的研究者与开发者使用。压缩包内共2000个文件包含980个xml标注文件、980个txt标注文件、39个图像文件及1个data.yaml配置文件整体约33.89MB已按训练与验证需求划分完毕。标注同时提供YOLO格式与VOC格式两套标签YOLO格式采用归一化中心点与宽高比例便于直接接入训练流程。目前已有417人学习下载可为管道缺陷检测项目提供开箱即用的数据基础帮助读者快速搭建实验环境并复现检测效果。1. 下水管道缺陷检测为什么 980 张图的数据集值得认真对待城市地下排水管网里关节偏移、障碍物、裂纹、带扣、洞、公用设施入侵、碎片这七类缺陷长期依赖人工下井或爬行器视频回看效率低、漏检高、危险系数大。把 YOLO 算法用到这里核心矛盾不是模型结构够不够新而是缺陷样本本身难采、难标、类别极不均衡。一套 980 张图像带标签的下水管道缺陷检测数据集恰好卡在“能跑通训练、又能暴露真实工程问题”的甜点位上它小到单卡几小时能出结果又大到足以让关节偏移和裂纹这两类易混目标把 mAP 拉开差距。这篇文章面向想用 YOLO 做管道缺陷检测的算法工程师和巡检方向从业者从数据组织、标签格式、训练参数一路讲到推理部署和踩坑记录目标是让你拿到类似数据集后能直接复现而不是停在“跑了个 demo”。2. 先看清数据七类缺陷的标注逻辑与 YOLO 格式转换2.1 七类缺陷的视觉特征与标注边界下水管道缺陷检测的难点一半在成像一半在标注口径。管道内窥镜图像普遍存在光照不均、反光、畸变、遮挡同一类缺陷在不同管径、不同材质下形态差异极大。先把七类的判定边界说清楚后面标注和训练才不会互相打架。关节偏移joint offset指两节管道的接口处出现错位视觉上是一条横向的错台或阴影带容易和正常接缝混淆。障碍物obstacle是管道内不属于管体结构的异物比如伸入的钢筋、树根、遗留工具。裂纹crack分纵向、横向、网状细裂纹在低分辨率下几乎和划痕、污渍同色。带扣coupling/buckle指连接件或卡箍类结构异常形态偏规则容易被误判为障碍物。洞hole是管壁穿孔通常伴随周边破损和裂纹的区别在于是否有贯穿性暗区。公用设施入侵utility intrusion指其他管线穿入排水管形态是规则的管状物和障碍物的区别在于它是有明确走向的管线。碎片debris是沉积的泥沙、碎屑堆积边界模糊常和障碍物重叠。标注时最容易翻车的是裂纹和碎片、障碍物和公用设施入侵这两组。我的经验是先定“是不是管体结构本身”再定“是不是贯穿性损伤”最后定“有没有明确管线走向”用这三个问题把七类串成一条判定链标注一致性会明显提升。2.2 从原始标注到 YOLO txt转换脚本与坐标校验YOLO 检测训练需要每张图对应一个 txt每行是class_id x_center y_center width height全部归一化到 0~1。原始数据集常见的是 VOC XML 或 COCO JSON转换时最容易错的是坐标归一化和类别 id 映射。下面这段脚本处理 VOC 到 YOLO 的转换并顺带做越界校验。import os import xml.etree.ElementTree as ET # 七类缺陷的固定顺序训练和推理必须一致 CLASSES [joint_offset, obstacle, crack, coupling, hole, utility_intrusion, debris] CLASS_MAP {name: i for i, name in enumerate(CLASSES)} def convert_voc_to_yolo(xml_dir, out_dir, img_w640, img_h640): os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() # 优先读 XML 里的真实尺寸读不到再用默认值 size root.find(size) w int(size.find(width).text) if size is not None else img_w h int(size.find(height).text) if size is not None else img_h lines [] for obj in root.iter(object): name obj.find(name).text.strip() if name not in CLASS_MAP: continue # 未定义类别直接跳过避免 id 错位 bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 裁剪到图像范围内防止标注越界 xmin, xmax max(0, xmin), min(w, xmax) ymin, ymax max(0, ymin), min(h, ymax) if xmax xmin or ymax ymin: continue # 宽高非法丢弃 xc (xmin xmax) / 2.0 / w yc (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{CLASS_MAP[name]} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}) out_path os.path.join(out_dir, xml_file.replace(.xml, .txt)) with open(out_path, w) as f: f.write(\n.join(lines)) convert_voc_to_yolo(./annotations_xml, ./labels)逻辑说明类别顺序用列表固定任何新增类别只能追加不能插队否则历史标签全部错位。坐标先裁剪再归一化能挡掉一批标注工具导出的越界框。参数上img_w/img_h只是兜底真正生效的是 XML 里的size因为管道图像分辨率往往不统一。转换完必须抽查随机抽 20 张用可视化脚本画框重点看裂纹这种细长目标有没有被压成一条线。2.3 数据集划分与类别分布检查980 张图按 8:1:1 划分训练 784、验证 98、测试 98。划分不能纯随机因为同一段管道连续帧高度相似随机划分会让验证集泄漏训练集信息mAP 虚高。正确做法是按管道段或采集批次分组划分同一段的所有帧只进一个集合。划分完立刻统计类别分布# 统计每个类别的实例数快速发现长尾 for i in 0 1 2 3 4 5 6; do echo -n class $i: cat labels/*.txt | awk -v c$i $1c | wc -l done如果裂纹实例数远高于洞训练时洞的召回会被压制。常见做法是给稀有类做过采样或在损失里加类别权重。980 张的规模下我一般先看分布再决定要不要动不盲目上重采样。3. 用 YOLO 训练管道缺陷检测模型配置、参数与收敛判断3.1 模型选型为什么中小规模数据集优先考虑 YOLOv8n/s980 张图属于中小规模直接上大模型容易过拟合训练也慢。YOLOv8n 参数量小、推理快适合先跑通基线YOLOv8s 在精度和速度之间更平衡是管道缺陷检测的常用起点。选型逻辑是先确认数据管线和标签没问题再谈模型容量。如果 n 和 s 的 mAP 差距很小说明瓶颈在数据不在模型加容量没意义。数据配置文件pipeline.yaml写法如下path: ./pipeline_dataset train: images/train val: images/val test: images/test nc: 7 names: 0: joint_offset 1: obstacle 2: crack 3: coupling 4: hole 5: utility_intrusion 6: debrisnc必须和转换脚本里的类别数一致names顺序也必须一致这是最常见的低级错误来源。3.2 训练命令与关键参数怎么设yolo detect train \ datapipeline.yaml \ modelyolov8s.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ mosaic1.0 \ mixup0.1 \ hsv_h0.015 \ hsv_s0.7 \ hsv_v0.4 \ degrees5.0 \ translate0.1 \ scale0.5 \ fliplr0.5 \ projectruns/pipeline \ nameexp01参数说明imgsz640是速度和精度的折中管道图像若原始分辨率很高可试 960但显存要跟上。lr00.01配合lrf0.01做余弦退火中小数据集上比固定学习率稳。patience30早停防止过拟合后继续跑。mosaic1.0增强对小目标和遮挡有效但管道缺陷里裂纹是细长目标mosaic 拼接可能把裂纹切断如果发现裂纹召回异常把它降到 0.5 试试。degrees5.0只做小角度旋转管道图像本身有方向语义旋转太猛会破坏关节偏移的上下关系。fliplr0.5左右翻转一般安全但公用设施入侵若和左右走向强相关要谨慎。3.3 看训练曲线判断收敛与过拟合训练启动后重点盯三条线train/box_loss、val/box_loss、metrics/mAP50-95。正常收敛是训练损失平滑下降、验证损失跟随下降、mAP 稳步上升。如果训练损失降但验证损失抬头就是过拟合先减 epochs 或加增强别急着换模型。如果两条损失都降不下去多半是标签问题回去查类别 id 和坐标。管道缺陷检测里有个典型现象mAP50 能到 0.8 以上但 mAP50-95 只有 0.4 左右。这不是训练失败而是细长目标裂纹和高重叠目标碎片的定位精度天然偏低。判断模型能不能用要看业务更在意召回还是定位精度巡检场景通常召回优先。4. 推理、评估与部署从 mAP 到现场可用4.1 推理命令与置信度阈值调优yolo detect predict \ modelruns/pipeline/exp01/weights/best.pt \ source./test_images \ conf0.25 \ iou0.45 \ saveTrue \ save_txtTrueconf0.25是默认起点但管道缺陷里洞和公用设施入侵漏检代价高实际部署常把 conf 降到 0.15~0.2 换召回。iou0.45控制 NMS 合并碎片这类密集目标如果被合并过头调到 0.5~0.6。调阈值不能凭感觉要在验证集上画 PR 曲线按业务可接受的误报率反推。4.2 按类别看评估结果别只看总 mAP总 mAP 会掩盖长尾类的问题。用验证脚本输出每类的 P、R、mAPyolo detect val \ modelruns/pipeline/exp01/weights/best.pt \ datapipeline.yaml \ splitval \ plotsTrue重点看三类实例数最少的类召回是否塌陷、裂纹和碎片的混淆矩阵、关节偏移和带扣的误判率。如果裂纹大量被判成碎片说明标注边界本身模糊要么重新定义口径要么在训练时对这两类做难例挖掘。4.3 部署侧的现实约束现场部署常见两种形态巡检车/机器人端侧推理或视频回传后服务端批量推理。端侧优先选 YOLOv8n导出 ONNX 或 TensorRT 提速服务端可以用 s批量处理。导出命令yolo export modelbest.pt formatonnx opset12 simplifyTruesimplifyTrue能去掉冗余算子但个别自定义算子可能不支持导出后务必用几张图做数值对齐确认 ONNX 输出和 PyTorch 一致再上线。5. 避坑与排查管道缺陷检测训练里最容易翻车的五件事5.1 类别 id 错位导致 mAP 归零现象训练能跑loss 也降但 mAP 始终接近 0。原因数据 yaml 里的names顺序和标签 txt 里的 class_id 对不上模型学的是错位映射。解决写一个校验脚本统计标签里出现的所有 class_id和 yaml 的nc、names逐一比对不一致直接报错退出别等训练完才发现。5.2 验证集泄漏让指标虚高现象验证 mAP 0.9换一批新图推理惨不忍睹。原因同一段管道的连续帧被随机分到了训练和验证集模型记住了背景而不是缺陷。解决按管道段或采集批次分组划分划分前先给每张图打上段号同段只进一个集合。5.3 细长裂纹被增强切碎现象裂纹召回明显低于其他类。原因mosaic 和随机裁剪把细长裂纹切成几段模型学到的是碎片化特征。解决把 mosaic 降到 0.5 以下或对裂纹类关闭裁剪增强同时提高输入分辨率到 960 再试。5.4 置信度阈值照搬默认值现象现场漏检多或误报刷屏。原因conf 和 iou 直接用了默认 0.25/0.45没按业务调。解决在验证集上扫 conf 从 0.1 到 0.5画每类的 P-R 曲线按可接受的误报率选阈值洞和公用设施入侵单独设更低阈值。5.5 导出 ONNX 后精度掉点现象PyTorch 推理正常ONNX 结果偏移或漏框。原因opset 版本不匹配、simplify 误删算子、预处理不一致。解决固定 opset12导出后做数值对齐预处理归一化、letterbox必须和训练时完全一致差一个通道顺序都会掉点。6. 把 980 张用透小数据集的进阶技巧与验证习惯980 张图不算多但用透它比盲目扩数据更划算。我一般会做三件事。第一件是难例回捞训练完在验证集上跑推理把漏检和误检的图单独拎出来人工复核标注往往能发现一批系统性标注错误改完再训一轮mAP 提升比加数据明显。第二件是交叉验证980 张按管道段分成 5 折轮流做验证取平均 mAP比单次划分的指标可信得多尤其能暴露划分泄漏问题。第三件是冻结骨干微调当新增少量标注数据时冻结 backbone 只训检测头学习率降到 0.001能在不破坏已有特征的前提下快速适配新管段。验证习惯上我坚持两条任何一次训练结果必须能在测试集上复现测试集在调参阶段绝不碰任何一次阈值调整必须记录对应的 P、R 变化不凭单张图观感下结论。管道缺陷检测的现场环境比实验室脏得多模型在测试集上的表现打个八折才是现场预期留足余量比追求榜单数字重要。最后说个我自己的教训早期做管道缺陷检测时我花了两周调模型结构mAP 卡在 0.6 上不去后来回去查标注发现裂纹和碎片的口径在三个标注人之间根本不统一重新对齐口径后同样的模型直接到 0.75。数据口径的一致性永远比模型结构更值得先花时间。希望帮到你。本文还有配套的精品资源点击获取