ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

下水管道损坏检测数据集构建全流程:从CCTV图像到YOLO训练实践

下水管道损坏检测数据集构建全流程:从CCTV图像到YOLO训练实践 干过市政管网检测的人应该都有体会下水管道内部环境又湿又暗CCTV机器人拍回来的视频动辄几个小时人工盯着屏幕判读裂缝、变形、脱节一不留神就看漏一段。所以最近两三年越来越多项目组开始尝试用目标检测模型做辅助识别先把可疑画面自动挑出来再让人复核。这个思路听起来不复杂但真正入手才发现模型本身反而是最简单的部分卡住进度的永远是数据集。这份“下水管道损坏检测数据集”的整理工作本质上是在解决管养单位、算法团队和检测公司之间最大的断层一方手里有大量历史CCTV视频和缺陷记录另一方却始终凑不齐一套能训练模型的高质量标注数据。一套结构清晰、类别均衡、标注规范的数据集能把模型从“能跑出来”推到“真正敢在工程里用”的水平。这篇文章我会从数据采集、病害分类、标注规范、训练细节到落地坑点把我整理这份数据集的过程和经验完整捋一遍。适合正在做市政缺陷检测、水下管道裂缝识别或者刚刚准备用YOLO训练自己数据集的朋友参考。1. 数据集从哪来——采集设备、场景设计与第一手数据1.1 CCTV机器人、潜望镜与声呐三种采集方式的取舍下水管道内部检测目前主流设备有三种每一种产出的数据格式和可用性都不一样。CCTV管道检测机器人在行业内用得最多一台爬行器带着高清摄像头进入管段匀速前行录像或者定时抓图画面能直接看到管壁全貌裂缝、变形、错口、树根侵入都很直观。潜望镜QV则更适合从检查井口向下快速观测设备轻便、架设快适合做普查或者复核但只能看到井口附近一段范围画面边缘畸变比较明显。声呐检测靠声波反射成像能穿过浑水和淤泥输出的是断面轮廓图对积泥深度、管道变形这类结构性问题很有效但看不到表面裂缝这种病害细节。整理数据集的时候要特别注意这三种设备产生的图像风格差异非常大CCTV画面光线相对均匀QV画面常常有强反光声呐图根本不是灰度照片而是扫描轮廓。我见过有人把三种数据混在一起训一个模型结果模型学到的全是设备风格特征而不是病害本身的纹理差异换一个设备立刻失效。比较推荐的做法是先以CCTV数据为主构建数据集把QV和声呐单独作为独立数据集去做适配或者后续增量。1.2 采集场景设计别拍出“干净得没有价值”的图像很多项目在采集阶段就埋了坑。如果刻意选择刚冲洗干净的管道去拍摄出来的图像虽然漂亮但模型训完拿到真实管段上基本不能用。现实中的下水管道几乎都有污水残留、管壁凝结水珠、泥浆反光甚至还有塑料袋、碎石堆积这些因素恰恰是模型在真实场景中必须面对的干扰项。我在整理时特意保留了三种类型的场景数据正常管道图像、带轻度污染干扰的管段、病害特征明显的管段。三者比例大概控制在4:3:3。正常图像不是废数据它们是背景类的核心来源能有效压制模型“把一切纹理都当成病害”的倾向。采集时还要尽量覆盖不同管径、不同材质混凝土管、PVC管、HDPE管、陶土管和不同年代的管段因为新旧管壁的底色、粗糙度差异很大只在一类管材上训练遇到新材质几乎必翻车。实操中还发现一个很有用的细节拍摄时帧率不用太高但机器人行进速度必须稳定画面重叠率会直接影响后续截图的连续性。同一段病害在连续多帧中出现既方便标注人员理解病害走向也为后面的数据划分策略提供了空间。采集现场尽量记录管段编号、井段范围、管径、材质这些元信息后面按井段做数据切分时这些信息能帮上大忙。2. 数据长什么样——病害分类标准与标注规范2.1 病害分类体系用什么标签直接影响模型能不能用下水管道病害在国家规程和行业标准里有一套完整分类结构性缺陷包括破裂、变形、错口、脱节、腐蚀、渗漏功能性缺陷包括沉积、结垢、障碍物、树根侵入。整理数据集不可能照搬全部病害类型一是部分类型标注难度太大二是类别太多会让模型学习负担过重在样本量不足时准确率掉得厉害。我在实际整理中把标签体系收敛成了10个类别破裂、变形、错口、脱节、腐蚀、渗漏、沉积、树根、障碍物、正常。沉降、起伏这些问题因为前期样本太少果断砍掉没有犹豫。有些病害大类下还细分成环向裂缝、纵向裂缝但对目标检测任务来说首版数据集阶段分到“破裂”这一级就够了等模型跑通、样本积累到一定量再考虑做细粒度拆分。这个策略比较稳妥既能保证模型快速收敛又不至于后期推倒重标。分类粒度还需要结合使用场景来定。如果你的目标是做自动出检测报告那分类尽量对齐规程如果纯粹是帮人工筛片分得粗一点反而更好用因为“有没有问题”这个二分类需求在工程现场远比“是哪一种问题”更迫切。2.2 标注格式与工具COCO、VOC、YOLO之间的转换标注工具我试过LabelImg、labelme、CVAT和Roboflow个人最推荐CVAT尤其当你有好几个标注员协同作业的时候它的任务分配、审核流和标签分类功能非常顺手。单人小项目用labelme也够用但后期转格式要多一步脚本。Roboflow的自动标注和增强功能很方便但涉及敏感管网数据时要注意数据上传问题能本地化尽量本地化。在格式选择上建议统一以COCO JSON作为中转格式。COCO格式把图像信息、标注信息、类别信息分别存在images、annotations、categories三个数组里结构清晰几乎所有目标检测框架都支持直接转换。YOLO系列的txt格式则是每行记录一条目标class cx cy w h坐标全部归一化到0到1之间。训练时如果直接用YOLO格式遇到类别增删或者数据合并改起来非常痛苦而COCO转YOLO就是写几行循环遍历的小事。整理过程中免不了要做格式转换。YOLO转COCO、COCO转YOLO这些脚本网上已经有很多现成的但用之前必须检查三个关键点坐标是否已经归一化、类别id是否从0开始连续编号、是否有空标注文件被保留。这三处任何一个出错训练时要么报错要么loss直接起飞排查起来极其费时间。2.3 标注避坑这些细节会让模型精度掉一个档次标注质量比标注数量重要得多这是整个数据集整理过程中我体会最深的一点。同一个病害不同人框出来的边界框大小差异如果超过30%模型学到的边界就非常模糊推理时要么框得太大要么根本框不住目标。我对标注工作制定了三条硬性规范。第一边界框必须紧贴病害区域的最小外接矩形不要为了省事把周围大段管壁包进框里那等于给模型增加大量背景噪声。第二模糊目标要不要标的问题原则上只要人眼能判断并且病害特征占画面主体超过10%就标只露出一条细缝的标只看到一个角的不标。第三同一张图上同时出现多个病害时全部标出来不能漏标漏标会让模型把“该检测的位置”都学成背景。复检环节不能省。我一般安排第二次标注审核抽10%的图像计算两个标注员的框重叠度IoU低于0.7的重新讨论修正。这套流程走下来虽然标注速度会慢一些但训练出来的模型性能提升非常明显。我还特意做了一个标注规范文档附上各个病害的典型示例图和标框示例新手标注员看一遍就能上手团队里沟通成本低了很多。3. 怎么把数据集用起来——从划分到训练的全流程3.1 数据划分随机划分是新手最容易犯的错误数据集划分看起来是最简单的一步但它直接决定了最终评估指标的可信度。很多新手拿到图片直接random split训练集80%、验证集10%、测试集10%看起来没问题但在管道检测数据上这是一个典型错误。原因是CCTV机器人采集的视频帧是连续的同一段破裂病害会出现在相邻的二三十帧里。如果这些连续帧被随机分到了训练集和验证集那么验证集里包含和训练集几乎一模一样的画面模型“背题”都能拿到95%以上的mAP可一遇到真正的新场景立刻露馅。正确做法是按井段或管段ID划分数据保证同一个管段的图像全部进入同一个集合跨管段验证模型表现。我一般还会做一次按管道材质的分组校验单独看模型在PVC管和混凝土管上的指标差异这个数据对未来模型上线很有参考价值。比例方面8:1:1是基础如果样本总量特别大可以调整到9:0.5:0.5但验证集太小会导致指标波动大不太建议压缩。3.2 数据预处理与增强策略管道图像有一个显著特点光照分布极度不均匀。机器人自带光源正前方亮、两侧暗加上管壁反光和阴影模型很容易被光照干扰。直接用原图训练效果较差建议先做直方图均衡化或者CLAHE限制对比度自适应直方图均衡化把暗部细节拉起来裂缝纹理清晰很多。这个预处理步骤实测能让小目标检测能力提升5到8个百分点成本几乎为零。数据增强不能乱来。几何增强里的平移、旋转、翻转、缩放对管道病害完全适用但要注意翻转方向。管道病害形态和管道走向有关上下翻转一般安全管壁上下纹理相似左右翻转需要确认病害纹理是否具有方向性削弱了再翻转的风险比较低。颜色增强方面亮度扰动范围控制在正负20%以内对比度扰动别超过15%过度扰动会让裂缝纹理失真模型学到的是“发亮的斜线”而不是“裂缝”。针对小目标病害我最常用的两个技巧是Mosaic增强和Copy-Paste增强。Mosaic把四张图拼成一张相当于变相增大batch size并扩充了小目标数量Copy-Paste可以把典型树根侵入、环形裂缝目标贴到背景正常的管壁图上既增加样本又控制标注成本。但Copy-Paste有个隐藏风险粘贴边缘处理不好会留下明显矩形接缝模型容易把接缝识别成特征我一般配合高斯模糊和边缘羽化处理。3.3 模型选型与训练配置管道病害检测里YOLO系列已经是绝对主流我自己主力用的是YOLOv8性能和部署便捷度都非常成熟。相比Faster R-CNN这类两阶段方法YOLO在推理速度上优势很大而管道检测场景对实时性要求比较高机器人行进过程中无法接受一帧分析好几秒。如果后期要轻量化部署到边缘设备YOLOv8n和YOLOv8s都是不错的起点。训练自己数据集时文件夹结构按images和labels两个目录组织每个目录下再分train、val、test。数据准备好以后写一个data.yaml内容大概是这样path: /data/sewer_defect_dataset train: images/train val: images/val test: images/test names: 0: crack_break 1: deformation 2: misalignment 3: dislocation 4: corrosion 5: leakage 6: sediment 7: root_intrusion 8: obstacle 9: normal启动训练的命令简单直接但有几个参数需要重点调。输入分辨率我们用的640因为原始采集图像普通都在1280以上缩放太多会丢失裂缝细节如果目标是小裂缝这类小目标可以试试768或者1024输入。batch size根据显存来8到16都比较常见。初始学习率用0.01配合warmupepochs一般150轮左右监控loss趋于平稳就可以考虑早停。类别不平衡是管道数据集最突出的问题。破裂和渗漏常常占了一半以上样本而脱节、障碍物可能只有几百张。直接的后果是模型对小样本类别几乎不学习。我试过比较有效的几个办法对小样本类别做过采样复制应用focal loss让模型更关注难分类目标以及在loss计算中给不同类别加权重。综合下来对脱节这种病态的mAP提升超过15个点。4. 训练和评估中的实战细节——常见问题与排查技巧4.1 模型指标怎么看mAP、Precision、Recall在管道场景下的解读很多人拿到模型第一个看mAP50但其实在管道检测场景里Recall召回率比Precision精确率更重要。原因很好理解漏检一段破裂病害意味着后期可能发生路面塌陷代价极高而多框出一两个可疑区域人工复核成本相对可控。具体到指标我会要求模型在测试集上Recall达到90%以上Precision可以放宽到80%左右。如果出现Precision很高但Recall很低的情况说明模型学得太保守只认最典型的病害形态此时要么增加正样本多样性要么降低置信度阈值。管道数据里很多病害在画面里占的比例非常小比如一条贯穿管壁的细线裂缝可能只有几个像素宽。这类目标会让模型的mAP50数据非常难看。我处理小目标问题主要用三个手段输入分辨率调大到768训练时用多尺度采样推理阶段做切片检测——把原图切成几个重叠区域分别送进模型再合并结果。第三个方法效果最直接代价是推理时间成倍增加所以在工程落地时要根据显卡性能做取舍。4.2 常见问题速查表训练和调试过程中我踩过不少坑这里整理成一份速查表希望帮你少走弯路问题现象常见原因解决办法训练loss不下降学习率过高/过低、标注错误多、背景占太多先调低学习率试跑50轮抽检标注框重点看类别是否错标、框是否偏大全部预测成背景正样本太少、前景背景比例极端不均衡增加正样本数量或者提高正样本的采样权重检测框整体偏大标注时框得松、边界不紧贴目标检查边界框标注规范返回去修正训练集检测框整体偏小标注时漏掉了目标边缘部分统一标注外边缘要求增加后处理中的框扩展逻辑同一病害重复出多个框NMS阈值太低、分类置信度阈值不合适调高NMS的IoU阈值到0.5附近置信度阈值调整到0.25以上训练集指标好但验证集差很多数据划分泄漏、过拟合确认是否按井段划分加正则化增加数据增强强度碰到模型输出大量假阳性我的做法是先做一次错误样本可视化把预测置信度排前50的假阳性挑出来看模型到底把什么东西误判成了病害。很多时候是井壁圆形纹理被当成变形或者管壁花斑被当成腐蚀。这时候去补充对应场景的负样本比盲目调参管用得多。4.3 人工复查是闭环的关键模型训练完成不代表工作结束。实际部署时模型输出只是一张带边界框的标注图真正决定项目能不能验收的是人工复查精度。我习惯把模型推理结果导出成带坐标的JSON或者CSV再写个小工具把检测框叠到原图上做成一页一页的幻灯片让人复核。复核界面要支持一键确认、一键驳回驳回的样本自动进到“待补充标注”列表。这套流程跑起来以后误检和漏检样本会源源不断回流到数据集里。每隔两周把这些回流样本加入训练集重新训练一个版本模型在特定项目上的表现会越用越准。最终模型准确率高不高很大程度上取决于这个迭代闭环有没有真正跑起来而不是一开始训练了多少数据。5. 从数据集到落地——再往前多走一步5.1 多模态融合图像、激光轮廓与声呐数据的价值整理数据集的后期我开始意识到纯视觉方案在下水管道场景里存在天花板。比如检测积泥深度图片上只能看到淤积面无法精确测算体积再比如管道变形等级判定需要精确轮廓数据二维图像很容易被视角和光影欺骗。后来我在数据家族里逐步加入了激光轮廓仪数据和声呐断面数据。激光轮廓数据由多线激光扫描管壁生成能精确重建管道内部三维轮廓声呐数据则能穿透浑水看到水下线形。这两类数据在结构性问题检测上和图像形成高度互补。虽然它们和图像的融合需要一个数据对齐过程也就是说要让图像帧、激光轮廓帧和声呐帧在时间和空间上对应起来但一旦对齐完成很多单独依靠图像判别不了的疑难病害都能找到答案。对于做数据集的朋友我的建议是不要只盯着图像数据有条件的话把激光和声呐的原始数据一并保存归档哪怕现阶段还没有模型能同时吃下多模态数据等到融合方法成熟时这些数据就是最宝贵的资产。5.2 持续扩充数据与负样本迭代下水管道检测有一个别的行业不太会遇到的特性跨地域、跨年代的管材差异巨大。南方城市管网腐蚀问题突出北方老城区管道变形的概率更高工业园区管道内部油腻附着严重。一个在某座城市表现不错的模型搬到另一座城市可能直接掉二十个点。解决这个问题只能靠持续采集新场景数据。我现在的做法是每到一个新项目都会先跑一个小规模测试把模型在新数据上的表现按病害类型拆开看找出掉点最严重的类别然后定向补充、重新微调。这个过程听上去繁琐但实测对跨场景泛化能力的提升非常明显。负样本迭代同样不能停。正常管道、轻微污染管段这些“没毛病”的画面是压制模型幻觉得关键素材需要持续纳入。市面上有一些关联的数据集比如桥墩病害检测、轴承齿轮缺陷检测它们的缺陷形态和管道病害在纹理上有相似性可以作为预训练阶段的数据来源但要说替代管道专用数据那还是不现实。5.3 半自动标注与模型迭代的扩展方向数据标注是管道检测数据集建设里成本最高的一环。一个熟练标注员一天能处理几百张图已经很快了但面对几十万帧的历史CCTV数据这个速度远远不够。我后来尝试了半自动标注流程用已有的模型对未标注视频做预标注再把预标注结果交给人工修正。人工只需要调整错误框和补充漏检框单帧处理时间能减少一半以上。预标注模型会漏掉一部分难样本这些漏检正好被人工补齐补齐的数据再回流训练形成良性循环。再往后可以考虑半监督和自监督方向。管道视频数量巨大但带标注的比例极低用自监督预训练可以让模型先学习管壁纹理分布再在下游微调对标注数据的需求能进一步降低。我自己试过用SimSiam做预训练在标注数据只有两千张的情况下微调后的效果比直接从头训练高了不少这个方向值得投入精力去试。另外消化一句老话数据集的质量才是这个项目真正的天花板。整理“下水管道损坏检测数据集”期间我反复验证过这一点——参数、网络结构、增强策略都只是锦上添花决定上限的永远是标注是否准确、场景是否充分、划分是否严谨。模型表现不好先回头查数据不要急着改网络结构这是我踩过很多坑之后最想分享的一件事。
返回列表