跳到主要内容

YoloV8的目标模型训练方法

使用YoloV8提供的Python接口,训练一个佩戴安全帽的目标检测模型,完成模型训练后,使用模型检测图片或视频中的人员是否佩戴安全帽。

准备训练数据

下载

训练数据可以从https://www.kaggle.com/ 上面下载,搜索worker safety,一定要下载yoloV8格式的数据集,如果是其它格式还需转成yoloV8格式(如PASCAL VOC 格式)。

下载后解压,打开css-data文件夹,如

  • test 文件中包含了82个测试数据
  • train 文件中包含了2605个训练数据,每张图片中有多个可标记的物体,实际有2万多个标记结果
  • valid 文件中包含了114个验证数据

打开训练数据文件夹train,里面包含文件夹images和labels,images保存的是待训练的图片数据,labels保存了图片数据的标记结果,标记的格式为yolo格式,同一个数据的数据名和标记名是相同的,及每一个images下的图片文件对应一个lables下的标记结果文件

数据格式

随便打开一个数据图片和对应标记数据,如 train/images/2_jpg.rf.2eba3dc769a0689dda8f6eb3fdbd297e.jpg和train/lables/2_jpg.rf.2eba3dc769a0689dda8f6eb3fdbd297e.txt,如

在标记数据中,每一行代表一个标记物体,在该图片标记数据中一共有19行标记数据,就代表对该图片会标记出19个目标物体。

每一行的数据格式如下,如第17行数据 0 0.7654552657144856 0.63203125 0.03461134933607006 0.040625

列号名称说明
1class_id代表类别编号
2x_center物体边界框中心点X坐标(值在0-1之间)
3y_center物体边界框中心点Y坐标(值在0-1之间)
4width物体边界框的宽度(值在0-1之间)
5height物体边界框的高度(值在0-1之间)

标记数据中的第一列0,就代表是安全帽,指的就是图片数据中红框标注的,物体边界框中心点的坐标是相对于图像宽度和高度的比例,边界框的宽度和高度也是相对于图像宽度和高度的比例。YOLO标注格式中的x, y, w, h是归一化后的坐标值(取值范围0~1)如:

图像原始尺寸:宽度:image_width 高度:image_height (单位:像素)

