尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
从零训练YOLOv8罐装饮料识别模型:数据集体检、标注清洗与训练调参实战
简介面向计算机视觉入门与进阶学习者这份罐装饮料识别数据集涵盖一千多张真实场景图片并提供YOLOv8格式的标注文件可支持薯片、东鹏特饮、红牛、芬达、养乐多、可乐、雪碧、王老吉、AD钙奶、金典、特仑苏、蒙牛、伊利、旺仔牛奶等多种常见饮品的检测模型训练。资源共2000个文件以1678个txt标注文件为主体配合321张jpg原始图片和1个yaml配置文件压缩包大小约45.95MB。txt文件对应YOLOv8所需的标签信息yaml文件用于定义类别名称与数据集路径拿到后即可直接对接训练脚本。目前已有929人学习下载。数据集目录组织规范图片与标注一一对应可快速划分训练集与验证集省去自行采集和标注的时间适合用于课程设计、毕业设计或目标检测算法的调优实验。1. 罐装饮料识别的数据包一千多张图够不够YOLOv8 标注怎么用罐装饮料识别一千多张图片支持yolov8格式的标记可识别常见的薯片东鹏特饮红牛芬达养乐多可乐雪碧王.zip——这个标题本身就是一个现成的目标检测数据集。它解决的是便利店货架、饮料柜和自动售货机场景下的商品识别问题图片和标注都给你备好了省掉手动打标签的体力活。但一千多张图摊到八个类别上每个类别样本也就一两百张类别不平衡和数据质量问题都会让训练翻车。适合拿它跑通 YOLOv8 训练自己的数据集这套流程的人尤其是想快速出 demo 的从业者。拿到压缩包别急着烧卡先按本文做一遍体检把坑排掉再开训。2. 解压后先体检目录结构、图片尺寸与标注格式检查2.1 从 zip 到训练目录images/labels 配对逻辑常见的数据包解压后有两种组织方式一种是所有图片放在 images 文件夹、所有 txt 放在 labels 文件夹另一种是已经分好 train/val每份下面再分 images 和 labels。不管哪种YOLO 读取的是 txt 文件名与图片名一致而不是读文件里的路径。所以第一步先把配对关系查一遍。unzip 罐装饮料识别*.zip -d drink_data cd drink_data find . -type f | head -20解压后建议先看目录树确认有没有多层嵌套的奇怪路径。常见坑是压缩包自带一层同名根目录处理的时候多套了一层文件夹写 dataset.yaml 的路径容易写错。我一般会先跑一个快速配对脚本统计 images 和 labels 的数量差import os from pathlib import Path root Path(drink_data) images list((root / images).glob(*)) labels list((root / labels).glob(*)) img_ids {p.stem for p in images} lab_ids {p.stem for p in labels} print(f图片数量: {len(img_ids)}) print(f标注数量: {len(lab_ids)}) print(有图无标注:, len(img_ids - lab_ids)) print(有标注无图:, len(lab_ids - img_ids))这段代码的核心是拿文件名去交集不看后缀。因为图片可能是 .jpg、.jpeg 或 .png但标注后缀一定是 .txt。如果有图无标注这个数字不是零说明数据包里有未标记样本训练时要么把它们删掉要么单独放到 unlabeled 目录。如果有标注无图异常多半是残留文件需要清理。2.2 用脚本查三类硬伤空标注、越界框、类别数量分布配对检查通过只代表没有孤儿文件不代表标注能用。罐装饮料数据集最常见的三类硬伤是空 txt、坐标越界、类别 id 超出了 classes 列表长度。空标注文件会让训练把该目标当背景越界框会直接报错或被过滤。这个体检脚本会把 labels 文件夹整个扫一遍import numpy as np from pathlib import Path label_dir Path(drink_data/labels) class_names [薯片, 东鹏特饮, 红牛, 芬达, 养乐多, 可乐, 雪碧, 王] counts {name: 0 for name in class_names} bad_boxes, empty_files 0, 0 for txt in label_dir.glob(*.txt): lines txt.read_text(encodingutf-8, errorsignore).strip().splitlines() if not lines: empty_files 1 continue for line in lines: parts line.split() if len(parts) ! 5: bad_boxes 1 continue cls, x_c, y_c, w, h parts[0], float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) if x_c 0 or x_c 1 or y_c 0 or y_c 1 or w 0 or h 0: bad_boxes 1 continue counts[class_names[int(cls)]] counts.get(class_names[int(cls)], 0) 1 print(空标注文件:, empty_files) print(非法框数量:, bad_boxes) for k, v in counts.items(): print(f{k}: {v})这里把类别名写死成了数据包的顺序实际上更通用的做法是先从 classes.txt 读列表但思路一致。坐标这里YOLO 格式要求中心点 x、y 和宽高都是 0~1 的归一化值如果 w 或 h 大于 1说明原作者给的是像素坐标没有归一化。这类硬伤处理起来很直接统一用脚本转成归一化坐标或者用 OpenCV 读取图像宽高换算。如果有空标注文件我一般直接删除对应图片和 txt让训练集只保留有效样本。如果某一类数量明显偏少比如养乐多只有二十几个框你得考虑是否要从原始图片里裁剪补充或者后面在增强阶段多给点权重。2.3 类别映射把王这类简写归到 class.txt很多数据集提供方习惯把类别表写成一个 classes.txt 或 data.yaml 放在根目录。但压缩包里有时候只有几个字母的简写比如标题里的王大概率对应某品牌凉茶但你不需要去猜。因为模型学的是类别编号与视觉外观的对应关系只要保证 classes.txt 的行顺序和 txt 第一列数字一致类别名是中文还是拼音完全不影响训练效果。常见做法是把所有类别名统一写成英文或拼音方便后面部署时打印标签。如果想在可视化时看到中文就把 class_names 单独存一个列表推理时将 index 映射回中文显示。这里给一个重命名类别表的流程from pathlib import Path name_map { 薯片: chips, 东鹏特饮: dongpeng, 红牛: red_bull, 芬达: fanta, 养乐多: yogurt, 可乐: cola, 雪碧: sprite, 王: wang, } label_dir Path(drink_data/labels) classes_file Path(drink_data/classes.txt) with classes_file.open(w, encodingutf-8) as f: for name in name_map.values(): f.write(name \n)这里有个容易踩的坑如果你只改了 classes.txt但没有同步改 labels 里的数字模型会把旧编号对应到新名字上。正确做法是始终以现有 txt 第一列的类别 id 为准classes.txt 只是给人看的命名表。所以我实际训练时会在 dataset.yaml 里直接引用这个 classes_file再单独写一段代码统计各类别 id 和类别名的对应数量确保没有异步。3. 划分数据集与预处理训练集和验证集这样分才不会让 mAP 虚高3.1 按文件列表划分 train/val一个脚本解决随机和连续帧问题数据包只有一份没有官方划分。最常见做法是随机抽 80% 做训练、20% 做验证。但罐装饮料的数据往往来自一次连续拍摄同一瓶饮料在多张相邻图片里都出现。如果纯随机划分验证集里会出现与训练集几乎一样的构图mAP 虚高得非常厉害线下指标完全不能反映真实货架场景。如果压缩包里已经按场景分了多个子目录就按目录划分如果没有看文件名是否有场景前缀。比如shelf_01_xx.jpg这种就按前缀分组后再划分。一个实用的划分脚本import random from pathlib import Path root Path(drink_data) image_dir root / images label_dir root / labels image_paths list(image_dir.glob(*.jpg)) random.shuffle(image_paths) train_n int(len(image_paths) * 0.8) train_files image_paths[:train_n] val_files image_paths[train_n:] def write_split(name, files): with open(name, w) as f: for img in files: f.write(fimages/{img.name}\n) write_split(train.txt, train_files) write_split(val.txt, val_files)脚本里写的是相对路径配合后面 dataset.yaml 里的path根目录一起使用YOLOv8 会自动拼接。这里要特别留意如果你知道这些图来自连续拍摄就别用上面的随机划分。按文件名前缀分组确保同一场景的连续帧要么全部进 train要么全部进 val这才是真正的严格划分。3.2 图像尺寸与缩放逻辑imgsz 不是越大越好手机拍照的原图往往 4000×3000直接喂给 YOLOv8 会把显存打爆。YOLOv8 在训练时会把输入图缩放到设定尺寸默认 imgsz640。罐装饮料的瓶子、易拉罐在货架上算中小目标瓶身上的 logo 尤其小建议先跑一版 imgsz640 的基线再看结果决定要不要上 1280。这里有个理解误区imgsz 不是把图片 resize 后再保存而是训练时在你的数据集上随机缩放、裁剪后放入网络。所以你不需要自己把原图压小了再进训练。但如果图片是超宽货架横图直接缩放会导致饮料瓶压得很扁建议先做一次居中裁剪或切分。用 Python 看一眼你的图片尺寸分布比拍脑袋决定 imgsz 靠谱from PIL import Image from pathlib import Path import collections sizes collections.Counter() for img_path in Path(drink_data/images).glob(*): with Image.open(img_path) as im: sizes[im.size] 1 print(sizes.most_common(10))如果最大宽高比超过 2:1建议按左右或上下切段让每个训练样本更接近正方形。这一步会显著影响小物体的召回率尤其是罐身 logo 那种极小目标。3.3 数据增强一千张图怎么翻出三千张效果YOLOv8 自带数据增强开箱即用的有 mosaic、hsv、flip、平移和缩放。对于罐装饮料识别我建议关闭上下翻转因为货架上的饮料罐不会头朝下保留左右翻转是合理的因为罐身本身对称。mosaic 增强会同时拼接四张图对提升小目标识别特别有帮助代价是训练初期损失波动会更大模型需要更多 epoch 才能稳定。在 YOLOv8 里你可以通过命令行把flipud、hsv_h、mosaic等参数覆盖默认值yolo detect train \ modelyolov8s.pt \ datadrink_data.yaml \ epochs100 \ imgsz640 \ batch16 \ flipud0.0 \ mosaic1.0flipud0.0禁止上下翻转mosaic1.0保持四图拼接。这两个是罐装饮料场景最值得动的增强项。如果你不确定增强参数怎么设先用默认值跑一个短训练观察损失曲线再逐步加。增强不是越多越好过了头会让模型学到错误的空间先验比如把上下颠倒的易拉罐也当成正样本。4. YOLOv8 训练自己的数据集yaml 写法和关键参数调校4.1 写 dataset.yaml路径、类别顺序与中文名在 YOLOv8 里数据集配置是一个 yaml 文件。大部分新手会在这里翻车路径写成相对路径但工作目录变了就找不到类别顺序和 txt 第一列不一致模型学到的语义全错。一个能直接用的 dataset.yaml 长这样path: /home/user/drink_data train: train.txt val: val.txt names: 0: chips 1: dongpeng 2: red_bull 3: fanta 4: yogurt 5: cola 6: sprite 7: wangtrain和val字段可以是目录也可以是文本文件。写train.txt时yaml 会把它当成图片列表文件逐行读取路径再和path字段做拼接。所以第 3 章写的train.txt内容用images/xxx.jpg这种相对路径是最稳的写法。如果你硬要用绝对路径YOLOv8 也能读但换电脑后就得全部重写。注意names的顺序必须和 labels 里 txt 第一列的类别 id 严格对应。如果 txt 里第一列是 0 对应薯片那names的第 0 个就写 chips位置不能换。这个顺序错了所有框都会张冠李戴。4.2 训练命令行从预训练权重起步的参数清单先说环境配置pip install ultralytics就能用但要确认 torch 和 CUDA 匹配。NVIDIA 驱动装好后在 Python 里跑一下import torch; torch.cuda.is_available()是 True 再开始。训练从预训练权重起步推荐用 yolov8n.pt 或 yolov8s.pt而不是随机初始化。一千多张图的规模下nano 当基线足够s 会稍准但更耗显存。yolo detect train \ datadrink_data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ namedrink_run参数含义modelyolov8s.pt网络结构加预训练权重省略结构只给权重文件即可。epochs100一千多图建议先跑 100 轮如果验证指标二十轮内不涨可以提前停。imgsz640输入尺寸小目标多可试 1280显存消耗翻倍。batch16显存不足就降到 8不要硬撑。device0指定 GPU没 GPU 就写devicecpu但训练时间会很长。namedrink_run输出权重和曲线会存在runs/detect/drink_run。给一个常用参数参考表参数常用值说明epochs100~300数据少时过拟合快配合早停更稳imgsz640小目标多可试 1280batch8~32按显存量力而行1.5GB 到 24GB 都能跑optimizerauto / SGDSGD 调 LR 更直接lr00.01用预训练权重时可降到 0.005patience50验证指标 50 轮不涨自动停cacheTrue小数据集可预加载到内存省 IO很多人问训练为什么不收敛建议先检查 batch 是否过小或学习率是否过大这两项是损失波动的元凶。train 输出目录里会有 args.yaml所有参数都记录在里面翻车时先看它。4.3 损失曲线怎么看训练中断、过拟合与欠拟合的吃瓜指南YOLOv8 每次训练结束会在输出目录生成results.csv和results.png。有些人直接看 png 就下结论但我一般会打开 csv 看具体数值变化因为 png 缩得太小容易漏掉细节。import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/drink_run/results.csv) plt.plot(df[train/box_loss], labeltrain box_loss) plt.plot(df[val/box_loss], labelval box_loss) plt.legend() plt.show()如果val/box_loss在二十轮后还在下降说明训练没到位如果训练损失一直降、验证损失从某轮开始反弹则进入过拟合。罐装饮料数据类别少但背景复杂过拟合会表现为验证集 mAP 不错一到真实货架上就开始乱框。如果验证损失震荡得像锯齿通常是 batch 太小或学习率偏大。损失曲线不是玄学它只是把数据质量和超参问题可视化出来你得学会从波动里反推训练状态。5. 罐装饮料识别常见问题排查5 个翻车现场与解决办法5.1 现象loss 死活不降验证 mAP 停在 0.1原因最常见是标签文件中有空 txt 或者类别 id 超出了范围。YOLO 训练遇到这类错误会直接跳过该样本或把它当背景导致模型学不到对应类别。解决把第 2 章的体检脚本跑一遍过滤掉所有空标注和越界框重新训练。十次有八次问题出在数据本身而不是模型结构。5.2 现象训练时只学会识别薯片东鹏特饮和养乐多一个都认不出原因类别不平衡。数据包里薯片样本可能占了一半养乐多也许只有二十个框网络把多数类学得很充分少数类被当成背景。解决办法分三步先看类别数量分布确认少数类然后对该类别做重复采样或复制增强最后调大分类损失权重YOLOv8 里对应超参是cls例如设成 0.8 会让模型更关注分类难例。少数类不足 50 个框时光靠增强不够建议从原图里裁剪该类别的瓶子再补标一批。5.3 现象验证集 mAP 不错一上真实货架就乱标原因数据泄漏。拍摄同一排货架的相邻两帧一张进了训练集、另一张进了验证集验证指标虚高而真实货架的拍摄角度、光线、背景都变化模型就露馅。解决回到第 3 章看划分是否按场景分组。如果图片文件名带序列号把连续几十帧强制分到同一边实在不行就重新标一小批完全没有进过训练集的新照片作为真实验证集以它为准。5.4 现象图片解压后看起来是正的标注却全部偏移原因手机照片有 EXIF 旋转。很多数据集是用手机原图做的图片查看器会自动转正但训练脚本读到的像素矩阵没有转。标注是在旋转后的视图上画的一转到像素坐标就错位。解决统一用 PIL 读取时做ImageOps.exif_transpose(im)或者干脆先把所有图过一次转正再存一遍。这个坑最隐蔽我拿任何数据集都会先抓一张图和它的 txt 画框可视化肉眼比对一下再开工。5.5 现象显存不够batch 一调小就报错原因数据集图片是 4000×3000虽然训练时会缩放但如果开了cacheTrue且 imgsz 较大数据加载和预处理会占额外显存。解决先把imgsz降到 640batch降到 8 或 4再不行就关掉 mosaic因为 mosaic 拼接四图需要额外缓冲。如果还报错换成yolov8n或者用 CPU 跑一个小 epoch 验证流程是否通。显存问题本质是算力和数据的平衡不是调一个参数就能彻底解决的。6. 验证与部署用一次货架实拍检验你的模型顺带聊聊 RK3588 部署模型训练完只是第一步罐装饮料识别最终要落到门店或设备上。建议先拿手机到便利店拍十张不同机位的货架照片用下面的命令跑一遍推理yolo detect predict \ modelruns/detect/drink_run/weights/best.pt \ sourcetest_photos/ \ conf0.35 \ saveTrue \ save_txtTrueconf0.35是置信度阈值误检多就调到 0.5漏检多就降到 0.25。货架上饮料紧密排列可以把 NMS 的 IoU 阈值适当调低减少相邻瓶子被合并成一个框的概率。实际业务里优先保证精确率还是召回率取决于你是做补货提醒还是做防错纠偏。如果要在 RK3588 这类边缘盒子上跑通常得先把权重导出 ONNX再转成 RKNN。我在导出时踩过一个坑直接导出 ONNX 的模型里有大量小算子和自定义算子RKNN 工具链不支持所以最好先用yolo export modelbest.pt formatonnx导出然后用onnxsim简化最后再进 RKNN 工具。这个环节参数调错了到设备上就是黑匣子看不到中间结果只能来回重导。我的教训是不要因为拿到一千多张图就急着烧卡训练。先花半小时把标注体检、数据划分和类别平衡这三件事做扎实训练只是最后的一步。很多看起来是模型能力的问题最后都指向数据质量。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

