news 2026/10/3 8:52:42

铝片表面缺陷检测数据集:4类瑕疵1400张图,YOLOV5直接开训

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
铝片表面缺陷检测数据集:4类瑕疵1400张图,YOLOV5直接开训

简介:这份资源面向从事工业质检、缺陷检测算法开发与目标检测入门的学习者,提供铝片表面缺陷图像数据集,可直接用于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(f'vis_{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一直不降,多半是类别标签有问题。
  • mAP@0.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

现象:跑了几十个 epoch,loss 纹丝不动,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 目录直接可用,拿来验证检测流程、跑通训练链路很合适。真要上产线,还得结合自己场景补数据、调阈值。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 8:51:48

PCA主成分分析降维算法:原理、Python实现与工程实战

简介&#xff1a;面向机器学习初学者与数据处理开发者&#xff0c;这份资源提供了一套完整的PCA降维算法Python实现&#xff0c;用于解决高维数据降维、特征提取与可视化等常见问题。代码按模块化设计&#xff0c;覆盖数据标准化、协方差矩阵计算、特征值分解等核心步骤&#x…

作者头像 李华
网站建设 2026/10/3 8:51:48

VMD排列熵与极限学习机在轴承故障诊断中的协同优化

简介&#xff1a;本资源是一套面向机械故障诊断研究者与工业智能化工程师的Python实践方案&#xff0c;聚焦滚动轴承早期故障识别这一典型工业场景&#xff0c;融合VMD信号分解、排列熵特征提取与ELM快速分类三大核心技术。压缩包共407个文件&#xff08;404个txt日志/数据文件…

作者头像 李华
网站建设 2026/10/3 8:51:48

零信任SDP动态授权后端架构与Python实现解析

简介&#xff1a;一套面向零信任场景的SDP动态授权访问系统后端源码&#xff0c;以Python实现&#xff0c;适合信息安全方向学生及后端开发者&#xff0c;用于理解软件定义边界中的服务发现、身份认证、动态授权等关键机制。包内共32个文件&#xff0c;主要由Python脚本构成&am…

作者头像 李华
网站建设 2026/10/3 8:50:57

模型量化入门:Q4、Q8、GGUF,部署选型不再迷茫

想把开源模型跑在自己机器上&#xff0c;绕不开量化这个话题&#xff1a;HuggingFace 上的模型动辄几十 GB&#xff0c;量化版只有几分之一&#xff0c;效果损失多少&#xff1f;GGUF、GPTQ、AWQ 这些名词是什么关系&#xff1f;这篇把量化选型讲成一个人话版决策指南。 量化的…

作者头像 李华
网站建设 2026/10/3 8:50:37

塞梅普雷斯 如是说 (第二部/22.乌合之众)

//2019-08-21 16:0322.乌合之众有一个阳光明媚的天,塞梅普雷斯坐在树下乘凉,一位蓝衣青年悄无声息的坐在他的旁边,他看着路上来往匆忙的行人,看着他们在说话,思考,争论,大笑,充满自信.你说,他们和动物有什么区别? 青年突然开口问, 他们都追随着让自身愉悦的行为,去努力得到让自…

作者头像 李华
网站建设 2026/10/3 8:50:10

Cloudflare 发布 Clef 决策模型,分类仅 2.2 秒

Cloudflare 今天发布并开源了两个自研决策模型 Clef 与 Clef-flash&#xff0c;托管在自家的 Workers AI 平台上。按官方说法&#xff0c;Clef 目前在 Jev Decision Index 评测中排名第一&#xff1b;模型权重以 Apache 2.0 协议在 Hugging Face 开放下载。同日&#xff0c;Clo…

作者头像 李华