基于深度学习的火焰与烟雾检测系统:YOLOv10 + 数据集 + UI 界面实现

1. 引言

随着近年来火灾安全意识的提升,火焰与烟雾检测在消防系统中的应用越来越广泛。传统的检测方法通常依赖于烟雾报警器等设备,但这些设备具有延迟性和局限性,难以适应复杂的环境。深度学习,特别是基于卷积神经网络(CNN)的方法,为火焰与烟雾检测提供了新的思路。

本篇博客将介绍如何使用YOLOv10构建基于深度学习的火焰与烟雾检测系统,详细讲解从数据集的准备、模型训练到UI界面的搭建与展示的完整实现过程,帮助读者从理论到实践全面理解该项目的开发过程。

目录

1. 引言

2. 深度学习火焰与烟雾检测概述

YOLOv10的选择

3. YOLOv10的核心原理

YOLO架构的主要特点:

4. 火焰与烟雾检测数据集的准备

数据集来源:

数据集标注:

5. YOLOv10火焰与烟雾检测模型的训练

环境准备

data.yaml文件

模型训练脚本

模型训练结果

6. UI界面的构建与交互设计

环境安装

基础UI设计

1. data.yaml 文件

2. YOLOv10 模型训练代码

环境准备

train.py(训练代码)

3. UI 界面代码(使用 Streamlit)

环境安装

app.py(UI 界面代码)

说明:



2. 深度学习火焰与烟雾检测概述

火焰与烟雾检测是图像识别领域的一种应用,目标是通过实时视频或图片分析,识别火焰或烟雾等潜在火灾信号。传统的图像处理方法依赖于特定的颜色空间转换和特征提取,但在复杂环境中往往表现不佳。深度学习特别是YOLO(You Only Look Once)模型,通过端到端的卷积神经网络结构,可以自动提取特征,检测图像中的火焰和烟雾,从而提高检测的准确率和实时性。

YOLOv10的选择

YOLO(You Only Look Once)是目标检测领域的一个重要分支。它的主要特点是速度快、检测精度高且适合实时应用。YOLOv10继承了YOLO家族的优点,具备较强的特征提取能力和多尺度特征融合能力,非常适合火焰与烟雾检测这种需要快速响应的任务。


3. YOLOv10的核心原理

YOLOv10是YOLO模型的一个最新版本,通过提升检测精度和推理速度,特别适合火焰与烟雾等实时检测任务。

YOLO架构的主要特点:
  • 单阶段检测器:YOLO的检测方式是端到端的,输入图像后只需要一次推理即可输出所有目标的边界框和类别。
  • 锚框机制:使用预定义的锚框来定位目标,优化了目标检测中的速度与精度平衡。
  • 多尺度检测:YOLOv10通过多尺度特征融合,能够更好地检测不同大小的目标。
  • 轻量级设计:YOLOv10在提升检测性能的同时也注重模型的轻量化设计,适合在边缘设备上运行。

为了在火焰与烟雾检测中取得更好的效果,我们将基于YOLOv10进行训练,并将其用于火焰与烟雾检测系统。


4. 火焰与烟雾检测数据集的准备

深度学习模型的成功依赖于高质量的数据集。为了训练一个高效的火焰与烟雾检测模型,首先需要收集并准备合适的数据集。这里我们将使用一个包含火焰与烟雾图像的公开数据集,并进行标注处理。

数据集来源:

火焰与烟雾检测的公开数据集可以通过多个渠道获取,例如Kaggle、UCI Repository等。你也可以使用自己收集的数据集,拍摄火焰与烟雾的图像,并通过标注工具进行标注。

数据集标注:
  • 火焰与烟雾检测属于多类目标检测,因此需要对图片中的火焰和烟雾进行标注。
  • 我们可以使用工具如LabelImg来手动标注图像中的火焰与烟雾。标注后的数据将以YOLO格式存储,生成 .txt 文件,每个文件包含图片中目标的类别编号、边界框坐标等信息。

数据集结构:

 
/dataset/
    /images/
        /train/           # 训练集图像
        /val/             # 验证集图像
        /test/            # 测试集图像
    /labels/
        /train/           # 训练集标签(YOLO格式)
        /val/             # 验证集标签
        /test/            # 测试集标签

数据集准备完毕后,即可进行模型的训练。


5. YOLOv10火焰与烟雾检测模型的训练

训练YOLOv10模型,需要设置相关参数和配置文件。

环境准备

首先,确保你的Python环境安装了必要的依赖项,如PyTorchYOLOv10的库。

pip install torch torchvision

克隆YOLOv10代码仓库:

git clone https://github.com/ultralytics/yolov10.git
cd yolov10
data.yaml文件

我们需要创建一个data.yaml文件,来配置数据集路径、类别数量和类别名称。

 
train: /path_to_dataset/images/train
val: /path_to_dataset/images/val

nc: 2  # 火焰和烟雾两类
names: ['flame', 'smoke']

模型训练脚本

YOLOv10的训练脚本非常简单,只需要调用train.py即可开始训练:

 
python train.py --img 640 --batch 16 --epochs 50 --data data.yaml --weights yolov10.pt --device 0

  • --img:输入图像的尺寸(640x640)。
  • --batch:批处理大小,默认为16。
  • --epochs:训练的轮数。
  • --data:数据集的配置文件。
  • --weights:YOLOv10的预训练权重文件。
  • --device:设备编号,0表示使用GPU。
模型训练结果

在训练过程中,模型会根据训练集和验证集的表现,输出如下信息:

  • mAP (Mean Average Precision):衡量模型在验证集上的表现。
  • Loss:分类损失、边界框损失和置信度损失。

训练完成后,模型权重会保存在runs/train/exp/weights/best.pt中,这个权重文件将用于UI界面中进行推理。


6. UI界面的构建与交互设计

为了方便用户使用火焰与烟雾检测系统,我们将使用Streamlit来搭建一个简易的UI界面。Streamlit是一个非常容易使用的Python框架,可以快速搭建数据应用的前端界面。

环境安装
pip install streamlit
基础UI设计

UI界面需要具备以下功能:

  • 用户可以上传图片。
  • 系统调用YOLOv10模型进行火焰与烟雾检测。
  • 显示检测结果,包括检测到的火焰和烟雾的位置和置信度。
 
import streamlit as st
from PIL import Image
from models.common import DetectMultiBackend
from utils.datasets import LoadImages
from utils.general import non_max_suppression, scale_coords

# 加载模型
model = DetectMultiBackend('best.pt', device='cpu')

st.title("火焰与烟雾检测系统")

# 图片上传
uploaded_file = st.file_uploader("上传火焰或烟雾图片", type=["jpg", "png", "jpeg"])
if uploaded_file is not None:
    image = Image.open(uploaded_file)
    st.image(image, caption="上传的图片", use_column_width=True)

    # 模型推理
    img = LoadImages(uploaded_file, img_size=640)
    pred = model(img, augment=False)
    pred = non_max_suppression(pred, conf_thres=0.25, iou_thres=0.45)

    # 结果展示
    for det in pred:
        if len(det):
            for *xyxy, conf, cls in reversed(det):
                label = f'{model.names[int(cls)]} {conf:.2f}'
                st.write(label)
                st.image(image, caption=f"检测结果:{label}", use_column_width=True)

这个界面非常简洁,用户可以直接上传图片,系统会调用YOLOv10模型进行检测,并返回火焰和烟雾的检测结果。

1. data.yaml 文件
 

# data.yaml - 用于火焰与烟雾检测的数据集配置
train: /path_to_dataset/images/train  # 训练集图像路径
val: /path_to_dataset/images/val      # 验证集图像路径

# 类别数
nc: 2

# 类别名称
names: ['flame', 'smoke']

2. YOLOv10 模型训练代码

首先,确保你已经安装了 YOLOv10 和依赖的库。

环境准备
pip install torch torchvision numpy opencv-python matplotlib pyyaml

然后,使用以下代码进行训练:

train.py(训练代码)
 
import torch
from yolov10 import YOLOv10
import yaml
from pathlib import Path

# 读取配置文件
with open('data.yaml', 'r') as f:
    data = yaml.safe_load(f)

# 数据集路径
train_images = data['train']
val_images = data['val']
nc = data['nc']
class_names = data['names']

# 加载YOLOv10预训练模型
model = YOLOv10(num_classes=nc)
model.load_pretrained_weights('yolov10.pt')  # 加载YOLOv10的预训练权重

# 设置训练参数
epochs = 50
batch_size = 16
img_size = 640
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# 训练模型
model.train_model(
    train_images=train_images,
    val_images=val_images,
    img_size=img_size,
    batch_size=batch_size,
    epochs=epochs,
    device=device
)

# 保存模型
model.save('runs/train/fire_smoke_detection_model.pt')

此代码中,我们加载了 YOLOv10 预训练权重,并对火焰与烟雾数据集进行训练。你可以在 runs/train/ 目录下找到训练好的模型权重文件。

3. UI 界面代码(使用 Streamlit)

通过 Streamlit,我们可以快速搭建一个简洁的火焰与烟雾检测界面。

环境安装

pip install streamlit pillow
 

app.py(UI 界面代码)

import streamlit as st
from PIL import Image
import torch
import numpy as np
from models.common import DetectMultiBackend
from utils.datasets import LoadImages
from utils.general import non_max_suppression, scale_coords
import cv2

# 加载YOLOv10模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = DetectMultiBackend('runs/train/fire_smoke_detection_model.pt', device=device)

# Streamlit页面标题
st.title("火焰与烟雾检测系统")

# 上传图片
uploaded_file = st.file_uploader("上传图片进行检测", type=["jpg", "png", "jpeg"])

if uploaded_file is not None:
    # 读取图片并显示
    image = Image.open(uploaded_file)
    st.image(image, caption='上传的图片', use_column_width=True)

    # 将PIL图片转换为NumPy数组
    img = np.array(image)

    # YOLOv10模型推理
    img_input = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # 转换为BGR格式
    img_input = cv2.resize(img_input, (640, 640))  # 调整大小
    img_input = torch.from_numpy(img_input).float().to(device).unsqueeze(0)
    pred = model(img_input)

    # NMS后处理
    pred = non_max_suppression(pred, conf_thres=0.25, iou_thres=0.45)
    
    # 显示检测结果
    for det in pred:
        if len(det):
            for *xyxy, conf, cls in det:
                label = f'{model.names[int(cls)]} {conf:.2f}'
                # 绘制检测框
                cv2.rectangle(img, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2)
                cv2.putText(img, label, (int(xyxy[0]), int(xyxy[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    # 显示处理后的图像
    st.image(img, caption='检测结果', use_column_width=True)
说明:
  • uploaded_file:用户上传图片。
  • DetectMultiBackend:加载 YOLOv10 模型。
  • non_max_suppression:进行非极大值抑制处理。
  • cv2.rectanglecv2.putText:在图像上绘制检测框和标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度学习实战项目

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值