
简介本资源为风力涡轮机缺陷检测数据集面向从事新能源运维、工业视觉检测及深度学习目标检测的开发者与研究人员可用于训练和评估风机叶片等部件的缺陷识别模型。压缩包共2000个文件以1997张jpg图像为主另含3个json标注文件整体约364.39MB支持YOLO、PASCAL VOC XML与COCO JSON多种标注格式便于直接接入主流检测框架。图像多来自无人机巡检场景覆盖不同角度与光照条件下的风机外观样本官方给出86.6%的准确识别率可作为基线参考。目前已有376人学习下载适合需要快速搭建缺陷检测流程、验证算法效果或进行模型对比的读者能帮助节省数据采集与标注成本直接投入训练与调优。1. 风力涡轮机缺陷检测数据集11921 张图与 86.6% 准确率背后的落地判断如果你正在做工业巡检方向的视觉项目大概率绕不开一个尴尬公开的风电缺陷数据太少自己爬叶片图又凑不齐标注。这份风力涡轮机缺陷检测数据集给了一个能直接开跑的起点——11921 张图片标注走 COCO JSON 格式官方给出的识别准确率是 86.6%。它不是那种几百张图的玩具集量级上足够支撑一次完整的训练和验证闭环。适合谁做叶片裂纹、腐蚀、雷击损伤检测的算法工程师想快速验证 YOLO 系列或 MMDetection 流程的从业者以及需要一份带标准标注格式做课程设计或原型验证的人。COCO JSON 这个格式选择很关键它意味着你不用再写脚本从 XML 或 txt 里倒腾主流框架基本都能直接吃。下面按「这份资源是什么 → 怎么把它跑起来 → 哪里会翻车」的顺序拆开讲。2. 数据集结构与 COCO JSON 标注先看清 11921 张图怎么组织拿到一个数据集我第一件事不是急着训练而是先把目录结构和标注文件读一遍。很多翻车都发生在「以为标注是那个格式结果不是」的阶段。这份资源的核心资产是图片加一份 COCO 风格的 JSON 标注理解它的组织方式决定了你后面转换、划分、训练顺不顺。2.1 目录布局与文件构成常见做法是图片放一个目录标注 JSON 放同级或 annotations 子目录。COCO 格式的典型结构是这样wind_turbine_defect/ ├── images/ │ ├── 000001.jpg │ ├── 000002.jpg │ └── ... # 共 11921 张 └── annotations/ └── instances.json # COCO 格式标注instances.json里通常包含四个顶层字段images、annotations、categories、info。images记录每张图的 id、文件名、宽高annotations是每个缺陷框的 bbox、面积、类别 id 和所属图片 idcategories定义缺陷类别。先跑一段脚本把类别和数量统计出来比盲目开训靠谱得多。import json from collections import Counter with open(annotations/instances.json, r, encodingutf-8) as f: coco json.load(f) # 类别映射id - 名称 cats {c[id]: c[name] for c in coco[categories]} print(类别数:, len(cats), cats) # 每类标注框数量 cnt Counter(a[category_id] for a in coco[annotations]) for cid, n in cnt.items(): print(f{cats[cid]}: {n} 个框) print(图片总数:, len(coco[images])) print(标注框总数:, len(coco[annotations]))这段脚本的作用是给你一张「体检表」。逻辑很直白读 JSON把 category_id 映射成可读名称再统计每类框数。参数上唯一要注意的是编码用 utf-8工业数据集里类别名带中文的情况不少不指定编码在部分环境会直接报错。跑完你会得到类似「裂纹 / 腐蚀 / 雷击损伤」这样的类别分布。如果某一类框数只有个位数那基本可以判定这类样本严重不足训练时要么合并类别要么单独做重采样否则模型对它的召回会很难看。2.2 COCO JSON 的字段含义与校验COCO 的 bbox 格式是[x, y, width, height]原点在左上角单位是像素。这一点和 YOLO 的归一化中心点格式完全不同转换时最容易在这里出错。area字段是框面积iscrowd标记是否为密集区域工业缺陷检测里一般用不到 crowd 标记但读的时候要能识别。校验环节我一般会做三件事检查 bbox 是否越界、检查图片 id 是否都能在 images 里找到、检查有没有宽高为 0 的脏框。img_ids {img[id] for img in coco[images]} img_wh {img[id]: (img[width], img[height]) for img in coco[images]} bad 0 for a in coco[annotations]: if a[image_id] not in img_ids: bad 1 continue x, y, w, h a[bbox] W, H img_wh[a[image_id]] if w 0 or h 0 or x 0 or y 0 or x w W or y h H: bad 1 print(异常标注数:, bad)逻辑说明先建立图片 id 集合和宽高字典再逐条比对标注框。参数上越界判断用x w W而不是x W因为框的右边界才是关键。如果异常数不为零别急着删先抽样看几张有些是标注工具导出的浮点误差四舍五入就能救回来真正越界严重的才剔除。这一步花十分钟能省掉训练时 loss 突然变 NaN 的排查时间。3. 从 COCO 到 YOLO格式转换与训练配置的完整链路数据集能读通只是第一步真正要跑起来得把它喂进训练框架。YOLO 系列在工业缺陷检测里落地最广这里以 YOLOv8 为例走一遍转换和训练。选它的理由是生态成熟、配置文件直观、对 COCO 转换支持好。如果你用 MMDetection思路一样只是配置文件写法不同。3.1 COCO 转 YOLO txt 的转换脚本YOLO 需要每张图对应一个 txt每行是类别索引 中心x 中心y 宽 高全部归一化到 0 到 1。转换的核心是把 COCO 的绝对坐标 bbox 换算成归一化中心点格式。import json, os from pathlib import Path with open(annotations/instances.json, r, encodingutf-8) as f: coco json.load(f) # 类别 id 重映射为 0 起始的连续索引 cat_ids sorted(c[id] for c in coco[categories]) cat2idx {cid: i for i, cid in enumerate(cat_ids)} img_info {img[id]: img for img in coco[images]} out_dir Path(labels) out_dir.mkdir(exist_okTrue) # 按图片聚合标注 from collections import defaultdict per_img defaultdict(list) for a in coco[annotations]: per_img[a[image_id]].append(a) for img_id, anns in per_img.items(): info img_info[img_id] W, H info[width], info[height] stem Path(info[file_name]).stem lines [] for a in anns: x, y, w, h a[bbox] cx (x w / 2) / W cy (y h / 2) / H nw w / W nh h / H lines.append(f{cat2idx[a[category_id]]} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) (out_dir / f{stem}.txt).write_text(\n.join(lines), encodingutf-8) print(转换完成类别映射:, cat2idx)逻辑说明先做类别 id 重映射因为 COCO 的 category_id 可能不连续比如从 1 开始还跳号YOLO 要求从 0 开始的连续整数。然后按 image_id 聚合标注逐框换算。参数上中心点公式是(x w/2) / W别写成x / W这是最常见的错误。保留 6 位小数足够精度写太多没必要。转换完记得抽查一个 txt和原图对照确认框的位置对得上。3.2 划分训练验证集与 data.yaml 配置11921 张图不能全拿去训练得留一部分做验证。常见比例是 8:1:1 或 8:2。划分时要注意类别均衡别让某一类缺陷全落进训练集。import random from pathlib import Path random.seed(42) # 固定种子保证可复现 imgs sorted(Path(images).glob(*.jpg)) random.shuffle(imgs) n len(imgs) n_train int(n * 0.8) n_val int(n * 0.1) splits { train: imgs[:n_train], val: imgs[n_train:n_train n_val], test: imgs[n_train n_val:], } for name, files in splits.items(): with open(f{name}.txt, w, encodingutf-8) as f: for p in files: f.write(str(p.resolve()) \n) print(name, len(files))逻辑说明固定随机种子是关键否则每次划分不同实验没法对比。参数上 0.8/0.1/0.1 是通用起点如果数据量偏少可以调成 0.7/0.15/0.15。输出的是绝对路径列表YOLO 的 data.yaml 可以直接引用。对应的data.yamlpath: /abs/path/to/wind_turbine_defect train: train.txt val: val.txt test: test.txt nc: 3 names: [crack, corrosion, lightning_damage]nc是类别数names顺序必须和转换脚本里的cat2idx一致错一个位置模型就学歪了。这一步没有报错提示全靠自己核对属于典型的「静默翻车点」。3.3 启动训练与关键参数配置齐了就能开训。YOLOv8 的命令行很直接yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/wind \ nameexp1参数说明model选 yolov8s 是精度和速度的折中如果显存吃紧换 yolov8n追求精度换 yolov8m。imgsz640是通用输入尺寸缺陷目标如果普遍很小可以提到 1024但显存占用会明显上升。patience20是早停验证指标 20 轮不涨就停省时间。lr00.01是初始学习率配合默认的余弦退火够用。训练时盯mAP50和mAP50-95两个指标前者宽松后者严格工业场景更该看后者。4. 避坑与排查这份数据集最容易翻车的五个地方数据集本身质量不错但用起来翻车往往不在数据而在流程细节。下面五条是我在实际项目里反复遇到的按「现象 → 原因 → 解决」写清楚。4.1 训练 loss 正常但 mAP 一直是 0现象训练跑了几十轮box_loss 在降但验证 mAP 始终为 0。原因九成是data.yaml里的names顺序和转换脚本的类别索引对不上或者路径写错导致验证集根本没加载到图。解决先确认val.txt里的路径真实存在再打印cat2idx和names逐项比对。路径问题在 YOLO 里不会报错只会静默跳过这是最坑的一点。4.2 小目标缺陷召回极低现象裂纹这类细长小目标几乎检不出来大面积的腐蚀却正常。原因640 输入下小目标下采样后特征几乎消失。解决把imgsz提到 1024 或 1280同时在 data.yaml 里开启mosaic增强默认开必要时用切片推理SAHI把大图切块再检。代价是推理变慢要按实际产线节拍权衡。4.3 类别不均衡导致模型偏向多数类现象某一类缺陷 AP 很高另一类接近 0。原因11921 张图里各类缺陷数量差异大模型被多数类主导。解决先统计每类框数对少数类做过采样或复制增强也可以在损失里给少数类加权。别直接删多数类样本工业数据每一张都来之不易。4.4 验证集泄漏进训练集现象验证指标高得离谱上线后一塌糊涂。原因划分时同一台风机的多张图被分到了训练和验证两边模型其实见过相似场景。解决按「风机编号」或「拍摄批次」分组划分而不是按图片随机划分。这一点在工业数据集里尤其重要同一设备的多角度图高度相似。4.5 标注框越界导致训练崩溃现象训练中途 loss 突然变 NaN。原因个别 bbox 越界或宽高为负归一化后出现非法值。解决训练前跑一遍 2.2 节的校验脚本把异常框修掉或剔除。养成「先校验再训练」的习惯能省掉大量玄学报错。5. 进阶玩法用 86.6% 准确率做基线把指标再往上推86.6% 这个数字是个不错的基线但别把它当终点。工业缺陷检测的准确率高度依赖场景同一份数据换个输入尺寸、换个模型、加不加增强结果能差好几个点。我一般会在这个基线上做三件事。第一件是换模型对比。YOLOv8s 跑完再跑一遍 yolov8m 和 RT-DETR看 mAP50-95 的差距。缺陷检测里 transformer 类模型对小目标有时更友好但推理慢得看产线能不能接受。第二件是调输入尺寸640 到 1024 之间做几组画一条「精度-速度」曲线选拐点。第三件是加数据增强除了默认的 mosaic针对缺陷可以加随机旋转和亮度扰动因为实际巡检的光照和角度变化很大。验证方法上别只看整体 mAP。把每类的 AP 单独拉出来再画混淆矩阵看模型到底把哪两类搞混了。裂纹和划痕在低分辨率下经常互混这时候要么提高分辨率要么在标注规范上把两者定义清楚。下面这张表是我常用的对比记录格式模型imgszmAP50mAP50-95推理耗时(ms)yolov8n6400.910.628yolov8s6400.930.6614yolov8s10240.950.7131yolov8m10240.960.7358数据是示意重点是这张表能帮你做决策如果产线要求 30ms 以内那 1024 的 yolov8s 就是上限如果能接受 60msyolov8m 值得上。别盲目追高指标落地看的是精度和速度的平衡点。最后说个习惯。从那以后我每次拿到新数据集都强制先跑一遍类别统计和标注校验再动训练脚本。这一步花不了二十分钟但能挡掉后面百分之八十的玄学问题。这份风力涡轮机缺陷检测数据集结构规整、格式标准值得作为工业视觉项目的起点把它跑通、调透比换十个数据集更有收获。希望帮到你。本文还有配套的精品资源点击获取