多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

338张电力漏油检测数据集:VOC+YOLO格式与YOLOv8训练实战

338张电力漏油检测数据集:VOC+YOLO格式与YOLOv8训练实战 简介电力设备漏油检测数据集面向电力巡检、工业视觉与目标检测算法研究者提供338张真实场景漏油图片并同时给出Pascal VOC与YOLO两种标注格式可直接用于训练漏油识别模型。数据集包内共1016个文件以jpg原图、xml标注和txt标签为主其中jpg与xml各338个、txt共340个压缩包大小24.07MB便于快速下载和解压使用。已有444人学习下载。全部图片使用labelImg工具按矩形框标注唯一的oil类别累计包含372个标注框目标类型集中、标注口径统一适合作为目标检测的入门练习或基准数据集配套的VOC与YOLO格式文件可无缝接入YOLO系列、Faster R-CNN等常见框架省去格式转换环节。需注意数据集仅提供准确合理的标注数据不附带训练好的模型或权重适合希望自行完成数据准备、模型训练与评估的开发者。1. 电力场景漏油检测一份 338 张的 VOCYOLO 数据集能干什么做电力设备巡检的人应该都有同感变电设备漏油不像别的缺陷那么显眼油迹往往藏在法兰、阀门、套管根部这些犄角旮旯现场光照杂、背景乱人眼扫过去都容易漏。想训练一个自动检测模型第一步就卡在数据上——公开的电力缺陷数据集少专门标注漏油点的更少自己标注一张张框过去一上午标不了五十张。这份电力场景设备漏油检测数据集标注了 338 张图片、共 1 个类别同时提供 VOC 和 YOLO 两种格式目标就是让做巡检视觉落地的人不用再从零收集、从零转换直接拿去过训练流程。适合正在做变电站设备缺陷检测、工业视觉落地的开发者或者刚接触目标检测、想找个真实场景数据集练手的人。2. 数据集底细从目录结构到标注内容先摸清手里有什么2.1 两类标注格式并存VOC 是中间态YOLO 是训练态拿到压缩包第一件事不是解压就跑训练而是先把目录结构看清楚。常见做法是解压后看到 images 和 labels 两大类其中 labels 下同时包含 VOC 格式的 XML 文件和 YOLO 格式的 txt 文件。VOC 格式是 PASCAL VOC 的标注标准用 XML 描述的每个目标的类别和边界框坐标坐标是绝对像素值YOLO 格式则是 Darknet/YOLOv5/v8 系列直接读取的文本文件每行记录类别 id 和归一化后的中心点坐标、宽高。我一般会先用 tree 命令把目录打出来看看tree -L 2 电力场景设备漏油检测数据集输出大概长这样├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── voc/ │ ├── train/ │ ├── val/ │ └── test/ └── yolo/ ├── train/ ├── val/ └── test/这个小步骤至少能帮你确认三件事图片集和标注集目录是否一一对应train/val/test 划分是否已经完成voc 和 yolo 两个分支是否存在。很多从网上下载的数据集只给原始图和标注文件切分得自己来这份资源直接切好了能省不少事。2.2 单一类别意味着什么漏油检测本质上是个二分类定位问题数据集只有 1 个类别也就是说所有 XML 和 txt 里的目标都是同一类——漏油区域。对训练来说这等于模型只需要学一件事图像里哪些像素区域属于油迹。这比多类别检测简单但也有它自己的麻烦。单类别检测容易出现的两个问题一是漏油区域形状极度不规则不像人、车、猫狗那样有稳定的轮廓特征油迹可能是条状、块状、点状边界模糊二是背景干扰强阀门反光、阴影、深色锈迹都可能被模型误判成油迹。所以拿到数据后不要急着调参先看一批标注框的分布心里有个底python check_annotations.py --voc_dir labels/voc/train这个检查脚本是我常用的套路它会统计每张图的标注框数量、框面积占比、宽高比分布输出异常样本的索引。比如某些图标注框特别小、面积占比低于 1%那大概率是远处小面积渗油点这类样本对模型召回率影响很大而框宽高比两极分化严重说明油迹的形态跨度大训练时 anchor 配置要留意。2.3 从 VOC 到 YOLO 的转换逻辑不是简单改后缀虽然这份数据集同时给了两种格式但理解两者之间的转换关系仍然有用——实际工作中你经常会拿到只有 VOC 标注的数据集需要自己转。VOC 的 XML 里存的是绝对坐标 xmin、ymin、xmax、ymaxYOLO 需要的是相对图片宽高的归一化坐标转换公式为x_center (xmin xmax) / 2 / width y_center (ymin ymax) / 2 / height box_width (xmax - xmin) / width box_height (ymax - ymin) / height注意 YOLO 的宽高是归一化后的值不是像素值。我见过有人直接拿 XML 里的 xmax 减 xmin 填进 txt结果训练时 anchor 匹配全乱损失降不下去还以为模型结构有问题。这种低级错误浪费的时间往往比想象中多。3. 直接开训以 YOLOv8 为例跑通漏油检测全流程3.1 数据配置文件的写法路径、类别、格式一次配对拿到 YOLO 格式的数据第一步是写一个数据集配置文件告诉训练框架数据在哪、类别是什么。以 YOLOv8 为例data.yaml 的核心内容如下path: /path/to/电力场景设备漏油检测数据集 train: images/train val: images/val test: images/test nc: 1 names: 0: oil_leak这里有几个参数很容易踩坑path 建议写绝对路径相对路径在换机器跑时经常出问题train/val/test 指向的是图片目录不是 labels 目录框架会根据图片路径自动去找同名的 txt 标注nc 必须和 names 列表长度一致类别编号从 0 开始。如果你把类别名写在 names 里但 nc 没改训练时会报类别数不匹配的错误。3.2 训练命令与关键参数说明数据配置没问题之后直接跑训练yolo detect train \ --model yolov8s.pt \ --data data.yaml \ --epochs 100 \ --batch 16 \ --imgsz 640 \ --patience 20 \ --save_period 10 \ --project runs/leak_detect \ --name exp1参数含义拆开说--model 选 yolov8s.pt 是速度和精度的折中点数据量只有 338 张用 yolov8l 或者 x 很容易过拟合s 级比较合适--batch 16 取决于显卡显存如果你的卡只有 8G 显存batch 可以降到 8--imgsz 640 是这个数据集标注时大概率采用的尺寸保持和标注一致可以减少坐标缩放误差--patience 20 表示连续 20 个 epoch 验证集指标没有提升就早停数据集小的时候这个参数能省很多时间。训练跑完以后用验证集评估一下yolo detect val \ --model runs/leak_detect/exp1/weights/best.pt \ --data data.yaml重点关注 mAP50 和 mAP50-95 两个指标。mAP50 反映定位和分类的综合能力油迹检测这类目标建议至少跑到 0.85 以上mAP50-95 更严格阈值从 0.5 到 0.95 逐步提高这个值低不要紧说明标注框的边界精度还有提升空间不影响实际工程使用。3.3 样本量只有 338 张迁移学习和数据增强是保命手段338 张图对于深度学习目标检测来说显然是偏少的。直接从头训练一个模型效果大概率不好但通过迁移学习完全可以做出能用的模型。YOLOv8 官方权重是在 COCO 上预训练的虽然 COCO 里没有漏油这个类别但底层的纹理、边缘、颜色特征仍然有效。同时训练时框架默认开启 Mosaic、随机仿射变换、HSV 扰动等数据增强对 338 张的小数据集帮助很大建议保持开启不要去关。如果跑完发现过拟合比如训练集 loss 一直降、验证集 mAP 上不去我一般会做两件事一是调大增强强度比如把 mosaic 概率从默认值调高二是冻结 backbone 前几层只训练后面几层相当于用小数据强行限制模型自由度。4. 推理部署与效果验证模型训练完只是开始4.1 用训练好的权重做批量推理模型训练完需要放到实际图片上验证效果不可能只在验证集上好看就完事。批量推理可以用下面这条命令yolo detect predict \ --model runs/leak_detect/exp1/weights/best.pt \ --source test_images/ \ --conf 0.35 \ --iou 0.5 \ --save_txt \ --save_conf--conf 是置信度阈值油迹检测我习惯设在 0.3 到 0.4 之间设得太高容易漏检小面积渗油点设得太低又会出现一堆误检--save_txt 和 --save_conf 会把预测结果连同置信度一起保存成 txt方便后续写脚本统计检测率、误检率。跑完以后建议把输出图片翻一遍重点关注那些低置信度的检测框很多误判就是从这里出来的。4.2 漏油检测的评估指标不能只看 mAP在电力巡检场景里漏油缺陷的漏检代价远大于误检代价。漏检意味着设备带病运行可能发展成严重事故误检最多是让人去现场复核一次。所以评估时要重点看召回率而不是只盯精度。YOLOv8 的 val 输出里会给出每个类别的 precision 和 recall你要关注的是 recall 能不能到 0.9 以上。如果 recall 不够优先降 conf 阈值或者补充更多小目标样本。4.3 转换格式推理边缘部署时的模型导出训练完成后如果需要部署到边缘设备一般要把 PyTorch 权重转成 ONNX 或 TensorRT 格式yolo export \ --model runs/leak_detect/exp1/weights/best.pt \ --format onnx \ --opset 12 \ --imgsz 640转 ONNX 时有一个容易忽略的点YOLOv8 默认导出的 ONNX 输出是三维张量 [batch, 84, 8400]里面包含了边界框坐标、目标分数和类别分数部署时解码逻辑要自己写和 v5 的导出格式不同。如果你的部署框架是做好了 v5 的 NMS 后处理直接换 v8 的模型会出现输出解析错误这一点务必注意。5. 避坑与常见问题小数据集训练的五个典型翻车现场5.1 现象训练 loss 下降但验证集 mAP 始终很低原因数据量少导致过拟合模型记住了训练图的具体纹理特征无法泛化到未见过的新图。我拿这份数据集第一次跑的时候用 yolov8x 加 150 epoch训练集 mAP 到了 0.95验证集只有 0.7。解决换小模型yolov8s 或 n增加增强强度把 epochs 降到 80 以内开早停。如果还不行对漏油样本做离线增强比如随机裁剪、旋转 90 度、亮度抖动人工把样本量扩到 600 张以上。5.2 现象标注框位置不准导致训练结果看起来还行、实测全偏原因油迹边缘不清晰标注人员主观判断差异大。同一张图不同人标的框可能差出 20 个像素。训练时模型去拟合这些不一致的框结果就是收敛困难或者框偏。解决用 labelimg 或 x-anylabeling 把可疑样本打开复查一遍修正边界明显的框。但注意不要花太多时间在逐像素精确上漏油检测的实际使用中框偏 10 个像素完全不影响判断。5.3 现象训练时报错 AssertionError: Label class X exceeds nc1原因txt 标注文件里出现了大于 0 的类别编号说明有一部分标注是从多类别数据集合并过来的或者转换脚本写错了类别映射。解决写个脚本扫描所有 txt 文件的最大类别编号python check_yolo_labels.py --label_dir labels/yolo/train --nc 1脚本逻辑很简单逐行读 txt取每行第一个数字统计最大值有没有超过 nc-1。如果发现异常定位到具体文件检查标注内容确认是类别问题就统一改成 0是坐标问题就删掉该样本。5.4 现象训练和推理时图片尺寸不一致导致小目标检测率暴跌原因训练用的 imgsz 是 640但部署时为了省显存把推理尺寸设成 416小面积的渗油点在降采样后特征消失。解决训练和推理的 imgsz 保持一致。如果部署设备确实算力有限应该重新用 416 训练一个模型而不是直接拿 640 的权重去推理。5.5 现象数据集的图片存在重复样本训练集和验证集有重合原因数据收集时同一场景拍了多张或者从视频抽帧后没有去重导致验证集指标虚高实际部署效果达不到验证水平。解决用感知哈希或者直方图对比做去重import hashlib from PIL import Image def image_hash(path): img Image.open(path).resize((32, 32)).convert(L) pixels list(img.getdata()) avg sum(pixels) / len(pixels) return bytes([1 if p avg else 0 for p in pixels]) hashes {} for p in image_paths: h image_hash(p) if h in hashes: print(f重复样本: {hashes[h]} 和 {p}) hashes.setdefault(h, p)如果有重复把重复样本从训练集挪到验证集或者直接删掉避免数据泄漏。6. 进阶玩法小样本条件下的类别增量与自训练策略这份数据集只有漏油一个类别但实际巡检场景里往往还要同时检测其他缺陷比如锈蚀、破损、异物搭挂。要在不重新收集数据的基础上把这些类加进来两个思路比较实际。第一个思路是增量学习。把已有漏油数据冻结起来新类别数据单独标个几百张用小学习率在原有模型上继续训练。难点在于旧类别容易遗忘一个缓解办法是把旧类别的部分样本重新放回训练集混合训练比例控制在 3:1 左右新类别 3 份、旧类别 1 份。第二个思路是自训练。用当前模型对大量未标注的现场图片做伪标注置信度超过 0.9 的检测结果当作标注加入训练集然后重新训练一轮。这个策略对漏油这类特征明显、不容易误导的目标效果很好。但要注意伪标注结果一定要人工抽检我见过有人直接全盘接受伪标注结果模型一代代把误检学进去越滚越偏。验证自训练效果有个简单方法把伪标注扩充后的模型和原始模型放在同一批测试图上对比看 mAP 和 recall 是否真的提升。我一般会做两次迭代就停伪标注加入太多反而会把噪声放大。回到原始数据集本身338 张单类别虽然量不大但胜在场景真实、标注格式规整作为电力巡检漏油检测的起步数据完全够用。从那以后我做类似的小样本工业检测项目都会强制先跑一遍数据体检——看格式、查重复、扫类别编号——再动训练这套流程帮我省掉的排查时间远比花的时间多。希望帮到你。本文还有配套的精品资源点击获取
返回列表