YOLOv8教程系列:四、使用yolov8仓库训练自己的图像分类数据集(含推理预测)

news2025/1/31 11:22:36

YOLOv8教程系列:四、使用yolov8仓库训练自己的图像分类数据集(含推理预测)

0.引言

Yolov8是最新一代的You Only Look Once目标检测模型,它由Ultralytics研究团队在2022年开发。相比于之前的Yolo版本,Yolov8在速度和精度上都有很大的提升。

在图像分类任务上,Yolov8使用了以下几个特点:

  1. 网络backbone采用了CSPResNeXt作为主干网络,此网络结合了ResNet和ResNeXt的优点,能够提取更丰富的特征。
  2. 使用了Cross Stage Partial Network作为网络的连接方式,将不同阶段的特征图连接起来,增强特征的表达能力。
  3. 引入了注意力机制,可以学习到目标的更加 discriminative 的特征。
  4. 使用了更大的输入分辨率,即640x640,可以学习到更丰富的信息。
  5. 损失函数上,融合了标签调制、IoU预测以及新颖的Grid Sensitive损失,可以更好地改善模型的定位能力。 在推理上使用了更高效的矩阵运算,可以加速模型的推理速度。

总的来说,Yolov8通过网络设计的改进,损失函数的优化以及高效的推理实现,相比之前的版本取得了显著的进步,在图像分类任务上能够达到更高的精度。
yolov8官方文档
**加粗样式**

1.数据准备

先把自己的数据按类别准备好,格式如下,imagenet数据集格式(文件夹名为datasets):

.
├── ./datasets
│ ├── ./datasets/OK
│ │ ├── ./datasets/OK/1.jpg
│ │ ├── ./datasets/OK/2.jpg
│ │ ├── ./datasets/OK/3.jpg
│ │ ├── …
│ ├── ./datasets/NG
│ │ ├── ./datasets/NG/1.jpg
│ │ ├── ./datasets/NG/1.jpg
│ │ ├── ./datasets/NG/1.jpg
│ │ ├── …

2.数据划分

在datasets上层目录下新建一个split.py文件,运行下面脚本:

# 工具类
import os
import random
from shutil import copy2

def data_set_split(src_data_folder, target_data_folder, train_scale=0.8, val_scale=0.2):
    '''
    读取源数据文件夹,生成划分好的文件夹,分为train、val两个文件夹进行
    :param src_data_folder: 源文件夹
    :param target_data_folder: 目标文件夹
    :param train_scale: 训练集比例
    :param val_scale: 验证集比例
    :return:
    '''
    print("开始数据集划分")
    class_names = os.listdir(src_data_folder)
    # 在目标目录下创建文件夹
    split_names = ['train', 'val']
    for split_name in split_names:
        split_path = os.path.join(target_data_folder, split_name)
        if os.path.isdir(split_path):
            pass
        else:
            os.makedirs(split_path)
        # 然后在split_path的目录下创建类别文件夹
        for class_name in class_names:
            class_split_path = os.path.join(split_path, class_name)
            if os.path.isdir(class_split_path):
                pass
            else:
                os.makedirs(class_split_path)

    # 按照比例划分数据集,并进行数据图片的复制
    # 首先进行分类遍历
    for class_name in class_names:
        current_class_data_path = os.path.join(src_data_folder, class_name)
        current_all_data = os.listdir(current_class_data_path)
        current_data_length = len(current_all_data)
        current_data_index_list = list(range(current_data_length))
        random.shuffle(current_data_index_list)

        train_folder = os.path.join(os.path.join(target_data_folder, 'train'), class_name)
        val_folder = os.path.join(os.path.join(target_data_folder, 'val'), class_name)
        train_stop_flag = current_data_length * train_scale
        current_idx = 0
        train_num = 0
        val_num = 0
        for i in current_data_index_list:
            src_img_path = os.path.join(current_class_data_path, current_all_data[i])
            if current_idx <= train_stop_flag:
                copy2(src_img_path, train_folder)
                train_num = train_num + 1
            else:
                copy2(src_img_path, val_folder)
                val_num = val_num + 1

            current_idx = current_idx + 1

        print("*********************************{}*************************************".format(class_name))
        print("{}类按照{}:{}的比例划分完成,一共{}张图片".format(class_name, train_scale, val_scale, current_data_length))
        print("训练集{}:{}张".format(train_folder, train_num))
        print("验证集{}:{}张".format(val_folder, val_num))


