火灾智能检测预警系统:从 YOLO11n 训练到 Streamlit 全链路实战

关键词:YOLO11n、火灾检测、明火识别、Streamlit、Ultralytics、边缘部署、配置驱动

一、背景

1.1 行业痛点

火灾的处置窗口往往只有最初数十秒。传统烟感、温感传感器需要在烟雾或热量积累到一定程度后才会触发,对"明火刚出现"这一关键时刻存在天然盲区。而视觉信号是唯一能在火焰出现的第一时间就捕捉到的模态:

  • 仓库 / 厂房:堆垛、货架、配电箱起火初期往往只有一簇小火苗,等烟感报警时已经错过最佳扑救窗口;
  • 森林防火:林区面积大、烟感无法覆盖,靠瞭望塔人工值守效率低,需要摄像头自动发现远处小火点;
  • 充电桩 / 电动车棚:电池热失控从冒火到蔓延可能只有几十秒,需要毫秒级响应的视觉预警;
  • 厨房明火监控:商用厨房油锅起火、明火离人,需要在不依赖人工巡视的前提下自动识别。

已有的视觉方案大多依赖"烟感 + 摄像头"两套系统拼接,或者用通用目标检测模型硬套火焰类别,存在误报高、部署链路长、换场景要改代码三大问题。本项目给出的方案是:以 YOLO11n 为唯一检测主干,用配置驱动的方式把"数据—训练—评测—推理—演示"整条链路收口到一份 project.yaml,让同一套代码库可以稳定复制到安全帽检测、无人机检测等其他任务。
视频演示与源码 下载

https://www.bilibili.com/video/BV1fzaW61EKL

在这里插入图片描述

包含:
📦 完整项目源码
📦 预训练模型权重
🗂️ 数据集数据集

项目运行效果

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

1.2 系统定位

火灾智能检测预警系统是一套面向明火早期发现的计算机视觉解决方案:

  • 输入:可见光图像 / 视频 / 摄像头实时流,不依赖烟感、温感等传统传感器;
  • 输出:带置信度的火焰目标框 + 检测明细 + 时间线趋势;
  • 复用:可直接对接仓库、厂房、林区、充电桩棚、厨房等场景已部署的监控摄像头;
  • 目标:在火焰出现的最初数秒内给出预警,为值班人员与联动平台争取处置窗口。

1.3 项目介绍

核心设计:

维度设计
检测主干YOLO11n(nano 规格),预训练迁移学习,兼顾精度与边缘端速度
输入模态可见光图像单一模态,直接复用现有监控摄像头
工程架构配置驱动:全部领域相关内容集中到 configs/project.yaml,代码零领域耦合
部署形态Streamlit 单页应用 + 本地 best.pt,四种推理模式开箱即用
迁移能力换数据集 + 换权重 + 改 YAML 即可切换到其他检测任务,无需改一行代码

功能概览:

  • 🔥 单张图片:上传后即时推理,输出标注图 + 检测明细表(类别、置信度、坐标)
  • 📚 批量图片:多选上传或 ZIP 导入,单次上限 200 张,输出汇总表 + 明细表 + 标注图 ZIP
  • 🎬 视频:OpenCV 逐帧推理,输出标注视频 + 逐帧检测 CSV + 火焰出现频次折线图
  • 📷 摄像头:实时流推理,适用于现场联调演示
  • 🎛️ 控制台:置信度阈值滑杆、模型热重载、引擎状态与运行信息展示

技术栈:

层选型
模型框架Ultralytics ≥ 8.3.0 + PyTorch
视觉算法YOLO11n(Anchor-Free,C2f Backbone,Decoupled Head + DFL)
Web 前端Streamlit ≥ 1.35 + 主题双色 #ff5a3c / #ffb547
视频 / 图像OpenCV、imageio-ffmpeg(ffmpeg 缺失时回退)
数据可视化Plotly / Streamlit 原生 chart
配置管理单一 configs/project.yaml,文案 / 参数 / 主题 / 阈值统一收口

二、设计框架

2.1 系统架构

系统自下而上分为五层,配置驱动是这套架构的核心约束:

            ┌────────────────────────────────────────────┐
            │  应用层  app/streamlit_app.py(956 行)      │
            │  单图 / 批量 / 视频 / 摄像头 四种推理模式     │
            │  阈值滑杆 · 模型热重载 · 结果导出 · 时间线分析 │
            └──────────────────────┬─────────────────────┘
                                   │
                                   ▼
            ┌────────────────────────────────────────────┐
            │  评测层  scripts/validate_model.py          │
            │  mAP / Precision / Recall → JSON 落盘        │
            │  回填 configs/project.yaml → app.metrics     │
            └──────────────────────┬─────────────────────┘
                                   │
                                   ▼
            ┌────────────────────────────────────────────┐
            │  训练层  scripts/train_yolo.py              │
            │  epochs / imgsz / batch / device / patience │
            │  runs/<project_name>/train/ → best.pt        │
            └──────────────────────┬─────────────────────┘
                                   │
                                   ▼
            ┌────────────────────────────────────────────┐
            │  工具层  scripts/(9 个通用脚本)            │
            │  数据体检 · 训练 · 评测 · 导出 · 对比 · 抽帧  │
            └──────────────────────┬─────────────────────┘
                                   │
                                   ▼
            ┌────────────────────────────────────────────┐
            │  数据层  data/(YOLO 标准格式)              │
            │  data.yaml: nc=1, names=['fire']            │
            │  images/ 与 labels/ 同名配对                 │
            └────────────────────────────────────────────┘

