简介本资源为风力涡轮机缺陷检测数据集面向从事新能源设备智能运维、工业视觉检测的算法工程师与高校研究者可用于训练和评估风机叶片、塔筒等关键部件的缺陷识别模型。数据集包含18912张图片支持YOLO、PASCAL VOC XML与COCO JSON三种主流标注格式便于直接接入目标检测框架开展实验。压缩包整体约584.4MB图片与标注文件按类别组织配套标注说明可参考作者提供的在线页面方便快速核对与转换格式。已有354人学习下载适合需要真实工业场景数据验证模型泛化能力的中高级开发者。借助该数据集读者可完成从数据加载、格式转换到模型训练与精度评估的完整流程并对照91.4%的准确识别率基线分析不同检测算法在风机缺陷任务上的表现差异为后续优化提供可靠参照。1. 风机叶片巡检的“数据荒”这份 18912 张的缺陷数据集能补上多少做过风电巡检的都知道叶片表面的裂纹、砂眼、雷击损伤这些缺陷靠人眼加望远镜一天看不了几台而且漏检率全凭老师傅心情。真正想把无人机航拍图丢给模型自动框缺陷第一步就卡在数据上——网上开源的风机缺陷集要么几百张要么只给分类标签不给框训出来的模型换个风场就翻车。这份风力涡轮机缺陷检测数据集给到 18912 张图标注覆盖 YOLO、PASCAL VOC XML、COCO JSON 三种格式官方口径 91.4% 准确识别率。它解决的不是“有没有数据”的问题而是“能不能直接进训练管线、不用自己从 LabelImg 开始点”的问题。适合两类人一是做新能源巡检算法、想快速搭 baseline 的工程师二是拿它当课程设计或毕设、需要现成 COCO JSON 跑通检测流程的学生。下面按“数据长什么样 → 怎么转成训练格式 → 怎么训 → 坑在哪”拆一遍。2. 拆开数据包三种标注格式到底怎么选、怎么读2.1 先看清目录结构和标注分布拿到一个检测数据集别急着写 DataLoader先花十分钟把目录摸清楚。这类风机缺陷集常见组织方式是images/放原图、annotations/放三种格式的标注文件或者按train/val/test分好再各自带标注。18912 张图的量级如果全是高清航拍图解压后大概在 36 GB 之间具体看分辨率。我一般先跑一段统计脚本确认类别数和每类框数量避免训到一半发现某个缺陷类只有几十个框。import json from collections import Counter # 读 COCO JSON统计类别分布和图片数 with open(annotations/instances.json, r, encodingutf-8) as f: coco json.load(f) print(图片总数:, len(coco[images])) print(标注框总数:, len(coco[annotations])) # 类别 id 到名字的映射 cat_map {c[id]: c[name] for c in coco[categories]} print(类别列表:, cat_map) # 每个类别的框数量 counter Counter(cat_map[a[category_id]] for a in coco[annotations]) for name, cnt in counter.most_common(): print(f{name}: {cnt} 个框)这段脚本干的事很直接coco[images]是图片清单coco[annotations]是每个框的记录category_id对应categories里的类别。跑完你会得到一张类别分布表。如果发现某类框数低于 200训练时就要考虑过采样或者类别加权否则模型会直接把这个类忽略掉。参数上唯一要注意的是编码COCO JSON 里如果有中文类别名encodingutf-8不能省不然 Windows 下直接报 UnicodeDecodeError。2.2 三种格式的取舍YOLO 快、VOC 稳、COCO 全数据集同时给 YOLO、PASCAL VOC XML、COCO JSON不是让你三选一随便用而是对应不同训练框架。YOLO 格式是每张图一个.txt每行class_id x_center y_center width height坐标全部归一化到 01Ultralytics 系的 YOLOv5/v8/v11 直接吃。VOC XML 是每张图一个 XML框坐标是绝对像素值适合老一点的 TensorFlow Object Detection API 或者 PaddleDetection。COCO JSON 是单个大文件包含 images、annotations、categories 三个主键MMDetection、Detectron2、YOLO 的新版都能读。格式文件组织坐标类型典型框架转换成本YOLO txt每图一个 txt归一化 cxcywhUltralytics YOLO最低直接训VOC XML每图一个 xml绝对像素 xyxyTF OD API、Paddle中需转 COCO 或 YOLOCOCO JSON单文件绝对像素 xywhMMDetection、Detectron2低配置 dataset 即可选型逻辑很简单如果你只是想快速验证“这个数据能不能训出东西”用 YOLO 格式跑 YOLOv8n半小时出结果。如果你要做多模型对比、发论文用 COCO JSON 配 MMDetection因为它的评估指标 mAP 计算最标准。VOC XML 更多是兼容老管线新项目我一般直接跳过它除非你手上的代码只认 XML。提示三种格式的类别 id 映射不一定一致。YOLO 的 class_id 从 0 开始COCO 的 category_id 可能从 1 开始甚至跳号。混用之前先对齐否则框会全错位。2.3 用 COCO JSON 反查图片和标注是否对得上数据集最怕的是图片和标注不同步——有图没框、有框没图。COCO JSON 的好处是可以一次性校验。下面这段脚本检查每张图是否有对应标注以及每个标注的 image_id 是否真实存在。import json with open(annotations/instances.json, r, encodingutf-8) as f: coco json.load(f) img_ids {img[id] for img in coco[images]} ann_img_ids {a[image_id] for a in coco[annotations]} # 有图但没有任何框的图片 no_ann img_ids - ann_img_ids # 有框但图片不存在的脏数据 ghost ann_img_ids - img_ids print(无标注图片数:, len(no_ann)) print(幽灵标注数:, len(ghost)) # 抽查一张图的框数量 sample_id coco[images][0][id] boxes [a for a in coco[annotations] if a[image_id] sample_id] print(f图片 {sample_id} 有 {len(boxes)} 个框)no_ann里的图片如果是纯背景图可以保留当负样本如果数量超过总图 10%说明标注可能漏了。ghost不为空就是数据打包时出的错必须清掉否则训练时 DataLoader 会直接抛 KeyError。这一步花两分钟能省掉后面调半天 loss 不下降的玄学时间。3. 把 COCO JSON 转成 YOLO 格式脚本、参数和四个边界坑3.1 转换脚本的核心逻辑虽然数据集号称支持 YOLO但如果你拿到的是 COCO JSON 版本还是得自己转一道。转换的核心就三件事读图宽高、把 xywh 转成归一化 cxcywh、按类别名映射到连续 id。下面这个脚本我用了很多次直接抄。import json import os from pathlib import Path def coco_to_yolo(coco_json, img_dir, out_dir): with open(coco_json, r, encodingutf-8) as f: coco json.load(f) # 类别 id 重映射为 0 起始的连续整数 cats sorted(coco[categories], keylambda x: x[id]) cat_id_map {c[id]: i for i, c in enumerate(cats)} names [c[name] for c in cats] # 图片 id 到文件名的映射 img_info {img[id]: img for img in coco[images]} # 按 image_id 聚合标注 from collections import defaultdict anns defaultdict(list) for a in coco[annotations]: anns[a[image_id]].append(a) os.makedirs(out_dir, exist_okTrue) for img_id, img in img_info.items(): w, h img[width], img[height] lines [] for a in anns.get(img_id, []): x, y, bw, bh a[bbox] # COCO 是左上角 xywh cx (x bw / 2) / w cy (y bh / 2) / h nw bw / w nh bh / h cid cat_id_map[a[category_id]] lines.append(f{cid} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) # 文件名去掉扩展名存同名 txt stem Path(img[file_name]).stem with open(os.path.join(out_dir, stem .txt), w) as f: f.write(\n.join(lines)) # 顺便生成 classes.txt with open(os.path.join(out_dir, classes.txt), w, encodingutf-8) as f: f.write(\n.join(names)) print(转换完成类别:, names) coco_to_yolo(annotations/instances.json, images, labels)逻辑说明bbox在 COCO 里是[x_min, y_min, width, height]绝对像素。YOLO 要的是中心点归一化坐标所以先x bw/2再除以图宽。cat_id_map把原始 category_id 压成 0 起始因为 YOLO 的 class_id 必须从 0 连续。classes.txt的顺序就是 class_id 的顺序训练时data.yaml里的 names 要跟它一致。参数上:.6f保留六位小数足够再多没必要。3.2 边界坑一图片尺寸和标注尺寸不一致有些数据集在打包时图片被缩放过了但 COCO JSON 里的width、height还是原图尺寸。这时候你按 JSON 里的宽高归一化框会整体偏移。排查方法是抽几张图用 PIL 读实际尺寸跟 JSON 里的对比。from PIL import Image import json with open(annotations/instances.json) as f: coco json.load(f) for img in coco[images][:5]: real Image.open(os.path.join(images, img[file_name])).size if real ! (img[width], img[height]): print(不一致:, img[file_name], JSON:, (img[width], img[height]), 实际:, real)如果发现不一致转换脚本里的w, h要改成用 PIL 实时读取而不是信 JSON。这个坑很隐蔽因为训练不会报错只是 mAP 死活上不去。3.3 边界坑二类别名里有空格或特殊字符COCO 的categories里如果类别名是blade crack这种带空格的生成classes.txt没问题但写data.yaml时如果直接拼字符串容易出问题。常见做法是统一把类别名转成下划线或者拼音保持跟标注文件里的 class_id 对应即可。另外注意中文类别名在某些框架的日志里会乱码建议转英文或拼音。3.4 边界坑三空标注图片的处理转换后会生成一些空的.txt文件对应没有缺陷的纯背景图。YOLO 训练时这些空文件是合法的负样本但如果你用的 DataLoader 会跳过空文件就等于丢了负样本模型误检率会升高。确认你的训练配置里skip_empty是 False。如果数据集里负样本比例过高比如超过 30%可以适当抽掉一部分避免正负失衡。3.5 边界坑四坐标越界COCO 标注偶尔会有框超出图片边界的情况比如x bw w。转成 YOLO 后 cx 可能大于 1训练时会被 clamp 或者直接报错。转换时加一道裁剪x max(0, min(x, w)) y max(0, min(y, h)) bw min(bw, w - x) bh min(bh, h - y)这四行加上去能避免大部分“训练到第几个 epoch 突然 loss 变 NaN”的问题。血泪经验坐标越界不报错但会让梯度爆炸。4. 训练配置与 91.4% 准确率的复现路径4.1 用 YOLOv8 跑一个 baseline数据转好之后最快验证的方式是 Ultralytics YOLOv8。先建data.yamlpath: ./dataset train: images/train val: images/val nc: 4 names: [crack, erosion, lightning_damage, sand_hole]nc是类别数names顺序必须跟classes.txt一致。然后一条命令开训yolo detect train datadata.yaml modelyolov8s.pt epochs100 imgsz640 batch16 patience20参数说明modelyolov8s.pt是预训练权重小模型速度快适合先跑通。imgsz640是输入分辨率如果原图很大且缺陷很小可以提到 1024但显存要够。patience20是早停20 个 epoch 验证集不提升就停省时间。batch16根据显存调8G 显存跑 640 大概能到 16。4.2 91.4% 这个数字怎么理解官方说的 91.4% 准确识别率大概率是 mAP0.5 或者 top-1 分类准确率具体口径得看原文档。检测任务里mAP0.5 能到 0.9 以上算不错但要注意这是在他们自己的验证集上。你复现时如果只拿到 0.85 左右不一定是代码问题可能是 train/val 划分不同。建议自己按 8:1:1 重新划分跑三次取平均心里才有底。另外如果缺陷类之间长得很像比如砂眼和雷击坑混淆矩阵会告诉你哪些类在互相误判。4.3 数据增强的参数怎么设风机缺陷检测的难点是缺陷尺度变化大——裂纹可能横跨半个叶片砂眼只有几十像素。增强策略上mosaic和mixup能提升小目标召回但mixup对缺陷检测有时会引入不真实的叠加我一般把mixup关掉只留mosaic1.0。旋转增强要开因为无人机拍摄角度不固定。HSV 抖动可以抑制光照影响风场早晚光线差异大。具体在 YOLO 的hyp.yaml里调或者命令行加degrees10 hsv_h0.015 hsv_s0.7。4.4 验证集评估看哪些指标训完别只看一个 mAP至少看四个数mAP0.5、mAP0.5:0.95、precision、recall。风机巡检场景里 recall 比 precision 重要漏检一个裂纹的代价远大于多报几个疑似。如果 recall 低先查标注里有没有漏标再考虑降低置信度阈值。混淆矩阵和 PR 曲线在runs/detect/val目录下打开看一眼比盯 loss 曲线有用。5. 避坑与排查训练不收敛、框错位、显存炸了怎么办5.1 现象loss 一直不降mAP 在 0.1 附近晃原因最常见的是类别 id 和data.yaml里的 names 顺序对不上模型学的是错位的标签。其次是图片路径写错DataLoader 实际读到的是空图或默认图。解决先跑一遍转换脚本里的校验逻辑确认每张图都有对应 txt再打印一个 batch 的标签看看 class_id 范围是否在[0, nc-1]内。5.2 现象验证时框整体偏移或缩放原因训练用的图片尺寸和标注归一化时用的尺寸不一致。比如转换时用了 COCO JSON 里的 1920x1080但实际图片是 1280x720。解决转换脚本里改用 PIL 实时读图宽高重新生成一遍 labels。这个坑我踩过两次第一次调了三天学习率最后发现是尺寸问题。5.3 现象训练到一半 CUDA out of memory原因imgsz或batch设太大或者mosaic增强在后期仍然开启导致单批图像数量翻倍。解决先把batch减半如果还炸把imgsz从 1024 降到 640。另外 YOLO 的close_mosaic参数可以在最后 10 个 epoch 关掉 mosaic既省显存又稳定收敛。5.4 现象某些类别完全检测不到原因该类样本太少或者该类缺陷在图像里太小。解决统计每类框数量低于 200 的做过采样检查 anchor 尺寸是否匹配YOLOv8 是 anchor-free但小目标仍然需要高分辨率输入。可以把imgsz提到 1280 试一轮如果显存不够就用切片推理SAHI。5.5 现象模型在验证集好换一批图就崩原因数据集的拍摄条件太单一模型学到了背景捷径。比如所有训练图都是晴天拍的阴天图就废了。解决增强里加大 HSV 和亮度抖动或者手动混入一些不同光照的负样本。如果数据集本身多样性不足再强的模型也救不了这是数据层面的天花板。6. 进阶技巧用切片推理把大图小缺陷的召回再拉一截风机航拍图动辄 4000x3000缺陷可能只占 50x50 像素。直接缩到 640 训练小缺陷信息丢得差不多了。我一般会在 baseline 跑通后加一层切片推理SAHISlicing Aided Hyper Inference。原理很简单把大图切成有重叠的小块每块单独推理再把框映射回原图做 NMS。这样小缺陷在切片里变成了“大目标”召回率能明显提升。from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction # 加载训好的 YOLO 模型 detection_model AutoDetectionModel.from_pretrained( model_typeyolov8, model_pathruns/detect/train/weights/best.pt, confidence_threshold0.25, devicecuda:0 ) # 切片推理512x512 的切片重叠 20% result get_sliced_prediction( test_blade.jpg, detection_model, slice_height512, slice_width512, overlap_height_ratio0.2, overlap_width_ratio0.2 ) # 导出 COCO 格式结果 result.export_visuals(export_diroutput/)参数说明slice_height/width根据缺陷尺度调缺陷越小切片越小但切片太多会慢。overlap_ratio一般 0.2太小会切断跨切片的缺陷太大则重复框多。confidence_threshold可以比训练时低一点因为切片后误检会被 NMS 压掉。跑完对比一下切片前后的 recall通常能涨 38 个百分点。另一个技巧是测试时增强TTAYOLO 自带augmentTrue推理时对图片做翻转和缩放再合并结果。代价是推理速度慢 23 倍适合离线巡检报告生成不适合实时视频流。从那以后我每次拿到新数据集都强制先跑一遍标注校验和尺寸核对再开始训。这两个检查加起来不到五分钟但能省掉后面几天的无效调参。希望帮到你。本文还有配套的精品资源点击获取