简介:这份瓶装白酒疵品检测数据集面向计算机视觉与工业质检方向的学习者和研究者,用于训练和评估瓶身划痕、标签破损、密封不良等疵品的自动识别模型,适合作为机器学习入门到进阶的实战素材。压缩包共约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(f"class {cls_id}: {num} boxes")逻辑说明:逐文件读取 YOLO 标注,取每行首列作为类别 id 累加。参数上,若你的标注是 VOC XML,需要改用xml.etree.ElementTree解析<object><name>;若是 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 python=3.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 \ data=bottle_defect.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ project=runs/bottle \ name=baseline逻辑说明:先用 nano 版模型(yolov8n.pt)跑基线,速度快、显存低,能快速暴露数据问题。imgsz=640是通用起点,瓶身小缺陷可试 960 或 1280,但显存翻倍。patience=20表示 20 轮无提升就早停,省时间。lr0=0.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(f"t={t:.2f} recall={recall:.3f} precision={precision:.3f}")逻辑说明:遍历阈值算召回和精确率,选业务可接受的点。参数上,酒类质检通常漏检代价高于误报,阈值可适当调低换召回,误报交给人工复检兜底。
5.2 推理速度与分辨率的取舍
产线节拍决定你能用多大模型和多高分辨率。给个参考:单瓶检测要在 200ms 内完成,yolov8n在 640 分辨率下 GPU 推理约 10~20ms,1280 约 40~60ms,加上预处理和后处理仍在预算内。若用更大模型,先测实际耗时再定。
| 模型 | 分辨率 | 单图推理(参考) | 适用场景 |
|---|---|---|---|
| yolov8n | 640 | 10~20ms | 高速产线 |
| yolov8s | 960 | 30~50ms | 平衡 |
| yolov8m | 1280 | 60~100ms | 高精度抽检 |
注意:表里是 GPU 参考值,CPU 推理会慢一个量级,产线部署前务必在目标硬件上实测。
5.3 复检策略:把误报交给第二道关
再好的模型也有误报,产线常见做法是「模型初筛 + 人工/规则复检」。规则可以是:连续多帧同一位置报警才判定、缺陷面积小于阈值不报、结合液位传感器交叉验证。这样既保住召回,又不让误报淹没质检员。
5.4 我自己的习惯:先固化数据版本再谈模型迭代
踩过最深的坑是数据悄悄改了、模型指标对不上。现在的习惯是每次训练前给数据集打版本号(如v1.2_20240101),标注改动走变更记录,模型和数据集版本绑定存档。这样出问题能回溯,不用靠记忆猜。瓶装白酒疵品检测这条路,数据质量永远比模型结构更决定成败,把标注和成像这两件事做扎实,比换十个网络都管用。希望帮到你。
本文还有配套的精品资源,点击获取