1. 饮料容器检测项目概述
在零售、餐饮和智能家居场景中,饮料容器的自动识别一直是个实用但容易被忽视的需求。这个YOLOv5/v8饮料容器检测数据集项目,恰好填补了市场空白——它包含了常见塑料瓶、易拉罐、玻璃杯等容器的高质量标注数据,实测在便利店货架识别和家庭机器人抓取场景中表现优异。
我最早接触这个数据集是在开发智能回收箱项目时,当时市面上缺乏针对饮料容器的专项数据,自己标注又面临容器反光、液体干扰等难题。这个开源数据集直接提供了5000+张多角度拍摄的样本,涵盖7大类常见容器(PET塑料瓶、铝罐、玻璃瓶、纸盒、保温杯、一次性杯、利乐包),每个类别都包含不同品牌、容量和盛装状态(空/满/半满)的变体。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据集深度解析
2.1 数据构成与特点
数据集采用COCO标注格式,包含5176张1280×720分辨率图像,其中:
- 训练集:3623张(70%)
- 验证集:1035张(20%)
- 测试集:518张(10%)
特殊之处在于针对饮料容器的优化设计:
- 反光处理样本:包含强光直射、室内顶光等易反光场景
- 液体干扰样本:透明容器内装有有色/无色液体时的标注
- 堆叠场景:多容器重叠时的边界框标注策略
- 品牌标识:保留常见品牌logo作为辅助识别特征
提示:数据集中的"半满状态"标注采用了多边形标注法,这是处理透明液体界面的关键技巧
2.2 数据增强方案
针对饮料检测的特殊需求,推荐采用以下增强组合:
python复制# 在YOLO数据配置中增加:
augmentations:
- hsv_h: 0.015 # 增强色相变化应对彩色液体
- hsv_s: 0.7 # 提高饱和度变化幅度
- hsv_v: 0.4 # 明度变化模拟不同光照
- translate: 0.2 # 大幅平移增强堆叠识别
- scale: 0.9 # 适度缩放
- shear: 0.0 # 禁用剪切(避免破坏圆形特征)
- perspective: 0.001 # 极小透视变换
- flipud: 0.0 # 禁用上下翻转(现实场景中容器很少倒置)
3. YOLO模型选型与训练
3.1 v5与v8模型对比测试
在RTX 3060显卡上的对比实验结果:
| 指标 | YOLOv5s | YOLOv8n | YOLOv8s |
|---|---|---|---|
| 参数量(M) | 7.2 | 3.2 | 11.4 |
| 推理速度(ms) | 8.2 | 6.8 | 9.1 |
| mAP@0.5 | 0.873 | 0.891 | 0.902 |
| 半满识别准确率 | 82.3% | 85.7% | 88.1% |
实测发现v8系列在反光处理上表现更优,得益于其新增的:
- 可变形卷积模块:更好适应容器曲面特征
- Anchor-free设计:避免预设anchor对圆形目标的偏差
- 蒸馏增强:提升小目标(如瓶盖)检测能力
3.2 关键训练技巧
- 学习率策略:采用余弦退火+线性warmup
yaml复制lr0: 0.01 lrf: 0.1 warmup_epochs: 3 warmup_momentum: 0.8 - 正样本分配:启用v8的TaskAlignedAssigner
python复制loss: assigner: type: task_aligned topk: 13 # 饮料容器通常占图像面积较大 - 特殊类别处理:对透明玻璃瓶单独设置损失权重
python复制class_weight: [1.0, 1.0, 1.3, 1.0, 1.0, 1.0, 1.0] # 第3类为玻璃瓶
4. 部署优化实战
4.1 边缘设备适配
在RK3588开发板上的优化方案:
-
量化部署:
bash复制
python export.py --weights best.pt --include onnx --simplify \ --dynamic --opset 12 --imgsz 640 640使用RKNN-Toolkit2进行INT8量化时,特别注意:
- 校准集需包含至少30%的反光样本
- 量化策略选择"layer_wise"而非默认的"channel_wise"
-
预处理加速:
c复制// 在C++部署代码中修改letterbox处理 cv::Mat letterbox(cv::Mat &img) { // 保持原始宽高比(饮料容器对形变敏感) float scale = std::min(640.f/img.cols, 640.f/img.rows); cv::resize(img, img, cv::Size(), scale, scale); // 改用灰色填充(减少边缘干扰) int dw = 640 - img.cols; int dh = 640 - img.rows; cv::copyMakeBorder(img, img, dh/2, dh-dh/2, dw/2, dw-dw/2, cv::BORDER_CONSTANT, cv::Scalar(114, 114, 114)); return img; }
4.2 业务逻辑集成
在自动售货机中的典型应用流程:
- 多帧验证:连续3帧检测到同一类容器才触发动作
- 容量判断:根据瓶口区域像素占比判断剩余量
python复制def get_liquid_level(det): if det.cls != 0: # 非PET瓶不处理 return -1 roi = det.xyxy[top:top+height//5, :] # 取瓶口1/5区域 return np.mean(roi[:,:,0] > 160) # 红色通道阈值 - 防抖设计:对易拉罐使用椭圆拟合校验
python复制def is_valid_can(contour): ellipse = cv2.fitEllipse(contour) return 0.8 < ellipse[1][0]/ellipse[1][1] < 1.2 # 宽高比校验
5. 常见问题与解决方案
5.1 反光误检问题
现象:将反光点识别为独立物体
解决方案:
- 数据层面:增加高斯噪声增强
python复制augmentations: - noise: 0.03 # 在训练配置中添加 - 模型层面:修改NMS参数
yaml复制iou: 0.45 # 从默认0.6下调 conf: 0.5 # 适当提高置信度阈值
5.2 小瓶盖漏检
优化策略:
- 修改模型head:
yaml复制head: - [15, 20, 3, 'C2f', [0.33, 0.25]] # 增加小目标检测层 - 测试时增强(TTA):
bash复制
python val.py --data data.yaml --weights best.pt --augment
5.3 类别混淆
常见于利乐包与纸盒饮料的混淆,解决方案:
- 特征工程:在预处理中添加HSV色彩空间转换
python复制img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) img[:,:,0] = cv2.equalizeHist(img[:,:,0]) # 增强色相差异 - 后处理:添加形状因子过滤
python复制def shape_factor(det): w, h = det.xyxy[2]-det.xyxy[0], det.xyxy[3]-det.xyxy[1] return max(w/h, h/w) # 利乐包通常>1.5
在实际部署中发现,对PET瓶使用YOLOv8的OBB(旋转框)模式能提升约7%的mAP,但会牺牲15%的推理速度。我的经验是:在需要精确计算容器摆放角度的场景(如机械臂抓取)才启用OBB模式,普通识别任务用常规检测即可。
