尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

水下管道缺陷检测数据集:VOC+YOLO双格式2069图

水下管道缺陷检测数据集:VOC+YOLO双格式2069图 简介计算机视觉与深度学习技术正在推动工业检测方式的智能化变革。其核心原理在于通过目标检测模型自动识别图像中的缺陷区域从而替代人工目视检查。在海洋工程与管道巡检场景中水下环境复杂光学成像质量受限高质量的标注数据成为模型性能提升的技术瓶颈。一套包含2069张水下管道图像、覆盖泄漏与破损两类缺陷的检测数据集采用VOC与YOLO双格式标注兼顾了数据通用性与工程实用性。该数据集可直接用于YOLOv5/v8等主流目标检测框架的训练与验证帮助算法工程师快速搭建水下缺陷检测基线也能为后续场景化微调和多类别扩展提供可靠的数据基础。 水下管道检测这个方向最近两年在工业视觉和海洋工程圈子里热度一直挺高。漏油、破损、生物附着这些问题靠人工潜水检查效率低、成本高而且深海环境根本下不去人。用无人机加光学成像做巡检再配合目标检测模型自动识别缺陷已经成了主流方案。但真正动手做过的人都知道卡住进度的往往不是模型而是数据——尤其是带精细标注的水下缺陷数据公开的本来就不多质量参差不齐的反而一堆。我最近整理完一批水下管道泄漏破损检测数据集VOC和YOLO两种格式都做了一共2069张图、2个类别压缩成7z包发布。这篇文章就把这套数据集的构建思路、格式细节、训练实测和一些坑一次性说清楚。这份数据集的核心信息先摆在这里图片总数2069张标注类别2个泄漏和破损标注格式包含Pascal VOC的XML和YOLO的TXT两种压缩包格式为7z。适合谁用正在做水下缺陷检测、管道巡检、海洋工程视觉识别相关项目的算法工程师和研究人员以及在yolov5、yolov8上训练自己数据集但苦于找不到高质量初始数据的朋友。下面我从头拆解这套数据集是怎么做的以及拿到之后怎么快速用起来。1. 数据集整体设计与构建思路1.1 为什么锚定“泄漏”和“破损”两个类别水下管道的问题种类其实很多除了泄漏和破损之外还有腐蚀、凹坑、裂纹、海生物附着、焊缝缺陷等等。那为什么只做两个类别这里有个很实际的考虑类别数量跟标注质量之间是直接相关的。做数据集不是堆类别数而是要保证每个类别有足够多的样本、足够清晰的特征表达、足够低的标注歧义。两个类别从模型训练的角度来看是一个“起步友好”但又不至于过于简单的设定。从目标检测的角度看泄漏和破损在视觉特征上是差异很大的两类目标。泄漏通常表现为管道表面附近的异常水流、气泡聚集、油花扩散特征比较发散、边缘不清晰、尺度变化大。破损则是管道结构的物理损坏比如裂口、断口、缺口边缘相对锐利、纹理变化明显。这两类目标放在同一个模型里训练能够迫使模型同时学习到“区域纹理异常”和“边缘结构异常”两种不同的特征模式这对于后续扩展到更多缺陷类别时是很好的基础。另外从实际工程出发泄漏和破损也是优先级最高的两类缺陷。管道巡检中泄漏直接关系安全环保事故破损直接关系结构完整性失效。这两类目标的检测价值最高先把这两类做扎实比贪多嚼不烂要有用得多。1.2 2069张图的规模是怎么定下来的2069这个数字不是随便拍的也不是一个简单凑出来的整数而是根据测试验证下来的一个阶段性规模。说句实在话深度学习目标检测对数据量的需求是“越多越好”但数据集的构建成本采集、清洗、标注、质检是实实在在的。对于水下管道这种特定场景目标类别有限、场景相对固定2000张级别的数据量是一个性价比很高的规模。从实测来说在yolov5s模型上用这套数据训练mAP0.5能达到0.89以上mAP0.5:0.95在0.72左右。这个指标作为初始基线已经完全足够了。如果后续有更多数据继续扩充把类别细化和样本量做到5000-10000张模型性能还能再往上走。所以2069张这个规模核心意义在于先把pipeline跑通把基线模型做出来把问题暴露出来然后用更丰富的数据去迭代提升。1.3 VOCYOLO双格式一次标注处处可用现在很多数据集发布者会只给一种格式然后让使用者自己转格式。这个做法其实挺折腾的——尤其是对于不熟悉标注格式转换细节的同学来说光是处理XML和TXT之间的坐标换算就能卡半天。我做这套数据集的时候决定一步到位同一个标注内容同时导出为VOC格式和YOLO格式。VOC格式是Pascal VOC标准的XML文件每个目标用一个bndbox块记录左上角和右下角坐标xmin, ymin, xmax, ymaxYOLO格式是归一化的TXT文件每行记录类别id和归一化后的中心点坐标x_center, y_center, width, height。双格式的好处很明显用LabelImg标注完导出成VOC格式后一套脚本就能转出YOLO格式给到别人手里的数据既可以直接用VOC系工具链如Faster R-CNN、SSD也可以直接用YOLO系工具链yolov5、yolov8、yolov9等。省去了每个用户自己转换格式的麻烦也避免了由于格式转换写错代码导致训练出问题的风险。这也是我为这个数据集设计的一个体验优化点。2. 数据集结构解析与使用准备2.1 7z压缩包的解压与校验发布格式选了7z不是没原因的。7z在压缩率和压缩速度的平衡上表现很好尤其对图片这种压缩空间大的数据压缩率比zip和rar都要优秀。这里直接给出解压步骤和一些常见问题的处理方法。拿到压缩包后解压是第一步。Linux环境下如果没有安装p7zip需要先安装# Ubuntu/Debian sudo apt-get install p7zip-full # CentOS/RHEL sudo yum install p7zip p7zip-plugins然后解压7z x 水下管道泄漏破损检测数据集VOCYOLO格式2069张2类别.7zWindows环境下推荐用7-Zip官方版本右键选择“解压到当前文件夹”即可。这里有个值得注意的点解压路径不要包含中文字符和空格。我实际操作中发现如果解压到包含中文字符的路径下部分标注工具和深度学习框架读取文件时会出现编码问题导致数据加载失败。虽然这个坑在纯英文路径下不会触发但养成好习惯能省很多事。解压完成后强烈建议先做一次完整性校验确认文件没有在传输或解压过程中损坏。可以用7z自带的校验功能7z t 水下管道泄漏破损检测数据集VOCYOLO格式2069张2类别.7z这个命令会遍历压缩包内每个文件的CRC校验值如果输出Everything is Ok就说明文件完整。这一步很多同学会跳过但我在实际分享数据集的过程中不止一次遇到过传输损坏的情况——文件看起来在但打开图片就报错训练到一半才发现数据集读不进去非常耗时。所以校验这步不要省。2.2 目录结构与标注文件格式详解解压后你会看到这样的目录结构水下管道泄漏破损检测数据集/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片 ├── annotations/ │ ├── xml/ # VOC格式的XML标注 │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ └── yolo/ # YOLO格式的TXT标注 │ ├── train/ │ ├── val/ │ └── test/ ├── classes.txt # 类别列表 ├── data.yaml # 适合yolov5/v8直接读取的数据配置 └── README.md # 数据说明文档classes.txt里面就两行leak breakleak对应类别id 0break对应类别id 1。这里需要特别强调两个类别的顺序不能搞错因为YOLO格式的TXT文件里每行开头的数字就是类别id而这个id是跟classes.txt中的行号一一对应的。如果你把break放在第一行、leak放在第二行那训练时的id含义就完全反了模型学出来的东西完全是错的。VOC格式的XML文件长这样annotation folderimages/folder filename000001.jpg/filename size width1920/width height1080/height depth3/depth /size object nameleak/name bndbox xmin320/xmin ymin240/ymin xmax780/xmax ymax560/ymax /bndbox /object /annotationYOLO格式的TXT文件长这样0 0.286458 0.370370 0.239583 0.296296这一行数据的含义是类别id为0也就是leak目标中心点的x坐标为0.286458相对于图片宽度的比例中心点y坐标为0.370370相对于图片高度的比例目标宽度为0.239583相对于图片宽度目标高度为0.296296相对于图片高度。VOC坐标与YOLO坐标的换算关系需要注意YOLO格式是归一化的中心点加宽高VOC格式是像素级的左上角加右下角。假设图片宽为W、高为HVOC框为(xmin, ymin, xmax, ymax)则YOLO框的计算方式是x_center (xmin xmax) / 2 / W y_center (ymin ymax) / 2 / H width (xmax - xmin) / W height (ymax - ymin) / H我把这个转换逻辑做成了脚本已经内置在数据集目录的tools/文件夹下如果你以后需要把自己标的数据从VOC转成YOLO格式直接改路径就能用。2.3 数据划分与可视化检查数据集已经按8:1:1的比例划分好了训练集、验证集和测试集。训练集1656张、验证集207张、测试集206张。这个比例属于目标检测任务中的常规设定训练集保证足够多样本让模型学习验证集用来调超参和选模型测试集用来做最终性能评估。拿到数据后不要急着训练我强烈建议先做一步可视化检查。方法很简单把标注框画到原图上肉眼扫一遍确认标注位置是否准确、有没有明显的错标漏标。这一步在数据分享场景下尤其重要因为数据是好几个环节接力处理出来的任何一个环节出问题都会影响最终标注质量。用Python画标注框的脚本很简单用cv2读图、读XML或TXT坐标、画矩形框即可import cv2 import xml.etree.ElementTree as ET img_path images/train/000001.jpg xml_path annotations/xml/train/000001.xml img cv2.imread(img_path) tree ET.parse(xml_path) root tree.getroot() for obj in root.findall(object): name obj.find(name).text bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2) cv2.putText(img, name, (xmin, ymin - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imwrite(check_000001.jpg, img)做一次这个检查你对数据集的整体质量就有了非常直观的感受。我自己在整理这批数据时通过可视化检查发现了不少细节问题比如个别图片中泄漏区域的边缘框得不够紧一些小目标的框没有完全包住目标。这些问题不通过可视化很难发现而一旦带着这些问题去训练模型很容易学到偏移的边框导致后期检测框位置不准、IOU指标偏低。3. 基于YOLO的模型训练全流程3.1 环境准备与依赖安装拿到数据集后的第一步就是准备训练环境。目前YOLO系列的主流框架是ultralytics的yolov5和yolov8。我自己实测下来yolov8在训练速度和精度之间平衡得更好而且API更简洁推荐直接用yolov8。环境安装建议使用conda创建独立环境避免和系统Python打架conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121如果用的是NVIDIA GPU记得安装对应CUDA版本的PyTorch这一步很多人会踩坑。装完torch之后可以验证一下GPU是否可用import torch print(torch.cuda.is_available())输出True就说明GPU环境OK可以开始训练了。如果没有GPUCPU也能训练但速度会慢很多尤其对于2000多张图的数据集一个有6GB显存的显卡大概30-50分钟能跑完一轮训练CPU可能要跑8-10个小时。所以能用GPU就尽量用GPU。3.2 数据配置与训练参数设定这个数据集里我已经预置了一个data.yaml文件直接点开看内容train: images/train val: images/val test: images/test nc: 2 names: [leak, break]这里有个重点路径建议改成绝对路径或者在相对路径前加上你的数据集根目录。Ultralytics框架在解析相对路径时工作目录不同会导致路径找不到。我建议直接把train、val、test都改成绝对路径一劳永逸比如train: /data/水下管道泄漏破损检测数据集/images/train val: /data/水下管道泄漏破损检测数据集/images/val test: /data/水下管道泄漏破损检测数据集/images/test nc: 2 names: [leak, break]训练启动命令yolo detect train datadata.yaml modelyolov8s.pt epochs100 batch16 imgsz640 device0这里的选择逻辑说一下yolov8s.pt是small版本参数量适中在这个数据规模上属于最平衡的选择。imgsz640是YOLO系列的默认输入尺寸对于水下管道数据集来说原图尺寸基本都在1080p左右直接缩放到640会损失一些细节但考虑到标注目标尺寸占比尚可640是够用的。如果你的检测目标很小可以试试imgsz800或imgsz960我实测把输入尺寸从640提升到800小目标的recall大概提升了3-4个点但训练和推理速度也会相应下降。batch16的设置取决于显存大小。8GB显存配batch16、imgsz640跑yolov8s是勉强够的如果显存不够会报CUDA out of memory那就把batch降到8甚至4。别硬撑OOM是家常便饭。3.3 训练过程中的关键观察点训练过程中值得重点关注的是results.csv文件ultralytics会在训练目录里自动生成这个文件记录了每一轮的train/box_loss、train/cls_loss、val/box_loss等关键指标。几个判断训练的实践经验train/box_loss和val/box_loss理想情况下两者都是持续下降趋势。如果train loss下降但val loss不降或者上升说明过拟合了这时候可以加大数据增强或者增加dropout。mAP0.5这个指标在训练初期前20轮会快速上升之后进入平稳期。如果到第80轮还在明显上升可以把epochs加到150甚至200。训练日志里的PPrecision和RRecall如果Precision远高于Recall说明模型预测偏保守很多目标没找出来如果Recall远高于Precision说明模型预测偏激进误检很多。理想状况是两者都能达到0.85以上。这里有一个实际案例我在这套数据集上训练yolov8s第一轮训练到50个epoch时mAP0.5已经到了0.83但到80轮之后就到了0.89左右然后基本上不再明显增长。这说明模型已经收敛得差不多了。如果把epochs从100改成200对最终精度没有太大提升。所以训练这种规模的数据集100个epochs已经是一个非常合理的上限。3.4 模型评估与结果解读训练完成后在runs/detect/train/目录下会有很多输出文件其中最值得关注的是confusion_matrix.png、results.png、val_batch0_pred.jpg等可视化结果。val_batch0_pred.jpg这个文件直接展示了模型在验证集上的预测效果框和置信度都会画出来。我建议每一轮训练完都点开看一遍这个比看数字指标更直观。如果发现预测框总是比真实目标大一圈说明边界回归还有问题如果发现同一张图上同一个目标被预测了两个重叠框说明NMS阈值需要调整。模型评估的量化指标核心看这几个指标含义当前数据集实测值mAP0.5IOU阈值0.5下的平均精度均值0.89mAP0.5:0.95IOU阈值从0.5到0.95的平均精度均值0.72Precision预测为正样本中真正的比例0.88Recall所有正样本中被找出来的比例0.86这套指标的解读mAP0.5达到0.89说明对于常规交并比要求下的检测任务模型已经具备了很好的实用价值。mAP0.5:0.95有0.72说明框的定位精度还有提升空间——如果实际项目对检测框的精确度要求高比如需要根据框的位置计算泄漏面积这个指标需要继续优化。4. 水下图像的特殊处理与数据增强4.1 水下成像的三大敌人在水下做目标检测跟在地面做完全不是一回事。水下成像有三个典型问题偏色、模糊、低对比度。这些问题的根本原因在于水对光的选择性吸收和散射。红光在水下衰减最快蓝绿光穿透力最强所以水下图像普遍呈蓝绿色调水中悬浮颗粒对光线的散射导致图像雾化光照不足则导致整体亮度偏低、细节损失。这些特点直接影响模型的训练效果。如果直接用原始水下图像训练模型很容易学到偏色特征而不是目标本身的纹理和结构特征。尤其是“泄漏”这类目标本来边缘就不清晰再加上水下成像的模糊效应检测难度会显著增加。4.2 有效的数据增强策略针对水下图像的特性我在数据训练阶段做了几组数据增强实验分享一些有效的经验。色彩增强策略。对训练图做随机色度、饱和度调整模拟不同水质条件下的颜色变化。这一步是必须的因为水下不同深度、不同浊度下拍出来的图像颜色差异很大。用hsv_h0.015、hsv_s0.7、hsv_v0.4这种参数来模拟。对比度增强策略。对图像做CLAHE限制对比度自适应直方图均衡提升暗部细节。这个对水下图像特别有效。建议在ultralytics的augment.py基础上封装一个预处理函数在输入模型前先对图像做CLAHE。Mosaic增强策略。Mosaic是YOLO系列在训练过程中默认开启的增强方式把4张图拼成1张训练图好处是提高了小目标检测能力和模型的泛化性。这套数据集的训练过程实测开启Mosaic比不开启在mAP0.5上高出大概3-5个点。但有个问题如果图像背景单一水下环境背景比较单调Mosaic增强的实际收益会有所打折。我的经验是在训练后期比如最后20轮关闭Mosaic因为Mosaic生成的拼接图跟真实推理场景差异较大到了后期反而会影响收敛精度。ultralytics框架里可以用close_mosaic20这个参数控制最后20轮关闭Mosaic。4.3 图像预处理与参数计算对于水下图像我强烈建议在训练之前做一次统一预处理。具体操作分两路走一是对所有图像做去雾和增强二是做缩放归一化。去雾我用的是简单的暗通道先验方法虽然这个算法不算新但胜在稳定可靠而且对水下图像的雾化效果确实有改善。核心代码如下import cv2 import numpy as np def dark_channel_dehaze(img, omega0.95, t00.1): # 计算暗通道 dark np.min(img, axis2) kernel cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15)) dark cv2.erode(dark, kernel) # 估计大气光 flat dark.flatten() num_pixels len(flat) num_bright int(max(num_pixels * 0.001, 1)) indices np.argsort(flat)[-num_bright:] if img.ndim 3: atmosphere np.max(img.reshape(-1, 3)[indices], axis0) else: atmosphere np.max(img.reshape(-1)[indices]) # 计算透射率 trans 1 - omega * dark.astype(np.float32) / (atmosphere.mean() 1e-6) trans np.clip(trans, t0, 1) # 恢复 result np.empty_like(img, dtypenp.float32) for i in range(3): result[:, :, i] (img[:, :, i].astype(np.float32) - atmosphere[i]) / trans atmosphere[i] return np.clip(result, 0, 255).astype(np.uint8)做不做去雾对模型的精度会有几个点的差别。实测下来去雾后发现训练收敛速度提高了约15%。原因很好理解去雾后的图像纹理更清晰模型更容易学到目标的结构特征而不是被雾化噪声干扰。但这里要注意一个潜在问题如果推理阶段输入的是没有去雾的原始图训练时却用了去雾图会导致域偏移模型性能不升反降。所以如果训练阶段做了去雾推理阶段也必须做同样的去雾处理保证数据分布一致。5. 常见问题与排查技巧实录5.1 解压和路径引发的连锁坑这个问题太常见了单独拎出来说。7z解压数据集时如果直接双击打开压缩包、拖拽出文件很可能出现文件损坏或路径丢失的情况。遇到解压后图片但XML文件不对应的问题先查是不是压缩包在传输过程中损坏了用7z t校验一下再说。更常见的是训练时报错找不到图片文件。这个问题的根源在于data.yaml里路径写的不对。前面提到过路径不对是个人训练自己数据集时最容易踩的坑因为它触发在训练启动时而且报错信息有时候不是特别直观容易让新手一头雾水。5.2 训练不收敛的排查方向训练过程中loss不降或者剧烈震荡这是很多人会碰到的问题。我建议按以下方向排查先确认学习率。YOLO系列默认学习率是0.01一般来说是通的但如果你把batch size调得很小比如4或者8学习率可能需要相应调低否则梯度不稳定loss就会震荡。我在测试中试过batch4、lr0.01的组合loss曲线一直是锯齿状调低到0.001后基本就稳定了。再检查类别标签是否有误。比如names顺序跟标注文件里id对应不上会造成模型在错误的类别上反复学习loss怎么都降不下去。这个问题的排查方法是可视化检查标注框看看类别名是否和标注内容一致。最后检查数据增强是否过强。对于水下图像这种本身就模糊的数据如果增强强度太高比如旋转角度太大、透视变换过于剧烈模型会很难学到稳定特征。可以先关掉Mosaic等强增强测试一下loss能否正常下降。5.3 误检漏检问题分析水下场景的误检漏检一直是实际部署中最头疼的问题。误检通常表现为把管道表面正常纹理误判为破损把生物附着或气泡误判为泄漏。漏检则通常发生在目标小、对比度低的情况下。针对误检我一般的处理思路是提高置信度阈值默认0.25太高对水下场景建议调到0.35-0.4可以有效滤除一部分低置信度的误检框。如果还有顽固误检那就需要针对性地增加负样本没有缺陷的正常管道图来训练让模型知道哪些是“正常”。针对漏检处理思路是增大输入尺寸。如果imgsz从640提升到960小目标的特征会被更好保留recall会有明显提升。另外可以检查NMS的IOU阈值默认0.45如果检测目标比较密集、相互重叠调低到0.35可能更好。5.4 推理部署的避坑技巧训练完成后导出模型做推理部署这里也有两个细节值得注意。导出模型格式的选择。要对速度敏感的边缘设备如Jetson Nano、树莓派做推理推荐导出成TensorRT或者ONNX格式。TensorRT的推理速度比PyTorch原生推理快3-5倍这对水下巡检机器人这种实时性要求高的场景至关重要。推理前图像预处理要和训练保持一致。这一步很多人会漏。如果你训练数据做过CLAHE增强、做过去雾那么推理阶段必须做同样的预处理。我遇到过不止一次训练时做了增强、推理时忘了这一步结果模型效果暴跌还以为是模型没训好。调用模型判断检测结果时的后处理逻辑也要简单可解释。比如对管道泄漏检测来说输出结果不应该只是一个框加分数还要对应到具体位置信息这需要把检测框的像素坐标转换成实际物理坐标涉及相机标定和坐标变换。这块不是数据集本身的问题但如果你想把这套模型真正落地这一步迟早要面对。写在最后的一些经验和建议这套数据集从采集到标注到发布整个过程走下来我最大的体会是数据集的价值不在于“有多少张图”而在于“每张图是否足够精准、格式是否足够规范、使用是否足够便利”。实际使用中还有一个细节想分享我用这批2069张数据训练出来的模型直接用于另一批不同水域拍摄的图片时性能下降比较明显。原因是不同水域的水质、光照、管道材质差异很大。解决思路是做了几次“小样本微调”——用新场景下几十张标注数据对模型做二次训练效果提升非常明显mAP0.5从0.72直接拉到0.88。所以如果你有特定的部署场景不要迷信“通用模型”微调是最务实的路径。最后再分享一个小技巧这2069张图的2个类别如果未来要扩展更多缺陷类别建议在现有数据上做增量训练而不是从头开始训练。用现在这套数据训练的模型做预训练权重新类别只需添加几百张标注图就能快速收敛。这比我当初从零开始收集数据、标注、训练快太多。数据集的价值就在这里它不仅仅是你手头这批图更是一个可以持续扩展的基础设施。本文还有配套的精品资源点击获取
返回列表