news 2026/10/27 1:13:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 YOLO V8 Fine-Tuning 训练自定义的目标检测模型

一、YOLO V8

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

网络结构如下图所示:

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

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

模型的比较如下:

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

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

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

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

安装ultralytics库:

pipinstallultralytics-ihttps://pypi.tuna.tsinghua.edu.cn/simple

ultralytics使用文档:

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

测试YOLO V8的效果:

测试图片:

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

fromultralyticsimportYOLO# Load a modelmodel=YOLO('yolov8n.pt')# pretrained YOLOv8n modelresults=model.predict('./img/1.png')# Show resultsresults[0].show()

二、数据收集及标注

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

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

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

pipinstalllabelimg-ihttps://pypi.tuna.tsinghua.edu.cn/simple

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

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

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

三、数据拆分

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

importosimportshutilfromtqdmimporttqdm# 图片地址image_dir="data/images/"# 标准文件地址label_dir="data/labels/"# 训练集的比例training_ratio=0.9# 拆分后数据的位置train_dir="train_data"defsplit_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)# 训练集withopen(os.path.join(train_dir,"train.txt"),"w")asfile:file.write("\n".join([train_dir+"images/train/"+image_fileforimage_fileintrain_images]))print("save train.txt success!")# 拷贝数据foritemintqdm(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/"))# 验证集withopen(os.path.join(train_dir,"val.txt"),"w")asfile:file.write("\n".join([train_dir+"images/val/"+image_fileforimage_fileinval_images]))print("save val.txt success!")# 拷贝数据foritemintqdm(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就是上面标注时的标签名。

开始训练:

fromultralyticsimportYOLO# 加载模型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模型

fromultralyticsimportYOLO# 加载模型model=YOLO('runs/detect/train/weights/best.pt')# 预测results=model.predict('data/images/8.jpg')# Show resultsresults[0].show()


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 1:13:45

Verilog基础:在testbench中使用阻塞赋值和非阻塞赋值的区别

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 本文详细阐述了在一个testbench中,应该如何使用阻塞赋值与非阻塞赋值。首先说结论,建议在testbench中,对时钟信号(…

作者头像 李华
网站建设 2026/10/27 1:13:27

英伟达显卡系列与架构、代表产品

NVIDIA的产品线和GPU架构发展历史都非常丰富。无论是面向普通消费者的游戏显卡,还是面向专业图形、科学计算与AI训练的高性能加速卡,都在不同阶段形成了非常清晰的定位。整体来看,NVIDIA的发展主线并不是简单地“做更快的显卡”,而…

作者头像 李华
网站建设 2026/10/27 1:12:44

Verilog基础:表达式中的整数常量(integer)

相关文章 Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html ​ 整数常量可以由十进制、十六进制、八进制或二进制格式指定,有两种表现形式。 第一种表现形式 第一种表现形式是一个简单的十进制数,应指定为0到9的数…

作者头像 李华
网站建设 2026/10/27 1:10:08

电容两端电压不能突变:原理、应用与工程实战完整笔记

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/27 1:07:13

TIA Context:让AI真正理解PLC程序的工业语义中枢

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/27 1:07:11

IC秋招笔试LDO电路详解:PMOS调整管、稳定性与效率分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华