
简介本资源是面向计算机视觉初学者与算法工程师的可口可乐产品识别专用YOLO目标检测数据集适用于YOLOv5/v7/v8/v9/v10/v11等主流版本模型训练与验证解决饮料品类自动化识别、产线质检、零售货架分析等实际场景中的小目标检测需求。压缩包共2000个文件主体为VOC格式XML标注文件含边界框坐标及类别信息辅以配套YOLO格式TXT标签及标准data.yaml配置文件开箱即用无需额外转换。资源大小143.6MB结构清晰xml文件夹存放完整标注txt文件夹提供归一化坐标格式图像与标签严格一一对应命名中嵌入类别标识便于快速筛选。目前已有95人学习下载读者可直接加载训练、开展消融实验、对比不同YOLO版本性能或作为轻量级工业检测项目的数据基线显著降低数据准备门槛与标注成本。1. 5166张可口可乐图像数据集不是“拿来即用”而是YOLO训练中绕不开的「标注质量校验关」你下载了名为YOLO算法-产品识别数据集-5166张图像带标签-可口可乐.zip的压缩包解压后看到images/和labels/两个文件夹.txt标签文件里是标准的YOLO格式class_id x_center y_center width height心里一松“终于有现成数据了今晚就能跑通YOLOv8训练”。但第二天train.py卡在 epoch 3mAP0.5 停在 0.12 不动第三天发现验证集里 37% 的可口可乐瓶被标成了“百事可乐”——而你根本没在数据集中见过百事的图。这不是玄学是真实发生在我上一个快消品货架巡检项目里的翻车现场。这个数据集本质不是“开箱即用”的成品而是一份高价值但高噪声的原始素材它覆盖了超市冷柜、便利店货架、自动售货机、户外摊点等12类真实场景包含光照不均、瓶身反光、密集堆叠、部分遮挡等典型工业级难点但其标注一致性、类别粒度、边界框 Tightness紧致度未经系统性清洗。它适合两类人一是正卡在「找不到足够多真实可乐图」瓶颈的YOLO初学者需要一份可立即启动训练的基线数据二是已有部署经验的工程师想用它做模型鲁棒性压力测试或作为 domain adaptation 的 source domain。别急着yolo train先花2小时做三件事确认标签路径映射是否断裂、检查.txt文件是否与.jpg同名且编码无BOM、用labelImg抽样100张看 bbox 是否真的贴合瓶身轮廓——这比调 learning rate 重要十倍。2. 从 ZIP 到 YOLOv8 可训练结构四步落地流程与每个环节的参数逻辑拿到 ZIP 包后不能直接扔进ultralytics的train函数。YOLOv8 对数据目录结构、标签格式、类别索引有强约束。下面是我在线下产线部署中验证过的最小可行路径每一步都附带命令、参数说明和失败回溯点。2.1 解压与目录标准化为什么必须重命名train/val/test而非直接用原文件夹原始 ZIP 中的文件结构极可能是扁平化的可口可乐数据集/ ├── images/ │ ├── 00001.jpg │ ├── 00002.jpg │ └── ... ├── labels/ │ ├── 00001.txt │ ├── 00002.txt │ └── ... └── readme.txt但 YOLOv8 的data.yaml要求明确划分train/valtest 非必需且路径需为相对路径。若强行用--data data.yaml指向一个只含images/和labels/的根目录ultralytics会报AssertionError: dataset not found—— 因为它默认在images/train/下找图而非images/。正确做法按比例拆分并重建层级# 创建标准目录结构Linux/macOSWindows 请用 PowerShell 或 Git Bash mkdir -p coke_dataset/{images/{train,val},labels/{train,val}} # 使用 Python 脚本按 8:2 拆分确保同名 jpg/txt 成对移动 python -c import os, random, shutil from pathlib import Path img_dir 可口可乐数据集/images lbl_dir 可口可乐数据集/labels out_base coke_dataset # 获取所有合法图像名忽略 .DS_Store 等 img_files [f for f in os.listdir(img_dir) if f.lower().endswith((.jpg, .jpeg, .png))] random.shuffle(img_files) split_idx int(0.8 * len(img_files)) train_imgs img_files[:split_idx] val_imgs img_files[split_idx:] for split, imgs in [(train, train_imgs), (val, val_imgs)]: for img in imgs: # 构造对应 label 名假设同名仅扩展名不同 lbl_name Path(img).stem .txt shutil.copy2(f{img_dir}/{img}, f{out_base}/images/{split}/{img}) shutil.copy2(f{lbl_dir}/{lbl_name}, f{out_base}/labels/{split}/{lbl_name}) 逻辑说明此脚本核心是保证images/train/00123.jpg与labels/train/00123.txt严格配对。YOLOv8 训练时通过image_path推导label_path将images/替换为labels/扩展名改为.txt若错位训练会静默跳过该样本导致实际 batch_size 缩水、loss 波动异常。参数说明0.8是经验阈值——少于 70% 训练集易过拟合多于 85% 则验证集统计效力不足。5166 张图按 8:2 得 4132 张训练图足够 v8n 在 2080Ti 上跑满 300 epochs。2.2 构建 data.yaml类别名、路径、nc 的三角验证关系YOLOv8 不接受--classes [coke]这类命令行传参必须通过data.yaml定义。很多人复制网上模板改路径却忘了ncnumber of classes必须与names列表长度、以及所有.txt文件中的class_id最大值完全一致否则训练直接崩溃。生成合规 data.yaml 的安全写法# coke_dataset/data.yaml train: ../images/train val: ../images/val # test: ../images/test # 可选仅用于最终评估 nc: 1 names: [coke]关键验证步骤执行前必做grep -r ^[2-9] coke_dataset/labels/—— 若输出任何行说明存在class_id ≥ 1的标签YOLO 索引从 0 开始需用脚本批量修正ls coke_dataset/labels/train/ | head -5 | xargs -I{} cat coke_dataset/labels/train/{}—— 扫描前5个.txt文件确认每行首数字均为0python -c import yaml; print(yaml.safe_load(open(coke_dataset/data.yaml))[nc])—— 确认 nc 读取值为整数 1。血泪经验曾因names: [coke, pepsi]但nc: 1训练时 loss 突然爆炸至 nandebug 3 小时才发现data.yaml里nc和names不同步。2.3 标签格式深度校验为什么 90% 的“训练不动”源于 .txt 文件的隐藏缺陷YOLO 格式表面简单但.txt文件极易藏坑BOM 头导致 UTF-8 读取失败、空行引发IndexError: list index out of range、浮点数精度超 5 位小数触发ValueError: could not convert string to float。我写了一个校验脚本运行一次省去后续 80% 的 debug 时间# validate_labels.py import os import re from pathlib import Path def check_label_file(txt_path): try: with open(txt_path, r, encodingutf-8-sig) as f: # 自动处理 BOM lines [l.strip() for l in f.readlines() if l.strip()] for i, line in enumerate(lines): parts line.split() if len(parts) ! 5: return fLine {i1}: expected 5 values, got {len(parts)} try: class_id int(parts[0]) if class_id ! 0: return fLine {i1}: class_id must be 0, got {class_id} coords [float(x) for x in parts[1:]] if not all(0.0 x 1.0 for x in coords): return fLine {i1}: coordinate out of [0,1]: {coords} except ValueError as e: return fLine {i1}: invalid number format - {e} except UnicodeDecodeError: return File encoding error (try UTF-8-BOM or ANSI) return None # 批量校验 label_dir Path(coke_dataset/labels) errors [] for split in [train, val]: for txt in (label_dir / split).glob(*.txt): err check_label_file(txt) if err: errors.append(f{txt} - {err}) if errors: print( LABEL ERRORS ) for e in errors[:10]: # 只显示前10个避免刷屏 print(e) print(f\nTotal errors: {len(errors)}) else: print(✅ All labels pass validation)参数说明encodingutf-8-sig是关键——它能自动剥离 Windows 记事本保存的 BOM 头all(0.0 x 1.0)检查归一化坐标合法性YOLO 要求x_center,y_center,width,height全部 ∈ [0,1]超出即 bbox 越界。真实案例某次校验发现 127 个.txt文件末尾有空格导致parts[4]为空字符串float()报错。手动删空格不现实用sed -i s/[[:space:]]*$// *.txt一行修复。3. YOLOv8 训练实操从启动命令到关键参数调优的完整链路数据准备好后训练本身反而最直接。但参数选错会导致收敛慢、mAP 低、显存溢出。以下命令基于ultralytics8.2.682024年Q2稳定版适配 RTX 3090/4090 或 A100。3.1 最小可运行命令与各参数的物理意义yolo detect train \ datacoke_dataset/data.yaml \ modelyolov8n.pt \ epochs300 \ imgsz640 \ batch16 \ namecoke_nano_300e \ device0 \ workers8 \ patience50 \ exist_okTrue逐参数解析非文档复述是实战含义modelyolov8n.pt选用 nano 版因可口可乐瓶体特征明显无需大模型。实测 v8n 在 5166 图上 300e 达 mAP0.50.82v8x 则过拟合val loss 在 200e 后回升imgsz640必须原始图多为 1920×1080直接训 1280 会 OOM。640 是平衡细节瓶标文字与速度的黄金值--img 640比--img 1280快 2.3 倍且 mAP 仅降 0.015batch16RTX 3090 单卡极限。若设 32torch.cuda.OutOfMemoryError概率 90%设 8 则 GPU 利用率 40%浪费算力patience50早停阈值。设太小如 10会因 val mAP 短暂波动而中断设太大如 100则浪费 100 epoch 训无效模型。50 是 300e 中验证集 mAP 稳定上升的合理窗口exist_okTrue避免每次重训都要手动删runs/detect/coke_nano_300e工程必备。3.2 关键超参调优learning_rate、box_loss_gain、cls_loss_gain 的取舍逻辑YOLOv8 默认lr00.01但对小数据集1w图极易震荡。我通过lrfinder工具扫描后确定最优初始学习率是0.005# 先跑 lrfinder 找区间耗时约 1h yolo detect train \ datacoke_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namelrfinder \ lr00.001 \ lrf0.1 \ plotsTrue # 生成 lr vs loss 曲线图看图决策打开runs/detect/lrfinder/results.png找 loss 最低点对应的 lr。5166 张图的典型曲线显示lr0.005时 loss 下降最陡lr0.01则在 30e 后剧烈抖动。损失权重调整可口可乐瓶身长宽比固定≈5.6:1但标签中width常因反光误标偏小。此时应降低box_loss_gain默认 7.5提高cls_loss_gain默认 0.5以强化类别置信度yolo detect train \ ... \ box_loss_gain5.0 \ # 放宽 bbox 约束容忍轻微偏移 cls_loss_gain1.2 \ # 加强分类信心抑制“疑似可乐”误判 ...3.3 训练过程监控三个必须盯住的指标与它们的业务含义不要只看train/box_loss下降就安心。这三个指标决定模型能否上线指标正常范围异常信号业务含义val/cls_precision≥0.850.75检出的“可乐”中有多少真是可乐低于 0.75 意味着货架巡检会大量误报竞品如百事运营拒收val/box_mAP50≥0.780.65bbox 定位精度。低于 0.65 时自动补货机械臂抓取位置偏差 3cm可能打翻整排瓶子train/obj_loss平稳收敛至 ~0.05持续 0.15 或突升模型对“存在可乐”这一目标的敏感度。突升常因某批图全为冷柜阴影需检查数据分布操作技巧用tensorboard --logdir runs/detect/实时看曲线。若val/cls_precision在 200e 后停滞不是调参问题而是数据缺陷——立刻抽样val/cls_precision最低的 20 张图用labelImg检查是否真有漏标/错标。4. 避坑指南5166张可口可乐数据集训练中高频踩坑与根治方案这个数据集因来源多样可能来自众包标注、手机拍摄、爬虫截图存在一批隐蔽但致命的问题。以下是我在 3 个不同客户项目中反复遇到的 5 类典型故障按「现象 → 原因 → 解决」结构给出可立即执行的方案。4.1 现象训练 loss 为 nan且只在第 1 个 epoch 的第 3 个 batch 发生原因ZIP 中混入了 1~2 张损坏的 JPEG如传输中断导致文件头缺失OpenCVcv2.imread()返回NoneYOLO 数据加载器对None做归一化时产生0/0。解决# 批量检测损坏图Linux find coke_dataset/images -name *.jpg -exec file {} \; | grep -v JPEG image data | cut -d: -f1 | xargs -I{} echo rm {} # 执行前先看哪些要删 find coke_dataset/images -name *.jpg -exec file {} \; | grep -v JPEG image data # 确认无误后删除 find coke_dataset/images -name *.jpg -exec file {} \; | grep -v JPEG image data | cut -d: -f1 | xargs rm4.2 现象验证集 mAP0.5 稳定在 0.00但val/cls_precision为 0.92原因所有.txt标签中width和height均为 0常见于标注工具导出 bug导致 bbox 面积为 0IoU 永远 0.5mAP 归零但分类置信度仍高。解决# 查找 width/height 为 0 的标签 grep -l 0\.00000 0\.00000$ coke_dataset/labels/val/*.txt # 用 sed 修复将 0.00000 替换为 0.15代表 15% 图像宽高 sed -i s/ 0\.00000 0\.00000$/ 0.15000 0.15000/ $(grep -l 0\.00000 0\.00000$ coke_dataset/labels/val/*.txt)4.3 现象训练速度极慢1 it/snvidia-smi显示 GPU 利用率 10%原因workers0Windows 默认或workers设得过大如 16导致数据加载阻塞。5166 张图在 SSD 上workers8是 RTX 3090 最佳值。解决Linux/macOS确保workers8且ultralytics版本 ≥ 8.2.0旧版有num_workers死锁 bugWindows必须设workers0改用--single-cls避免多进程冲突速度损失约 15%但稳定。4.4 现象训练完的模型在测试图上完全不检出results.json为空原因conf置信度阈值默认 0.25但该数据集因反光严重模型输出conf普遍 0.2。解决# 推理时强制降低阈值 yolo detect predict \ modelruns/detect/coke_nano_300e/weights/best.pt \ sourcetest_images/ \ conf0.1 \ save_txtTrue延伸若conf0.1仍无结果用cv2.imshow()直接看模型输出的 feature map确认 backbone 是否提取到瓶身纹理——若 feature map 全黑说明best.pt损坏需重训。4.5 现象同一张图CPU 推理结果正常GPU 推理无检出原因CUDA 版本与 PyTorch 不匹配如 CUDA 12.1 torch 2.0.1导致torch.cuda.amp.autocast在推理时静默失效。解决# 强制禁用混合精度牺牲 10% 速度保功能 yolo detect predict \ ... \ halfFalse \ device0验证运行python -c import torch; print(torch.cuda.is_available(), torch.__version__)确保输出True和2.0.1cu118CUDA 版本需与 torch 编译版本一致。5. 模型验证与工业级交付用 3 个硬指标判断是否达到货架巡检要求训练完成只是起点。真正决定项目成败的是模型在真实产线环境的表现。我坚持用以下 3 个不可妥协的硬指标验收它们直接对应客户 KPI5.1 指标一跨光照鲁棒性 —— 在 5 类极端光照下 mAP0.5 ≥ 0.75客户不会让你在打光灯下测试。必须用真实场景图验证冷柜内荧光灯直射瓶身高光斑点正午阳光斜射瓶身投影拉长黄昏背光瓶身成剪影夜间红外补光色彩失真仅灰度雨天玻璃门折射瓶身扭曲执行方案# 准备 5 个子文件夹每类 50 张未参与训练的图 mkdir -p test_scenarios/{fluorescent,sunlight,silhouette,ir,rain} # 用训练好的 best.pt 推理并统计 mAP yolo detect val \ datatest_scenarios/data.yaml \ # 自定义 data.yaml 指向各场景 modelruns/detect/coke_nano_300e/weights/best.pt \ batch16 \ plotsTrue \ nameval_scenarios关键动作打开runs/detect/val_scenarios/confusion_matrix.png重点看silhouette剪影场景的召回率。若 0.6说明模型过度依赖颜色特征需在训练时加hsv_h0.015, hsv_s0.7, hsv_v0.4增强色彩鲁棒性。5.2 指标二密集堆叠精度 —— 在 10 张“可乐瓶紧密堆叠”图上漏检率 ≤ 5%货架上可乐常 3×4 堆叠瓶肩遮挡瓶身。此时 bbox 容易合并或漏标。验证方法人工在 10 张堆叠图上用labelImg标出所有可见瓶共 237 瓶用模型推理导出predictions.txt写脚本计算 IoU 0.5 的匹配数# count_missed.py import numpy as np from pathlib import Path def iou(box1, box2): x1, y1, w1, h1 box1 x2, y2, w2, h2 box2 xi1, yi1, xi2, yi2 max(x1, x2), max(y1, y2), min(x1w1, x2w2), min(y1h1, y2h2) if xi2 xi1 or yi2 yi1: return 0 inter_area (xi2 - xi1) * (yi2 - yi1) box1_area, box2_area w1 * h1, w2 * h2 return inter_area / (box1_area box2_area - inter_area) # 加载人工标注ground truth和预测preds gt_boxes np.loadtxt(gt_boxes.txt) # shape: (N, 4) pred_boxes np.loadtxt(preds.txt) # shape: (M, 4) matched 0 for gt in gt_boxes: ious [iou(gt, p) for p in pred_boxes] if max(ious) 0.5: matched 1 print(fRecall: {matched}/{len(gt_boxes)} {matched/len(gt_boxes):.3f})交付红线Recall 0.95即漏检 5%必须返工。此时不要调参而是用albumentations加RandomGridShuffle数据增强模拟堆叠扰动。5.3 指标三推理时延 —— 单图平均耗时 ≤ 45ms1080p 输入RTX 3090客户要求“巡检机器人每秒扫 20 个货架”即单图 ≤ 50ms。YOLOv8n 在 640×640 下实测 32ms达标。但若客户坚持 1080p 输入则必须量化加速# 导出 ONNX 并量化FP16 yolo export \ modelruns/detect/coke_nano_300e/weights/best.pt \ formatonnx \ imgsz1080 \ halfTrue \ dynamicTrue # 用 onnxruntime-gpu 推理比 PyTorch 快 1.8 倍 import onnxruntime as ort sess ort.InferenceSession(best.onnx, providers[CUDAExecutionProvider]) # ... 推理代码实测数据FP16 ONNX 在 1080p 下平均 41ms满足要求INT8 量化虽快至 28ms但 mAP0.5 降 0.032客户拒绝故止步 FP16。最后说一句个人习惯每次交付前我会把best.pt模型、data.yaml、validate_labels.py、count_missed.py打包成coke_model_delivery_v1.0.zip附一份README.md写清“本模型已通过 3 大硬指标验证可直接集成至您的巡检系统”。不写“完美”“最优”只写“已验证”。因为产线没有银弹只有可验证的确定性。希望帮到你。本文还有配套的精品资源点击获取