if __name__ == '__main__':
    src_data_folder = "datasets"
    target_data_folder = "dataset/"
    data_set_split(src_data_folder, target_data_folder)

运行结束,会按训练集和验证集8:2的比例生成一个划分后的数据集,名为dataset

3.开始训练

新建一个classify_train.py文件,根据自己情况,调整相关参数即可

from ultralytics import YOLO

model = YOLO("yolo-cls/yolov8s-cls.pt")
model.train(data='/home/lzj/03.AlgoDemo/yolov8/dataset/', epochs=100, batch=2, imgsz=1280)

4.推理预测

新建一个classify_infer.py的脚步,注意修改下面的路径和名称列表,运行结束后,会在指定目录下生成预测的图片

import cv2
import os
from ultralytics import YOLO
from tqdm import tqdm

def read_path(file_pathname, model, name_dict, save_folder):
    file_dir = os.listdir(file_pathname)
    for k,v in name_dict.items():
        name_foler = os.path.join(save_folder, v)
        os.makedirs(name_foler)
    #遍历该目录下的所有图片文件
    for filename in tqdm(file_dir):
        print(filename)
        img = cv2.imread(file_pathname+'/'+filename)
        results = model.predict(source=img)

        for result in results:
            # print(result.names)
            name_dict = result.names
            print(name_dict)
            probs = result.probs.cpu().numpy()
            top1_index = result.probs.top1
            class_name = name_dict[top1_index]
            print(class_name)
            save_img_path = os.path.join(save_folder, class_name, filename)
            cv2.imwrite(save_img_path, img)
        print('---------------------------')



if __name__ == '__main__':
    name_dict = {0: 'NG', 1: 'OK'}
    save_folder = 'classify_infer_folder'
    load_img_folder = '/home/lzj/Downloads/pb'
    model = YOLO('runs/classify/train46/weights/best.pt')
    read_path(load_img_folder, model, name_dict, save_folder)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/924032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)

1.目标&#xff1a; a.数码管显示相同的值 0000 1111 ......9999&#xff1b; b.数码管显示不同的值 1234&#xff1b; 2.分析m74hc595芯片内部框图&#xff1b; 真值表&#xff1a; 3.代码&#xff1b; ---spi.h头文件--- #ifndef __SPI_H__ #define __SPI_H__#include &quo…

Oracle的学习心得和知识总结(二十八)|Oracle数据库数据库回放功能之论文二翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

湘潭大学 湘大 XTU OJ 1271 Color 题解(非常详细)

链接 1271 题面 题目描述 Alice在玩一个游戏&#xff0c;她在一个mn的格子里&#xff0c;随机涂黑k个格子。然后她每次可以把一行或者一列的格子染成红色&#xff0c;但是这一行中不能有黑色的格子。 请问她最多能把多少个格子涂成红色&#xff1f; 输入 第一行是一个整数…

低代码平台:开发应用程序的新革命

一、前言 在传统的软件开发交付链中&#xff0c;需求经过多次传递&#xff0c;往往造成需求失真和功能返工。然而&#xff0c;随着业务的不断变化&#xff0c;低代码开发作为软件开发的新兴分支&#xff0c;呈现出高效、灵活和稳定的特点&#xff0c;为企业提供了解决方案。 在…

MAC电脑外放没有声音解决方案

烦人呐&#xff0c;我的mac外接显示屏幕&#xff0c;显示器没有音频输出&#xff0c;需要mac笔记本的音频输出&#xff0c;但是经常打开后&#xff0c;mac没有声音输出&#xff0c;需要重启电脑才能生效。亲测一下方法有效&#xff0c;请参考&#xff1a; 文章目录 一、短期方案…

Java的类加载顺序

加载、验证、准备、解析和初始化。 加载 “加载”(Loading)阶段是“类加载”(Class Loading)过程的第一个阶段&#xff0c;在此阶段&#xff0c;虚拟机需要完成以下三件事情&#xff1a; 通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构…

