YOLOv8训练一个安全帽佩戴识别模型

2,095 阅读4分钟

环境准备

  1. 准备Conda及YOLO环境

创建名为yolov8的虚拟环境。

conda create -n yolov8 python=3.10

成功后激活环境。

conda activate yolov8

安装YOLO环境。(非CUDA )

conda install -c conda-forge ultralytics

安装YOLO环境。(如果你计划在CUDA环境中请用下面这个,注意cuda的版本号)

conda install -c pytorch -c nvidia -c conda-forge pytorch torchvision pytorch-cuda=11.8 ultralytics
  1. 测试环境

运行下面的命令测试安装是否成功。

yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

在命令行可以看到类似这样的结果,打开这个目录。 在这里插入图片描述

看到下面的图就表示成功了! 在这里插入图片描述

开始训练

  1. 准备数据集

我们可以在kaggle官网搜索需要的数据集。文章这个例子使用的是:施工现场安全图像数据集,下载数据集。 如果无法注册账号请使用魔法工具,或者参考这位大佬的文章-kaggle注册问题,一般不能注册的原因都是因为Google的人机验证加载不出来。 image.png 解压后的css-data目录(左图)里的文件(右图)就是YOLO格式的数据集。(PS:在kaggle中下载的数据集有多种格式,注意不要用错)

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

  1. 编写yaml文件

创建safeHat.yaml文件,这个文件告诉YOLOv8关于数据集的信息(留意Hardhat和NO-Hardhat “0和2”),记得修改路径为你本机的实际路径。

# 模型训练时使用的yaml配置文件。该文件说明了数据的地址和待训练的类别

# 数据集的根路径
path: D:\ultralytics\archive\css-data

# 配置三个路径,分别对应训练数据、验证数据、测试数据的地址
# 训练数据用于模型的训练
train: D:\ultralytics\archive\css-data\train\images
# 验证数据用于模型训练过程中的评估和参数调试
val: D:\ultralytics\archive\css-data\valid\images
# 测试数据用于模型完成训练后的测试
test: D:\ultralytics\archive\css-data\test\images

# number of classes
nc: 10
# 0-9分别指代下面的类型,注意Hardhat和NO-Hardhat(0和2)
# class names#names: ['0','1','2','3','4','5','6','7','8','9']
#Hardhat - 安全帽
#Mask - 口罩
#NO-Hardhat - 无安全帽
#NO-Mask - 无口罩
#NO-Safety Vest - 无安全背心
#Person - 人
#Safety Cone - 安全锥
#Safety Vest - 安全背心
#machinery - 机械(挖掘机)
#vehicle - 车辆
names: [Hardhat, Mask, NO-Hardhat, NO-Mask, NO-Safety Vest, Person, Safety Cone, Safety Vest, machinery, vehicle]
  1. 使用数据集训练自己的模型

创建yolo_train.py脚本(与safeHat.yml文件在同级目录),用于训练模型。 CPU训练

from ultralytics import YOLO #导入Yolo模块
# 加载yolov8的预训练模型,这个模型是yolov8使用了coco数据集训练的通用目标检测模型.
# #我们将它作为基础模型,在该模型的基础上,训练安全帽模型
model = YOLO('yolov8n.pt') # 用于加载模型
# model.to('cuda')# 使用 GPU 设备
# 训练用户自定义的数据集,数据的配置保存在safehat.yaml中,epochs等于100表示100轮迭代
model.train(data='safeHat.yaml', epochs=100)
#使用验证集验证效果
model.val ()

GPU训练

from ultralytics import YOLO
import torch
# 加载yolov8的预训练模型
model = YOLO('yolov8n.pt')
# 选择设备
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model.to(device)
# 定义主函数
if __name__ == '__main__':
    # 训练用户自定义的数据集
    model.train(data='safeHat.yaml', epochs=100, save=True, save_period=10)
    # 训练完成后进行验证
    model.val()

在命令行中,cd命令切换到你的项目目录(包含safeHat.yaml文件的目录),在命令行运行我们的训练脚本开始训练:

python yolo_train.py

看到如下图类似的数据就代表在训练了,等待训练完成(如果你的一轮训练时间很长可以使用GPU训练或者减少训练迭代次数)。 在这里插入图片描述 更建议用GPU来训练,速度快指数倍 在这里插入图片描述

使用模型

  1. 查看模型

在训练脚本同级目录下的runs\detect\train\weights\best.pt就是我们训练得出的模型。 在这里插入图片描述

  1. 使用模型预测

创建yolo_test.py脚本,用于测试我们的模型。

#在代码中导入YOLO模块
from ultralytics import YOLO

# 导入训练好的模型best.pt
model = YOLO("runs\\detect\\train\\weights\\best.pt")

# 随意找一些测试数据
# 图片数据和视频数据都可以,直接将数据传入接口就可以了
# 设置 conf=0.5 时,这意味着只有模型以至少 50% 的置信度识别出的对象才会被保留并输出。
model.predict('source_files\\source_files\\*.jpg', save=True, conf=0.5)
# model.predict("source_files\\source_files\\*.mp4", save=True, conf=0.7)

# 在识别数据时,传入了classes = [0,2]
# 代表只输出0和2,也就是安全帽是否佩戴这两个类别
model.predict("source_files\\source_files\\schupan_japan1web.jpg", save=True, classes = [0,2], conf=0.7)

可以看到,这是我此时的文件目录结构。 在这里插入图片描述

在命令行中,cd命令切换到你的项目目录(包含safeHat.yaml文件的目录),在命令行运行我们的测试脚本开始测试:

python yolo_test.py

如果看到下图的输出,代表预测成功了。 在这里插入图片描述 打开runs\detect\predict可以看到我们的预测结果。 这个是指定了class的输出。 在这里插入图片描述 这个是默认的输出。 在这里插入图片描述