
简介本资源为面向YOLO系列目标检测算法的罐头与瓶子图像数据集适用于yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流框架可直接用于模型训练与验证测试适合从事食品包装检测、工业质检或目标检测入门与进阶的开发者使用。压缩包共2000个文件包含1073个xml标注文件与927个txt标注文件分别对应VOC格式与YOLO格式两种标签一一对应文件名末尾标注类别名称便于快速区分与调用包体大小约68.59MB并附带data.yaml配置文件数据集已划分完毕开箱即可投入训练。YOLO格式采用归一化中心点与宽高坐标符合标准训练输入要求。目前已有54人学习下载可作为小样本检测任务的练手素材帮助读者省去数据采集与标注环节将精力集中于模型结构调优与实验对比。1. 罐头瓶子鲜奶检测数据集1531 张图带标签为什么它值得先跑一遍手上有一批产线巡检图想快速验证 YOLO 系列算法能不能把罐头、瓶子、鲜奶这几类目标框出来最省事的路径不是从零标注而是直接拿一份已经划好训练验证、标签格式齐全的数据集先跑通链路。这份资源就是干这个的1531 张图像全部带标签目录里已经分好训练集和验证集附data.yaml同时给了 YOLO 格式的 txt 和 VOC 格式的 xml 两套标注文件名末尾还带部分类别名称方便肉眼核对。它适合两类人一类是刚接触 YOLO 系列目标检测、想拿真实数据走一遍训练和验证流程的另一类是有罐头、瓶子、鲜奶这类检测需求想先用现成数据把模型跑起来看效果再决定要不要补自己数据的。下面按「这份资源是什么 → 怎么接进 YOLO → 坑在哪 → 怎么验证」的顺序拆开讲能直接抄的步骤我都落成代码块。2. 数据集结构与标签格式先看清目录再动手2.1 目录长什么样两个格式分别放哪拿到压缩包解压后常见做法是看到images、labels两个主目录外加一个data.yaml。YOLO 格式的 txt 放在 labels 下VOC 格式的 xml 单独放一个文件夹两者文件名主体一致只是后缀不同。项目正文里列出的img_0769_404.txt、img_0769_402.txt这类文件就是 YOLO 格式的标签文件命名规则是「图像名 序号」序号部分对应不同标注实例或不同版本实际训练时以图像名为准去配对。先别急着改路径用一条命令把结构打出来看# 查看解压后的目录层级确认 images / labels / xml 三类目录都在 find . -maxdepth 3 -type d | sort # 统计图像数量和标签数量两者应基本一致 find ./images -type f \( -name *.jpg -o -name *.png \) | wc -l find ./labels -type f -name *.txt | wc -l逻辑说明第一条命令只列目录避免被上千个文件名刷屏第二条和第三条分别数图像和 txt 标签数量对不上就说明有图没标或有标没图训练前必须处理。参数上-maxdepth 3控制层级太深会翻出缓存目录太浅可能漏掉子集目录。2.2 YOLO 格式每一列到底怎么读YOLO 格式一行一个目标五列class x_center y_center width height。类别索引从 0 开始后四个都是相对图像宽高的归一化比例值范围 0 到 1。这一点是新手最容易翻车的地方如果你拿到的坐标是像素值直接喂进去训练损失会一直不降因为模型以为框在图像外面。# 抽查一个标签文件确认坐标是否已归一化 def check_label(path): with open(path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(列数异常:, path, parts) continue cls, x, y, w, h parts vals list(map(float, [x, y, w, h])) # 归一化坐标必须落在 0~1超出说明是像素值没转换 if any(v 0 or v 1 for v in vals): print(坐标未归一化:, path, vals) print(类别:, cls, 框:, vals) check_label(./labels/img_0769_404.txt)逻辑说明这段脚本逐行读标签先查列数是不是 5再查四个坐标是否都在 0 到 1 之间。参数上cls是字符串转 int 才能和data.yaml里的names对应坐标用 float 读避免整数截断。跑完如果大量报「坐标未归一化」说明这份标签需要先做像素到比例的转换不能直接训练。2.3 data.yaml 里三个字段决定训练能不能起来data.yaml一般包含train、val、nc、names四项。train和val指向图像目录nc是类别数names是类别名列表顺序必须和标签里的类别索引严格对应。索引 0 对应 names 第一个索引 1 对应第二个错一位整个训练结果就是错的。# data.yaml 典型结构路径按自己解压位置改 train: ./images/train val: ./images/val nc: 3 names: 0: can 1: bottle 2: milk逻辑说明nc必须等于names的长度多写少写都会在训练启动时报错。names的顺序不是随便排的要回去看标签里类别索引实际分布用脚本统计每个类别出现次数确认没有空类别。参数上路径建议用相对路径换机器时只改根目录即可。3. 接进 YOLOv5 到 YOLO11训练命令与参数怎么设3.1 环境与依赖别一上来就装最新版YOLO 系列各版本对 PyTorch 和 CUDA 有对应要求常见做法是先确认显卡驱动和 CUDA 版本再装匹配的 torch最后装 ultralytics 或对应版本的仓库。不要直接pip install ultralytics就开跑版本不匹配会在训练中途报 BN 崩溃或显存异常。# 查看 CUDA 版本决定装哪个 torch nvidia-smi # 建独立环境避免和系统包冲突 conda create -n yolo_data python3.10 -y conda activate yolo_data # 按 CUDA 版本装 torch这里以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 装 ultralyticsYOLOv8/v9/v10/11 通用 pip install ultralytics逻辑说明nvidia-smi右上角显示的是驱动支持的最高 CUDA 版本装 torch 时选不高于它的版本。参数上Python 3.10 是目前兼容性较稳的选择3.12 部分版本轮子还不全。环境隔离是血泪经验混装过一次之后我每次新数据集都单独建环境。3.2 用命令行直接训练先跑小轮数验证链路第一次不要直接跑 300 轮先用 10 到 20 轮确认数据能读、损失能降、验证能出结果。YOLOv8 及之后的版本命令统一换模型权重即可切换版本。# 用 yolov8n 轻量模型先跑 20 轮验证数据链路 yolo detect train \ data./data.yaml \ modelyolov8n.pt \ epochs20 \ imgsz640 \ batch16 \ workers4 \ project./runs_can \ nameexp1逻辑说明data指向 yamlmodel用预训练权重能加快收敛epochs先小后大imgsz是输入尺寸batch受显存限制workers是数据加载进程数。参数上显存不够就把 batch 降到 8 或 4workers 在 Windows 下建议设 0 避免多进程报错。跑完看runs_can/exp1下的损失曲线和混淆矩阵确认没有类别全空。3.3 换 YOLOv5 或 YOLOv7 时的差异点YOLOv5 和 YOLOv7 用的是各自仓库的train.py不是 ultralytics 那套命令。数据 yaml 结构类似但参数名有差别比如 YOLOv5 用--img而不是imgsz用--weights而不是model。# YOLOv5 训练写法注意参数名和 ultralytics 不同 python train.py \ --data ./data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 20 \ --project ./runs_can \ --name exp1_v5逻辑说明YOLOv5 的参数是双横线长选项--img对应输入尺寸--weights对应预训练权重。参数上YOLOv5 对data.yaml里train/val路径的解析和 ultralytics 略有差异建议用绝对路径先跑通再改相对路径。切换版本时最容易忽略的是标签缓存文件换版本后删掉*.cache重新生成否则会读到旧版本的缓存导致类别错乱。3.4 训练参数怎么调看这三个信号训练过程中盯三个东西box_loss、cls_loss、mAP50。box_loss 不降说明框回归有问题常见是坐标没归一化cls_loss 不降说明类别索引和 names 对不上mAP50 一直为 0 说明验证集路径错了或标签没被读到。# 训练结束后用验证命令单独跑一次确认指标可复现 yolo detect val \ model./runs_can/exp1/weights/best.pt \ data./data.yaml \ imgsz640 \ batch16逻辑说明单独 val 能排除训练时数据增强的干扰得到更干净的指标。参数上best.pt是验证集表现最好的权重last.pt是最后一轮对比两者能看出有没有过拟合。如果 val 的 mAP 远低于训练时显示的值多半是验证集和训练集有重叠或标签泄漏。4. 避坑与排查标签、路径、显存这三类问题最常见4.1 现象训练启动就报「No labels found」原因data.yaml里train或val指向的目录下没有 labels 子目录或者图像和标签不在同一层级。YOLO 默认按「图像路径替换 images 为 labels」去找标签目录结构不对就找不到。解决确认 images 和 labels 是平级目录且内部子目录名一致。用前面 2.1 的统计命令核对数量缺标签的图要么补标要么移出训练集。4.2 现象损失正常降但 mAP 一直是 0原因类别索引和names顺序错位或者标签里出现了nc范围外的类别索引。比如 nc 写 3标签里却有类别 3模型直接忽略这些框。解决统计标签里所有类别索引的最大值确保小于 nc。# 统计所有标签里的类别索引分布 import glob, collections counter collections.Counter() for p in glob.glob(./labels/**/*.txt, recursiveTrue): with open(p) as f: for line in f: if line.strip(): counter[line.split()[0]] 1 print(counter)逻辑说明这段脚本把所有标签的类别索引汇总输出每个索引出现次数。参数上recursiveTrue保证子目录也扫到。如果出现索引等于或大于 nc回去改 yaml 或清理标签。4.3 现象训练中途显存溢出CUDA out of memory原因batch 太大、imgsz 太大或者 workers 太多导致数据加载占用显存。1531 张图不算大但 640 尺寸下 batch 16 在 8G 显存上就可能吃紧。解决按顺序降 batch、降 imgsz、降 workers。先降到 batch 8 试还不行就 imgsz 512再不行 workers 设 0。不要一上来就换更大显存的卡先确认参数是不是设过头。4.4 现象换 YOLO 版本后类别名全变成数字原因旧版本生成的*.cache缓存文件被新版本读到缓存里存的是旧类别映射。换版本或改过data.yaml后必须删缓存。解决删掉 labels 目录下所有.cache文件重新训练让缓存重建。# 清理标签缓存换版本或改 yaml 后必做 find ./labels -name *.cache -delete逻辑说明缓存文件是 YOLO 为了加速数据读取生成的内容包含图像路径和标签解析结果。参数上-delete直接删除下次训练自动重建。这一步不做改过的类别映射不会生效。4.5 现象验证集指标虚高实际推理一塌糊涂原因训练集和验证集有重叠图像或者同一张图的不同增强版本分别进了训练和验证。1531 张图划分时如果按文件名随机分容易出现这种泄漏。解决按图像主体分组划分同一场景或同一批次的图要么全在训练集要么全在验证集。检查方法是对比训练集和验证集的图像文件名看有没有重复。# 检查训练集和验证集是否有同名图像 import os train set(os.listdir(./images/train)) val set(os.listdir(./images/val)) print(重叠图像:, train val)逻辑说明这段脚本直接求两个目录文件名的交集有输出就说明划分有问题。参数上如果图像名带批次前缀可以按前缀分组再划分避免同批次泄漏。5. 验证与进阶用混淆矩阵和单图推理确认模型真的能用训练跑完不算完得确认模型在真实图上框得对。最直接的方法是拿验证集里的图跑单图推理把预测框画出来看。YOLO 系列都支持命令行推理输出带框的图像。# 对单张图推理保存带框结果 yolo detect predict \ model./runs_can/exp1/weights/best.pt \ source./images/val/img_0769_404.jpg \ conf0.25 \ saveTrue逻辑说明source可以是单图、目录或视频conf是置信度阈值低于它的框不显示。参数上conf设 0.25 是常用起点漏检多就降到 0.1误检多就升到 0.4。保存的结果在runs/detect/predict下直接打开看框的位置和类别标签对不对。接着看混淆矩阵。训练完成后runs_can/exp1下会生成confusion_matrix.png横轴是预测类别纵轴是真实类别对角线越深越好。如果罐头被大量预测成瓶子说明这两类在特征上太接近要么补更多区分性样本要么在训练时加大这两类的损失权重。我一般会重点看非对角线上的数值超过对角线 20% 就说明这一类有问题。再进一步用val命令输出的mAP50和mAP50-95两个指标交叉判断。mAP50 高但 mAP50-95 低说明框的位置不够准可能是标注框偏大或偏小两个都低说明特征没学好回去查数据质量和类别平衡。1531 张图里如果某一类只占几十张训练时容易出现类别不平衡常见做法是在data.yaml同级加一个权重文件或者在训练命令里用cls权重参数调整但更稳的还是补样本。最后说一个我自己的习惯每次拿到新数据集先不训练先用 2.2 的脚本抽查 20 个标签文件再用 4.2 的脚本统计类别分布最后用 4.5 的脚本查训练验证重叠。这三步走完再开训练能省掉后面大量排查时间。从那以后我每次接新数据集都强制走一遍这套检查翻车次数明显少了。希望帮到你。本文还有配套的精品资源点击获取