目标框的像素坐标:左上角(x1, y1),右下角(x2y2

像素级中心点坐标:

center_x_pixel = (x1 + x2)/ 2

center_y_pixel = (y1 + y2)/ 2

目标框像素级宽高:

box_w_pixel = x2 - x1

box_h_pixel = y2 - y1

归一化后坐标(除以图片尺寸,转成0~1的比例):

白色安全帽边界框中心点的X坐标 = center_x_pixel / image_width

白色安全帽边界框中心点的Y坐标 = center_y_pixel / image_height

物体边界框的宽度 = box_w_pixel / image_width

物体边界框的高度 = box_h_pixel / image_height

搭建环境

创建Python环境

使用conda create 创建一个名称为safehat的新python环境,其中python版本使用3.10

conda create -n safehat python=3.10

激活Python环境

安装完成后激活环境

activate safehat

安装Yolo

安装YOLOv8环境,安装用时较长,请耐心等待

YOLOv8 是 Ultralytics 开发的 YOLO(You Only Look Once)物体检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的SOTA模型,它建立在先前YOLO成功基础上,并引入了新功能和改进,以进一步提升性能和灵活性。它可以在大型数据集上进行训练,并且能够在各种硬件平台上运行,从CPU到GPU。 不仅如此,YOLOv8还有一个关键特性是它的可扩展性,由于其被设计成一个框架,支持所有以前YOLO的版本,使得在不同版本之间切换和比较它们的性能变得容易。

pip install ultralytics

配置

编写模型训练所需的yaml配置文件,名称为safehat.yaml,用于配置待训练数据的地址和训练的类别等。

# 训练数据用于模型的训练
train: D:\workspace\python\yolo\safehat\data\train\images\

# 验证数据用于模型训练过程中的评估和参数调试
val: D:\workspace\python\yolo\safehat\data\valid\images\

# 测试数据用于模型完成训练后的测试
test: D:\workspace\python\yolo\safehat\data\test\images\

# 训练类别个数,类别的名称在下面names中配置
nc: 10

# 训练类别名称
# Hardhat 安全帽
# NO-Hardhat 无安全帽
# Mask 口罩
# NO-Mask 无口罩
# NO-Safety Vest 无安全背心
# Safety Vest 安全背心
# Person 人
# Safety Cone 安全锥
# machinery 挖掘机
# vehicle 车辆
names: [Hardhat, Mask, NO-Hardhat, NO-Mask, NO-Safety Vest, Person, Safety Cone, Safety Vest, machinery, vehicle]

模型训练

训练脚本

编写模型的训练脚本 train.py,如

# 导入yolo模块
from ultralytics import YOLO

# 加载yolov8的预训练模型,该模型是yolov8使用了coco数据集训练的通用目标检测模型
model = YOLO('./models/yolov8n.pt')

# 在yolov8n.pt模型基础上训练自定义模型, safehat.yaml数据配置文件,epochs=100表示100轮迭代
model.train(data='safehat.yaml', epochs=100)

# 使用验证集验证模型效果
model.val()

  • YOLOv8n(Nano):是 YOLOv8 系列中尺寸最小、参数最少的模型。它的计算量小,推理速度快,适合部署在资源有限的设备上,如嵌入式系统、移动设备等,用于实时目标检测任务,不过检测精度通常相对较低,在简单场景下能提供合理性能。
  • YOLOv8s(Small):模型尺寸和参数数量相对较小。检测精度比 YOLOv8n 稍好,能满足一般目标检测任务的需求,适用于实时视频监控、车辆检测等对精度有一定要求,但计算资源相对有限的场景。
  • YOLOv8m(Medium):属于中型模型,参数和计算量处于中等水平。能提供良好的精度和速度平衡,适用于中等复杂度的场景,如城市交通监控、工业检测等,在这些场景中既需要一定的检测精度,也要求模型有较快的推理速度。
  • YOLOv8l(Large):模型尺寸较大,参数数量较多,计算量也较大。通常能提供较高的检测精度,但推理速度相对较慢,适用于对检测精度要求较高的任务,如复杂场景的目标检测、大规模图像分析等。
  • YOLOv8x(Extra Large):是 YOLOv8 系列中尺寸最大、参数最多、计算量最高的模型。在大多数情况下能提供最佳的检测性能,但对计算资源的要求非常高,适合用于对精度要求极高的任务,如医学影像分析、精密工业检测等。
模型参数量 (M)计算量 (FLOPs)精度 (COCO mAP)速度 (FPS)适用场景优势劣势
YOLOv8n~3.2~8.7G~37.3最高移动端/嵌入式,实时检测极快,低资源消耗精度较低,小目标检测差
YOLOv8s~11.2~28.6G~44.9边缘计算(如Jetson系列)速度与精度平衡中等资源需求
YOLOv8m~25.9~78.7G~50.2通用场景(中端GPU)精度显著提升需要更强GPU
YOLOv8l~43.7~165.4G~52.9中低高性能服务器/复杂场景高精度,适合多目标检测计算成本高
YOLOv8x~68.2~257.1G~53.9最低专业级检测(如卫星/医疗)最高精度,复杂场景鲁棒性需高端GPU,推理延迟高

训练GPU最低配置建议

  • YOLOv8n/s

    • 最低配置:NVIDIA GTX 1660(6GB显存)或 RTX 3050(8GB显存)。
    • 批处理大小(Batch Size):8-16(需降低分辨率或批处理以适应显存)。
  • YOLOv8m

    • 最低配置:RTX 3060(12GB显存)或 Tesla T4(16GB显存)。
    • 批处理大小:4-8(输入分辨率较高时需进一步调整)。
  • YOLOv8l/x

    • 最低配置:RTX 3080(10GB)或 A100(40GB)级显卡。
    • 批处理大小:1-4(可能需要梯度累积或混合精度训练)。
提示
  • 显存不足时可通过降低--imgsz(如640→320)或--batch-size缓解,但可能影响精度。
  • 使用AMP(自动混合精度)可减少显存占用(添加--amp参数)。

每个预训练模型还可以细分为检测模型、分割模型和分类模型,以YoloV8n(检测模型)为例,YoloV8n-seg(分割模型),YoloV8n-cls(分类模型)

任务类型输出示例
分类模型类别 + 置信度判断图像是否包含“狗”
目标检测模型位置 + 类别 + 置信度定位并识别图中的“狗”和“猫”
实例分割模型位置 + 类别 + 置信度 + 轮廓掩膜(mask)定位“狗”并精确勾勒其轮廓

目标检测模型效果

实例分割模型效果

开始训练

运行训练脚本

python train.py

通过输出信息可以看环境信息,如:

  • yolo版本 ultralytics YOLOv8.1.3
  • python版本 Python-3.11.5
  • cpu 环境

训练需要持续一段时间,每个Epoch大概需要3-10分钟,整个训练预计需要10-20个小时

图中训练记录指标解释

  • Epoch:表示当前是第几个完整的训练周期。1 个 Epoch 意味着模型把整个训练数据集的所有图片都学习了一遍,随着 Epoch 增加,模型会不断优化参数。
  • GPU_mem:GPU 显存占用,当前训练批次(Batch)占用的 GPU 显存大小。作用是监控显存占用,防止超出显卡容量导致训练崩溃。
  • box_loss:边界框损失,衡量模型预测的目标边界框(Bounding Box)与真实标注框之间的位置差异,数值越小越好(表示预测框越准),box_loss的作用是优化目标的 “定位” 能力,让框住物体的位置更精准。
  • cls_loss:分类损失,衡量模型对目标类别的预测准确性(比如判断是 “猫” 还是 “狗”),数值越小越好(表示分类越准),作用是优化目标的 “识别” 能力,让模型分清不同类别的物体。
  • dfl_loss:分布焦点损失,YOLOv8/11 等版本中特有的损失函数,用于更精细地优化边界框坐标预测(通过预测坐标的分布而非单一值),数值越小越好,作用是辅助提升边界框的定位精度,尤其对小目标或边缘模糊的目标效果更好。
  • Instances:目标实例数,当前训练批次(Batch)的图片中包含的目标物体总数量。3 表示这一步处理的图片里一共有 3 个标注的目标,反映当前批次的数据密度,辅助判断训练进度是否正常。
  • Size:输入图像的尺寸,模型实际接收的输入图像的长边尺寸(如果开启了 rect=True,会保持原始宽高比,只将长边缩放到指定大小),尺寸越大,通常检测精度越高,但计算量和显存占用也越大。显存不足时也降低输入图像的尺寸大小。

训练完 1 个 Epoch 后,会在验证集上评估,关键指标:

  • Box(P):精确率(Precision),预测的目标中 “真阳性” 的比例(越高越好)。
  • R:召回率(Recall),真实目标中被成功检测到的比例(越高越好)。
  • mAP50:IoU 阈值为 0.5 时的平均精度。
  • mAP50-95:IoU 阈值从 0.5 到 0.95 的平均精度(更严格的综合指标)。

完成训练后会在当前目录/runs/detect/train下生成训练过程中的数据和模型文件,其中weights文件夹中保存是生成的模型文件best.pt和last.pt,如图

模型测试

使用训练好的模型文件 bast.pt 进行模型测试,编写测试代码 test.py

# 导入yolo模块
from ultralytics import YOLO

# 导入训练好的模型文件
model = YOLO('./models/best.pt')

# 使用测试图片或视频文件测试模型
model.predict('test.jpg', save=True)
model.predict('test.mp4', save=True)

# 测试时可以指定需要识别的类别,如指定classes=[0,2]就代表只识别Hardhat和NO-Hardhat,及是否佩戴了安全帽
# 类别编号及名称可参考 safehat.yaml 配置文件
# line_width 表示指定识别框的字体大小
model.predict('test.jpg', save=True, classes = [0, 2], line_width = 3)

运行模型测试脚本

python test.py

脚本运行后可以看到模型识别的过程输出,视频会逐桢输出,识别结果会保存到当前目录/runs/detect/predict中。打开目录可以看到输出的结果,如图

其它

预训练模型支持识别类型:

最后更新时间: 2026/7/31 13:40:36|访问次数: 0|豫ICP备2025159864号|