ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

铝片表面缺陷检测数据集:VOC+YOLO双格式400张4类别实战指南

2026/9/23 12:52:53 拓冰建站 浏览量
铝片表面缺陷检测数据集:VOC+YOLO双格式400张4类别实战指南 简介本资源为铝片表面工业缺陷检测数据集面向从事工业质检、表面缺陷识别方向的算法工程师与深度学习学习者可用于目标检测模型的训练、验证与算法对比实验。数据集同时提供Pascal VOC与YOLO两种标注格式包含jpg图片及对应的xml、txt标注文件标注工具为labelImg共4个类别擦伤、脏污、折皱与针孔各类别框数分别为270、456、124、212总框数达1062类别分布较为均衡便于直接投入训练。压缩包为7z格式共1202个文件其中402个txt、400个xml、400个jpg整体约15.25MB体积轻量、结构清晰适合快速下载与本地部署。目前已有526人学习下载可作为工业缺陷检测入门练手或小样本实验的实用数据支撑。1. 铝片表面缺陷检测数据集400 张 VOCYOLO 双格式到底能干什么产线上铝片表面缺陷检测最卡脖子的往往不是模型选型而是手里没有一份能直接开训的标注数据。这份「铝片表面工业缺陷检测数据集 VOCYOLO 格式 400 张 4 类别」解决的正是这个起点问题400 张实拍铝片表面图覆盖 4 类典型工业缺陷同时给出 VOC 的 XML 标注和 YOLO 的 TXT 标注两套格式。它适合三类人——想快速跑通 YOLO 训练闭环的算法新手、需要做缺陷检测方案验证的机器视觉工程师、以及拿它当打标模板做数据扩充的产线技术人员。400 张不算大但胜在类别清晰、双格式齐全能让你在一个下午内把「数据→训练→推理→看结果」整条链路走通而不是把时间耗在格式转换和标注清洗上。下面按「先看清数据、再跑通训练、最后避坑调优」的顺序讲透。2. 拆开这份铝片缺陷数据集4 类别、双格式与目录结构2.1 400 张 4 类别意味着什么先给一个不绕弯的判断400 张、4 类别平均每类 100 张左右这是一个「验证流程够用、直接上产线不够」的规模。它的正确用法是拿来跑通 pipeline、验证标注规范、做 baseline 对比而不是指望训出一个能直接部署的高精度模型。铝片表面缺陷的常见 4 分类一般是划痕、凹坑、脏污、氧化色差这一类具体类别名以数据集内classes.txt或 XML 里的name字段为准拿到手第一件事就是打开确认别凭猜。为什么强调「先确认类别名」因为 VOC 和 YOLO 两套标注里类别顺序和拼写必须完全一致否则训练时会出现「标签对不上、loss 不降」的玄学问题。我一般拿到数据集先跑一段统计脚本把每类数量、图片尺寸分布、标注框大小分布一次性看清楚心里有底再动手。import os, glob import xml.etree.ElementTree as ET from collections import Counter # 统计 VOC 标注里每个类别的框数量 xml_dir Annotations # VOC 的 XML 目录 counter Counter() for xml_path in glob.glob(os.path.join(xml_dir, *.xml)): tree ET.parse(xml_path) root tree.getroot() for obj in root.findall(object): name obj.find(name).text.strip() counter[name] 1 print(类别分布:, dict(counter)) print(总框数:, sum(counter.values()))这段脚本做三件事遍历所有 XML、提取每个object的name、用 Counter 汇总。跑完你会得到类似{scratch: 120, pit: 95, ...}的结果。参数说明xml_dir换成你实际的标注目录如果某类数量明显偏少比如低于 50后面训练时就要考虑过采样或加权。这一步花两分钟能省掉后面几小时的排查。2.2 VOC 与 YOLO 格式的差异与转换VOC 和 YOLO 的核心差异就一句话VOC 存的是绝对像素坐标(xmin, ymin, xmax, ymax)YOLO 存的是归一化中心点加宽高(cx, cy, w, h)且都是 0~1 之间的小数。很多人转换后训练不收敛八成是归一化时用错了图片尺寸——XML 里的size字段才是准的别用你后来 resize 的尺寸去算。import os from xml.etree import ElementTree as ET classes [scratch, pit, stain, discolor] # 必须与标注一致 xml_dir, out_dir Annotations, labels os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue root ET.parse(os.path.join(xml_dir, xml_file)).getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) lines [] for obj in root.findall(object): cls obj.find(name).text.strip() if cls not in classes: continue b obj.find(bndbox) xmin, ymin float(b.find(xmin).text), float(b.find(ymin).text) xmax, ymax float(b.find(xmax).text), float(b.find(ymax).text) # 归一化中心点 宽高全部除以原图尺寸 cx, cy (xmin xmax) / 2 / w, (ymin ymax) / 2 / h bw, bh (xmax - xmin) / w, (ymax - ymin) / h lines.append(f{classes.index(cls)} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) with open(os.path.join(out_dir, xml_file.replace(.xml, .txt)), w) as f: f.write(\n.join(lines))逻辑说明先读原图宽高再对每个框做归一化类别名映射成索引。参数说明classes列表顺序决定 YOLO 标签里的数字训练时的data.yaml必须用同样顺序:.6f保留 6 位小数是 YOLO 官方推荐精度别省。转换完随手抽查几个 TXT确认数值都在 0~1 之间出现大于 1 的就是坐标越界多半是标注框超出了图片边界。2.3 目录该怎么摆标准 YOLO 训练目录长这样照着摆不会错dataset/ ├── images/ │ ├── train/ # 约 320 张 │ └── val/ # 约 80 张 ├── labels/ │ ├── train/ │ └── val/ └── data.yamldata.yaml内容path: ./dataset train: images/train val: images/val nc: 4 names: [scratch, pit, stain, discolor]注意nc必须等于类别数names顺序必须和转换脚本里的classes完全一致。图片和标签文件名要一一对应a.jpg对a.txt少一个标签文件训练时那张图会被当成负样本白白污染数据。3. 用这份数据集跑通 YOLO 训练从环境到第一个权重3.1 环境配置与最小可跑命令环境这块YOLOv8 用 Anaconda 建个干净环境最省心别在 base 里折腾。核心就三样Python 3.9、PyTorch带 CUDA 版本按你显卡选、ultralytics。conda create -n alu_defect python3.10 -y conda activate alu_defect pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics参数说明cu118对应 CUDA 11.8你的驱动版本低就换cu117或纯 CPU 版ultralytics装完自带yolo命令行。验证是否装好yolo checks能打印出环境信息、检测到 GPU 就说明通了。这一步翻车的典型是 PyTorch 和 CUDA 版本对不上torch.cuda.is_available()返回 False训练时默默跑在 CPU 上慢到你以为卡死了。3.2 训练参数怎么设400 张的小数据集直接上大模型容易过拟合我一般从yolov8nnano起步先看流程通不通再考虑换s或m。yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/alu \ nameexp1参数说明epochs100对小数据集够用配合patience20早停验证集 20 轮不涨就停省时间imgsz640是默认输入尺寸铝片缺陷如果很小比如细划痕可以提到 1024但显存和速度要权衡batch16显存不够就降到 8 或 4lr00.01是初始学习率小数据集别设太大否则 loss 震荡。训练日志里重点盯mAP50和mAP50-95两个指标前者宽松后者严格两个都在涨才健康。3.3 推理与结果查看训练完权重在runs/alu/exp1/weights/best.pt拿它跑推理yolo detect predict \ modelruns/alu/exp1/weights/best.pt \ sourcedataset/images/val \ conf0.25 \ saveTrue参数说明conf0.25是置信度门限漏检多就降到 0.15误检多就提到 0.4这个值没有标准答案得看你的业务更怕漏还是更怕误saveTrue把画框结果存到runs/detect/predict。跑完打开图看重点看三类问题框歪了标注问题、同类缺陷框大小差异巨大数据分布问题、背景被误检负样本不足。这一步是判断数据集质量最直接的方式比看任何指标都直观。4. 铝片缺陷检测的避坑清单5 个我踩过的坑4.1 坑一类别名大小写不一致导致标签全丢现象训练能跑但 loss 一直不降mAP接近 0。原因XML 里写的是Scratchdata.yaml里写的是scratch转换脚本按小写匹配结果所有框被if cls not in classes过滤掉标签文件全是空的。解决转换前先print(set(所有name))看真实拼写统一成一种写法再转。空标签文件是隐形杀手训练时不会报错只会让你怀疑人生。4.2 坑二图片和标签没对齐现象训练报No labels found或者某张图明明有缺陷却检测不出。原因images/train里有a.jpg但labels/train里没有对应的a.txt或者文件名大小写、后缀不一致。解决写个校验脚本遍历图片目录检查每个图是否有同名 TXT缺的列出来补上或删图。这个检查我每次训练前必跑两行代码的事。4.3 坑三小目标缺陷被 resize 吃掉现象大缺陷检得挺好细划痕、小凹坑全漏。原因原图可能是 2000 像素训练时统一 resize 到 640小缺陷缩到几个像素特征直接没了。解决要么提高imgsz到 1024/1280要么用切片推理把大图切小块分别检测再合并。铝片细划痕这类小目标imgsz提到 1024 通常有明显改善代价是显存翻倍。4.4 坑四验证集和训练集分布不一致现象训练集指标很高验证集一塌糊涂。原因随机划分时某类缺陷恰好全被分到训练集验证集里没有这类样本。解决按类别分层划分保证每类在训练集和验证集里都有合理比例。400 张的规模验证集留 20%约 80 张每类至少留 15~20 张。4.5 坑五拿 400 张直接上产线现象实验室 mAP 0.9产线上误检漏检一堆。原因400 张覆盖不了真实产线的光照变化、铝片批次差异、相机角度变化。解决把这份数据集当 baseline 和标注模板产线部署前用现场数据做增量训练至少补到每类几百张、覆盖不同光照和批次。400 张能证明方案可行证明不了能上线。5. 把 400 张用出 4000 张的效果数据增强与增量迭代小数据集的出路不是硬训而是「增强 迭代」。YOLO 训练时自带在线增强mosaic、hsv、flip等默认就开着但针对铝片缺陷我一般会手动调几个参数。hsv_h、hsv_s、hsv_v控制色调、饱和度、亮度扰动铝片表面反光敏感hsv_v可以适当调大让模型适应不同光照degrees旋转角度别开太大工业缺陷有方向性转 180 度可能把划痕方向语义搞乱mosaic对小数据集提升明显但训练后期建议关掉close_mosaic让模型在真实分布上收敛。离线增强也值得做用imgaug或albumentations对训练集做翻转、亮度调整、加噪声把 320 张扩到 1000 张再训。但要注意增强出来的图不能进验证集否则指标虚高。更关键的是增量迭代闭环第一版模型训完拿它去推理一批没标注的现场图把高置信度的预测当预标注人工修正后加入训练集再训第二版。这个循环跑两三轮效果提升往往比换更大模型还明显。我自己的习惯是每轮迭代都固定验证集不变这样指标才可比。最后说个验证技巧别只看mAP把混淆矩阵调出来看训练完自动生成confusion_matrix.png哪两类互相误判一目了然。铝片缺陷里「脏污」和「氧化色差」经常混看到混淆矩阵里这两个数高就知道该补这两类的区分性样本了。这套流程我跑过不止一次最深的教训是数据集小不可怕可怕的是标注不规范还硬训。拿到任何一份 VOCYOLO 数据集先花半小时做统计和校验比急着敲训练命令值钱得多。希望帮到你。本文还有配套的精品资源点击获取