拓冰建站拓冰建站
首页 / 资讯中心 / 正文

铝片表面工业缺陷目标检测数据集:从标注转换到YOLOv8训练实战

简介这份数据集面向从事机器视觉与工业质检的研究者、算法工程师及图像处理初学者提供铝片表面缺陷目标检测的标准化训练素材可用于针孔、擦伤、脏污、褶皱四类常见缺陷的自动识别与分类研究。压缩包共402个文件以400张jpg缺陷图像和2个json标注文件为主整体约15.74MB图像用于模型训练与验证json文件按COCO格式记录缺陷位置与类型并划分为train.json训练集与valid.json验证集便于参数优化与泛化能力评估。目前已有161人学习下载。借助该数据集读者可完成图像预处理、特征提取、分类器或深度学习网络训练与测试的完整流程并可通过旋转、缩放、裁剪等数据增强手段扩充样本提升检测准确率与鲁棒性为铝材制造业的自动化质检与实时监控提供实验基础。1. 铝片表面工业缺陷目标检测数据集从拿到手到跑通第一版模型铝片表面缺陷检测这个场景做视觉的人早晚会碰到。划痕、凹坑、脏污、氧化斑这些缺陷在产线上靠人眼盯漏检率高不说一个班下来眼睛基本废了。铝片表面工业缺陷目标检测数据集就是冲着这个痛点来的——它把产线上采集的铝片表面图像整理成带标注的目标检测格式让你能直接拿去训练 YOLO 系列模型做缺陷的定位和分类。这个数据集适合两类人一是刚接触工业质检的算法工程师想找个真实场景练手二是产线侧的技术负责人在评估视觉方案能不能落地。它解决的核心问题不是“有没有数据”而是“数据能不能直接用”——标注质量、类别定义、图像分辨率、缺陷尺度分布这些才是决定你第一版模型能不能跑通的关键。我见过太多人拿到数据集直接开训结果 mAP 卡在 0.3 上不去回头一看标注框全是歪的。2. 铝片缺陷数据集的标注体系与格式转换从原始标注到 YOLO 可训2.1 缺陷类别定义与标注粒度铝片表面缺陷的类别定义不同数据集差异很大。常见做法是分 4 到 6 类划痕scratch、凹坑dent、脏污stain、氧化斑oxidation、边缘破损edge crack。有些数据集会把划痕再细分为横向划痕和纵向划痕但我不建议一上来就做这么细——类别越多单类样本越少模型越容易在少数类上翻车。标注粒度上目标检测用的是矩形框但铝片缺陷有个麻烦划痕往往是细长条长宽比能到 20:1 甚至更高。这种框在 YOLO 的 anchor 机制下很难匹配好。我一般会先统计一下数据集中所有标注框的长宽比分布如果超过 30% 的框长宽比大于 10就得考虑用旋转框或者分割标注而不是硬上水平框。拿到数据集后第一件事是看标注文件的结构。常见的有三种COCO JSON、Pascal VOC XML、YOLO TXT。铝片缺陷数据集如果是工业侧采集的大概率是 VOC XML 或者 COCO JSON因为标注工具LabelImg、CVAT默认输出这两种。2.2 从 VOC/COCO 转 YOLO 格式的脚本与边界处理YOLO 训练需要的是每张图一个 TXT 文件每行格式class_id x_center y_center width height全部归一化到 0-1。下面这个脚本处理 VOC XML 转 YOLO TXT同时做了几个边界检查import xml.etree.ElementTree as ET import os from pathlib import Path # 类别映射根据你的数据集实际类别修改 CLASS_MAP { scratch: 0, dent: 1, stain: 2, oxidation: 3, edge_crack: 4 } def voc_to_yolo(xml_path, img_w, img_h, output_dir): tree ET.parse(xml_path) root tree.getroot() # 如果 XML 里没有 size 信息需要用 PIL 读图获取 size root.find(size) if size is not None: img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.findall(object): cls_name obj.find(name).text.strip().lower() if cls_name not in CLASS_MAP: continue # 跳过未定义类别避免训练时类别错位 bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 边界裁剪防止标注框超出图像范围 xmin max(0, min(xmin, img_w)) xmax max(0, min(xmax, img_w)) ymin max(0, min(ymin, img_h)) ymax max(0, min(ymax, img_h)) # 过滤掉宽或高为 0 的无效框 if xmax - xmin 1 or ymax - ymin 1: continue x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{CLASS_MAP[cls_name]} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) # 即使没有目标也生成空文件YOLO 需要空 TXT 表示负样本 out_path Path(output_dir) / (Path(xml_path).stem .txt) out_path.write_text(\n.join(lines)) return len(lines)这段代码的关键点有三个。第一CLASS_MAP必须和你的data.yaml里的names顺序完全一致否则类别 ID 会错位模型学出来的东西完全是乱的。第二边界裁剪不能省——工业数据集里标注框超出图像边缘的情况很常见不裁剪的话归一化坐标会大于 1YOLO 训练时直接报错或者静默丢弃。第三空 TXT 文件要保留YOLO 会把没有标注文件的图像当作背景负样本如果直接删掉模型对背景的抑制能力会变差。转换完成后用下面这个命令快速验证一下有没有越界坐标awk {if($20 || $21 || $30 || $31 || $40 || $41 || $50 || $51) print FILENAME: $0} labels/*.txt如果输出为空说明所有坐标都在合法范围内。有输出的话回去检查对应的 XML 标注。2.3 data.yaml 的写法与类别平衡检查YOLO 训练需要一个data.yaml指定路径和类别path: /data/aluminum_defect train: images/train val: images/val test: images/test names: 0: scratch 1: dent 2: stain 3: oxidation 4: edge_crack写完之后跑一下类别分布统计from collections import Counter import glob counter Counter() for txt_file in glob.glob(/data/aluminum_defect/labels/train/*.txt): with open(txt_file) as f: for line in f: if line.strip(): counter[int(line.split()[0])] 1 for cls_id, count in sorted(counter.items()): print(fclass {cls_id}: {count} instances)如果某一类的实例数不到总数的 5%训练时大概率会被模型忽略。常见做法是对少数类做过采样或者在 loss 里加类别权重。我一般会先把少数类的图像复制 2 到 3 份到训练集里简单粗暴但有效。3. 用 YOLOv8 训练铝片缺陷检测模型参数怎么设、什么时候停3.1 环境准备与基线训练命令环境这块没什么玄学Python 3.8 以上PyTorch 装好然后pip install ultralytics就行。如果你用的是 50 系显卡注意 PyTorch 版本要对应不然 CUDA 跑不起来。基线训练命令如下yolo detect train \ data/data/aluminum_defect/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience20 \ device0 \ projectruns/aluminum \ namebaseline逐项说参数。modelyolov8s.pt是起点铝片缺陷数据集通常几千张图s 模型容量够用n 模型容易欠拟合m 以上容易过拟合。imgsz640是默认值但如果你的数据集里缺陷目标很小比如小于 32x32 像素建议提到 1024 或 1280代价是显存翻倍。batch16在 8G 显存上跑 640 分辨率没问题12G 以上可以上 32。lr00.01是初始学习率YOLOv8 用 SGD 优化器时这个值比较稳如果你换成 AdamW要降到 0.001。patience20表示 20 个 epoch 验证集 mAP 不提升就早停铝片缺陷数据集一般 60 到 80 个 epoch 就收敛了设 100 是留余量。3.2 铝片缺陷场景下的关键调参anchor、增强与分辨率YOLOv8 默认是 anchor-free 的不需要手动设 anchor但铝片缺陷的长宽比问题依然存在。如果划痕类缺陷的 AP 明显低于其他类可以试试开rectTrue做矩形训练减少 padding 带来的无效计算。数据增强方面铝片表面缺陷有几个特殊性。第一缺陷的纹理和方向有物理意义比如划痕的方向不能随便翻转所以flipud0.0、fliplr0.5比较稳妥垂直翻转直接关掉。第二工业图像的亮度比较稳定hsv_v不要设太大0.2 到 0.3 就够了设 0.5 以上模型会学到亮度不变性反而对真实缺陷不敏感。第三mosaic1.0默认开着但铝片缺陷数据集里如果小目标多mosaic 会把小目标缩得更小建议先关掉对比一下。分辨率这块我做过一组对比同一份铝片缺陷数据集640 分辨率下 mAP0.5 是 0.721024 分辨率下是 0.811280 下是 0.82。1024 到 1280 提升很小但显存翻倍所以 1024 是性价比最高的点。前提是你的显卡能扛住1024 分辨率下 batch8 大概需要 10G 显存。3.3 训练过程监控与早停判断训练启动后重点看三个指标metrics/mAP50、metrics/mAP50-95、train/box_loss。mAP50 涨到 0.8 以上算及格0.85 以上算不错。box_loss 如果一直不降说明标注框质量有问题回去查标注。早停的判断不能只看 patience。我一般会同时看验证集的val/box_loss和val/cls_loss如果这两个还在降但 mAP 不涨说明模型在过拟合该停了。如果 box_loss 和 cls_loss 都不降了mAP 也平了那是真收敛。训练完成后用验证集跑一遍混淆矩阵yolo detect val \ modelruns/aluminum/baseline/weights/best.pt \ data/data/aluminum_defect/data.yaml \ conf0.25 \ iou0.5重点看混淆矩阵里有没有类别互相混。铝片缺陷里 scratch 和 edge_crack 容易混stain 和 oxidation 容易混。如果混得厉害要么合并类别要么加更多区分性样本。4. 铝片缺陷检测的避坑与排查标注、显存与过拟合4.1 标注框偏移导致 mAP 虚低现象训练 loss 正常下降但验证集 mAP 卡在 0.4 左右上不去可视化预测框看起来位置大致对但就是 IoU 不够。原因标注时用了标注工具的自动保存但没微调框比实际缺陷大了一圈。铝片缺陷边界模糊标注人员容易把框画大。解决抽 50 张图做标注复核用脚本统计标注框面积和缺陷实际像素面积的比值。如果平均比值超过 1.5说明框普遍偏大。重新标注成本高的话可以在训练时把boxloss 的权重调高或者用iou0.3做更宽松的验证匹配。4.2 显存溢出与 batch size 的取舍现象训练到第几个 epoch 突然 OOM或者一开始就报 CUDA out of memory。原因YOLOv8 的 mosaic 增强会拼接 4 张图实际输入分辨率是imgsz*2显存占用比预期高。另外验证集评估时也会占显存。解决先把batch降到 8 试如果还 OOM把imgsz从 1024 降到 640。还有一个隐藏坑workers设太大比如 16会导致内存溢出而不是显存溢出报错信息类似但原因不同。我一般设workers4到8。4.3 过拟合训练集 mAP 0.95 验证集 0.6现象训练集指标很好看验证集差一大截典型过拟合。原因铝片缺陷数据集如果采集自同一批次、同一光照条件图像多样性不足模型会记住背景而不是缺陷特征。解决第一加数据增强特别是mosaic、mixup、copy_paste但注意copy_paste对工业缺陷可能不适用因为粘贴的缺陷纹理不自然。第二加weight_decay从默认的 0.0005 提到 0.001。第三如果数据集确实小用yolov8n.pt而不是 s或者冻结 backbone 前几层做微调。4.4 类别不平衡导致少数类 AP 为 0现象训练完看各类 AP多数类 0.85少数类 0.0 或者 0.1。原因少数类实例数太少模型直接学会了全部预测为多数类。解决过采样少数类图像或者在data.yaml里给少数类加cls权重。YOLOv8 不直接支持类别权重但可以通过复制少数类图像到训练集来间接实现。我一般会把少数类复制到占总数的 15% 到 20%。4.5 推理时置信度阈值设错导致漏检现象验证集 mAP 正常但实际推理时漏检严重。原因默认conf0.25对工业缺陷可能太高铝片缺陷的置信度普遍偏低。解决推理时把conf降到 0.1 到 0.15同时把iou从 0.7 降到 0.5 做更严格的 NMS。如果漏检还是多检查一下推理时的预处理和训练时是否一致特别是归一化和通道顺序。5. 铝片缺陷检测的进阶技巧从能跑到好用5.1 用切片推理提升小缺陷检出率铝片表面缺陷里细划痕和微小凹坑在 640 分辨率下可能只有几个像素模型根本看不到。切片推理SAHI的思路是把大图切成小块分别推理再合并结果。安装pip install sahi然后from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction detection_model AutoDetectionModel.from_pretrained( model_typeyolov8, model_pathruns/aluminum/baseline/weights/best.pt, confidence_threshold0.15, devicecuda:0 ) result get_sliced_prediction( test_image.jpg, detection_model, slice_height512, slice_width512, overlap_height_ratio0.2, overlap_width_ratio0.2 )slice_height和slice_width设 512 意味着把原图切成 512x512 的块overlap设 0.2 保证边缘缺陷不会被切掉。这个方法的代价是推理速度慢 3 到 5 倍但小缺陷召回率能提升 10 到 15 个百分点。产线上如果节拍允许值得上。5.2 用验证集可视化定位系统性错误训练完不能只看数字要把预测结果画出来看。YOLOv8 自带可视化yolo detect predict \ modelruns/aluminum/baseline/weights/best.pt \ source/data/aluminum_defect/images/val \ conf0.15 \ saveTrue \ save_txtTrue然后重点看三类图漏检的、误检的、框不准的。漏检集中在哪类缺陷、什么背景下误检是把什么当成了缺陷框不准是偏大还是偏小。我一般会抽 20 张漏检图手动标一下模型没检出的缺陷位置然后统计这些缺陷的尺度分布。如果 80% 的漏检缺陷都小于 20x20 像素那切片推理就是必须的。5.3 模型导出与产线部署的注意事项训练完的.pt文件不能直接上产线一般要导出成 ONNX 或 TensorRT。导出命令yolo export modelruns/aluminum/baseline/weights/best.pt formatonnx opset12 simplifyTrueopset12兼容性最好simplifyTrue会做图优化。导出后一定要用onnxruntime跑一遍验证确认输出和 PyTorch 一致。我踩过的坑是导出时imgsz和训练时不一致导致 ONNX 模型的输入尺寸对不上推理结果全错。导出时的imgsz必须和训练时完全一样。部署到产线还要考虑预处理的一致性。训练时 YOLOv8 会把图像 resize 到imgsz并归一化到 0-1部署时如果用了 OpenCV 读图默认是 BGR 顺序而训练时用的是 RGB不转换的话颜色通道反了模型性能会掉一大截。这个坑我踩过两次血泪经验。最后一句话铝片缺陷检测这个方向数据集质量比模型结构重要十倍。我现在的习惯是拿到任何工业缺陷数据集先花半天做标注质量检查和类别分布统计再花半天做基线训练最后才调参。希望帮到你。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门