当前位置: 首页 > article >正文

【工业场景】用YOLOv12实现饮料类别识别

        饮料类别识别任务的意义在于帮助人们更快速地识别和区分不同类型的饮料,从而提高消费者的购物体验和满意度。对于商家而言,饮料类别识别可以帮助他们更好地管理库存、优化货架布局和预测销售趋势,从而提高运营效率和利润。此外,饮料类别识别还可以应用于自动贩卖机、智能购物系统等领域,为人们提供更便捷的购物服务。总的来说,饮料类别识别任务的意义在于提升消费者和商家的体验,促进商业领域的发展。

        本文以YOLOv12为基础,设计研究了基于YOLOv12的饮料类别识别任务,提取饮料类别自动检测,包含完整数据介绍、训练过程和测试结果全流程。

若需要完整数据集和源代码可以私信

目录

若需要完整数据集和源代码可以私信。

🌷🌷1.数据集介绍

👍👍2.饮料类别识别检测实现效果

🍎🍎3.YOLOv12识别饮料包装类别算法步骤

🍋3.1数据准备

🍋3.2模型选择

🍋3.3加载预训练模型

🍋3.4输入数据组织

🍭🍭4.目标检测训练代码

⭐4.1训练过程

⭐4.2训练结果

🏆🏆5.目标检测推理代码

整理不易,欢迎一键三连!!!送你们一条美丽的--分割线--


