(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}")
部署注意事项
-
移动端优先选择 n/s 版本,启用 FP16 量化
-
工业场景建议 m 版本,平衡吞吐与精度
-
模型转换:支持 ONNX/TensorRT 导出(
model.export(format='onnx')
) -
自定义训练:使用
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 继承了系列模型的工程化优势,提供从轻量化到高精度的完整选择,尤其在实时性要求高的分类场景中表现突出。其统一的训练与部署框架,能快速在检测、分割、分类任务间切换,降低跨任务迁移成本。