YOLOv9 + Triton 部署实战:从 ONNX 导出到生产级推理服务

YOLOv9 + Triton 部署实战:从 ONNX 导出到生产级推理服务

简介:本资源是一套面向AI算法工程师与深度学习部署实践者的YOLOv9目标检测模型生产级部署方案,聚焦Triton Inference Server在工业场景中的落地应用,解决模型从训练到服务化推理的关键断点问题。压缩包共16个文件,含7个核心Python…

📅 2026/10/11 6:30:44
从极简命名到工程落地:轻量级自动化工具的设计与实现

从极简命名到工程落地:轻量级自动化工具的设计与实现

1. 从“rea”这个标题说起:一个极简命名背后的完整项目思维第一次看到“rea”这个标题的时候,我脑子里蹦出来的第一反应是——这大概率又是一个被压缩到极致的项目代号。做技术的人都有这个习惯,项目名越短越好,短到外人完全看不懂…

📅 2026/10/11 6:30:44
扫地机器人三条路线全解析:成品选购、半成品改造与DIY攒机指南

扫地机器人三条路线全解析:成品选购、半成品改造与DIY攒机指南

1. 从“想拥有一台”到“真正用上”:三条路线怎么选扫地机器人这东西,第一次认真研究的人多半会被参数表绕晕。吸力多少帕、电池多少毫安时、带不带激光雷达、能不能自动洗拖布,每一项都有人告诉你“必须拉满”,但真到自己掏钱或者…

