(1)机器学习小白入门YOLOv :从概念到实践
(2)机器学习小白入门 YOLOv:从模块优化到工程部署
(3)机器学习小白入门 YOLOv: 解锁图片分类新技能
前言
YOLOv 算法通常被用于目标检测任务,但通过对其进行适当的调整和改造,也能够满足图片分类的需求。接下来,我将基于之前 YOLOv 的开发框架,详细介绍如何利用它实现图片分类。
一、核心思路转换
在目标检测任务中,YOLOv 会输出目标的位置和类别;而图片分类只需要判断整张图片属于哪个类别。我们可以将 YOLOv 的输出进行简化处理:不再关注目标的位置信息,仅提取置信度最高的类别作为图片的分类结果 。
二、代码模块调整
2.1 模型调用与推理模块优化
在原有的模型调用和推理代码基础上,我们需要修改结果解析部分。原代码中解析结果时会获取所有检测到的目标信息,现在我们只需要获取置信度最高的类别。
from ultralytics import YOLO
import cv2
import torch
# 加载预训练模型
model = YOLO('yolov8n.pt')
# 读取图像
image = cv2.imread('test.jpg')
# 预处理:调整尺寸、归一化、维度转换
input_tensor = torch.from_numpy(image).unsqueeze(0).float() / 255.0
input_tensor = input_tensor.permute(0, 3, 1, 2) # NHWC -> NCHW
# 执行推理
results = model.predict(source=input_tensor, show=False)
# 解析结果,获取置信度最高的类别
max_score = 0
predicted_class = None
for result in results:
boxes = result.boxes.xyxy.tolist()
scores = result.boxes.conf.tolist()
classes = [result.names[int(cls)] for cls in result.boxes.cls.tolist()]
for score, cls in zip(scores, classes):
if score > max_score:
max_score = score
predicted_class = cls
print(f"图片分类结果为:{predicted_class},置信度:{max_score:.2f}")
2.2 训练数据集与配置修改
如果需要训练自己的模型用于图片分类,数据集准备和配置环节也需要相应调整。
数据集标注:标注工具仍可使用 LabelImg,但每张图片仅需标注一个类别,且标注框应覆盖整张图片 。标注生成的
.txt
文件中,每行格式为类别索引 0.5 0.5 1.0 1.0
,其中0.5 0.5 1.0 1.0
表示标注框覆盖整张图片。数据集配置:在
data.yaml
文件中,nc
设置为实际的类别数量,names
列表填写对应的类别名称。同时,确保训练集、验证集和测试集路径正确指向处理好的图片和标注文件。
train: path/to/train/images # 训练集图像路径
val: path/to/val/images # 验证集图像路径
test: path/to/test/images # 测试集图像路径
nc: 5 # 假设图片分类有5个类别
names: ['class1', 'class2', 'class3', 'class4', 'class5'] # 类别名称列表
三、训练与评估调整
3.1 训练参数设置
训练参数配置与目标检测类似,但由于任务性质改变,部分参数可根据实际情况微调。例如,学习率、训练轮数等可以在原基础上进行尝试性调整,以获得更好的分类效果。
python train.py \
--weights yolov8n.pt \
--data data.yaml \
--epochs 50 \
--batch 32 \
--lr0 0.0005 # 调整后的初始学习率
3.2 模型评估指标
评估模型时,不再使用目标检测的mAP@0.5:0.95
指标,而是采用图片分类常用的准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 值等指标 。可以通过编写自定义脚本,加载测试集数据进行预测,然后计算这些指标来评估模型的分类性能。
# 读取测试集标签
with open(test_label_file, 'r') as f:
max_score = 0
predicted_class = None
for result in results:
scores = result.boxes.conf.tolist()
classes = [result.names[int(cls)] for cls in result.boxes.cls.tolist()]
for score, cls in zip(scores, classes):
if score > max_score:
max_score = score
predicted_class = cls
predicted_labels.append(predicted_class)
# 计算评估指标
accuracy = accuracy_score(true_labels, predicted_labels)
precision = precision_score(true_labels, predicted_labels, average='weighted')
recall = recall_score(true_labels, predicted_labels, average='weighted')
f1 = f1_score(true_labels, predicted_labels, average='weighted')
print(f"准确率: {accuracy:.4f}")
print(f"精确率: {precision:.4f}")
print(f"召回率: {recall:.4f}")
print(f"F1值: {f1:.4f}")
遍历测试集的每一张图片,进行预处理后输入模型进行预测,提取置信度最高的类别作为预测结果。
最后,使用
sklearn
库中的函数计算准确率、精确率、召回率和 F1 值,并打印输出评估结果。
3.3核心评估指标详解
3.3.1 准确率(Accuracy)
准确率是最直观的评估指标,它表示模型正确分类的样本数占总样本数的比例。
在图片分类中,准确率反映了模型对所有样本的整体判断正确程度,但当数据集中类别不均衡时,准确率可能会产生误导。例如,数据集中 90% 是类别 A,10% 是类别 B,模型将所有样本都预测为类别 A,虽然准确率很高,但模型实际上无法识别类别 B。
3.3.2 精确率(Precision)
精确率衡量的是模型预测为正类的样本中,真正为正类的比例。
精确率关注的是模型预测结果的准确性。在图片分类中,如果精确率较低,说明模型容易将其他类别误判为目标类别,导致误报较多。
3.3.3 召回率(Recall)
召回率也称为灵敏度或真正率,它表示实际为正类的样本中,被模型正确预测为正类的比例。召回率反映了模型对正类样本的捕捉能力。在图片分类中,召回率低意味着模型容易遗漏正类样本,出现漏报的情况。
3.3.4 F1 值
F1 值是精确率和召回率的调和平均数,综合考虑了精确率和召回率两个指标,能够更全面地评估模型性能。F1 值越高,说明模型在精确率和召回率之间取得了较好的平衡
通过上述指标和脚本,能够全面、准确地评估基于 YOLOv 的图片分类模型性能,为模型的优化和改进提供有力依据。