瓶装白酒疵品检测数据集实战:从数据拆解到YOLO基线训练 简介这份瓶装白酒疵品检测数据集面向计算机视觉与工业质检方向的学习者和研究者用于训练和评估瓶身划痕、标签破损、密封不良等疵品的自动识别模型适合作为机器学习入门到进阶的实战素材。压缩包共约2000个文件以4516张jpg图像为主体另含1个json标注文件整体约213.04MB图像覆盖瓶体多角度视图json可用于整理类别与标注信息便于直接构建训练、验证与测试流程。目前已有293人学习下载可作为竞赛或课程项目的现成数据基础。读者可据此搭建卷积神经网络分类或检测模型实践数据增强、样本平衡、过拟合抑制与准确率、精确率、召回率、F1分数等指标评估并理解工业质检场景下光照、背景与焦点一致性对模型泛化的影响快速完成从数据加载到模型部署的完整链路。1. 瓶装白酒疵品检测数据集从产线灯箱到可训练样本的最后一公里做视觉质检的工程师大多有过类似经历模型在公开数据集上跑出 0.95 的 mAP搬到灌装线灯箱前却连瓶身气泡和玻璃杂质都分不开。瓶装白酒疵品检测数据集.zip 这类资源解决的正是这个落差——它不是通用图像集合而是围绕透明玻璃瓶、液位线、标签贴合、瓶盖密封这几类典型缺陷整理出的专用样本包。适合谁用一是正在给酒类、饮料、药液做外观质检的算法同学二是需要快速验证检测方案可行性的产线自动化团队。它不能直接变成产线系统但能让你在两周内判断这套视觉路线在你的缺陷定义下到底走不走得通。下面按「先看懂数据、再跑通基线、最后踩坑收口」的顺序拆开讲。2. 拆开压缩包先看什么疵品检测数据集的四层结构拿到一个检测数据集最忌讳直接train.py一把梭。瓶装白酒的缺陷形态和通用 COCO 差别很大先花半小时把目录、标注、类别分布摸清楚后面能省掉一整天的调参玄学。2.1 目录结构与标注格式的对应关系常见做法是images/与labels/平行存放标注走 YOLO 的 txt 格式每行class cx cy w h坐标归一化到 0~1。也有部分数据集给的是 VOC 的 XML 或 COCO 的 json。先确认格式再决定转换脚本怎么写。# 先看目录层级不要急着解压到桌面 unzip -l 瓶装白酒疵品检测数据集.zip | head -40 # 解压后统计图片数量与标注文件数量是否一一对应 find ./dataset/images -type f \( -name *.jpg -o -name *.png \) | wc -l find ./dataset/labels -type f -name *.txt | wc -l逻辑说明unzip -l只列清单不解压避免一次性铺满磁盘两个find | wc -l用来核对图片与标注是否配对。参数上注意如果图片是.jpeg或.bmp-name要相应扩展否则统计数会偏小误判成「标注缺失」。2.2 类别定义与缺陷边界先对齐再训练瓶装白酒的疵品通常分几类瓶身气泡/杂质、液位异常过高过低、标签歪斜或破损、瓶盖未封严、瓶身裂纹。关键问题是——「轻微气泡」和「正常玻璃纹理」的边界在哪这个边界不定义清楚标注就是噪声。缺陷类别典型表现标注难点建议最小框瓶身气泡玻璃内圆形亮点与反光混淆8×8 px液位异常液面偏离标准线需参照瓶肩位置整瓶高度框标签缺陷歪斜、起皱、破损边缘模糊覆盖标签区瓶盖异常未压紧、歪盖小目标12×12 px瓶身裂纹细线状对比度低沿裂纹长条框提示如果数据集里某类样本少于总量的 5%先别急着上 focal loss优先确认是真实稀有还是标注漏标。2.3 用一条脚本快速画出类别分布不画分布就调参等于闭眼开车。下面这段统计每个类别的框数量输出直方图数据。import os from collections import Counter label_dir ./dataset/labels counter Counter() for fn in os.listdir(label_dir): if not fn.endswith(.txt): continue with open(os.path.join(label_dir, fn)) as f: for line in f: line line.strip() if not line: continue cls_id int(line.split()[0]) # 第一列是类别 id counter[cls_id] 1 for cls_id, num in sorted(counter.items()): print(fclass {cls_id}: {num} boxes)逻辑说明逐文件读取 YOLO 标注取每行首列作为类别 id 累加。参数上若你的标注是 VOC XML需要改用xml.etree.ElementTree解析objectname若是 COCO json直接读annotations里的category_id。跑完看分布长尾类别后面要单独做增强。2.4 划分训练/验证集时别踩的坑同一瓶酒可能被拍了多张不同角度、不同光照如果随机划分同一瓶的图会同时进训练和验证验证指标虚高。正确做法是按「瓶」或按「拍摄批次」分组划分。import random from collections import defaultdict # 假设文件名里含瓶号如 bottle_0231_ang2.jpg groups defaultdict(list) for fn in os.listdir(./dataset/images): bottle_id fn.split(_)[1] # 提取瓶号 groups[bottle_id].append(fn) bottles list(groups.keys()) random.seed(42) random.shuffle(bottles) split int(len(bottles) * 0.8) train_bottles, val_bottles bottles[:split], bottles[split:] print(train bottles:, len(train_bottles), val bottles:, len(val_bottles))逻辑说明按瓶号分组后再划分保证同一瓶的所有图只出现在一个集合。参数0.8是训练比例小数据集可调到 0.7 留更多验证样本。seed固定保证可复现。3. 跑通第一个基线YOLO 系列在瓶身缺陷上的最小配置数据摸清后先要一个能跑起来的基线别一上来就改网络结构。YOLO 系列对小目标缺陷的召回相对友好工程链路也成熟适合做第一版验证。3.1 环境与依赖把版本钉死conda create -n bottle_defect python3.10 -y conda activate bottle_defect pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python numpy逻辑说明单独建环境避免污染torch 的 index-url 按你的 CUDA 版本选cu118 对应 CUDA 11.8。参数上如果机器没有独显去掉 index-url 装 CPU 版也能跑通只是训练慢。装完python -c import torch; print(torch.cuda.is_available())确认 GPU 可用。3.2 数据配置文件路径和类别名最容易写错# bottle_defect.yaml path: ./dataset train: images/train val: images/val nc: 5 names: 0: bubble 1: liquid_level 2: label_defect 3: cap_defect 4: crack逻辑说明path是根目录train/val是相对路径。nc必须等于names的条目数多一个少一个都会在训练启动时报错。类别名建议用英文避免中文路径在某些环境下编码翻车。3.3 启动训练先小后大先冻后解yolo detect train \ databottle_defect.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/bottle \ namebaseline逻辑说明先用 nano 版模型yolov8n.pt跑基线速度快、显存低能快速暴露数据问题。imgsz640是通用起点瓶身小缺陷可试 960 或 1280但显存翻倍。patience20表示 20 轮无提升就早停省时间。lr00.01是初始学习率小数据集可降到 0.005 更稳。3.4 看训练曲线判断是数据问题还是模型问题训练日志里重点看三条box_loss是否持续下降、mAP50是否震荡、验证集 loss 是否早于训练集反弹。如果训练 loss 降但验证 mAP 不涨八成是标注噪声或类别不平衡如果两者都不降先查学习率和数据路径。常见做法是导出results.csv用 pandas 画图比盯终端直观。import pandas as pd df pd.read_csv(runs/bottle/baseline/results.csv) df.columns df.columns.str.strip() # 列名常带空格先清理 print(df[[epoch, train/box_loss, metrics/mAP50(B)]].tail(10))逻辑说明列名带空格是 ultralytics 输出的老毛病strip()清理后再取列。看最后 10 轮若 mAP50 还在缓慢爬升可以加轮次若已平台考虑换更大模型或补数据。4. 透明瓶身与反光疵品检测里最容易被低估的坑这一章专门讲避坑。瓶装白酒的成像条件比一般工业件苛刻很多「模型不行」其实是「图不行」。4.1 现象气泡和反光被混为一类现象模型把瓶身反光高亮误检成气泡误报率居高不下。原因灯箱光源是点光源或环形光玻璃表面形成镜面反射和气泡的圆形亮点在像素上高度相似。解决改用漫射背光或加偏振片从成像端压制反光同时在标注规范里明确「反光不算缺陷」让标注员统一标准。如果只能改算法可在预处理里做高光抑制。import cv2 import numpy as np img cv2.imread(bottle.jpg) hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 高亮区域V 通道很高且 S 很低 mask cv2.inRange(hsv, (0, 0, 230), (180, 40, 255)) img[mask 0] (128, 128, 128) # 用中灰填充高光 cv2.imwrite(bottle_noglare.jpg, img)逻辑说明在 HSV 空间里镜面反光表现为高 V 低 S用inRange圈出后填灰。参数(0,0,230)到(180,40,255)是经验阈值需按你的灯箱实拍微调调太狠会把真实气泡也抹掉。4.2 现象液位缺陷框不准现象液位异常的标注框忽大忽小模型学不稳。原因不同标注员对「液位线在哪」理解不一致有人框液面有人框整瓶。解决统一为「以瓶肩为参照框住液面上下各 10% 瓶高的区域」写进标注手册返工重标。这类问题不解决调参就是白费。4.3 现象小目标裂纹召回极低现象瓶身裂纹几乎检不出。原因裂纹细长、对比度低下采样后特征消失。解决提高输入分辨率到 1280或在数据增强里加随机裁剪放大标注时沿裂纹走向用长条框别用正方形框硬套。4.4 现象验证集 mAP 高但产线误报多现象离线指标漂亮上线后误报一堆。原因验证集和产线成像条件分布不一致灯箱、相机、距离不同。解决从产线实拍一批图单独做测试集别只用数据集自带的验证集。这一步是血泪经验指标好看不等于能用。5. 从数据集到产线阈值、速度与复检策略基线跑通、坑也踩过最后一章讲怎么把方案往产线推。核心是三件事定阈值、控速度、留复检。5.1 置信度阈值不是拍脑袋定的检测模型输出的是置信度卡多少算缺陷直接决定漏检和误报的平衡。做法是画 PR 曲线按业务能接受的漏检率反推阈值。import numpy as np # 假设已有每张图的预测置信度与真实标签 confs np.array([...]) # 预测置信度 labels np.array([...]) # 1 为真缺陷0 为正常 thresholds np.arange(0.1, 0.95, 0.05) for t in thresholds: pred (confs t).astype(int) tp ((pred 1) (labels 1)).sum() fp ((pred 1) (labels 0)).sum() fn ((pred 0) (labels 1)).sum() recall tp / (tp fn 1e-6) precision tp / (tp fp 1e-6) print(ft{t:.2f} recall{recall:.3f} precision{precision:.3f})逻辑说明遍历阈值算召回和精确率选业务可接受的点。参数上酒类质检通常漏检代价高于误报阈值可适当调低换召回误报交给人工复检兜底。5.2 推理速度与分辨率的取舍产线节拍决定你能用多大模型和多高分辨率。给个参考单瓶检测要在 200ms 内完成yolov8n在 640 分辨率下 GPU 推理约 10~20ms1280 约 40~60ms加上预处理和后处理仍在预算内。若用更大模型先测实际耗时再定。模型分辨率单图推理(参考)适用场景yolov8n64010~20ms高速产线yolov8s96030~50ms平衡yolov8m128060~100ms高精度抽检注意表里是 GPU 参考值CPU 推理会慢一个量级产线部署前务必在目标硬件上实测。5.3 复检策略把误报交给第二道关再好的模型也有误报产线常见做法是「模型初筛 人工/规则复检」。规则可以是连续多帧同一位置报警才判定、缺陷面积小于阈值不报、结合液位传感器交叉验证。这样既保住召回又不让误报淹没质检员。5.4 我自己的习惯先固化数据版本再谈模型迭代踩过最深的坑是数据悄悄改了、模型指标对不上。现在的习惯是每次训练前给数据集打版本号如v1.2_20240101标注改动走变更记录模型和数据集版本绑定存档。这样出问题能回溯不用靠记忆猜。瓶装白酒疵品检测这条路数据质量永远比模型结构更决定成败把标注和成像这两件事做扎实比换十个网络都管用。希望帮到你。本文还有配套的精品资源点击获取