← 返回首页
基于roboflow+yolov8实现火灾检测系统
发表时间:2024-11-22 01:57:32
基于roboflow+yolov8实现火灾检测系统

1.准备原始数据集

这里我们准备一些训练图片,进行标注,作为我们的数据模型,我选择了两百张图片、可以使用 potplayer 连续截图功能将视频分割为图片,再从图片中剪切出不相似的人物。

为了方便训练,我们已经把这些原始图片进行目标信息的标注,并且已经转换为yolo的txt格式。

原始数据集目录结构图如下:

2.创建yolov8项目

把下载下来的ultralytics-main.zip源码解压缩后作为yolov8的项目目录。项目结构图如下所示:

3.创建训练用的数据集目录

在项目根路径下创建 dataset 文件夹,然后在 dataset 目录下再创建(test,train,valid)三个子文件夹,分别在每个子文件夹下再创建名字为images和labels的子目录。在dataset目录下创建data.yaml配置文档。

再把原数据集的images里的图片放到(test,train,valid)三个子文件夹的images目录,labels_all里的标注文件放到(test,train,valid)三个子文件夹的labels目录。这里我们 train 目录里放入编号1-100的图片,test 目录放入编号101-180的图片,valid目录放入编号181-200的图片。 标注文件放入labels目录,训练图片放入 images内,并且文件名要一一对应起来。

dataset 目录结构如下图所示:

data.yaml 的内容如下:

# 用来分多少类,指定各个文件夹的位置
train: F:\ultralytics-main\dataset\train\images
val: F:\ultralytics-main\dataset\valid\images
test: F:\ultralytics-main\dataset\test\images
nc: 6
names:
  0: e-bike
  1: bike
  2: human
  3: 3bike
  4: casque
  5: bike-card

data.yaml 文件包含以下配置信息:

根据自身需求修改,我项目路径就是F:\ultralytics-main,因此就不用修改了。

4.训练数据集

为了加快训练速度,我们提前下载好对应的yolov8模型文件,把模型文件复制到项目根目录下。如下图所示:

执行以下命令开始训练。

#训练自己的数据集
yolo task=detect mode=train model=F:\ultralytics-main\ultralytics\cfg\models\v8\yolov8.yaml data=F:\ultralytics-main\dataset\data.yaml epochs=30 imgsz=640 resume=True workers=4

也可以使用代码方式训练数据集。

# 导入YOLO模块
from ultralytics import YOLO

if __name__ == '__main__':
  # 使用YOLO的预训练模型,这个模型使用了coco数据集训练是通用的目标检测模型
  model = YOLO('yolov8n.pt')
  # 训练数据集
  model.train(data='./dataset/data.yaml',epochs=30, batch=4, workers=8)
  # 使用验证集验证效果
  model.val()

其中 epochs 为训练次数,如果是 10 代的中端 cpu 大概是四十秒一轮,3060ti 则为 2 秒一轮根据自身情况选择训练次数,建议不低于三十次。最后结果集会保存至 ultralytics-main\runs\detect 内,效果图为 val_batch0_pred.jpg

训练过程截图如下:

对编号181-200图片目标检测预测结果如下:

模型训练过程中展示的指标含义如下:

如果训练时报cuda内存溢出,报错如下:

RuntimeError: CUDA out of memory. Tried to allocate ... MiB

尝试以下解决方案:

import torch, gc

gc.collect()
torch.cuda.empty_cache()

或者添加batch 参数:

batch=4

5.中断训练

5.1 YOLO模型中best.pt和last.pt的区别

小结:当需要在之前的训练基础上继续训练时,应该使用last.pt作为起点进行训练;当需要使用训练后的模型进行推理和部署时,应该使用best.pt。

5.2 中断训练后恢复

有时候我们训练的轮数比较多,如果中途中断训练后如何恢复训练呢?这里我们就可以利用last.pt来继续从上一次训练结束的地方继续训练模型。

==注意:第一次训练模型只能使用官方的模型(例如:yolov8n.pt),模型一旦训练完毕无法使用继续恢复训练模式。==

代码如下:

from ultralytics import YOLO

model = YOLO("./runs/detect/train/weights/last.pt")  # 加载预训练模型(建议用于训练)

if __name__ == '__main__':
    # 单GPU训练
    model.train(resume=True)  # 训练模型
    # 多GPU训练
    # results = model.train(data="coco8.yaml", epochs=100, imgsz=640, device=[0, 1])
    metrics = model.val()  # 在验证集上评估模型性能
    success = model.export(format="onnx")  # 将模型导出为 ONNX 格式
    results = model("./dataset/test/images/00002.png")  # 对图像进行预测
    # Process results list
    for result in results:
        boxes = result.boxes  # Boxes object for bounding box outputs
        masks = result.masks  # Masks object for segmentation masks outputs
        keypoints = result.keypoints  # Keypoints object for pose outputs
        probs = result.probs  # Probs object for classification outputs
        result.show()  # display to screen

模型预测:

import ultralytics
from ultralytics import YOLO

