1. 项目概述与核心目标
去年夏天参与了一个工业园区的智能安防系统升级项目,其中最关键的需求就是实现全天候的火灾自动检测。传统烟雾传感器在开放环境中的表现总是不尽如人意,于是我们决定尝试基于视觉的火焰检测方案。经过多轮技术选型,最终选择了YOLOv11这个平衡了精度和速度的目标检测框架。
这个项目的核心是构建一个能够实时检测图片/视频中火焰的深度学习模型,主要应用场景包括:
- 工业园区露天仓库的火灾预警
- 厨房等半开放环境的明火监测
- 森林防火的无人机巡检系统
技术栈选择上,我们采用了:
- Python 3.12作为开发语言
- Ultralytics 8.3.228框架实现YOLOv11
- PyTorch 2.9.1作为后端
- OpenCV处理图像流
- ONNX Runtime用于生产环境部署
提示:虽然项目使用的是YOLOv11n轻量版模型,但整套方法同样适用于YOLOv8/v9等其他版本,只需调整少量参数即可迁移。
2. 环境搭建与依赖管理
2.1 开发环境配置
在Windows 10专业版(版本21H2)上,我们使用Miniconda创建了独立的Python环境,这是避免依赖冲突的最佳实践:
bash复制conda create -n fire_det python=3.12
conda activate fire_det
对于没有GPU的设备,安装CPU版本的PyTorch即可。但如果有NVIDIA显卡,建议安装CUDA 11.8对应的PyTorch版本以获得更快的训练速度:
bash复制# CPU版本
pip install torch==2.9.1+cpu torchvision==0.10.1+cpu -f https://download.pytorch.org/whl/torch_stable.html
# GPU版本(需要先安装对应版本的CUDA)
pip install torch==2.9.1+cu118 torchvision==0.10.1+cu118 -f https://download.pytorch.org/whl/torch_stable.html
2.2 关键依赖安装
除了PyTorch,还需要安装以下核心包:
bash复制pip install ultralytics==8.3.228 # 必须指定此版本以兼容YOLOv11
pip install opencv-python==4.8.0 # 图像处理
pip install pillow==10.0.0 # 图像加载
pip install numpy==1.24.3 # 数值计算
pip install yaml==6.0 # 配置文件解析
pip install onnxruntime==1.15.1 # 模型部署
注意:Ultralytics 8.3.228是一个关键版本,它同时支持YOLOv8和v11。新版本可能不兼容本项目代码,强烈建议锁定此版本。
2.3 环境验证
安装完成后,运行以下脚本验证环境是否正确:
python复制import torch
from ultralytics import YOLO
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"Ultralytics版本: {YOLO().__version__}")
# 测试YOLO模型加载
try:
model = YOLO('yolov11n.pt')
print("✅ 环境验证通过")
except Exception as e:
print(f"❌ 环境异常: {e}")
3. 数据集构建与标注规范
3.1 数据收集策略
火焰检测的数据集构建有几个特殊挑战:
- 真实火灾图像难以获取(我们最终使用了公开数据集+模拟火焰的组合)
- 火焰形态多变(大小、颜色、形状)
- 容易与红色物体、灯光等混淆
我们的解决方案是:
- 从FireNet、Foggia等公开数据集中选取500张真实火灾图像
- 使用Blender合成300张不同场景的模拟火焰
- 收集200张包含干扰项(红色衣物、车灯等)的负样本
3.2 标注标准制定
使用LabelImg进行标注时,我们制定了严格的标注规范:
- 标注框应完全包围火焰区域,包括轻微摇曳部分
- 对于多个分离的火焰,分别标注而不用一个大框包围
- 半透明火焰区域也需要标注
- 烟雾不标注,除非伴随明显火焰
标注文件示例(YOLO格式):
code复制0 0.45 0.52 0.3 0.4 # 类别0 中心点x 中心点y 宽度 高度
3.3 数据集目录结构
最终数据集按以下结构组织:
code复制fire_dataset/
├── images/
│ ├── train/ # 1200张
│ └── val/ # 300张
└── labels/
├── train/
└── val/
我们特别保持了训练集和验证集在场景分布上的一致性(都有室内、室外、白天、夜晚等场景)。
4. 模型训练与调优
4.1 基础训练配置
使用YOLOv11n预训练模型进行迁移学习,基础训练参数如下:
python复制from ultralytics import YOLO
model = YOLO('yolov11n.pt') # 加载预训练模型
results = model.train(
data='fire.yaml',
epochs=100,
batch=8, # 根据GPU显存调整(RTX 3060可设16)
imgsz=640,
device='0', # 使用GPU
lr0=0.01,
patience=50,
save=True,
project='fire_detection',
name='v11n_base'
)
4.2 训练过程监控
训练时我们主要关注三个指标:
- 损失曲线:box_loss和cls_loss应平稳下降
- 验证集mAP50:反映整体检测质量
- 召回率:对火灾预警尤为关键
使用TensorBoard可以实时监控这些指标:
bash复制tensorboard --logdir fire_detection
4.3 性能优化技巧
针对初期召回率低的问题(仅0.61),我们实施了以下优化:
- 数据增强:
python复制augment=True, # 基础增强
mosaic=1.0, # 马赛克增强
mixup=0.2, # 图像混合
copy_paste=0.1 # 火焰复制粘贴
- 模型结构调整:
- 改用更大的YOLOv11s模型
- 增加输入分辨率到896x896
- 调整anchor尺寸适配火焰形状
- 训练策略优化:
python复制lr0=0.001, # 降低学习率
weight_decay=0.0005, # 增加正则化
warmup_epochs=3 # 学习率预热
优化后召回率提升到0.79,同时mAP50达到0.83。
5. 模型部署与性能测试
5.1 ONNX模型导出
为适配生产环境,将PyTorch模型导出为ONNX格式:
python复制model.export(
format='onnx',
opset=21,
imgsz=896, # 与训练尺寸一致
simplify=True,
dynamic=False # 固定输入尺寸提升效率
)
5.2 推理代码实现
部署时的核心推理代码:
python复制import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO('best.onnx') # 加载导出的模型
def detect_fire(frame):
results = model(frame, imgsz=896, conf=0.4) # 置信度阈值设为0.4
for box in results[0].boxes:
if box.conf > 0.7: # 高置信度才触发警报
x1, y1, x2, y2 = map(int, box.xyxy[0])
cv2.rectangle(frame, (x1,y1), (x2,y2), (0,0,255), 2)
return True, frame
return False, frame
5.3 性能指标
在Intel i7-12700K + RTX 3060上的测试结果:
- 分辨率896x896时:38 FPS
- 分辨率640x640时:52 FPS
- CPU推理(ONNX Runtime):12 FPS @640x640
6. 常见问题与解决方案
6.1 误报问题处理
初期模型经常将夕阳、车灯误判为火焰,解决方案:
- 在数据集中添加更多日落、车灯等负样本
- 使用HSV色彩空间过滤(火焰通常满足H∈[0,20], S>100, V>100)
- 添加动态检测逻辑(火焰应该有摇曳特征)
改进后的过滤代码:
python复制def is_real_fire(roi):
hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
hue = hsv[...,0].mean()
sat = hsv[...,1].mean()
val = hsv[...,2].mean()
return 0 <= hue <= 20 and sat > 100 and val > 100
6.2 小火焰检测优化
对于远处的小火焰(<20x20像素),我们:
- 添加更多小火焰样本
- 修改模型head结构,增加小目标检测层
- 使用SAHI等切片推理技术
6.3 模型轻量化
为适配边缘设备,我们尝试了:
- 知识蒸馏(用大模型指导小模型训练)
- 通道剪枝(移除不重要的卷积通道)
- 量化(FP16/INT8量化)
最终INT8量化后的模型体积减小60%,速度提升2倍,精度仅下降3%。
7. 实际应用建议
经过三个月的实际部署,总结出以下经验:
-
多摄像头协同:单摄像头易受遮挡,建议关键区域部署多个摄像头,使用投票机制判断
-
报警延迟设置:持续检测到火焰3秒以上才触发报警,避免瞬时误报
-
定期模型更新:每季度用新数据微调模型,适应环境变化
-
硬件选择:
- 室内:Jetson Xavier NX
- 户外:工控机+RTX A2000
- 移动端:树莓派5+Intel神经计算棒
对于想尝试此项目的开发者,建议先从YOLOv11n小模型开始,逐步迭代优化。我们开源的代码和部分数据集已发布在GitHub上(此处应替换为实际仓库地址)。