🌷🌷1.数据集介绍

        饮料类别识别数据集为特定场景下的15种常见饮料( 

  0: AD  AD钙奶
  1: Wangzai   旺仔牛奶
  2: Wanglaoji  王老吉
  3: Qingdao  青岛啤酒
  4: Xuebi    雪碧
  5: Qixi    七喜
  6: Weita   维他
  7: Dongpeng   东鹏特饮
  8: Baishi   百事
  9: Hongniu  红牛
  10: Xingbake   星巴克
  11: Yongchuangtianya   勇闯天涯
  12: Qingshuang   清爽啤酒
  13: Fenda_Orange   橘色芬达
  14: Meinianda_Orange   橘色美年达
  15: Meinianda_Green   绿色美年达

部分影像展示如下:

  label为txt格式的yolo目标检测格式,示例txt文件内容为:

训练验证比例可以自行调整,这里不赘述。

👍👍2.饮料类别识别检测实现效果

 

🍎🍎3.YOLOv12识别饮料包装类别算法步骤

        通过目标检测方法进行饮料类别识别的方法不限,本文以YOLOv12为例进行说明。

🍋3.1数据准备

数据组织:

----yinliao_dataset
       ----images
                ----train
                ----val
        ----labels
                ----train
                ----val

 image/train文件夹下内容如下:

labels/train文件夹下内容如下:

        模型训练label部分采用的是YOLO格式的txt文件,所以如果自己的数据集是xml格式或者json格式需要进行转换哦,转换可移步这里。

        具体txt格式内容如1.数据集介绍中所示。

🍋3.2模型选择


        以YOLOv812为例,模型选择代码如下:

from ultralytics import YOLO# Load a model
model = YOLO('yolov12n.yaml')  # build a new model from YAML
model = YOLO('yolov12n.pt')  # load a pretrained model (recommended for training)
model = YOLO('yolov12n.yaml').load('yolov12n.pt')  # build from YAML and transfer weights


        其中yolov12n.yaml为./ultralytics/cfg/models/v12/yolov12n.yaml,可根据自己的数据进行模型调整,打开yolov12n.yaml显示内容如下:

# YOLOv12 🚀, AGPL-3.0 license
# YOLOv12 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov12n.yaml' will call yolov12.yaml with scale 'n'# [depth, width, max_channels]n: [0.50, 0.25, 1024] # summary: 465 layers, 2,603,056 parameters, 2,603,040 gradients, 6.7 GFLOPss: [0.50, 0.50, 1024] # summary: 465 layers, 9,285,632 parameters, 9,285,616 gradients, 21.7 GFLOPsm: [0.50, 1.00, 512] # summary: 501 layers, 20,201,216 parameters, 20,201,200 gradients, 68.1 GFLOPsl: [1.00, 1.00, 512] # summary: 831 layers, 26,454,880 parameters, 26,454,864 gradients, 89.7 GFLOPsx: [1.00, 1.50, 512] # summary: 831 layers, 59,216,928 parameters, 59,216,912 gradients, 200.3 GFLOPs# YOLO12n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv,  [64, 3, 2]] # 0-P1/2- [-1, 1, Conv,  [128, 3, 2]] # 1-P2/4- [-1, 2, C3k2,  [256, False, 0.25]]- [-1, 1, Conv,  [256, 3, 2]] # 3-P3/8- [-1, 2, C3k2,  [512, False, 0.25]]- [-1, 1, Conv,  [512, 3, 2]] # 5-P4/16- [-1, 4, A2C2f, [512, True, 4]]- [-1, 1, Conv,  [1024, 3, 2]] # 7-P5/32- [-1, 4, A2C2f, [1024, True, 1]] # 8# YOLO12n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 2, A2C2f, [512, False, -1]] # 11- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 2, A2C2f, [256, False, -1]] # 14- [-1, 1, Conv, [256, 3, 2]]- [[-1, 11], 1, Concat, [1]] # cat head P4- [-1, 2, A2C2f, [512, False, -1]] # 17- [-1, 1, Conv, [512, 3, 2]]- [[-1, 8], 1, Concat, [1]] # cat head P5- [-1, 2, C3k2, [1024, True]] # 20 (P5/32-large)- [[14, 17, 20], 1, Detect, [nc]] # Detect(P3, P4, P5)

        主要需要修改的地方为nc,也就是num_class,此处数据集类别为16类,所以nc=16。

        如果其他的模型参数不变的话,就默认保持原版yolov12,需要改造模型结构的大佬请绕行。

🍋3.3加载预训练模型


        加载预训练模型yolov12n.pt,可以在第一次运行时自动下载,如果受到下载速度限制,也可以自行下载好(下载链接),放在对应目录下即可。

🍋3.4输入数据组织


        yolov12还是以yolo格式的数据为例,./ultralytics/cfg/datasets/data.yaml的内容示例如下:

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8  # dataset root dir
train: images/train  # train images (relative to 'path') 4 images
val: images/val  # val images (relative to 'path') 4 images
test:  # test images (optional)# Classes (80 COCO classes)
names:0: person1: bicycle2: car# ...77: teddy bear78: hair drier79: toothbrush


        这个是官方的标准coco数据集,需要换成自己的数据集格式,此处建议根据自己的数据集设置新建一个fall_detect_coco128.yaml文件,放在./ultralytics/cfg/datasets/目录下,最后数据集设置就可以直接用自己的yinliao_detect_coco128.yaml文件了。以我的yinliao_detect_coco128.yaml文件为例:

path: /home/datasets/yinliao# dataset root dir
train: images/train  # train images (relative to 'path') 4 images
val: images/val  # val images (relative to 'path') 4 images
test: images/test # test images (optional)names:0: AD1: Wangzai2: Wanglaoji3: Qingdao4: Xuebi5: Qixi6: Weita7: Dongpeng8: Baishi9: Hongniu10: Xingbake11: Yongchuangtianya12: Qingshuang13: Fenda_Orange14: Meinianda_Orange15: Meinianda_Green


🍭🍭4.目标检测训练代码


准备好数据和模型之后,就可以开始训练了,train.py的内容显示为:

from ultralytics import YOLO# Load a model
#model = YOLO('yolov12n.yaml')  # build a new model from YAML
#model = YOLO('yolov12n.pt')  # load a pretrained model (recommended for training)
model = YOLO('yolov12n.yaml').load('yolov12n.pt')  # build from YAML and transfer weights# Train the model
results = model.train(data='yinliao_detect_coco128.yaml', epochs=200, imgsz=640)


        通常我会选择在基础YOLO模型上进行transfer微调,不会从头开始训练,如果想自己从头开始,可以自行选择第一种方式。这里建议选择第三种。

⭐4.1训练过程


        开始训练之后就会开始打印log文件了。如下图所示:

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size199/200      2.62G     0.3875     0.4138     0.8016         45        640: 100%|██████████| 11/11 [00:01<00:00,  8.74it/s]Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 6/6 [00:00<00:00,  8.67it/s]all        176        484      0.993          1      0.995      0.935Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size200/200      2.63G     0.3813     0.4127     0.8208         43        640: 100%|██████████| 11/11 [00:01<00:00,  8.83it/s]Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 6/6 [00:00<00:00,  8.78it/s]all        176        484      0.993          1      0.995      0.935200 epochs completed in 0.151 hours.
Optimizer stripped from runs/detect/train5/weights/last.pt, 5.5MB
Optimizer stripped from runs/detect/train5/weights/best.pt, 5.5MBValidating runs/detect/train5/weights/best.pt...
Ultralytics 8.3.63 🚀 Python-3.11.0 torch-2.6.0+cu124 CUDA:0 (NVIDIA RTX A6000, 45623MiB)
YOLOv12 summary (fused): 352 layers, 2,559,848 parameters, 0 gradients, 6.3 GFLOPsClass     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 6/6 [00:01<00:00,  4.51it/s]all        176        484      0.995          1      0.995      0.938Wangzai         38         38      0.996          1      0.995      0.946Wanglaoji         38         38      0.996          1      0.995      0.961Qingdao         35         35      0.995          1      0.995      0.972Xuebi         35         35      0.996          1      0.995      0.936Qixi         35         35      0.998          1      0.995      0.915Weita         38         39      0.998          1      0.995      0.904Dongpeng         31         31      0.989          1      0.995      0.868Hongniu         32         32      0.999          1      0.995      0.858Xingbake          6          6      0.976          1      0.995      0.965Yongchuangtianya         35         35      0.995          1      0.995      0.945Qingshuang         35         35      0.996          1      0.995      0.966Fenda_Orange         30         30      0.996          1      0.995      0.946Meinianda_Orange         29         29      0.999          1      0.995      0.973Meinianda_Green         65         66      0.997          1      0.995       0.98
Speed: 0.1ms preprocess, 0.9ms inference, 0.0ms loss, 0.7ms postprocess per image
Results saved to runs/detect/train5

⭐4.2训练结果

训练完成后的结果如下:

        其中weights文件夹内会包含2个模型,一个best.pth,一个last.pth。

        至此就可以使用best.pth进行推理检测是否发生火灾了。

训练精度展示:

可以看到,基本每个类别都能达到99%以上。训练效果还是很不错的。 

🏆🏆5.目标检测推理代码


批量推理python代码如下:

from ultralytics import YOLO
from PIL import Image
import cv2
import osmodel = YOLO('/yolov12/runs/detect/train4/weights/best.pt')  # load a custom model
path = '/home/dataset/yinliao/images/test/'  #test_image_path_dir
img_list = os.listdir(path)
for img_path in img_list:
###  =============detect=====================im1 = Image.open(os.path.join(path,img_path))results = model.predict(source=im1, save=True,save_txt=True)

若需要完整数据集和源代码可以私信。

整理不易,欢迎一键三连!!!
送你们一条美丽的--分割线--

🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷

相关文章:

【工业场景】用YOLOv12实现饮料类别识别

饮料类别识别任务的意义在于帮助人们更快速地识别和区分不同类型的饮料&#xff0c;从而提高消费者的购物体验和满意度。对于商家而言&#xff0c;饮料类别识别可以帮助他们更好地管理库存、优化货架布局和预测销售趋势&#xff0c;从而提高运营效率和利润。此外&#xff0c;饮…...

从小米汽车事故反思 LabVIEW 开发

近期&#xff0c;小米汽车的一起严重事故引发了社会各界的广泛关注。这起事故不仅让我们对智能汽车的安全性产生了深深的思考&#xff0c;也为 LabVIEW 开发领域带来了诸多值得汲取的知识与领悟。 在智能汽车领域&#xff0c;尤其是涉及到智能驾驶辅助系统时&#xff0c;安全是…...

oracle WAIT 和 NOWAIT

在 Oracle 数据库中&#xff0c;WAIT 和 NOWAIT 是与 锁&#xff08;Lock&#xff09; 相关的关键选项&#xff0c;用于控制事务或操作在请求资源时的等待行为。以下是它们的详细说明和应用场景。 1. NOWAIT 选项 作用&#xff1a; 当请求资源&#xff08;如表、行&#xff09…...

Vue3+Vite+TypeScript+Element Plus开发-04.静态菜单设计

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 文章目录 目录 系列文档目录 文章目录 前言 一、Aside设计 二、动态增加菜单 三.布局引用在Main中显示 参考文献&#xff1a; 前言 在本系列文档中&…...

从代码学习深度学习 - LSTM PyTorch版

文章目录 前言一、数据加载与预处理1.1 代码实现1.2 功能解析二、LSTM介绍2.1 LSTM原理2.2 模型定义代码解析三、训练与预测3.1 训练逻辑代码解析3.2 可视化工具功能解析功能结果总结前言 深度学习中的循环神经网络(RNN)及其变种长短期记忆网络(LSTM)在处理序列数据(如文…...

大数据技术发展与应用趋势分析

大数据技术发展与应用趋势分析 文章目录 大数据技术发展与应用趋势分析1. 大数据概述2 大数据技术架构2.1 数据采集层2.2 数据存储层2.3 数据处理层2.4 数据分析层 3 大数据发展趋势3.1 AI驱动的分析与自动化3.2 隐私保护分析技术3.3 混合云架构的普及3.4 数据网格架构3.5 量子…...

与Linux操作系统相关的引导和服务

目录 一.Linux操作系统引导过程 1.1引导过程总览 1.2系统初始化进程 1.2.1init进程 1.2.2sysmted 1.3systemd单元类型 二.排除启动类故障 2.1MBR扇区故障 2.1.1故障原因 2.1.2故障现象 2.1.3解决办法 2.1.4模拟修复MBR扇区故障 1)添加新的硬盘 2&#xff09;进行…...

STM32单片机入门学习——第16节: [6-4] PWM驱动LED呼吸灯PWM驱动舵机PWM驱动直流电机

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.05 STM32开发板学习——第16节: [6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱…...

基础框架系列分享:一个通用的Excel报表生成管理框架

由于我们系统经常要生成大量的Excel报表&#xff08;Word&#xff0c;PDF报表也有&#xff0c;另行分享&#xff09;&#xff0c;最初始他们的方案是&#xff0c;设计一个表&#xff0c;和Excel完全对应&#xff0c;然后读表&#xff0c;把数据填进去&#xff0c;这显然是非常不…...

Ansible(4)—— Playbook

目录 一、Ansible Playbook : 1、Play &#xff1a; 2、Playbook&#xff1a; 二、Ansible Playbook 格式&#xff1a; 1、空格&#xff1a; 2、破折号&#xff08; - &#xff09;&#xff1a; 3、Play 格式&#xff1a; 三、查找用于任务的模块&#xff1a; 1、模块…...

自学-C语言-基础-数组、函数、指针、结构体和共同体、文件

这里写自定义目录标题 代码环境&#xff1a;&#xff1f;问题思考&#xff1a;一、数组二、函数三、指针四、结构体和共同体五、文件问题答案&#xff1a; 代码环境&#xff1a; Dev C &#xff1f;问题思考&#xff1a; 把上门的字母与下面相同的字母相连&#xff0c;线不能…...

Bash 花括号扩展 {start..end} 进阶使用指南——字典生成

Bash 的花括号扩展&#xff08;brace expansion&#xff09;{start..end} 是一个强大而灵活的语法特性&#xff0c;用于生成特定序列或组合。它在脚本编写、爆破字典生成、文件批量操作以及模式匹配中有着广泛的应用。本文将从基础用法到高级技巧&#xff0c;带你全面掌握这一功…...

AGI大模型(10):prompt逆向-巧借prompt

1 提示词逆向 明确逆向提示词⼯程概念 我们可以给ChatGPT提供⼀个简洁的提示词,让它能够更准确地理解我们所讨论的“逆向提示词⼯程”是什么意思,并通过这个思考过程,帮它将相关知识集中起来,进⽽构建⼀个专业的知识领域 提示词:请你举⼀个简单的例⼦,解释⼀下逆向pro…...

蓝桥云客--团队赛

2.团队赛【算法赛】 - 蓝桥云课 问题描述 蓝桥杯最近推出了一项团队赛模式&#xff0c;要求三人组队参赛&#xff0c;并规定其中一人必须担任队长。队长的资格很简单&#xff1a;其程序设计能力值必须严格大于其他两名队友程序设计能力值的总和。 小蓝、小桥和小杯正在考虑报名…...

C-S模式之实现一对一聊天

天天开心&#xff01;&#xff01;&#xff01; 文章目录 一、如何实现一对一聊天&#xff1f;1. 服务器设计2. 客户端设计3. 服务端代码实现4. 客户端代码实现5. 实现说明6.实验结果 二、改进常见的服务器高并发方案1. 多线程/多进程模型2. I/O多路复用3. 异步I/O&#xff08;…...

[Deep-ML]Transpose of a Matrix(矩阵的转置)

Transpose of a Matrix&#xff08;矩阵的转置&#xff09; 题目链接&#xff1a; Transpose of a Matrix&#xff08;矩阵的转置&#xff09;https://www.deep-ml.com/problems/2 题目描述&#xff1a; 难度&#xff1a; easy&#xff08;简单&#xff09;。 分类&#…...

Java的Selenium的特殊元素操作与定位之select下拉框

如果页面元素是一个下拉框&#xff0c;我们可以将此web元素封装为Select对象 Select selectnew Select(WebElement element); Select对象常用api select.getOptions();//获取所有选项select.selectBylndex(index);//根据索引选中对应的元素select.selectByValue(value);//选…...

前端精度计算:Decimal.js 基本用法与详解

一、Decimal.js 简介 decimal.js 是一个用于任意精度算术运算的 JavaScript 库&#xff0c;它可以完美解决浮点数计算中的精度丢失问题。 官方API文档&#xff1a;Decimal.js 特性&#xff1a; 任意精度计算&#xff1a;支持大数、小数的高精度运算。 链式调用&#xff1a;…...

智慧节能双突破 强力巨彩谷亚VK系列刷新LED屏使用体验

当前全球节能减排趋势明显&#xff0c;LED节能屏作为显示技术的佼佼者&#xff0c;正逐渐成为市场的新宠。强力巨彩谷亚万境VK系列节能智慧屏凭借三重技术保障、四大智能设计以及大师臻彩画质&#xff0c;在实现节能效果的同时&#xff0c;更在智慧显示领域树立新的标杆。   …...

html 给文本两端加虚线自适应

效果图&#xff1a; <div class"separator">文本 </div>.separator {width: 40%;border-style: dashed;display: flex;align-items: center;color: #e2e2e2;font-size: 14px;line-height: 20px;border-color: #e2e2e2;border-width: 0; }.separator::bef…...

C#:is关键字

目录 is 关键字的核心是什么&#xff1f; 1. 什么是 is 关键字&#xff0c;为什么要用它&#xff1f; 2. 如何使用 is 关键字&#xff1f; 3. is 的作用和场景 4. is 与 as 的区别 5. 模式匹配的扩展&#xff08;C# 8.0&#xff09; 6. 常见陷阱和注意事项 总结&#x…...

leetcode4.寻找两个正序数组中的中位数

思路源于 LeetCode004-两个有序数组的中位数-最优算法代码讲解 基本思路是将两个数组看成一个数组&#xff0c;然后划分为两个部分&#xff0c;若为奇数左边部分个数多1&#xff0c;若为偶数左边部分等于右边部分个数。i表示数组1划分位置&#xff08;i为4是索引4也表示i的左半…...

0101安装matplotlib_numpy_pandas-报错-python

文章目录 1 前言2 报错报错1&#xff1a;ModuleNotFoundError: No module named distutils报错2&#xff1a;ERROR:root:code for hash blake2b was not found.报错3&#xff1a;**ModuleNotFoundError: No module named _tkinter**报错4&#xff1a;UserWarning: Glyph 39044 …...

Qt之QHostInfo

简介 QHostInfo表示主机信息&#xff0c;即主机名称 常用接口 static QHostInfo fromName(const QString &name); QString hostName() const; QList<QHostAddress> addresses() const;结构 #mermaid-svg-HTJ95sEk8JwO4uCy {font-family:"trebuchet ms",…...

OSCP - Proving Grounds- SoSimple

主要知识点 wordpress 插件RCE漏洞sudo -l shell劫持 具体步骤 依旧是nmap 起手&#xff0c;只发现了22和80端口&#xff0c;但80端口只能看到一张图 Nmap scan report for 192.168.214.78 Host is up (0.46s latency). Not shown: 65533 closed tcp ports (reset) PORT …...

JVM虚拟机篇(五):深入理解Java类加载器与类加载机制

深入理解Java类加载器与类加载机制 深入理解Java类加载器与类加载机制一、引言二、类加载器2.1 类加载器的定义2.2 类加载器的分类2.2.1 启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;2.2.2 扩展类加载器&#xff08;Extension ClassLoader&#xff09;2.2.3 应用…...

Golang的Goroutine(协程)与runtime

目录 Runtime 包概述 Runtime 包常用函数 1. GOMAXPROCS 2. Caller 和 Callers 3. BlockProfile 和 Stack 理解Golang的Goroutine Goroutine的基本概念 特点&#xff1a; Goroutine的创建与启动 示例代码 解释 Goroutine的调度 Gosched的作用 示例代码 输出 解…...

C语言求3到100之间的素数

一、代码展示 二、运行结果 三、感悟思考 注意: 这个题思路他是一个试除法的一个思路 先进入一个for循环 遍历3到100之间的数字 第二个for循环则是 判断他不是素数 那么就直接退出 这里用break 是素数就打印出来 在第一个for循环内 第二个for循环外...

【2025】物联网发展趋势介绍

目录 物联网四层架构感知识别层网络构建层管理服务层——**边缘存储**边缘计算关键技术&#xff1a;综合应用层——信息应用 物联网四层架构 综合应用层&#xff1a;信息应用 利用获取的信息和知识&#xff0c;支持各类应用系统的运转 管理服务层&#xff1a;信息处理 对数据进…...

如何查看 MySQL 的磁盘空间使用情况:从表级到数据库级的分析

在日常数据库管理中&#xff0c;了解每张表和每个数据库占用了多少磁盘空间是非常关键的。这不仅有助于我们监控数据增长&#xff0c;还能为性能优化提供依据。 Google Gemini中国版调用Google Gemini API&#xff0c;中国大陆优化&#xff0c;完全免费&#xff01;https://ge…...