资讯动态

铝片表面缺陷检测数据集:YOLOv5目录格式与标签规范化实践

发布时间:2026/10/5 3:56:29 来源:尧图企业网站定制
简介铝片表面缺陷图像目标检测数据集按YOLOV5目录结构整理可直接用于目标检测模型的训练与验证覆盖针孔、擦伤、脏污、褶皱4类典型缺陷。图像为640×480 RGB格式符合工业铝材表面质检场景适配缺陷检测算法开发、课程实验及精度评测等需求。资源共2000个文件以jpg样本图片约598张和txt标签文件1401个为主另含1个可视化py脚本压缩包整体约82MB。数据已划分训练集1120张、验证集280张每张图片均配对对应标签txt无需额外格式转换即可接入YOLO系列流程可视化脚本可随机读取图片绘制并保存边界框便于快速核对标注质量。当前已有195人学习下载适合需要规范格式缺陷数据集的开发者和学习者直接使用。1. 铝片表面缺陷检测为什么数据集比模型更值得先花时间拿到一个“铝片表面缺陷图像目标检测数据集YOLOV5目录格式4类别含训练集和验证集”的时候多数人第一反应是赶紧跑train.py看看mAP能到多少。但我建议你先别急——这类数据集的真正价值不在那几万张图而在目录结构、标签格式和类别定义是否经得起工程推敲。YOLOV5对数据组织方式极其敏感图片放在哪、labels里的txt内容对不对、类别顺序和data.yaml是否一致任何一个环节出问题轻则训练中断重则模型学了一堆错误特征还浑然不觉。这篇笔记按工业质检的落地视角把铝片缺陷数据集的目录规范、标签格式、划分策略和踩坑点从头捋一遍适合正在准备自有铝材产线数据、或想评估这份数据集能不能直接用来训模型的工程师。2. 铝片缺陷的4类怎么定才不返工类别定义与YOLO标签格式2.1 4类缺陷的视觉特征与标注边界铝片表面的缺陷在视觉上有一个共同点背景是均匀的金属反光面缺陷本身对比度低、形态细长或呈点状散布这直接决定了标注边界不能照搬通用目标检测的逻辑。常见做法是把缺陷按产线质检工位最关心的问题归成4类例如划痕、氧化斑、麻点、油污。这四类在视觉上各有典型表现划痕是细长的暗色线状痕迹方向随机但通常沿轧制方向延伸氧化斑是灰白或暗色的块状区域边缘模糊和周围铝色过渡不清晰麻点是密集的小圆形凹坑单个体积极小常常成片出现油污则是亮暗不一的不规则斑块反光特性和正常铝面差异明显。类别定义的关键不在于名字而在于标注规则的唯一性。最常见的返工原因就是不同标注员对“划痕和凹坑同时存在时算哪一类”“氧化斑边缘淡到看不清要不要画进去”这类边界问题判断不一致。所以拿到数据集第一步不是看图片而是看类别定义文档里有没有写清楚判定优先级。如果没有我一般会自己补一条规则同一区域同时存在多种缺陷时按产线停机优先级最高的类别标注宁缺毋滥。这个规则看似简单但它决定了模型学到的决策边界是否稳定。2.2 YOLO标签txt的内容逐行解读YOLOV5目录格式的标签不是XML或JSON而是和每张图片同名、同路径层级的一个txt文件。txt的每一行对应一个目标框格式为“类别编号 中心点x 中心点y 宽度 高度”其中坐标全部做了归一化数值范围在0到1之间以图片宽和高做分母。例如一行内容1 0.5234 0.6812 0.0543 0.0721表示类别编号为1的目标框中心点位于图片宽度的52.34%处、高度的68.12%处框宽为图片宽的5.43%框高为图片高的7.21%。读到这里可以停下来核对一下数值的合理性。一个常见误区是手工计算时把中心点坐标直接填成左上角坐标或者混淆宽和高的顺序这类问题在单张图上难以发现但会成批地让目标框偏移。我在检查数据集时习惯写一个小脚本统计所有txt里的坐标范围一旦发现存在大于1或小于0的数值或者宽度与高度倒挂超过一定比率的行立即定位到具体文件逐一复查。这个预处理步骤能避免后面训练时出现大量“标签超出边界”的警告。2.3 类别编号与data.yaml映射错了等于白训YOLO标签里的类别编号是纯数字它在语义上对应data.yaml里names列表的下标。YOLOV5的类别编号从0开始如果data.yaml里写成names: 0: scratch 1: oxidation 2: pit 3: oil那么标签txt里第一列数字0就代表scratch划痕1代表oxidation氧化斑以此类推。这个映射关系一旦错位比如把names顺序调换但标签txt没同步更新模型训练不会报任何错误只是收敛到错误的分类语义上最终在验证集上mAP看起来不差但实际检测结果永远对不上产线需求。检查这个映射不需要看图只需要把每张图片的标注框裁剪出来按类别编号存到不同文件夹然后肉眼抽查几个文件夹里的图片内容是否和类别名吻合。我见过一个团队因为标注工具默认类别从1开始而YOLOV5要求从0开始导致所有类别编号偏移一位训练一周后才发现问题不得不全部重新生成标签。这类翻车是完全可以避免的——用脚本扫一遍每个类别编号对应的框数量分布和裁剪图即可。3. 把原始图片整理成YOLOV5目录格式划分策略与转换脚本3.1 YOLOV5目录结构的最小可运行形态YOLOV5官方仓库对数据目录的要求并不复杂但目录层级必须严格。最小可运行形态是根目录下同时存在images和labels两个文件夹各自再按train和val划分训练图片放在images/train中对应标注放在labels/train中验证集同理。图片和标注文件的文件名必须完全一致仅后缀不同例如IMG_001.jpg对应IMG_001.txt如果图片是png则标注文件依然是同名txt。训练时YOLOV5通过读取图片路径推断对应的label路径默认规则是把路径中的/images替换为/labels把图片后缀替换为.txt。aluminum_defect_dataset/ ├── images/ │ ├── train/ │ │ ├── 00001.jpg │ │ ├── 00002.jpg │ │ └── ... │ └── val/ │ ├── 01001.jpg │ ├── 01002.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── 00001.txt │ │ ├── 00002.txt │ │ └── ... │ └── val/ │ ├── 01001.txt │ ├── 01002.txt │ └── ... └── data.yaml这个结构有一个容易被忽略的细节data.yaml中train和val字段的值推荐写数据集根目录到images子目录的相对路径或绝对路径不需要写labels路径。YOLOV5启动训练时会自动定位label位置。很多初学者把YAML里填了images/train却没有把YAML文件放在数据集根目录而是放在和训练脚本同级的位置导致相对路径解析失败、训练直接报找不到文件。我一般的做法是让YAML路径以数据集根目录为基准来写相对路径并且train脚本的工作目录保持在YOLOV5仓库根目录下。3.2 按生产批次划分训练集和验证集别随机打散训练集和验证集的划分方式直接影响模型在真实产线上的表现。随机打散全部图片做划分虽然统计学上最严谨但工业缺陷检测场景中往往不是最优选择因为同一批次铝片的生产工艺条件一致表面纹理和反光特性高度相似如果随机划分验证集里会混入和训练集几乎同源的图片验证分数虚高换一批新铝材就露馅。更稳妥的划分策略是按生产批次划分把整个批次的图片全部放进训练集或验证集。比如某一周生产了5个批次的铝片样本取前4个批次的全部图片做训练第5个批次全部用来验证模拟模型面对“没有见过的工艺状态”时的表现。这个划分方式会让验证集稍微难一些mAP数字可能不如随机划分好看但更接近真实部署场景。如果数据集本身就按批次组织目录名或文件名里带有批次信息优先利用这些信息做分组。如果数据集文件里没有批次信息只能从图片内容侧写近似分组可以统计图片的背景纹理特征差异或者干脆按拍摄时间排序把前80%做训练、后20%做验证。无论如何不要单纯用random.shuffle然后切分——那种做法在工业数据上通常会给你一个过于乐观的评估结果。3.3 一个转换脚本把图库和标注变成标准目录拿到分散的原始图片和标注时需要一个脚本把它们整理成标准目录。假设原始数据中图片统一放在src_imgs文件夹标注统一放在src_labels文件夹且文件同名下面这段脚本可以完成复制和划分import os import random import shutil from pathlib import Path random.seed(42) src_imgs Path(src_imgs) src_labels Path(src_labels) dst_root Path(aluminum_defect_dataset) # 批次信息可以藏在文件名里例如 batch3_00451.jpg def get_batch_key(filename: str) - str: parts filename.split(_) return parts[0] if len(parts) 2 else unknown_batch img_files sorted(src_imgs.glob(*.jpg)) sorted(src_imgs.glob(*.png)) batch_keys list({get_batch_key(f.name) for f in img_files}) # 按批次做划分前80%批次进训练集其余进验证集 batch_keys.sort() split_idx int(len(batch_keys) * 0.8) train_batches set(batch_keys[:split_idx]) val_batches set(batch_keys[split_idx:]) for split, batch_set in [(train, train_batches), (val, val_batches)]: (dst_root / images / split).mkdir(parentsTrue, exist_okTrue) (dst_root / labels / split).mkdir(parentsTrue, exist_okTrue) for img_file in img_files: if get_batch_key(img_file.name) not in batch_set: continue label_file src_labels / (img_file.stem .txt) if not label_file.exists(): print(f[skip] 缺少标注文件: {label_file}) continue shutil.copy2(img_file, dst_root / images / split / img_file.name) shutil.copy2(label_file, dst_root / labels / split / label_file.name) print(f[copy] {img_file.name} - {split})这段脚本的核心逻辑是先解析文件名里的批次前缀按批次分组后按比例划分避免随机打散。get_batch_key函数是关键如果你的文件名结构不同需要在这里改成对应的解析逻辑。比如文件名是20250412_xxx.jpg那批次键可以取前8位日期。脚本执行时会打印每个文件的去向同时跳过缺失标注的图片——这一步能顺便暴露数据不完整的隐患。3.4 划分完成后先跑完整性和边界检查目录组织完成后不能直接开训还要跑一轮自动化检查排查三类问题一是每张图片是否都有对应的txt标签且内容非空二是标签坐标值是否都在0到1的合法区间内三是每张图片的尺寸是否和标注框尺寸匹配。第三点容易漏比如标注时用的图片分辨率是1920×1080但实际图片被压成了1280×720归一化坐标不报错可框的位置整体偏了。from pathlib import Path root Path(aluminum_defect_dataset) for split in [train, val]: img_dir root / images / split label_dir root / labels / split for img_file in sorted(img_dir.iterdir()): label_file label_dir / (img_file.stem .txt) if not label_file.exists(): print(f[error] 缺标签: {label_file}) continue lines [l.strip() for l in label_file.read_text().splitlines() if l.strip()] if not lines: print(f[error] 空标签: {label_file}) continue for line in lines: parts line.split() if len(parts) ! 5: print(f[error] 列数不对: {label_file}: {line}) continue cls, cx, cy, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) if not (0 cx 1 and 0 cy 1 and 0 w 1 and 0 h 1): print(f[error] 越界坐标: {label_file}: {line})这段检查脚本每行输出一个具体的错误位置跑完后逐个修复。特别提一下空标签如果你的数据里有完全不包含任何缺陷的“负样本”图片它们的txt文件应为空文件这类图片建议单独放到一个images/background目录不要混进训练集里干扰正样本学习。训练集的负样本应该通过在训练时开启mosaic增强或单独配置背景图片来引入而不是简单地把空标签文件留在labels目录里。4. 铝片缺陷数据集的常见坑与排查空标签、越界框、小目标与样本失衡4.1 图片和标签文件名对不上训练集等于盲人摸象现象训练日志里Warning数量暴增提示WARNING: corrupt image或WARNING: labels not found但训练进程不中断只是速度变慢训练完成后验证分数很低。原因最常见的是图片从采集设备导出时被重命名比如相机自动按时间戳命名而标注工具按自定义规则命名导致jpg和txt前缀不一致。还有一种情况是图片后缀大小写不一致比如标注时是.JPG目录里是.jpg在Linux环境下大小写敏感会直接查不到文件。解决不要靠肉眼对文件名写个脚本比较两个集合的文件主干名。我的习惯是在转换阶段就统一命名规则全部重命名为6位数字序号既避免特殊字符问题也让批次信息只保留在分组表里而不是文件名中。产线数据往往文件名带有中文或空格YOLOV5虽然能处理但在跨平台拷贝和后续部署时这类文件名容易成为隐患建议尽早规范化。4.2 归一化坐标越界训练在第一个epoch就中止现象训练启动后不久就报错错误信息中有assert (l[:, :2] 1).all()或labels require agnostic NMS之类的断言整个训练进程直接退出。原因标注框贴图片边缘时标注工具给出的x、y或宽高值在经过归一化后超过了1.0或者在原点附近出现负值。这通常不是标错而是标注工具的输出坐标是像素值转换脚本里分母用错导致的。比如把图片的实际宽度写成了高度值或者把框的右下角坐标当作中心点坐标来算。解决先跑上一节提到的越界检查脚本把所有越界行找出来。修复时有两条路可选一是回标注工具重新导出正确的像素坐标再算一遍归一化二是如果只是少量框轻微越界例如边缘只有1-2个像素可以在转换脚本里做数值裁剪把坐标限制在[0,1]区间内。我建议优先选前者因为裁剪相当于人为移动了框的边界会影响检测精度。修复后重新跑检查脚本直到零报错再开始训练。4.3 缺陷只占几十个像素模型在深层特征图上找不到目标现象训练时loss能正常下降但验证集上mAP0.5很低尤其是麻点和细小划痕几乎检测不到大块的氧化斑却能识别出来。原因YOLOV5的检测头在三个不同尺度的特征图上检测目标最小的P3特征图是输入图片的1/8缩放。如果缺陷目标在原始图片上只有30×30像素缩放8倍后只剩约4×4个像素的特征响应信息几乎消失。铝片缺陷中的麻点常常只有十几个像素大小这属于典型的小目标问题并不是模型结构有问题。解决有三类处理手段。一是提高输入分辨率训练时设置--img 1280而不是默认的640给小目标更多像素支撑代价是显存占用成倍增加。二是使用YOLOV5自带的超参数调整将anchors重新聚类为适应小目标的尺寸。三是把缺陷区域从原图中裁切出来做单独的局部训练集。对于铝片缺陷最有效的通常是第二种加第三种组合保持640分辨率训练全局背景同时把麻点等小缺陷的局部裁剪图作为第二个数据集单独训练一个模型推理时先用全局模型定位可疑区域、再局部放大。4.4 三类缺陷占了九成样本验证集mAP虚高现象训练完成后的验证集mAP0.5很高但逐类查看时发现数量少的类别AP极低比如整体mAP有0.87氧化斑类别只有0.41而这个类恰恰是产线返修率最高的缺陷。原因类别不平衡是工业缺陷数据集的通病划痕类在产线上出现频率远高于氧化斑。模型学到的默认倾向是预测高频类别验证集如果和训练集保持同样的分布高低频类别的AP差异会被整体平均掩盖看起来数字不错。我在评估数据集时习惯逐类打印AP不看整体mAP——这个习惯救过我好几次。解决先看类别统计分布确认每个类别的图片数和目标框数。对于典型的不平衡数据采用几种手段组合调整。类别权重可以在loss计算时加大少样本的权重数据增强上对少样本类别做复制粘贴增强把氧化斑目标复制到正常铝面背景图片上更彻底的办法是只有少数类别样本的小类别用专门的微调数据集单独训练一个模型推理时和主模型做多模型融合。但这类方案让产线部署复杂度上升优先把前两者试过再说。5. 训练前最后一步用最小命令验证数据集完整闭环到这里目录结构、标签格式、划分策略和常见的坑都排查过一遍接下来用最小命令验证整个数据链路能跑通。这个验证的目的不是拿一个好看的结果而是确认数据被YOLOV5正确读入且模型能在完整训练流程中正常工作。先执行一次YOLOV5的数据集检查命令它会输出每个类的目标框数量分布和图片数量我一般这么做cd yolov5 python train.py --data /path/to/aluminum_defect_dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 1训练1个epoch观察日志中Scanning labels阶段是否出现0 missing和0 corrupt的输出然后在第一个step的loss输出确认loss没有发散成NaN。如果这一步通过再以验证模式完整跑一轮val.pypython val.py --data /path/to/aluminum_defect_dataset/data.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640val.py会输出每个类别的AP表格这是验证数据质量最直观的呈现方式。如果发现某个类别的AP明显低于其他类别回头检查这个类别的样本量、标签质量和目标尺寸分布而不是盲目调超参。最后一个细节值得单独提一下训练和推理时的输入分辨率要保持一致。铝片表面缺陷的用户在调试时常常训练用640、部署时为了提速切成416导致小目标检测率大幅下降这不是模型退化了而是输入信息总量变了。我在这类工业质检项目上的习惯是训练分辨率与部署分辨率严格一致宁可在部署端保持640也不为了几个毫秒的提速牺牲检测率。希望这篇关于铝片缺陷数据集整理的笔记能帮你少走一段弯路。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