基于 YOLO V8 Fine-Tuning 训练自定义的目标检测模型

一、YOLO V8

YOLO V8 是由 2023ultralytics 公司开源的发布,是结合了前几代 YOLO 的融合改进版。YOLO V8 支持全方位的视觉 AI 任务,包括检测、分割、姿态估计、跟踪和分类。并且在速度和准确性方面具有无与伦比的性能。能够应用在各种对速度和精度要求较高的应用和领域。

网络结构如下图所示:

在这里插入图片描述

YOLO V8 相对于 YOLO V5还是有很大的不同,例如:YOLO V8 相对于 YOLO V5,依然使用的是CSP的思想,不过将 V5 中的C3模块换成了C2F模块,以减轻模型的大小,也依旧使用 V5 架构中的SPPF模块。但是在 PAN-FPN 层面,V8V5 中的上采样阶段中的卷积结构去除了。同时借鉴了 YOLOXDecoupled-Head 结构,分类和回归两个任务的 HEAD 不再共享参数等。

在模型上 V8 和 V5 类似,包括不同大小的模型,从小到大包括:yolov8n、yolov8s、yolov8m、yolov8l、yolov8x等:

模型的比较如下:

在这里插入图片描述

更多的介绍可以参考官方的文档:

https://docs.ultralytics.com/de/models/yolov8/

本文借助ultralyticsYOLO V8 迁移训练自定义的目标检测模型,在本次的实验中,主要训练一个人脸检测模型,包括数据标注、数据拆分、训练、测试等过程。

本次采用ultralytics 公司发布的 ultralytics 框架,可以帮助开发人员高效完成数据训练和验证任务,由于 ultralytics 默认采用的为 PyTorch 框架,因此实验前请安装好 cudatorch 环境,如果没有 GPU 环境,由于YOLO V8 已经足够轻量级,使用CPU 也是可以训练。

安装 ultralytics 库:

pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

ultralytics 使用文档:

https://docs.ultralytics.com/zh/quickstart/#use-ultralytics-with-python

测试 YOLO V8 的效果:

测试图片:
在这里插入图片描述

这里使用 yolov8n 模型,如果模型不存在会自动下载

from ultralytics import YOLO
# Load a model
model = YOLO('yolov8n.pt')  # pretrained YOLOv8n model

results = model.predict('./img/1.png')
# Show results
results[0].show()

在这里插入图片描述

二、数据收集及标注

图像数据可以从网上找一些或者自己拍摄,我这里准备了一些 人 的图片:

在这里插入图片描述

这里可以准备两个目录,data/imagesdata/labels,其中 labels 存放标注后的文件,将收集到的图像放在 images 目录下:

在这里插入图片描述

下面使用 labelimg 工具进行标注,如果没有安装,使用下面命令安装:

pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

然后在控制台输入:labelimg 打开可视化工具:

在这里插入图片描述

注意:数据集格式默认是 VOC 格式的,要选择为 YOLO ,我这里的人脸标签为 face ,这个后面需要使用到。

标注完成后,可以在 /data/labels 下看到标注后的文件:

在这里插入图片描述

三、数据拆分

这里拆分为 90% 的训练集,10% 的验证集,拆分脚本如下,

import os
import shutil
from tqdm import tqdm

# 图片地址
image_dir = "data/images/"
# 标准文件地址
label_dir = "data/labels/"
# 训练集的比例
training_ratio = 0.9
# 拆分后数据的位置
train_dir = "train_data"

def split_data():
    list = os.listdir(image_dir)
    all = len(list)
    train_count = int(all * training_ratio)
    train_images = list[0:train_count]
    val_images = list[train_count:]

    # 训练集目录
    os.makedirs(os.path.join(train_dir, "images/train"), exist_ok=True)
    os.makedirs(os.path.join(train_dir, "labels/train"), exist_ok=True)
    # 验证集目录
    os.makedirs(os.path.join(train_dir, "images/val"), exist_ok=True)
    os.makedirs(os.path.join(train_dir, "labels/val"), exist_ok=True)

    # 训练集
    with open(os.path.join(train_dir, "train.txt"), "w") as file:
        file.write("\n".join([train_dir + "images/train/" + image_file for image_file in train_images]))
    print("save train.txt success!")
    # 拷贝数据
    for item in tqdm(train_images):
        label_file = item.replace(".jpg", ".txt")
        shutil.copy(os.path.join(image_dir, item), os.path.join(train_dir, "images/train/"))
        shutil.copy(os.path.join(label_dir, label_file), os.path.join(train_dir, "labels/train/"))

    # 验证集
    with open(os.path.join(train_dir, "val.txt"), "w") as file:
        file.write("\n".join([train_dir + "images/val/" + image_file for image_file in val_images]))
    print("save val.txt success!")
    # 拷贝数据
    for item in tqdm(val_images):
        label_file = item.replace(".jpg", ".txt")
        shutil.copy(os.path.join(image_dir, item), os.path.join(train_dir, "images/val/"))
        shutil.copy(os.path.join(label_dir, label_file), os.path.join(train_dir, "labels/val/"))


