(3)机器学习小白入门 YOLOv: 解锁图片分类新技能

发布于:2025-07-09 ⋅ 阅读:(12) ⋅ 点赞:(0)

(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 = Nonefor 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}")

  1. 遍历测试集的每一张图片,进行预处理后输入模型进行预测,提取置信度最高的类别作为预测结果。

  2. 最后,使用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 的图片分类模型性能,为模型的优化和改进提供有力依据。


网站公告

今日签到

点亮在社区的每一天
去签到