configs/project.yaml 划分为四段:

段内容
project_name / task_name项目标识,决定 runs 目录名
dataset_yaml / default_model数据与基座权重路径
train / inference训练超参与推理阈值
app全部展示层文案(标题、hero 标语、目标词、类别映射、主题色、ZIP 文件名)

应用启动时一次性加载 YAML,把标题、hero 标语、目标词(“火焰”)、类别展示名映射(fire → 火焰)、推理动画副标题、结果 ZIP 文件名、主题双色全部注入页面;脚本层同样从该文件读取参数,并允许命令行覆盖。

2.2 YOLO11 网络结构

输入 640×640×3
   │
   ▼
[Backbone]  Conv → C2f → Conv → C2f → Conv → C2f → Conv → C2f → SPPF
   │
   ▼
[Neck]      FPN 上采样 + PAN 下采样:P3 / P4 / P5 三级金字塔
   │
   ▼
[Head]      Decoupled Head(cls 头 / reg 头解耦)
            回归头采用 DFL(Distribution Focal Loss)
            Anchor-Free,输出 (cx, cy, w, h, cls × 1)
   │
   ▼
[NMS]       IoU=0.7, conf=0.30, max_det=300 → 最终检测框

2.3 检测流程

图像 / 监控视频帧
        │
        ▼
   Letterbox 640×640 + RGB
        │
        ▼
   YOLO11n forward
        │
        ▼
   Detect Head 输出(cls × 1)
        │
        ▼
   conf 过滤 + NMS(conf=0.30, IoU=0.7, max_det=300)
        │
        ▼
   result.plot() 画框 + 类别 + 置信度
        │
        ▼
   Streamlit 双列展示 + DataFrame + 时间线折线图

三、数据集

数据集为单类别明火检测专用数据集,共 6988 张人工标注图像:

划分数量
训练集6576 张
验证集205 张
测试集207 张

训练集在 2026-05-17 经过一轮 3 倍增强(dataset_info.json 记录 augmentation_factor: 3),以增强样本多样性。样本涵盖:

  • 光照:白天、夜晚、室内、室外
  • 尺度:远处小火点到近景大面积明火
  • 环境:仓库、厂房、林区、充电桩棚、厨房等

标注经清洗后边界框贴合火焰轮廓,无越界坐标与类别越界标签 —— 这一点在每次训练前由 scripts/check_dataset.py 强制校验,致命错误直接退出码 1。

四、模型与训练

检测模型选用 YOLO11n(nano 规格),在 yolo11n.pt 预训练权重上微调,输入分辨率 640×640。

关键训练配置:

项目取值说明
基础模型yolo11n.pt预训练迁移学习,兼顾精度与边缘端速度
输入尺寸 / 批大小640 / 16与推理阶段严格对齐
训练轮次200(patience 50)早停机制防止无效训练
优化器SGD(auto),lr0 0.01,momentum 0.937weight_decay 0.0005
混合精度AMP 开启显存占用更低、迭代更快
数据增强mosaic 1.0、fliplr 0.5、translate 0.1、scale 0.5、HSV 扰动、random erasing 0.4、close_mosaic 10提升小目标与遮挡鲁棒性
推理阈值conf 0.30、IoU 0.7、max_det 300兼顾误报抑制与召回

训练在 GPU(device 0)上执行,共完成 100 个 epoch 后由 patience 机制提前停止,第 50 个 epoch(索引 49)取得验证集最优权重,该权重即 model/best.pt。

五、评测结果

验证集上的最优指标(epoch 49,源自 train/results.csv 真实记录):

指标数值含义
mAP@0.569.6%主指标,IoU=0.5 下的平均精度
mAP@0.5:0.9537.9%严格 IoU 区间下的定位质量
Precision74.4%误报抑制能力
Recall62.0%火焰目标召回率

结果解读:

明火属于形态高度不规则的类别:火焰边缘随气流抖动、与晚霞 / 车灯 / 焊接弧光等强光干扰在视觉上相似,因此 69.6% 的 mAP@0.5 已具备实用价值,但仍有提升空间。

后续优化方向:

  • 扩充夜间与小火焰样本,提升暗光场景召回;
  • 引入时序一致性判断(连续 N 帧命中才报警),压低瞬时误报;
  • 增加烟雾类别,形成火—烟联合判据。

一个工程细节:模板的指标卡片渲染规则为「仅展示 ≥90% 的指标」,当前指标未达该阈值,前端不显示卡片。如需展示可调整 app/streamlit_app.py 中 render_metric_cards() 的过滤阈值。

六、推理应用