if __name__ == '__main__':
    # 加载模型
    model = YOLO('./runs/detect/train/weights/best.pt')
    model.predict('./images/tpc0001.jpg', save=True)

6.迁移学习与从头训练的区别

上面使用加载预训练模型yolov8n.pt的方式训练模型,属于一种迁移学习方式。当然我们也可以加载yolov8.yaml配置文档的方式从头训练,代码如下:

import ultralytics
from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO('./ultralytics/cfg/models/v8/yolov8.yaml')
    # 开始训练
    model.train(data='./dataset/data.yaml', epochs=30, batch=4, imgsz=640, workers=8, device=0)
    # 使用验证集验证效果
    model.val()

但是这种方式如果仅仅只是训练30轮,那么模型效果不是很理想。因为这是一种从零训练(.yaml)的模型参数是随机初始化的,相当于"婴儿状态"。预训练模型只需微调(30 epochs足够),随机初始化模型需从头学习(通常需要300+ epochs)。

两种不同的训练方式对比如下:

7.YOLOV8模型训练综合案例

下面使用Roboflow+Yolov8实现一个火灾检测系统。

7.1.Roboflow介绍

Roboflow是一款专为YOLOv8设计的自动化训练数据工具,它为YOLOv8提供了一种更便捷、更快速的方式来准备训练数据。它能够自动从开发者提供的原始图像数据中提取所需的信息,并将其转换为YOLOv8可以直接使用的格式。Roboflow还提供了一种独特的标记方式,让开发者更轻松地为图像中的物体设定标签,以便YOLOv8能够更有效地识别它们。本文将为大家介绍如何使用Roboflow来训练YOLOv8自定义数据集。

7.1.1 Roboflow基本使用步骤

去Roboflow官网注册账号。网址如下:

https://app.roboflow.com/login

可以使用已有的github账号登录。

登录成功后可以查看自己的API Keys。

复制并保存好自己的private API key。

7.1.2 创建自己的项目(可选)

当然你也可以从头到尾创建自己的新项目。

创建项目时输入项目名称,组织名称,选择项目类型即可。

7.2.使用Roboflow已有数据集

代码实现如下:

首先安装roboflow依赖。

pip install roboflow 
from roboflow import Roboflow
# 导入YOLO模块
from ultralytics import YOLO

def init_datasets():
    #这里输入自己的Roboflow private API key。
    rf = Roboflow(api_key="xxxxxxxxxxxxxxxxxx")
    project = rf.workspace("custom-thxhn").project("fire-wrpgm")
    dataset = project.version(8).download("yolov8")

if __name__ == "__main__":
    init_datasets()

运行主方法后,会自动从roboflow 下载数据集到项目的fire-8目录下:

loading Roboflow workspace...
loading Roboflow project...
Downloading Dataset Version Zip in fire-8 to yolov8:: 100%|██████████| 33054/33054 [00:05<00:00, 5898.66it/s]
Extracting Dataset Version Zip to fire-8 in yolov8::   100%|██████████| 1970 /1970 [00:00<?, ?it/s]
Extracting Dataset Version Zip to fire-8 in yolov8:: 100%|██████████| 1970/1970 [00:01<00:00, 1296.09it/s]

重新构建项目结构如下下图:

7.3.训练模型

修改datasets/fire-8/data.yaml,里面的训练数据集路径为自己项目的绝对路径。

names:
- Fire
- default
- smoke
nc: 3
roboflow:
  license: CC BY 4.0
  project: fire-wrpgm
  url: https://universe.roboflow.com/custom-thxhn/fire-wrpgm/dataset/8
  version: 8
  workspace: custom-thxhn
test: E:/firedected_prj/datasets/fire-8/test/images
train: E:/firedected_prj/datasets/fire-8/train/images
val: E:/firedected_prj/datasets/fire-8/valid/images

训练模型代码(train.py)如下:

from roboflow import Roboflow
# 导入YOLO模块
from ultralytics import YOLO

def init_datasets():
    rf = Roboflow(api_key="Qi5d659Rhw9nMMLBy4Ou")
    project = rf.workspace("custom-thxhn").project("fire-wrpgm")
    dataset = project.version(8).download("yolov8")


if __name__ == "__main__":
    # init_datasets()
    # 使用YOLO的预训练模型,这个模型使用了coco数据集训练是通用的目标检测模型
    model = YOLO('yolov8n.pt')
    # 训练数据集
    model.train(data='./datasets/fire-8/data.yaml', epochs=100, batch=4, workers=4,imgsz=800,plots=True)
    # 使用验证集验证效果
    model.val()

经过100轮训练后,模型会生成在runs/train2/weights 目录下。

7.4.验证模型

模型验证代码(predict.py)如下:

from roboflow import Roboflow
# 导入YOLO模块
from ultralytics import YOLO


if __name__ == "__main__":
    # 使用YOLO的预训练模型,这个模型使用了coco数据集训练是通用的目标检测模型
    model = YOLO('./runs/detect/train2/weights/best.pt')
    # 使用训练好的模型预测
    model.predict('./img', save=True)
    model.predict('./video/fire001.mp4', save=True)

图片资源预测效果: