# 图像分类小工具实现:基于YOLOv8的本地训练与输出


背景介绍

随着图像内容识别技术的发展,小型图像分类工具在工业和生活场景中日益重要。本项目通过本地环境实现训练并输出结果,可直接集成到开发环境中使用。项目核心在于利用PIL库读取图像数据,并结合YOLOv8模型完成分类任务,同时记录训练数据路径。

思路分析

  1. 数据读取:使用PIL库读取图像,通过numpy处理图像数组,实现数据预处理。
  2. 模型加载:将训练好的YOLOv8模型加载至模型类中,实现分类功能。
  3. 训练与预测:通过PyTorch框架完成模型训练,利用预处理后的图像数据进行预测,输出分类结果和模型名称。
  4. 数据记录:在训练过程中记录训练数据路径,便于后续调试和扩展。

代码实现

# 项目主程序

import numpy as np
from PIL import Image
import os
import torch
import torchvision

# 训练数据目录
training_data_path = "data/yolov8_train"

# 读取训练数据
def load_images(data_path):
    images = []
    labels = []
    for file in os.listdir(data_path):
        if file.endswith(".jpg"):
            img = Image.open(os.path.join(data_path, file))
            label = file.split(".")[0]
            images.append(img)
            labels.append(label)
    return images, labels

# 加载训练好的模型
def load_model(model_path):
    model = torch.hub.load("yolov8", "train")
    model.eval()
    model_path = os.path.join(model_path, "train")
    return model, model_path

# 预处理图像数据
def preprocess(img, model, image_size):
    img = img.resize((image_size, image_size))
    y = model(img)
    return y, img

# 输出分类结果和模型名称
def predict(img_path, model_path):
    model, model_path = load_model(model_path)
    y, img = preprocess(img_path, model, 256)
    result = model(img)
    result = torch.sigmoid(result).cpu().numpy().argmax()
    model_name = "YOLOv8"
    print(f"分类结果:{result},模型名称:{model_name}")
    print(f"训练数据路径:{model_path}")

# 独立运行说明
if __name__ == "__main__":
    # 示例输入输出
    predict("input.jpg", "data/yolov8_train")

总结

本项目通过Python实现图像分类功能,利用PIL库进行图像处理,结合YOLOv8模型完成分类任务。代码实现了数据读取、模型加载、训练与预测的完整流程,并记录了训练数据路径。项目时间约1~3天完成,面向中级开发者,具有可扩展性,可直接集成到开发环境中使用。

参考文献

  1. YOLOv8: A Deep Learning Model for Object Detection, arXiv:2204.07719 v1
  2. Pillow: A PIL library for Python, https://pil.readthedocs.io