CentOS8中使用yum命令出现错误提示:为仓库 ‘appstream‘ 下载元数据失败

需求 最近安装了虚拟机并配置了CentOS8&#xff0c;然后打算继续安装WEB服务环境 科普 yum是一个命令行工具&#xff0c;可以在Linux系统下帮助我们方便地管理软件包&#xff08;包括安装、卸载、检查更新等操作&#xff09;&#xff0c;yum install命令的作用是在系统上安装…

很干的 Nginx

&#x1f3a8; 前言 本篇文章有些概念性的东西&#xff0c;是结合自己的理解表达出来的&#xff0c;可能有些理解不到位的地方。希望多多指教&#xff0c;谢谢大家。 红包献上 &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;…

解决idea登录github copilot报错问题

试了好多方案都没用&#xff0c;但是这个有用&#xff0c; 打开idea-help-edit custonm vm options 然后在这个文件里面输入 -Dcopilot.agent.disabledtrue再打开 https://github.com/settings/copilot 把这个设置成allow&#xff0c;然后重新尝试登录copilot就行就行 解决方…

【java安全】JNDI注入概述

文章目录 【java安全】JNDI注入概述什么是JNDI&#xff1f;JDNI的结构InitialContext - 上下文Reference - 引用 JNDI注入JNDI & RMI利用版本&#xff1a;JNDI注入使用Reference 【java安全】JNDI注入概述 什么是JNDI&#xff1f; JNDI(Java Naming and Directory Interf…

开源许可证解析:从MIT到GPL

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

kafka复习:(11)auto.offset.reset的默认值

在ConsumerConfig这个类中定义了这个属性的默认值&#xff0c;如下图 也就是默认值为latest,它的含义是&#xff1a;如果没有客户端提交过offset的话&#xff0c;当新的客户端消费时&#xff0c;把最新的offset设置为当前消费的offset. 默认是自动提交位移的&#xff0c;每5秒…

基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码

基于黄金正弦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于黄金正弦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.黄金正弦优化BP神经网络2.1 BP神经网络参数设置2.2 黄金正弦算法应用 4.测试结果&#xff1a;5…

5个产品经理必看的交互软件,高保真原型必备

今天本文将给大家分享5个产品小白也能轻松上手使用的交互软件&#xff0c;帮助大家更快地做出具有高保真效果的原型图&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一个来自国内的交互软件&#xff0c;因此无论是在设计过程&#xff0c;还是使用体验方面&…

基于swing的图书借阅系统java jsp书店进销存mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的图书借阅系统 系统有2权限&#xff1a;管…

GPS坐标转换并实时显示轨迹

文章目录 下载数据集创建功能包主要代码使用 下载数据集 链接: https://pan.baidu.com/s/1zSXyNhMNQdaFlDFziDse1Q 密码: 6j6u 其中话题/gps/fix和/imu_correct分别为sensor_msgs/NavSatFix类型的gps数据和sensor_msgs/Imu类型的imu数据 查看相关话题信息 创建功能包 cat…

MySQL 8.0 的工具日志配置管理

文章目录 日志分类设置错误日志设置错误日志等级生效时间 二进制日志&#xff08;binlog&#xff09;作用配置 慢日志&#xff08;slow_log&#xff09;作用 general_log 业务sql 日志分类 error log &#xff1a; 错误日志 genernal log &#xff1a; 普通日志 binlog &#…

香港开启创科「黄金时代」,企业如何乘势高飞?

文 | 智能相对论 作者 | 范柔丝 以“Made in Hong Kong&#xff08;香港制造&#xff09;”为标志的香港工业&#xff0c;在历经了辉煌与式微之后&#xff0c;近几年&#xff0c;在高质量发展、创新科技引领之下&#xff0c;迎来“再工业化”的契机。 特区政府在2022年12月公…

什么是通达信程序接口?运用哪些源代码?

在股市里提及的通达信程序接口&#xff08;TDXAPI&#xff09;是获取个股行情数据的分析系统&#xff0c;用户可以通过编程语言调用接口&#xff0c;获取实时行情数据、历史行情数据、板块数据等&#xff0c;进而进行自定义的行情分析、股票筛选、交易决策等操作。 例如开发数…