📅 2026/10/11 6:30:44
MORE NEWS

更多资讯

📰

TongWeb集中管理文件名乱码排查:LANG环境变量与JVM字符集链路解析

上周处理了一个挺典型的中间件现场问题:客户反馈TongWeb集中管理平台上,通过控制台上传的部署包和配置文件,文件名在管理界面里变成了一串乱码,服务器上实际落盘的文件名也是乱的。排到后面发现根子不在TongWeb本身,而…

📰

明明DLL就在眼前却找不到?一文讲透Windows加载机制与排查修复

一开始先把结论说在前面:这个"明明 DLL 就在眼前,却说找不到"的报错,九成以上根本不是文件丢了,而是 Windows 在加载动态链接库的路上卡住了。卡住的环节千奇百怪,但排查思路高度统一。我干了十来年 Windows…

📰

Spring Boot+Vue图书馆座位预约系统设计与实现:信用分与并发控制实践

1. 项目概述与核心需求拆解1.1 为什么需要一个座位预约系统高校图书馆的占座问题几乎是每个学校都绕不开的痛点。早八点抢座、书包装座位、人走书留一整天,这些场景我相信每个经历过图书馆生活的人都不陌生。我自己在学校做过一段时间的信息化项目支持,接…

📰

解决Claude Code会话失忆:claude-mem自动记忆工具完整指南

如果你正在重度使用 Claude Code 这个命令行 AI 编程工具,大概率碰到过同一个让人抓狂的问题:聊到一半它开始忘记项目里的结构约定,隔了一天再打开终端,上次会话里好不容易对齐的技术方案它一个字都不记得。我大概是在做某跨平台系…

📰

从模糊题目到完整工程:自研服务编排框架OSOF全复盘

上周日晚上,教务群跳出来一条消息:“OSOF综合实验,请抓紧完成框架设计、源码和测试报告,周五答辩。”没有需求文档,没有验收标准,连这个缩写具体指什么都不解释。我盯着屏幕翻了十分钟热搜,搜出…

📰

基于深度学习的图像隐写分析系统:从残差图到GUI部署全解析

简介:这是一份基于深度学习的图像隐写分析项目源码与论文资料包,面向计算机、通信、人工智能等专业学生、教师及从业者,适合用于课程设计、毕业设计或进阶学习。项目实现隐写分析与隐写去除两大功能,分别采用SRNet网络模型与DDSP网…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