演示应用基于 Streamlit 构建,主色 #ff5a3c / #ffb547,具备以下能力:

  • 单张图片:上传后即时推理,输出标注图 + 检测明细表(类别、置信度、坐标)。
  • 批量图片:支持多选上传或 ZIP 包导入,单次上限 200 张,逐张推理并生成汇总表、明细表与标注图 ZIP 下载包,推理结果带缓存键,重复查询不重算。
  • 视频:OpenCV 逐帧推理,输出标注视频与逐帧检测 CSV(含帧号、时间戳、坐标、置信度),并调用 ffmpeg(缺失时回退 imageio-ffmpeg)转码为浏览器可直接播放的 H.264 MP4,同时绘制「火焰出现频次—时间」折线图。
  • 摄像头:实时流推理,适用于现场联调演示。
  • 控制台:侧栏提供置信度阈值滑杆(0.05–0.95,默认 0.30)、模型重载按钮,以及引擎状态、架构、权重路径、类别数、训练轮次等运行信息。

两个健壮性设计:

  1. 应用启动时若 model/best.pt 不存在会直接报错停止,避免「空引擎误判」;
  2. 视频链路缺少 ffmpeg 时给出明确警告而非静默失败。

七、脚本工具链

scripts/ 提供 9 个通用脚本,构成可复现的工程流水线,所有脚本均由 configs/project.yaml 驱动,并支持命令行参数临时覆盖:

脚本用途
check_dataset.py数据集体检:标签配对、5 列格式、类别越界、坐标越界、坏图检测,致命错误退出码 1
train_yolo.py训练:yaml 驱动 + CLI 覆盖(–epochs / --device / --batch / --resume)
validate_model.pyval/test 评测,指标 JSON 落盘
run_video_inference.py视频逐帧推理 → detections.csv + 标注视频
attention_analysis.py检测时间线 → 类别加权趋势与告警时间点
export_model.py导出 ONNX / TorchScript / OpenVINO / CoreML / TensorRT / TFLite / SavedModel
compare_yolo_runs.py汇总多个 run 的 results.csv 做横向对比
extract_frames.py视频抽帧,用于制备标注数据
prepare_label_studio_tasks.py生成 Label Studio 标注任务,支撑持续迭代

八、部署与二次开发

8.1 边缘部署

使用 export_model.py 将 best.pt 导出为 ONNX(--simplify --dynamic)或 TensorRT engine,可在 Jetson、昇腾等边缘设备上获得数倍加速。

配合 extract_frames.py 与 prepare_label_studio_tasks.py,可把现场误报样本回流到标注环节,形成「部署—回流—重训」的闭环。

8.2 二次开发三步走

  1. 替换 data/ 数据集
  2. 训练并把权重放到 model/best.pt
  3. 改写 configs/project.yaml(标题、hero 标语、目标词、类别展示名、主题色、指标与部署场景文案、训练与推理超参)

8.3 交付前自检清单

  • 数据体检退出码 0
  • 评测指标已回填且 display_accuracy: true
  • 四种推理模式无报错
  • 全局搜索确认代码层无旧项目领域词残留

九、快速开始

pip install -r requirements.txt

python scripts/check_dataset.py                                  # 1. 数据体检
python scripts/train_yolo.py --device 0                           # 2. 训练
python scripts/validate_model.py --weights model/best.pt --split val   # 3. 评测
streamlit run app/streamlit_app.py                                # 4. 启动演示应用

核心依赖:ultralytics ≥ 8.3.0、opencv-python、pandas、numpy、PyYAML、streamlit ≥ 1.35、plotly、tqdm、tabulate、imageio-ffmpeg。

目录结构:

火灾检测_yolo11n/
├── app/streamlit_app.py     # 演示应用(四种推理模式)
├── configs/project.yaml     # 唯一需要维护的配置文件
├── data/                    # 数据集(6988 张图像 + 同名标签)
├── model/best.pt            # 部署权重
├── scripts/                 # 9 个通用脚本(无领域硬编码)
├── train/                   # 训练产物:曲线、混淆矩阵、results.csv、权重
└── outputs/                 # 评测与推理产物(eval/、app_inference/)

十、适用场景与展望

系统面向仓库厂房、森林防火、充电桩与电动车棚、厨房明火监控等高危场景,可作为现有视频监控平台的 AI 插件,也可独立部署为边缘预警终端。

当前版本已完成从数据到演示的全链路打通。下一步的演进方向是:

  • 引入连续帧投票机制:抑制瞬时误报,把单帧检测升级为稳定告警;
  • 增加烟雾类别:形成火—烟联合判据,在明火出现前更早预警;
  • 接入告警联动:声光、短信、平台工单,从「看得见火焰」走向「报得准、联得动」。

一句话总结:YOLO11n + 配置驱动 + Streamlit,让火灾视觉预警从"一个模型 + 一堆胶水代码"变成"一份 YAML + 一份 best.pt + 一条可复现流水线"的工程化标准动作——本文给出了一份可以直接复制到其他检测任务的样板。

Logo

一站式 AI 云服务平台

更多推荐