if __name__ == '__main__':
    split_data()

在这里插入图片描述
可以在 train_data 中看到拆分后的数据集格式:

在这里插入图片描述

四、训练

使用 ultralytics 框架训练非常简单,仅需三行代码即可完成训练,不过在训练前需要编写 YAML 配置信息,主要标记数据集的位置。

创建 face.yaml 文件,写入下面内容:


path: D:/pyProject/yolov8/train_data # 数据集的根目录, 建议使用绝对路径
train: images/train # 训练集图像目录
val: images/val # 验证集图像目录
test: # test images (optional)

# 分类
names:
  0: face

注意分类中的 face 就是上面标注时的标签名。

开始训练:

from ultralytics import YOLO

# 加载模型
model = YOLO('yolov8n.pt')

# 训练
model.train(
    data='face.yaml', # 训练配置文件
    epochs=50, # 训练的周期
    imgsz=640, # 图像的大小
    device=[0], # 设备,如果是 cpu 则是 device='cpu'
    workers=0,
    lr0=0.001, # 学习率
    batch=8, # 批次大小
    amp=False # 是否启用混合精度训练
)

运行后可以看到打印的网络结构:

在这里插入图片描述

训练中:

在这里插入图片描述

训练结束后可以在 runs 目录下面看到训练的结果:

在这里插入图片描述

其中 weights 下面的就是训练后保存的模型,这里可以先看下训练时 loss 的变化图:

在这里插入图片描述

五、模型测试

使用 best.pt 模型

from ultralytics import YOLO
# 加载模型
model = YOLO('runs/detect/train/weights/best.pt')

# 预测
results = model.predict('data/images/8.jpg')

# Show results
results[0].show()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【重制版】在Android手机上安装kali Linux

前言 由于kali官方的Nethunter2的安装代码因为…无法访问,手头又没有一些受支持的机器3,所以做了这个脚本,供大家使用。 工具 搭载基于Android的手机TermuxVNC Viewer 安装必备软件(如已安装请忽略) 请到 https://www.hestudio.net/post…

制造出海,灵途科技助力割草机器人、泳池清洁机器人全方位感知

近年来,越来越多的中国企业开始对外开拓,走向海外市场、挖掘和满足全球消费者的需求。在消费机器人领域,中国企业出海成绩亮眼!在2024 ces 和上海AWE展会上,多家机器人公司展示了家用智能割草机器人、泳池清洁机器人的…

C#基础知识总结

C语言、C和C#的区别 ✔ 面向对象编程(OOP): C 是一种过程化的编程语言,它不直接支持面向对象编程。然而,C 是一种支持 OOP 的 C 的超集,它引入了类、对象、继承、多态等概念。C# 是完全面向对象的&#xff…

【C++】string类(常用接口)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:http://t.csdnimg.cn/eCa5z 目录 修改操作 push_back append operator assign insert erase replace c_str find string类非成…

淘宝商品详情数据(商品分析,竞品分析,代购商城建站与跨境电商,ERP系统商品数据选品)

淘宝商品详情数据在多个业务场景中发挥着关键作用,以下是一些主要的应用场景: 请求示例,API接口接入Anzexi58 商品分析:通过对淘宝商品详情的全面分析,商家可以深入了解商品的属性、价格、销售量、评价等信息。这些数…

手写简易操作系统(十八)--实现用户进程

一、TSS TSS是Task State Segment的缩写,即任务状态段,早在简述特权级的时候我们就讲过了一点 手写简易操作系统(八),现在我们讲一下这些保存的寄存器是干嘛的。 这一部分需要讲点历史,硬件与软件的关系是相互促进的&#xff0c…

基于SpringBoot + Vue实现的中国陕西民俗网设计与实现+毕业论文

