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

(9)机器学习小白入门 YOLOv:YOLOv8-cls 技术解析与代码实现

YOLOv8-cls 技术解析与代码实现

YOLOv8-cls 是 YOLOv8 系列中专注于图像分类任务的模型分支,延续了 YOLOv8 在轻量化与高性能上的设计理念,同时针对分类任务的特性进行了网络结构优化。以下从模型结构、性能表现、适用场景等方面详细解析 YOLOv8-cls:

核心定位

YOLOv8-cls 是 YOLOv8 系列中针对图像分类任务的模型,基于 CSPDarknet 架构优化,专注于高效特征提取与类别判断,支持多规模版本部署。

模型架构

  • 骨干网络:CSPDarknet(移除检测头 / PANet),保留特征提取层。

  • 分类头:全局平均池化 + 全连接层,输出类别概率向量。

  • 版本参数

版本 参数量 (M) 输入尺寸 核心用途
n 3.4 224×224 轻量化部署
s 11.6 224×224 平衡速度精度
m 26.4 224×224 中等复杂度任务
l 44.5 224×224 高精度需求
x 69.5 224×224 科研级精度

性能指标(ImageNet-1k)

n: 69.1% Top-1, 420 FPS@T4s: 76.8% Top-1, 230 FPS@T4m: 80.5% Top-1, 120 FPS@T4l: 81.9% Top-1, 65 FPS@T4x: 82.5% Top-1, 35 FPS@T4

YOLOv8 检测模型的核心差异​

  • 任务目标:cls 模型专注于 “图像整体类别判断”(如 “猫”“狗”),而检测模型则需要定位目标并分类(如 “图中左上角有一只猫”)。​
  • 网络结构:cls 模型无检测头和锚框设计,输出层为单一类别概率向量;检测模型需输出边界框坐标和类别信息。​
  • 输入尺寸:cls 模型默认输入为 224×224(检测模型为 640×640),更小的尺寸进一步降低计算量,适配分类任务的轻量化需求。​

适用场景​

  • 移动端快速分类:如相册 APP 自动归类(人物、风景、动物),采用 n 或 s 版本,在手机端实现毫秒级响应。​
  • 工业质检初步筛选:对产品外观进行 “合格 / 不合格” 二元分类,m 版本可在流水线中实现高吞吐检测。​
  • 实时视频内容分析:如直播平台鉴黄、监控画面场景识别(室内 / 室外),l 版本能平衡速度与分类精度。​
  • 资源受限设备部署:在嵌入式终端(如边缘计算网关)中,cls-n 的低功耗特性适合长期运行。

代码实现

环境依赖

pip install ultralytics opencv-python pillow requests

本地读取图片进行训练

数据集组织形式

本地训练图片需按以下目录结构组织,其中train为训练集,val为验证集,每个类别单独放在一个子文件夹中:

dataset/
├── train/
│   ├── class1/
│   │   ├── img1.jpg
│   │   ├── img2.jpg
│   │   └── ...
│   ├── class2/
│   └── ...
└── val/├── class1/├── class2/└── ...
训练配置文件(dataset.yaml)

创建配置文件指定数据集路径和类别信息,内容如下:

