
简介这份资源面向从事工业质检、缺陷检测算法开发与目标检测入门的学习者提供铝片表面缺陷图像数据集可直接用于YOLOv5训练与验证省去自行标注与格式转换的环节。数据按YOLOv5目录结构组织共2000个文件以1401个txt标签、598张jpg图像和1个可视化py脚本为主压缩包约81.92MB包含训练集1120张图片及对应标签、验证集280张图片及对应标签图像为640×480的RGB图片。缺陷类别共4类针孔、擦伤、脏污、褶皱并附有类别文本信息。配套的py脚本可随机读取一张图片绘制边界框并保存到当前目录无需修改即可运行便于快速检查标注质量与数据分布。目前已有195人学习适合用于算法验证、课程实验与工业缺陷检测项目原型开发。1. 铝片表面缺陷检测数据集4 类瑕疵、1400 张图YOLOV5 目录直接开训产线上铝片表面那点针孔、擦伤肉眼盯着看一天漏检是迟早的事。这份铝片表面缺陷图像目标检测数据集就是冲着这个场景来的4 个类别——针孔、擦伤、脏污、褶皱训练集 1120 张图配 1120 个 txt 标签验证集 280 张图配 280 个标签图像统一 640×480 的 RGB整体 82MB按 YOLOV5 的文件夹结构摆好解压就能挂到训练脚本上。它适合两类人一类是想跑通 YOLOV5 训练自己数据集流程、但手头没有标注数据的算法工程师另一类是做工业质检、想先拿现成数据验证检测方案可行性的从业者。不用自己标、不用转格式这是它最省事的地方。2. 目录结构与标签格式先搞清 YOLOV5 到底认什么拿到一个数据集我第一件事不是急着训练而是把目录翻一遍确认它跟框架的约定对不对得上。YOLOV5 对数据集的目录结构和标签格式有硬性要求对不上训练脚本第一轮就报错或者更坑——不报错但学不到东西。2.1 训练集/验证集的目录约定这份数据按 YOLOV5 的标准结构组织核心是 images 和 labels 两个平行目录各自再分 train 和 val。结构大致是这样datasets/ ├── images/ │ ├── train/ # 1120 张 .jpg │ └── val/ # 280 张 .jpg ├── labels/ │ ├── train/ # 1120 个 .txt │ └── val/ # 280 个 .txt └── classes.txt # 4 类别名称关键点在于 images 和 labels 的路径要能对应上。YOLOV5 默认的查找逻辑是把 images 路径里的/images/替换成/labels/再把扩展名换成.txt去找同名标签文件。所以images/train/1163.jpg必须对应labels/train/1163.txt文件名主干一模一样差一个字符都找不到标签。我见过有人把标签目录命名成label少个 s或者labels_train训练时一张标签都匹配不上loss 直接不降排查半天才发现是目录名的事。2.2 标签 txt 里到底存了什么每个 txt 文件对应一张图里面每一行是一个目标框格式是class_id x_center y_center width height这五个值里class_id是类别索引从 0 开始后面四个都是归一化到 0~1 的浮点数分别表示框中心点的 x、y 坐标和框的宽、高全部除以图像宽高得到。注意是中心点坐标加宽高不是左上角加右下角这是 YOLO 系列跟很多标注工具默认格式不一样的地方转换时最容易翻车。这份数据的 4 个类别按常见约定映射成class_id类别名称0针孔1擦伤2脏污3褶皱classes.txt里按这个顺序写四行类别名训练时data.yaml的names字段也要跟它一致。顺序错了不会报错但模型会把针孔当褶皱学最后指标看着还行、实际全错位这种玄学问题最耗人。2.3 用可视化脚本先验一遍数据数据集自带的那个可视化 py 文件别跳过它是训练前最省事的体检工具。随机传入一张图它会把边界框画出来存到当前目录。我一般会改一下让它批量跑几张快速看标注有没有明显偏移。import cv2 import os import random # 类别名顺序必须和 classes.txt 一致 classes [针孔, 擦伤, 脏污, 褶皱] img_dir datasets/images/train label_dir datasets/labels/train # 随机抽 6 张看看 samples random.sample(os.listdir(img_dir), 6) for name in samples: img_path os.path.join(img_dir, name) img cv2.imread(img_path) h, w img.shape[:2] label_path os.path.join(label_dir, name.replace(.jpg, .txt)) if not os.path.exists(label_path): print(f缺标签: {name}) continue with open(label_path) as f: for line in f: cid, xc, yc, bw, bh map(float, line.split()) # 归一化坐标还原成像素坐标 x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, classes[int(cid)], (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imwrite(fvis_{name}, img) print(f已保存 vis_{name})这段脚本的逻辑很直白读图拿到宽高读对应 txt把归一化坐标乘回像素尺寸画框、写类别名。参数上唯一要盯的是classes列表的顺序必须和classes.txt、data.yaml三处完全一致。跑完打开生成的vis_xxx.jpg如果框都贴在缺陷上、类别名也对说明这份数据的标注是干净的可以放心进训练。要是框整体偏移或者尺寸不对多半是坐标格式理解错了得回头查标签。3. 挂上 YOLOV5 开训data.yaml 配置与关键参数数据验完接下来就是把它接进 YOLOV5 的训练流程。这一步的坑主要集中在配置文件的路径写法和几个影响收敛的超参上。3.1 data.yaml 怎么写才不出错YOLOV5 用data.yaml描述数据集位置和类别这份数据对应的配置大概长这样# 数据集根路径指向你解压后的 datasets 目录 path: ./datasets train: images/train # 相对 path 的路径 val: images/val # 类别数这份数据是 4 nc: 4 # 类别名顺序必须和 classes.txt 一致 names: 0: 针孔 1: 擦伤 2: 脏污 3: 褶皱path用相对路径还是绝对路径都行但相对路径是相对于你运行训练命令时的工作目录不是相对于 yaml 文件本身。这是很多人栽的地方yaml 放在data/下path写./datasets结果在项目根目录跑训练它去找根目录下的 datasets找不到就报No labels found。稳妥做法是path直接写绝对路径或者确认自己始终在同一个目录下执行命令。nc和names的条目数必须对上写nc: 4却只列了 3 个名字训练启动时就会抛断言错误。类别名用中文没问题YOLOV5 内部按索引处理显示时才用到名字但要注意文件编码存成 UTF-8不然读 yaml 时可能乱码。3.2 训练命令与几个不能乱动的参数配置好了训练命令本身不复杂python train.py \ --data data/aluminum.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0逐个说下参数。--weights yolov5s.pt是从官方预训练权重起步这份数据只有 1400 张图从零训很容易过拟合用预训练权重做迁移学习收敛快得多小数据集上这是常规操作。--img 640是训练输入尺寸原图是 640×480设成 640 会做 letterbox 缩放保持长宽比补边到 640×640这是 YOLOV5 的默认行为不用改。--batch 16看显存8G 显存跑 yolov5s 加 640 尺寸16 一般稳爆显存就降到 8。--epochs 100对小数据集够用配合早停默认 patience 100基本不会白跑。有个参数新手容易忽略--rect。默认训练是方形输入开启--rect会用矩形推理减少补边对 640×480 这种非方形图能提速但小数据集上收益有限我一般不开保持默认省心。3.3 训练过程看什么指标训练一跑起来终端会刷一堆指标别只盯着 loss。重点看这几个box_loss、obj_loss、cls_loss三个损失分别管框回归、目标置信度、分类正常都是下降趋势。如果cls_loss一直不降多半是类别标签有问题。mAP0.5验证集上的平均精度这是最终看效果的硬指标。小数据集上能到 0.7 以上就算不错具体看缺陷本身的辨识度。Precision/Recall精确率和召回率工业质检里召回率往往更关键漏检比误检代价大。训练完权重存在runs/train/exp/weights/下best.pt是验证集上表现最好的last.pt是最后一轮的。部署或推理用best.pt。4. 避坑与排查这份数据最容易翻车的五个地方数据集再干净接进训练流程也总有几处会绊人。下面这几条是我在实际跑这类工业缺陷数据时反复遇到的按现象、原因、解决拆开写。4.1 报 No labels found但标签明明在现象训练启动直接报No labels found in ...或者警告0 labels但你去目录里看txt 文件一个不少。原因九成是 images 和 labels 的路径对应关系断了。要么 labels 目录名不叫labels要么 train/val 层级对不上要么 yaml 里的train路径写的是 images 的路径但实际指向了别处。解决先确认目录结构严格是images/train对labels/train。然后检查 yaml 里train字段——它应该指向 images 下的目录YOLOV5 自己会去推 labels 路径。如果目录名实在改不了就得改 YOLOV5 源码里的img2label_paths函数但更省事的是把目录名改对。4.2 训练 loss 不降mAP 一直是 0现象跑了几十个 epochloss 纹丝不动mAP 始终 0。原因标签格式不对。常见的是坐标没归一化直接写了像素值或者用了左上角右下角格式而不是中心点宽高。YOLOV5 对超出 0~1 范围的坐标会做裁剪但如果整批都是像素值等于所有框都挤在图像左上角一小块模型学不到东西。解决随便打开一个 txt看数值是不是都在 0~1 之间。如果出现几百这种数就是没归一化。用可视化脚本画一下框框的位置对不对一眼就能看出来。4.3 显存爆了CUDA out of memory现象训练刚起步就CUDA out of memory。原因--batch或--img设太大。yolov5s 在 640 尺寸下batch 16 大概吃 6~8G 显存显存小或者同时开了别的进程就容易爆。解决先把 batch 降到 8 甚至 4还不行就降--img到 512。另外 YOLOV5 支持--batch -1自动选 batch但自动模式有时选得偏大不如手动稳。4.4 类别名中文乱码现象训练日志或推理结果里类别名显示成乱码。原因yaml 或 classes.txt 的编码不是 UTF-8或者终端本身不支持中文显示。解决用编辑器把文件另存为 UTF-8 无 BOM 格式。如果只是终端显示问题不影响训练推理时用 OpenCV 画中文需要额外处理字体但那是显示层的事跟数据无关。4.5 验证集指标虚高实际推理一塌糊涂现象验证集 mAP 挺好看拿新图一测框得乱七八糟。原因训练集和验证集如果来自同一批连续拍摄的图分布太接近验证集不能反映真实泛化能力。另外小数据集上过拟合也常见。解决这份数据训练验证是分好的但如果你要评估真实效果最好自己再留一批完全没参与训练的图做测试。训练时开数据增强YOLOV5 默认开 mosaic、翻转等能缓解过拟合。别只看验证集数字实际跑几张新图最靠谱。5. 从能跑到好用推理验证与几个提效技巧训练出best.pt只是开始真正判断这份数据值不值得用得看推理效果和后续能不能接进实际流程。这一章落到具体操作上。5.1 用 detect.py 快速验证训练完先别急着部署用官方推理脚本跑几张验证图python detect.py \ --weights runs/train/exp/weights/best.pt \ --source datasets/images/val \ --img 640 \ --conf 0.25 \ --save-txt--source指向验证集目录脚本会逐张推理并把画框结果存到runs/detect/exp/。--conf 0.25是置信度阈值低于这个值的框不显示工业缺陷检测里这个值可以调低到 0.1 提高召回宁可多报也别漏。--save-txt会把预测框按 YOLO 格式存下来方便跟真值对比算指标。跑完打开结果图重点看两类问题漏检缺陷在但没框和误检正常区域被框了。针孔这种小目标如果漏得多可以考虑提高训练分辨率或者用更大的模型yolov5m/l但这份数据只有 1400 张大模型容易过拟合得权衡。5.2 小目标缺陷的调参方向铝片表面的针孔往往很小640 输入下可能就几个像素。几个能试的方向调整项做法适用场景提高输入尺寸--img 960或 1280小目标多、显存够换更大模型yolov5m / yolov5l数据量够、追求精度调 anchor用--noautoanchor关自动手动聚类缺陷尺寸分布特殊降 conf 阈值推理时--conf 0.1优先保召回anchor 这块多说一句。YOLOV5 默认会根据你的数据集自动聚类 anchor一般不用管。但如果你的缺陷框尺寸特别集中比如全是细长条自动 anchor 可能不理想可以用kmeans脚本自己聚一版替换掉默认值。这是进阶操作先跑通默认流程再折腾。5.3 一个我踩过的坑验证集别拿来调参最后说个血泪经验。我早期做这类项目习惯拿验证集反复调 conf 阈值、调模型调到验证集指标好看为止。结果上线一测效果差一大截。原因是验证集被我用成了测试集调参过程本身就在过拟合验证集。正确做法是训练时验证集用来选best.pt这没问题但一旦要调推理阈值、选模型就得另留一批完全没碰过的图。这份数据只有训练和验证两个划分我一般会从训练集里再切一小部分出来当内部测试或者自己另外拍几张铝片图。从那以后我每次调参前都强制问自己一句这批图模型见过没有没见过才敢用来下结论。这份铝片缺陷数据集的价值在于省掉了标注和格式转换的活1400 张图、4 类别、YOLOV5 目录直接可用拿来验证检测流程、跑通训练链路很合适。真要上产线还得结合自己场景补数据、调阈值。希望帮到你。本文还有配套的精品资源点击获取