1. 引言
随着近年来火灾安全意识的提升,火焰与烟雾检测在消防系统中的应用越来越广泛。传统的检测方法通常依赖于烟雾报警器等设备,但这些设备具有延迟性和局限性,难以适应复杂的环境。深度学习,特别是基于卷积神经网络(CNN)的方法,为火焰与烟雾检测提供了新的思路。
本篇博客将介绍如何使用YOLOv10构建基于深度学习的火焰与烟雾检测系统,详细讲解从数据集的准备、模型训练到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环境安装了必要的依赖项,如PyTorch
和YOLOv10
的库。
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.rectangle
和cv2.putText
:在图像上绘制检测框和标签。