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

(1)机器学习小白入门YOLOv :从概念到实践
(2)机器学习小白入门 YOLOv:从模块优化到工程部署
(3)机器学习小白入门 YOLOv: 解锁图片分类新技能

前言

YOLOv 算法通常被用于目标检测任务,但通过对其进行适当的调整和改造,也能够满足图片分类的需求。接下来,我将基于之前 YOLOv 的开发框架,详细介绍如何利用它实现图片分类。

一、核心思路转换

在目标检测任务中,YOLOv 会输出目标的位置和类别;而图片分类只需要判断整张图片属于哪个类别。我们可以将 YOLOv 的输出进行简化处理:不再关注目标的位置信息,仅提取置信度最高的类别作为图片的分类结果 。

二、代码模块调整

2.1 模型调用与推理模块优化

在原有的模型调用和推理代码基础上,我们需要修改结果解析部分。原代码中解析结果时会获取所有检测到的目标信息,现在我们只需要获取置信度最高的类别。

python 复制代码
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列表填写对应的类别名称。同时,确保训练集、验证集和测试集路径正确指向处理好的图片和标注文件。

python 复制代码
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 复制代码
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 值等指标 。可以通过编写自定义脚本,加载测试集数据进行预测,然后计算这些指标来评估模型的分类性能。

python 复制代码
# 读取测试集标签​
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}")
  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 的图片分类模型性能,为模型的优化和改进提供有力依据。

相关推荐
jay神23 分钟前
2026年YOLO还有哪些创新点可以做?
python·yolo·毕业设计·科研·课程设计·创新
傲笑风9 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
维基框架9 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python
谢白羽13 小时前
SGLang的AWQ量化笔记
笔记·python·sglang
迷迭香yy14 小时前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
清水白石00814 小时前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
️学习的小王14 小时前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
前端 贾公子14 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
evans在进步15 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式
jayson.h15 小时前
PDF 合并+添加页码 相关库、类、函数
开发语言·前端·python