path: ./dataset  # 数据集根目录
train: train  # 训练集相对路径
val: val  # 验证集相对路径
nc: 2  # 类别数量,根据实际情况修改
names: ['class1', 'class2']  # 类别名称列表,与文件夹名对应
``#### 训练代码
```python
from ultralytics import YOLO# 加载预训练模型(以yolov8s-cls为例)
model = YOLO('yolov8s-cls.pt')# 从本地读取图片进行训练
results = model.train(data='dataset.yaml',  # 配置文件路径epochs=50,  # 训练轮数imgsz=224,  # 输入图片尺寸batch=16,  # 批次大小,根据显卡显存调整device=0,  # 训练设备,0表示第一张GPU,cpu表示使用CPUworkers=4,  # 数据加载线程数project='cls_train',  # 训练结果保存项目名name='exp',  # 实验名pretrained=True  # 是否使用预训练权重
)# 训练完成后可在cls_train/exp目录下查看训练日志、权重文件等
训练过程监控

训练过程中,可通过以下方式监控训练状态:

  • 终端会实时输出每轮的训练损失、准确率等指标

  • 生成的results.csv文件记录了详细的训练数据,可用于绘制损失曲线和准确率曲线

  • 若安装了 TensorBoard,可通过tensorboard --logdir=cls_train/exp查看可视化训练过程

关键 API 说明

  • model(): 核心推理函数,支持路径 /ndarray/PIL 图像输入

  • results.probs: 概率张量,包含 top1/top5 索引及置信度

  • model.names: 类别名称映射表(list 类型)

  • model.train(): 训练函数,主要参数包括 data(配置文件)、epochs(轮数)、batch(批次大小)等

  • 可配置参数:imgsz(输入尺寸)、device(设备选择)、verbose(日志开关)

视频流处理示例


import cv2
import os# 创建视频帧本地保存目录
frame_dir = "video_frames"
os.makedirs(frame_dir, exist_ok=True)model = YOLO('yolov8l-cls.pt')
cap = cv2.VideoCapture(0)  # 摄像头输入
frame_count = 0while cap.isOpened():ret, frame = cap.read()if not ret: break# 保存当前帧到本地frame_path = os.path.join(frame_dir, f"frame_{frame_count}.jpg")cv2.imwrite(frame_path, frame)frame_count += 1# BGR->RGB 转换(YOLO 默认输入格式)rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 推理(50ms 级延迟)res = model(rgb_frame, imgsz=224, verbose=False)[0]# 绘制结果cv2.putText(frame, f'{res.names[res.probs.top1]} {res.probs.top1conf:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)cv2.imshow('cls', frame)if cv2.waitKey(1) == ord('q'): breakcap.release()
cv2.destroyAllWindows()
print(f"视频帧已保存至: {frame_dir}")

部署注意事项

  1. 移动端优先选择 n/s 版本,启用 FP16 量化

  2. 工业场景建议 m 版本,平衡吞吐与精度

  3. 模型转换:支持 ONNX/TensorRT 导出(model.export(format='onnx')

  4. 自定义训练:使用 model.train(data='dataset.yaml', epochs=50, imgsz=224),训练数据需为本地图片目录

性能优化点

  • 输入尺寸可动态调整(建议 128-384 范围内)

  • 启用 OpenVINO 加速:model = YOLO('``yolov8s-cls.pt``').to('openvino')

  • 批量推理时 batch 大小设置为设备核心数的整数倍

  • 本地图片预处理:可提前进行尺寸调整和归一化,减少推理时的计算量

# 本地图片预处理示例
from PIL import Image
import numpy as npdef preprocess_image(local_path, target_size=(224, 224)):"""预处理本地图片,调整尺寸并归一化"""img = Image.open(local_path).convert('RGB')img = img.resize(target_size)img_np = np.array(img) / 255.0  # 归一化到 [0,1]return img_np# 预处理后直接用于推理
processed_img = preprocess_image('local_images/test.jpg')
results = model(processed_img)

总结​
YOLOv8-cls 继承了系列模型的工程化优势,提供从轻量化到高精度的完整选择,尤其在实时性要求高的分类场景中表现突出。其统一的训练与部署框架,能快速在检测、分割、分类任务间切换,降低跨任务迁移成本。

http://www.xdnf.cn/news/1161037.html

相关文章:

  • uni-app 开发小程序项目中实现前端图片压缩,实现方式
  • Java基础面试题
  • Laravel 后台登录 403 Forbidden 错误深度解决方案-优雅草卓伊凡|泡泡龙
  • 芯谷科技--固定电压基准双运算放大器D4310
  • kafka 日志索引 AbstractIndex
  • 智慧场景:定制开发开源AI智能名片S2B2C商城小程序赋能零售新体验
  • Web开发:ABP框架12——中间件Middleware的创建和使用
  • delphi disqlite3 操作sqlite
  • 通信刚需小能手,devicenet转PROFINET网关兼容物流分拣自动化
  • 【Elasticsearch】IndexModule
  • 【Elasticsearch】BM25的discount_overlaps参数
  • SVM(Support Vector Machine)从入门到精通
  • [Python] -项目实战10- 用 Python 自动化批量重命名文件
  • odoo-059 xml中字段上写 domain 和 filter_domain 什么区别
  • 第三章自定义检视面板_创建自定义编辑器类_如何自定义预览窗口(本章进度5/9)
  • Ubuntu 22.04 安装 Jdk 8和 Tomcat (安装包形式)
  • 基于python django的BOSS直聘网站计算机岗位数据分析与可视化系统,包括薪酬预测及岗位推荐,推荐算法为融合算法
  • Sklearn 机器学习 IRIS数据 理解分类报告
  • Nginx IP授权页面实现步骤
  • 分布在内侧内嗅皮层(MEC)的带状细胞对NLP中的深层语义分析有什么积极的影响和启示
  • Zetane:让深度学习不再抽象,一键3D可视化
  • CFD总压边界条件的理解与开发处理
  • 深入解析 Linux 硬链接与软链接:原理、区别及应用场景
  • 用户虚拟地址空间布局架构
  • C语言:20250721笔记
  • 日历类生辰八字九九三伏入梅出梅算法
  • 【用unity实现100个游戏之34】使用环状(车轮)碰撞器(Wheel Collider)从零实现一个汽车车辆物理控制系统,实现一个赛车游戏
  • PHP反序列化漏洞详解
  • 悬镜安全将受邀参加2025开放原子开源生态大会
  • 进程资源分配的安全性判断与安全序列