资讯动态

AeBAD航空发动机叶片异常检测数据集实战:从格式解析到YOLO训练

发布时间:2026/10/18 3:32:19 来源:尧图企业网站定制
第一次拿到AeBAD航空发动机叶片异常检测数据集的时候我的第一反应不是去数有多少张图而是先把所有标注框的尺寸分布跑了一遍。在工业缺陷检测里泡久了的人都懂标注框的宽度分布基本决定了模型最后能做成什么样这比看类别数量有用得多。1149张、4个类别、同时提供VOC和YOLO两种格式这个组合听起来平平无奇真正上手之后你会发现它比很多动辄上万张的通用数据集要“扎手”得多。这篇文章我把整个数据集从格式解析、校验到训练部署的完整链路捋一遍适合刚入门工业视觉检测、想做目标检测练手项目、或者准备把AI落到航空质检场景的人参考。1. 一张叶片照片背后航空发动机异常检测为什么这么难1.1 不在实验室里看图而是去理解“为什么必须盯住叶片”先聊一个很多人忽略的背景航空发动机叶片是整台发动机里工作条件最苛刻的部件之一。风扇叶片要承受鸟撞和外来物冲击压气机叶片要在高速旋转中对抗疲劳裂纹涡轮叶片则长期泡在高温燃气里烧蚀、氧化、热疲劳都是家常便饭。这些损伤一旦发展到一定程度轻则影响气动效率重则可能造成叶片断裂直接威胁飞行安全。所以叶片检查从来不是“例行公事”而是适航维修体系里最硬的一环。传统做法是孔探检查也就是把内窥镜伸进发动机内部靠老师傅的眼睛对着屏幕一帧一帧找异常。这种方式的问题很明显疲劳、主观、效率低。一个熟练的孔探人员看一段视频要花很长时间而且不同人的判读标准很难完全一致。于是近几年大家都想把计算机视觉搬过来用目标检测模型自动标出可疑区域让老师傅只做复核。想法很美好落地时第一个坎就是没有数据。1.2 为什么公开的叶片异常数据集这么少叶片损伤图片属于典型的“高价值、难获取”数据。发动机拆检机会少孔探作业窗口短能拍到缺陷的时机更是难得。再加上各单位的图片涉及维修记录和型号信息共享意愿普遍不高所以市面上的公开数据集相当稀缺。AeBAD这类数据集的价值就在这里——它至少给你提供了一个能跑通流程、验证算法思路的起点。但也要提醒一句公开数据集和你在实际产线上拿到的图分布几乎肯定不一样。后面我会专门讲域差异怎么处理这里先记住一个原则——把AeBAD当成“练手和验证方法”的数据而不是“直接部署就能用”的数据。真正落地时大概率还是要用自己采集的现场图做微调。1.3 叶片异常检测对算法到底提出了什么苛刻要求叶片表面是典型的低纹理、高反光金属面光线稍微一变同一个缺陷拍出来可能完全是两个样子。再加上叶片本身带有弧度缺陷会跟着曲面发生形变有些裂纹细到只有几个像素宽。这直接导致三个技术难点小目标问题很多缺陷在整张图中的占比极小尤其是早期裂纹可能只有十几乘十几个像素。类内差异大同样是凹坑撞击坑和腐蚀坑的边缘形态完全不同同样是裂纹疲劳裂纹和热裂纹的走向、开口宽度都不一样。类间相似度高涂层脱落和早期腐蚀在视觉上很像掉块和严重凹坑也容易混淆。这几个难点决定了你不能拿一个通用检测模型随便训一训就往生产环境丢而是要在数据清洗、模型选型、训练策略上都花心思。后面几章就是围绕这些难点展开的。2. AeBAD数据集盘点1149张图与4类异常的来龙去脉2.1 先搞清楚这4个类别到底“是什么”AeBAD标题里写明是4个类别但具体是哪四类异常不同版本的数据打包可能略有差异。拿到数据后别急着训练第一步永远是打开标签文件夹把类别名列出来。以航空发动机叶片异常检测的常见分类习惯来看大概率覆盖的是这几类类别英文标签习惯典型形态检测难点裂纹crack细线状可能带分叉方向沿受力方向尺寸小、对比度低凹坑/压坑dent局部凹陷边缘有金属挤压痕迹表面反光导致轮廓不清腐蚀/烧蚀corrosion / erosion表面失去金属光泽呈片状或点状与涂层脱落相似边界模糊掉块/缺损missing / nick边缘缺了一块形状不规则形状变化大与背景分割困难这里有一点非常关键无论类别名叫什么你都要打开几十张图人工核对一遍标签确认“名字”和“视觉特征”是对得上的。这个动作叫标签语义确认永远不要跳过。我见过不止一次数据集的类别叫“scratch”结果框里框的全是加工刀痕和真正要检测的运行损伤根本不是一回事。2.2 图片内容和分布特点1149张图说多不多说少不少。对于缺陷检测这种小目标、高难度的任务它的规模刚好够你验证算法但要直接训出一个高召回率的工业级模型还是比较吃力的。图片大概率来自孔探视频抽帧或实验室台架拍摄分辨率通常在1280x720以上部分可能是1920x1080。背景比较复杂有叶片边缘、轮毂、甚至油污和积碳这些都会干扰检测。一个容易被忽略的点这1149张图的缺陷分布大概率是不均衡的。有些类别比如裂纹可能占了接近一半的标注框有些类别比如掉块可能只有几十个框。这种长尾分布很现实工业数据几乎都是这样。所以在开始训练之前我建议先写个小脚本统计一下每类标注框的数量心里有个底。from pathlib import Path from collections import Counter label_dir Path(labels/train) counts Counter() box_count 0 for p in label_dir.glob(*.txt): lines p.read_text().strip().splitlines() for line in lines: parts line.split() if len(parts) 5: counts[int(parts[0])] 1 box_count 1 print(总标注框数:, box_count) for cls, n in sorted(counts.items()): print(f类别 {cls}: {n} 个框)如果脚本输出显示某些类别只有几十个框那就要做好心理准备要么用数据增强硬扛要么考虑从其他来源补充同类缺陷图要么干脆把相似类别合并。我见过一个项目就是把“点蚀”和“麻点”合并成一个“表面腐蚀”类准确率立刻涨了好几个点。类别粒度不是越细越好要看数据量撑不撑得起。2.3 训练集验证集怎么切分最稳妥很多数据集会直接给一个官方划分AeBAD的压缩包里一般也会带train/val文件夹。但我建议你拿到后自己重新切一次而且要按“图”切而不是按“框”切。原因很简单同一张图里的多个缺陷高度相关如果同一张图既出现在训练集又出现在验证集验证指标会虚高这叫数据泄漏。更严格的做法是按“叶片个体”或“拍摄批次”切分保证训练和验证里没有同一片叶子的不同图片。当然公开数据集通常不提供这类分组信息那就退而求其次至少保证同名前缀的图片同一段视频抽出来的帧全部归到同一个集合里。切分比例上我习惯用8:2也就是917张训练、232张验证这个比例对千张规模的数据比较舒服。3. VOC和YOLO格式的异同以及两步走校验方法3.1 两种格式的本质区别AeBAD同时提供VOC和YOLO格式本质上是同一批标注的两种“编码方式”。VOC格式是XML文件用绝对像素坐标描述目标框YOLO格式是纯文本文件用归一化坐标描述目标框。对比项VOC XMLYOLO txt文件组织每张图一个.xml与图片分离存放每张图一个.txt与图片分离存放坐标形式绝对像素坐标xmin, ymin, xmax, ymax归一化中心点坐标与宽高0~1之间类别表示直接写类别名如namecrack/name用数字索引如 0 表示第一类可读性人工可读结构清晰简洁但脱离类别表无法直接读懂使用场景传统检测框架、标注工具通用格式YOLO系列训练直接读取VOC的一个典型标注片段长这样annotation folderJPEGImages/folder filenameblade_0001.jpg/filename size width1280/width height720/height depth3/depth /size object namedent/name bndbox xmin312/xmin ymin245/ymin xmax389/xmax ymax310/ymax /bndbox /object /annotationYOLO对应的一行是1 0.273438 0.385417 0.060156 0.090278这里前一个数字是类别索引后四个分别是中心点x、中心点y、宽、高全部除以了图像宽高做了归一化。如果你改动过图片尺寸必须重新生成标注否则坐标全部错位。3.2 格式转换脚本与“转格式翻车”的高发点其实多数情况下你不需要自己转数据集已经给好了两份。但自己动手转一遍仍然很有价值因为你迟早要处理自己采集的数据。下面这个函数是我常用的VOC转YOLO片段import xml.etree.ElementTree as ET from pathlib import Path def voc_to_yolo(xml_path, out_path, class_map): tree ET.parse(xml_path) root tree.getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) lines [] for obj in root.findall(object): name obj.find(name).text.strip() cls class_map[name] xmin float(obj.find(bndbox/xmin).text) ymin float(obj.find(bndbox/ymin).text) xmax float(obj.find(bndbox/xmax).text) ymax float(obj.find(bndbox/ymax).text) x_center ((xmin xmax) / 2) / w y_center ((ymin ymax) / 2) / h bw (xmax - xmin) / w bh (ymax - ymin) / h if bw 0 or bh 0 or w 0 or h 0: continue lines.append(f{cls} {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}) out_path.write_text(\n.join(lines))转格式最容易翻车的有四个点我一个个踩过class_map顺序不一致。VOC里类别名是字符串YOLO里是整数索引一旦names顺序和训练配置对不上模型会把裂纹当凹坑学而且损失函数还不会报警。xmin/xmax写反或者从zero-based和one-based的标注入手时搞混导致框整体偏移一个像素。单看一两个框发现不了批量统计宽度分布时会看到异常尖峰。图片分辨率读了但没对。有些标注软件在XML里写的size和实际图不一致转换时必须从图片文件本身读宽高而不是完全信任XML。空标注文件被遗漏。没有目标的图片在YOLO格式下应该是空的txt文件很多脚本会跳过空文件结果训练时每张图都强制要求有目标严重影响收敛。3.3 标注合法性校验训练前最后的防线转完格式之后我强烈建议跑一遍合法性校验。这一步花不了几分钟但能拦住90%的低级错误。主要检查几件事归一化坐标是否都在0到1之间、框宽高是否大于0、框面积是否小得可疑、类别索引是否越界。def check_yolo(label_path): bad [] for line in open(label_path): parts line.split() if len(parts) ! 5: bad.append(字段数量错误) continue c, cx, cy, bw, bh map(float, parts) if not (0 cx 1 and 0 cy 1): bad.append(中心坐标越界) if not (0 bw 1 and 0 bh 1): bad.append(宽高非法) if bw * bh 1e-6: bad.append(框面积过小) if int(c) 4: bad.append(类别索引越界) return bad我的经验是把校验结果汇总成表格逐项核对而不是只看“有没有报错”。很多时候错误是系统性的比如所有框的y坐标整体偏大这往往是标注工具坐标系原点在左上角还是右下角的设置问题。这类系统性错误对模型的影响是灾难性的但它不会让训练崩掉只会让模型学到一个错误的映射最后mAP低得莫名其妙。4. 基于AeBAD训练YOLO检测模型从配置到评估4.1 数据目录组织与YAML配置训练前先把数据整理成YOLO系列直接能读的目录结构。我习惯这样组织AeBAD/ ├── images/ │ ├── train/ │ ├── val/ ├── labels/ │ ├── train/ │ ├── val/ └── AeBAD.yaml注意图片和标签的对应文件名必须完全一致包括扩展名。比如图片叫blade_0001.jpg标签就必须叫blade_0001.txt如果有一张图的标签缺失训练时会直接报错或跳过。可以用一个简单命令检查ls images/train | sed s/\.[^.]*$// | sort img_list.txt ls labels/train | sed s/\.[^.]*$// | sort label_list.txt diff img_list.txt label_list.txt然后写YAML文件path: ./AeBAD train: images/train val: images/val nc: 4 names: [dent, crack, corrosion, missing]names的顺序和你在转换标注时用的class_map必须一一对应这是整个训练环节最容易出问题的地方。我会在训练之前额外打印一行代码确认names顺序“如果names顺序和类别索引对不上后面的所有分析都没意义”。4.2 模型选型与关键训练参数AeBAD这种规模的数据集我建议直接从YOLO系列的小模型起步。以yolov8为例可以先跑nano或small不推荐一上来就上large或xlarge原因有两个一是千张图片的数据量喂不饱大模型参数量大了反而容易过拟合二是后面部署到产线时推理速度往往是硬指标nano和small在边缘设备上能跑到实时large基本只能上服务器。训练命令大概是yolo detect train dataAeBAD.yaml modelyolov8n.pt epochs100 imgsz640 batch16这里几个参数值得展开说imgsz建议设成640起步因为叶片缺陷是小目标如果设备显存允许直接上1280往往能带来明显的召回率提升。代价是训练时间和显存占用成倍增加。我一般先640看基线再拿1280做一轮对比两者取优。epochs设100到150比较合理。这个数据量下模型通常在几十个epoch内就收敛了设太多反而浪费时间。batch大小取决于显卡显存但要注意batch太小会导致BN层统计不稳定。如果只能用batch4这种小批量建议把模型中BN的momentum调低一点。预训练权重用yolov8n.pt而不是完全从头训练。叶片缺陷虽然特殊但COCO预训练模型已经学会了通用的边缘、纹理、形状特征迁移过去能大幅加快收敛。4.3 训练过程中的关键监控指标训练不是把命令跑完就完事了。要盯着三个东西看box_loss、cls_loss和验证集mAP50。如果box_loss持续下降但mAP一直不动多半是数据出了问题比如标注框质量差或者类别定义不清。如果loss下降很快但val mAP震荡剧烈说明过拟合或验证集太小232张验证图确实会带来不小的波动。有个实用技巧训练过程中每隔几十个epoch保存一次权重最后用验证集把所有checkpoint都测一遍挑mAP50最高的那个而不是默认用最后一个epoch的权重。有时候模型在训练后期已经过拟合了中间的checkpoint反而性能更好。这个习惯在数据量小的项目上尤其重要。4.4 评估阶段除了mAP还要看什么训练完跑验证集mAP50只是第一层信息。我至少还会看两个东西每个类别的单独AP和PR曲线。类别AP能直接告诉你哪一类是短板。如果裂纹的AP只有其他类别的一半那后面所有的优化资源都应该优先砸向裂纹。还有一张混淆矩阵也很关键它能告诉你模型具体把哪两类搞混了。如果“腐蚀”经常被误报成“涂层脱落”那说明这两个类在视觉特征上确实太接近。这时候算法的改进空间有限更务实的做法是回到类别定义层面去问业务方这两个类在维修决策上是否需要区分如果不需要合并就是最优解。5. 实战踩坑小缺陷漏检、类不均衡与现场误报5.1 小目标漏检先算算你的框有多小我在开头说过拿到数据集先看标注框尺寸分布。这里展开讲为什么。YOLO系列的下采样步长是32也就是说输入640的图特征图只有20x20。如果一个缺陷在640尺度下小于32个像素它的信息在浅层特征图上就可能只剩下一个点模型很难学出有效特征。具体操作上我给你一个判断标准把所有标注框的短边像素值统计一下如果大量框的短边在20像素以下就必须处理小目标问题。可选方案有这么几个层次最简单的是把imgsz增大到1280让小目标拥有更多的特征像素通常能稳定提升几个点的召回率。更进一步是切图推理把大图切成若干小块分别检测再合并结果。这个方案在小目标检测里几乎是必杀技但要注意切图会破坏叶片边缘的上下文切块之间要有重叠然后用NMS合并重叠区域的目标框。还可以在YOLO框架里调整anchor或者使用针对小目标的检测头但AeBAD规模的数据下这类结构级改动风险较大收益不一定显著。我自己的实践经验是先用imgsz640跑通流程确认基线没问题之后再花半天时间用imgsz1280重训一次。如果mAP50的提升超过3个点就说明小目标确实是主要矛盾后续切图、多尺度训练都值得做。5.2 类不均衡不要指望loss自己“摆平”前面说过叶片缺陷数据集几乎必然是长尾分布。解决类不均衡我的优先级排序是这样的第一优先是数据层面。看能不能补充少数类数据或者用更强的数据增强加持少数类。比如裂纹这类细线状目标旋转、轻微缩放、随机透视变形都比较安全但要注意有些增强对缺陷检测是有害的比如水平翻转对左右对称的叶片没问题对带有方向性纹理的裂纹就要谨慎。第二优先是损失函数层面的调整。经典的做法是给少数类加权重YOLO里可以直接修改cls_loss的权重系数。不少新框架也内置了focal loss机制对难样本自动加大梯度。但这些手段都是“在同样的数据里多榨一点”不要指望它们能弥补数据的根本短缺。第三优先是把类别合并或删除。如果某个类只有二三十个框且和另一个类视觉特征重合度高合并是最实际的选择。我做过一个项目把六个类合并成四个mAP50从0.61涨到0.72合并后业务方也认为分类粒度完全够用。不要为了“看起来先进”而强行保留数据量撑不起的类别。5.3 反光、油污和标签噪声现场误报的三个来源AeBAD里的图片毕竟是经过筛选的真实产线上的图要脏得多。我在实际项目里看到过三种典型的误报来源趁这个机会一起说第一种是金属反光。叶片表面光照不均时高光区域会产生类似裂纹的细长亮线暗角区域则可能让凹坑看起来像阴影。应对思路是数据增强里加入亮度、对比度、锐化的随机扰动更高级的做法是在训练图里人为叠加真实光照变化。第二种是油污和积碳。这些附着物和腐蚀、烧蚀在视觉上高度相似即使人眼都容易判断错。这种问题不是模型能单独解决的要么在图像采集端增加固定光源和清洁流程来压制干扰要么加入一个前置的“图像质量判断”模块把质量不合格的图直接打回重拍。第三种是标签噪声。AeBAD整体标注质量应该不错但人工标注难免有漏标和错标。如果某个类别的AP异常低我建议把该类别所有标注框在原图上画出来人工过一遍。你可能会发现部分框的位置偏了半个目标甚至框里根本不是缺陷。清洗掉这些噪声标注往往比更换模型结构更有效。这也是我坚持“先清洗后调参”的原因。5.4 域差异公开数据集训出来的模型别直接上产线AeBAD的图片和实际产线上拍的图大概率存在域差异。可能差在相机型号、分辨率、拍摄距离、光照条件甚至叶片表面状态。这种差异会让模型在实验室测试时很漂亮一到现场就疯狂误报。处理域差异有两个方向。一个是收集少量的现场数据比如一两百张对模型做微调。这里关键是微调时要把现场数据按8:2切分现场验证集绝不能掺入训练。另一个是图像预处理层面的对齐比如把现场图像统一缩放到和训练数据相似的分辨率、做直方图匹配、或者应用相同的图像增强管线让模型看到的图像统计特征尽量接近训练时的分布。如果现场采集条件可控我更推荐的办法是主动设计采集规范固定光源角度、固定相机参数、统一拍摄距离。这听起来是工程问题而不是算法问题但实际效果往往比调模型还大。6. 从数据集到产线迁移学习、数据回灌与部署建议6.1 把AeBAD当成“预训练数据”而不是终点AeBAD的定位应该是“冷启动数据集”而不是最终交付数据。比较好的使用路径是先在这个数据集上把训练、验证、评估的完整流程跑通确定模型结构、超参数和标注规范然后带着这套经验去处理自己采集的真实数据。具体做法是先在AeBAD上训练一个基础模型然后用这个模型的权重作为预训练权重在自己的现场数据上微调。相比直接用COCO预训练权重用AeBAD权重的好处是模型已经见过叶片这类目标的纹理和形态迁移时收敛更快最终精度往往也更高。前提是你的现场数据和AeBAD的类别体系能对应上。如果不能那就只迁移浅层特征重新定义检测头。6.2 自标注与人工复核把数据集越滚越大一个现实问题是现场采集到的带缺陷图片永远不够用。这时候可以把“半监督学习”和“人工复核”结合起来做数据回灌。流程是这样的用现有模型对一批无标注的现场图片做推理把置信度高的检测结果转成伪标签再由质检人员快速复核修正修正后的数据进入下一轮训练。这个闭环跑起来之后数据量会越滚越大模型也会越来越贴合现场分布。但伪标签有个陷阱模型自己的错误会被当成“标准答案”回灌错误会自我强化。所以伪标签的置信度阈值要设得比较高并且每一批回灌数据都要抽样人工复核确保质量。另外现在也有不少团队尝试用图像生成或扩散模型来合成缺陷样本补充少数类。这类方法在叶片缺陷上还在探索阶段生成的缺陷形态和真实损伤可能存在差异使用时要谨慎评估。目前来看最可靠的方式仍然是“真实数据伪标签人工复核”的组合。6.3 部署阶段的量化与提速选择训练完成后进入部署通常要把模型导出为ONNX或TensorRT格式。叶片缺陷检测的部署目标一般有两种形态一种是边缘设备上的实时推理比如孔探过程中同步检测另一种是服务器端的批量分析比如检查完一批视频后统一跑一遍。边缘设备上INT8量化是常见的提速手段。但量化对小目标检测的影响比较大裂纹这类细特征在量化后可能直接消失。稳妥的做法是先导出FP16模型测一遍精度再试INT8对比mAP50的掉点是否可接受。如果INT8导致裂纹类别AP掉了超过5个点就不要省那点延迟老老实实用FP16。还有一个容易被忽略的问题部署时的图像预处理必须和训练时保持一致。YOLO训练时默认做了letterbox也就是把原图等比缩放到640x640并填充灰边部署时如果直接resize成正方形而不填充输入分布变了精度会莫名其妙地掉好几个点。这类问题排查起来很隐蔽但一旦定位到解决起来只要几分钟。6.4 最后给新人的一点实操顺序建议接触AeBAD这类数据集我建议你按这个顺序走不要跳步先花半天时间人工看图建立对4类异常的直观认识同时核对标签质量。跑一遍标注统计脚本明确每类框数量、尺寸分布判断小目标和类不均衡的严重程度。用yolov8n以imgsz640训一个基线模型把流程跑通。跑测试集输出每个类的AP和混淆矩阵定位主要问题。针对最大短板做优化要么调imgsz要么做增强要么清洗数据。把最终模型导出为ONNX/TensorRT用完全没参与训练和验证的“盲测图”做最终评估。这里面第6步最容易被赶进度的人省略但恰恰是最重要的一步。没有盲测图你永远不知道模型在新数据上到底行不行。我见过太多项目在验证集上mAP很高拿到现场一测就现原形的案例都是因为缺了这一步。就我个人体会而言AeBAD这种规模的数据集最大的价值不是让你练出一个直接能商用的模型而是逼着你把“从数据到部署”的每一个环节都亲手走一遍。小目标、类不均衡、标签噪声、域差异这些工业缺陷检测里的经典问题在这个数据集上全都会遇到而且因为数据量小每个问题的信号反而特别清晰特别适合用来建立方法论。最后再分享一个小技巧训练过程中把所有实验的超参数、数据切分方式、图像预处理配置都记录下来。等数据量变大之后你会发现当初做的这组“小数据实验”就是最有价值的方向筛选器能帮你避开很多弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