简介:这份易拉罐缺陷识别数据集面向工业质检方向的算法工程师、高校研究者及视觉项目开发者,聚焦罐体表面划痕、罐底异常等缺陷的自动检测任务,可直接用于目标检测模型的训练、验证与迁移学习。资源包共1709个文件,包含854张jpg实拍图像与854个同名txt标注文件,另附1个yaml配置文件,整体压缩包约38.27MB,标注同时兼容YOLO、COCO JSON与Pascal VOC XML三种主流格式,方便在不同框架间灵活切换。图像覆盖多种光照与拍摄角度,缺陷类别标注清晰,平均正确识别率可达98.9%,能有效减少数据清洗与格式转换的重复工作。目前已有457人学习下载,适合需要快速搭建易拉罐缺陷检测基线、验证模型精度或扩充工业质检数据集的读者参考使用。
1. 易拉罐缺陷识别数据集:98.9% 识别率背后,数据比模型更值钱
产线上一个易拉罐从灌装到封盖不到两秒,罐身凹坑、拉环变形、涂层划伤、印刷错位这些缺陷,人眼盯久了必然漏检。很多团队第一反应是换更大的模型,结果 mAP 卡在 0.7 上不去,回头一看训练集里同一类缺陷只有几十张图,标注框还画得松松垮垮。易拉罐缺陷识别数据集支持 YOLOv8 格式标注这件事,真正的价值不在「98.9%」这个数字,而在于它把工业质检里最耗时的数据准备环节标准化了——你拿到的是可以直接喂给 YOLOv8 的 images/labels 目录结构,而不是一堆需要自己清洗的原始图。
这个方向适合三类人:做产线视觉质检的工程师,想用 YOLOv8 快速验证缺陷检测可行性;算法同学,需要一个真实工业场景的数据集来调参和对比;还有做设备集成的团队,要把检测模型塞进工控机或边缘盒子。98.9% 的平均正确识别率通常是在特定光照、固定相机位、缺陷类型有限的条件下测出来的,换产线、换光源、换罐型,数字会掉,这点先有心理预期。下面从数据组织、YOLOv8 训练、参数设置到踩坑排查,把这条路走一遍。
2. 拆开这个数据集:YOLOv8 标注格式与目录结构怎么对上
2.1 缺陷类别划分与标注粒度
易拉罐缺陷常见分几类:罐身凹陷(dent)、涂层划伤(scratch)、印刷缺陷(print_defect)、拉环变形(tab_deform)、罐口卷边异常(flange)。数据集如果按这五类标注,类别数就是 5,YOLOv8 的 nc 参数设 5。标注粒度上有个容易翻车的点:凹陷这种缺陷边界模糊,不同标注员画的框可能差十几个像素。工业数据集一般要求框紧贴缺陷可见区域,不预留太多背景,否则模型学到的是「大框里有个小缺陷」,推理时框会偏大。
标注文件是 YOLO 格式的 txt,每行class_id x_center y_center width height,坐标全部归一化到 0~1。这里注意:x_center 和 width 是相对图像宽度的比例,y_center 和 height 是相对高度的比例,不是绝对像素。很多新手直接拿标注工具导出的绝对坐标塞进去,训练 loss 直接爆炸。
2.2 目录结构:images 和 labels 必须平行
YOLOv8 对目录结构有硬性要求,images 和 labels 要平行,且文件名(除扩展名)一一对应。常见做法是这样组织:
can_defect_dataset/ ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ └── 0002.jpg │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ │ ├── 0001.txt │ │ └── 0002.txt │ ├── val/ │ └── test/ └── data.yamldata.yaml 是 YOLOv8 训练入口,内容如下:
path: /home/user/can_defect_dataset train: images/train val: images/val test: images/test nc: 5 names: 0: dent 1: scratch 2: print_defect 3: tab_deform 4: flangepath 写数据集根目录绝对路径,train/val/test 写相对 path 的子路径。nc 必须和 names 数量一致,names 的 key 从 0 开始连续。如果类别名里有中文或空格,训练时可能报编码错误,建议全用英文下划线。
2.3 用脚本检查标注一致性
拿到数据集先别急着训练,跑一段检查脚本,确认每张图都有对应 label、坐标都在 0~1 之间、类别 id 没越界:
import os from pathlib import Path img_dir = Path("can_defect_dataset/images/train") lbl_dir = Path("can_defect_dataset/labels/train") nc = 5 errors = [] for img in img_dir.glob("*.jpg"): lbl = lbl_dir / (img.stem + ".txt") if not lbl.exists(): errors.append(f"缺少标注: {img.name}") continue with open(lbl) as f: for i, line in enumerate(f): parts = line.strip().split() if len(parts) != 5: errors.append(f"{lbl.name} 第{i}行字段数不对") continue cid = int(parts[0]) coords = list(map(float, parts[1:])) if cid < 0 or cid >= nc: errors.append(f"{lbl.name} 类别id越界: {cid}") if any(c < 0 or c > 1 for c in coords): errors.append(f"{lbl.name} 坐标越界: {coords}") print(f"检查完成,发现 {len(errors)} 个问题") for e in errors[:20]: print(e)这段脚本遍历 train 下所有 jpg,找同名 txt,逐行检查字段数、类别 id 范围、坐标范围。参数 nc 要和 data.yaml 一致。输出前 20 条错误,避免刷屏。实际跑下来最常见的问题是「缺少标注」和「坐标越界」,前者通常是漏标,后者是标注工具导出格式没转对。
3. 用 YOLOv8 训练易拉罐缺陷模型:从命令行到参数调优
3.1 环境准备与最小训练命令
YOLOv8 用 ultralytics 包,Python 3.8 以上。安装就一行:
pip install ultralytics训练最小命令:
yolo detect train data=can_defect_dataset/data.yaml model=yolov8s.pt epochs=100 imgsz=640 batch=16 device=0data 指向 data.yaml,model 用预训练权重 yolov8s.pt(s 是 small,工业缺陷检测一般够用,数据量少可以换 yolov8n.pt)。epochs 100 起步,imgsz 640 是默认输入尺寸,batch 16 看显存,8G 显存跑 yolov8s 640 大概能到 16,不够就降到 8。device=0 指定第一块 GPU,CPU 训练把 device 改成 cpu,但速度会慢很多。
训练开始后终端会打印每轮 loss 和 mAP,同时 runs/detect/train/ 下生成权重和曲线图。第一次跑建议先 epochs=10 验证流程通不通,再拉长。
3.2 关键参数:imgsz、batch、lr0 怎么定
imgsz 直接影响小缺陷能不能被看到。易拉罐缺陷里划伤可能只有十几个像素宽,640 下缩得太小,模型学不到。常见做法是 640 起步,如果验证集上小缺陷漏检多,提到 960 或 1280,但显存和速度代价明显。有个折中:训练用 960,推理用 640,YOLOv8 支持 train 和 val 不同 imgsz,但会损失一些一致性。
batch 不是越大越好。小数据集(几千张)用大 batch 容易过拟合,16 或 32 比较稳。如果显存不够,用batch=8配合accumulate=2模拟大 batch。
lr0 初始学习率默认 0.01,工业缺陷数据集通常比 COCO 小,建议降到 0.001~0.005。配合 lrf 最终学习率系数 0.01,cos 退火。如果训练前期 loss 震荡大,先降 lr0。
yolo detect train data=can_defect_dataset/data.yaml model=yolov8s.pt epochs=200 imgsz=960 batch=8 lr0=0.003 lrf=0.01 cos_lr=True patience=30patience=30 表示 30 轮 mAP 不涨就早停,省时间。cos_lr 开余弦退火,对小数据集收敛更平滑。
3.3 数据增强:别把缺陷增强没了
YOLOv8 默认开 mosaic、HSV、翻转等增强。工业缺陷检测里,水平翻转通常安全,垂直翻转要谨慎——罐身倒过来在产线上不出现。mosaic 把四张图拼一张,能提升小目标检测,但易拉罐缺陷位置固定(比如拉环总在上方),mosaic 会破坏空间先验,可能掉点。
建议配置:
fliplr: 0.5 flipud: 0.0 mosaic: 0.5 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 scale: 0.3flipud 关掉,mosaic 降到 0.5,HSV 增强保留(产线光照会有波动)。scale 0.3 允许缩放,模拟不同距离。这些参数写在 data.yaml 同级或训练命令里用fliplr=0.5 flipud=0.0覆盖。
3.4 训练过程看什么:loss 曲线和 mAP
训练日志里重点看三个:box_loss、cls_loss、mAP50。box_loss 下降说明框回归在学,cls_loss 下降说明分类在学。如果 box_loss 一直不降,检查标注框是不是太松或坐标没归一化。mAP50 到 0.9 以上且验证集 loss 没反弹,基本可用。
验证命令:
yolo detect val model=runs/detect/train/weights/best.pt data=can_defect_dataset/data.yaml imgsz=960best.pt 是验证集上最好的权重,last.pt 是最后一轮。工业场景建议用 best.pt,除非你确定最后一轮更好。
4. 避坑排查:易拉罐缺陷检测训练中最容易翻车的 5 个点
4.1 现象:mAP 卡在 0.5 上不去,loss 也不降
原因:标注框和实际缺陷对不上,或者类别 id 映射错了。常见是标注工具导出时类别顺序和 data.yaml 不一致,模型把凹陷学成了划伤。
解决:跑 2.3 的检查脚本,再随机抽 20 张图用yolo detect predict可视化标注框,确认框贴不贴。类别映射错的话,重新生成 label 文件。
4.2 现象:训练正常,推理时框全偏大
原因:标注时框留了太多背景,模型学到「大框里有个小缺陷」。或者推理 imgsz 和训练不一致,缩放导致框偏移。
解决:重新标注,框紧贴缺陷。推理 imgsz 尽量和训练一致,不一致时用rect=True保持长宽比。
4.3 现象:验证集 mAP 高,产线实测漏检多
原因:数据集和产线分布不一致。数据集可能是固定光源、固定相机拍的,产线有震动、光照变化、罐型切换。
解决:从产线补拍一批图,混进训练集,至少占 20%。开 HSV 增强模拟光照变化。如果罐型多,按罐型分桶,每桶都要有样本。
4.4 现象:训练报错「No labels found」
原因:labels 目录路径不对,或者文件名不匹配。YOLOv8 找 label 是按 images 路径替换images为labels、扩展名换.txt,如果目录名不是 images/labels 就会找不到。
解决:确认目录名严格是 images 和 labels,且 train/val 子目录平行。文件名除扩展名外完全一致,大小写敏感。
4.5 现象:显存爆了,batch 降到 1 还爆
原因:imgsz 太大,或者模型选太大(yolov8x)。也可能是数据加载器开了太多 worker。
解决:imgsz 降到 640,模型换 yolov8n 或 yolov8s,workers=4降下来。如果还爆,用amp=False关混合精度(会慢但省显存)。
5. 把 98.9% 搬到自己的产线:验证方法与一个提点技巧
数据集给的 98.9% 是在它的测试集上算的,换到你的产线,第一件事是建自己的验证集。从产线连续拍 200~500 张,覆盖不同时段、不同罐型、不同光照,人工标一遍,跑yolo detect val看 mAP。如果掉到 0.8 以下,别急着调模型,先看漏检的图长什么样——大概率是训练集里没有类似场景。
一个提点技巧:难例挖掘。用训练好的模型跑产线未标注图,把置信度在 0.3~0.6 之间的框导出来,人工确认后加进训练集。这批「模型拿不准」的样本信息量最大,通常加两三轮,mAP 能涨 3~5 个点。代码大概这样:
from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") results = model.predict("production_images/", conf=0.3, iou=0.5, save_txt=True) # 导出的 txt 在 runs/detect/predict/labels/,人工筛 0.3~0.6 的框conf=0.3 是低阈值,先把可疑框都捞出来,再人工筛。save_txt 保存 YOLO 格式,筛完直接进训练集。
验证时别只看 mAP,工业场景更关心漏检率(召回)和误检率。漏检一个缺陷可能流出不良品,误检太多产线会停。根据产线容忍度调 conf 阈值:宁可误检不可漏检就调低 conf,反之调高。
我自己踩过的坑是:拿数据集训完直接上线,结果产线换了 LED 光源,划伤对比度变了,模型集体失明。后来养成习惯,每次换光源或换罐型,先拍 50 张跑一遍验证,mAP 掉超过 5 个点就补数据重训。数据比模型值钱,这句话在工业质检里是血泪经验。希望帮到你。
本文还有配套的精品资源,点击获取