介绍 本系统包含管理员、用户两个角色。 管理员角色:登录、用户管理功能、民俗介绍管理功能(发布和管理民俗文化的介绍文章)、公告信息管理功能(发布网站的重要通知和活动信息)、商品管理功能(对商家发布的商品进行监管)、商品评价管理功能(监管商品评价内容&#…

乐理通识

2023 年搞了台雅马哈 61 键的电子琴,顺手看了下啊 B 的上的课程 《零基础自学音乐学乐理合集-第一季》,这里是部分笔记(给博客加点不一样的东西👀)。 简谱各部分一览 C 表示音名竖线为小节线 音名 完整钢琴键盘 88 键…

leetcode:392. 判断子序列

题目: class Solution { public:bool isSubsequence(string s, string t) {} }; 题解: 很巧妙的题解:循环遍历两个字符串,两个字符串都没遍完就继续遍历,字符串s先遍历完结果为true,字符串t先遍历完结果为…

项目管理【环境】概述

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 一、组织运行环境 1.1 事业环境因素EEFs 1.2 组织过程资产OPA 1.3 二者差异 二、组织结构类型 2.1 组织架构 2.2 职能型组织 2.3 项目型组织 2.4 矩阵型组织 2.5 项目管理者在不同组织中的特…

NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)

真亦假&#xff0c;假亦真 简介&#xff1a;java伪造php一句话马。实则信息泄露一扫就出&#xff0c;flag在/flag里面。 题目描述&#xff1a;开开心心签个到吧&#xff0c;祝各位师傅们好运~ 静态flag&#xff1a;NSS{Checkin_h4v3_4_g00D_tINNe!} /路由显示 <?php e…

数据库安全(redis、couchdb、h2database)CVE复现

redis服务默认端口&#xff1a;6379&#xff1b;我们可以通过端口扫描来判断是否存在该服务。 Redis 是一套开源的使用ANSI C 编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库&#xff0c;并提供多种语言的API。 Redis 如果在没有开启认证的情况下&#xff0c;…

论文笔记:TALK LIKE A GRAPH: ENCODING GRAPHS FORLARGE LANGUAGE MODELS

ICLR 2024&#xff0c;reviewer评分 6666 1 intro 1.1 背景 当下LLM的限制 限制1&#xff1a;对非结构化文本的依赖 ——>模型有时会错过明显的逻辑推理或产生错误的结论限制2&#xff1a;LLMs本质上受到它们训练时间的限制&#xff0c;将“最新”信息纳入到不断变化的世…

MySQL优化之外连接消除----空值拒绝

什么叫空值拒绝呢&#xff1f;请看下面用例 可以看到&#xff0c;外连接中&#xff0c;从表的表连接列&#xff0c;tb2.id出现了null&#xff0c;因为tb2中并没有id5的情况 点击(此处)折叠或打开 select * from tb1 left join tb2 on tb1.idtb2.id where tb2.id>1; sel…

商品说明书的制作工具来啦,用这几个就够了!

商品说明书是用户了解产品特性、性能、使用方法的重要途径。一个明确、易懂的商品说明书&#xff0c;可以显著提升用户体验&#xff0c;进而提升产品的销量。但我们都知道&#xff0c;制作一份高质量的说明书并不容易&#xff0c;需要仔细设计、计划和撰写。幸运的是&#xff0…

解决 linux 服务器 java 命令不生效问题

在Linux系统中&#xff0c;当你安装Java并设置了JAVA_HOME环境变量后&#xff0c;你可能需要使用source /etc/profile命令来使Java命令生效。这是因为/etc/profile是一个系统级的配置文件&#xff0c;它包含了系统的全局环境变量设置。 但是需要注意的是&#xff0c;source /e…

数据运营分析-详解

一、指标与指标体系 指标体系就是业务逻辑的框架,也是思考业务逻辑的第一步 案例: 老板,我负责的用户活跃,主要考察每天启动产品的注册用户数量,整体来看,每月活跃保持7.3%的增长,是因为渠道团队的拉新活动带来很多新增注册用户,占每月活跃用户的40%,新一年会继续沿…

手写简易操作系统(十七)--编写键盘驱动

前情提要 上一节我们实现了锁与信号量&#xff0c;这一节我们就可以实现键盘驱动了&#xff0c;访问键盘输入的数据也属于临界区资源&#xff0c;所以需要锁的存在。 一、键盘简介 之前的 ps/2 键盘使用的是中断驱动的&#xff0c;在当时&#xff0c;按下键盘就会触发中断&a…

图的基础和图的遍历(--蓝桥云)

图的基础概念 度数&#xff1a;出边入边的条数 有向边&#xff1a;有箭头 图的存储方式 //邻接表 List<int []> list[N] list<x>//存放x的所有出点的信息 list[i][j]{first,second}//其中first表示从i出发的某个出点的编号&#xff08;这个出点是i的第j个出点&…

Lecture 1 - Introduction

Lecture 1 - Introduction MIT 6.824 Distributed Systems 1、概念预览 分布式系统需要考虑的因素&#xff1a; Parallelism &#xff1a;并行性Fault tolerence &#xff1a;容错性Physicial &#xff1a;不同系统之间物理距离引起的通信问题**Security ** &#xff1a;不…