当前位置:首页>python>Python + YOLOv5 搭建火焰检测与预警系统

Python + YOLOv5 搭建火焰检测与预警系统

  • 2026-10-11 05:40:10
Python + YOLOv5 搭建火焰检测与预警系统

前言

火焰检测的算法本身已经比较成熟了,YOLO 系列做目标识别效果不错,把算法和一套完整的 Web 管理系统串起来,其实就是一个可以落地的小型智慧消防系统。于是花了两周时间,基于 Django + MySQL + YOLOv5 搭了一套完整的火焰检测系统,从用户上传图片/视频到检测结果展示、预警推送、大屏统计,全流程跑通。

这篇文章就分享一下这个系统的完整实现过程。

项目介绍

一个基于 Python + Django + YOLOv5 的火焰检测系统,名字暂叫 FireGuard。系统通过深度学习算法自动识别图片或视频中的火焰,检测到火情后记录预警信息,并在管理后台和大屏上实时展示。

项目采用 B/S 架构,用户通过浏览器访问。前端负责上传文件和展示结果,后端 Django 处理业务逻辑、调用 YOLOv5 推理,MySQL 存储所有数据。整体分两层权限:管理员可以查看全站数据和用户管理,普通用户只负责上传检测和查看自己的记录。

项目功能

功能模块
具体说明
用户登录与权限
管理员和普通用户两套权限,登录后进入不同界面
图片火焰检测
上传带地理位置的图片,系统标记火焰位置并返回结果
视频火焰检测
上传视频文件,逐帧分析是否存在火焰
检测结果展示
显示原始文件、标注后的结果文件、置信度和火情判断
预警记录生成
检测到火焰时自动生成预警日志,状态为未处理
大屏数据展示
使用 ECharts 展示总检测数、火情数、近七天趋势和占比
管理员用户管理
管理员可查看和管理系统所有注册用户
预警处理
管理员在预警列表中将预警标记为已处理

项目特点

算法与 Web 整合:YOLOv5 推理作为后端的一个工具模块,与 Django 的视图逻辑解耦,调用清晰

双模态输入支持:同时支持图片和视频两种检测方式,覆盖不同使用场景

实时预警闭环:检测到火焰后自动落库预警,大屏和预警列表同步更新,闭环速度快

大屏可视化:基于 ECharts 的动态图表展示数据趋势和占比,适合监控中心展示

位置信息追踪:每次检测都记录位置描述,便于后续定位和地图扩展

权限分层清晰:管理员和普通用户的界面和数据范围分离,符合多级管理需求

项目技术

技术项
选型说明
后端框架
Django(Python 3.8)
前端框架
HTML + JavaScript(模板渲染)
数据库
MySQL
算法模型
YOLOv5(Ultralytics 实现)
深度学习框架
PyTorch
图表库
ECharts(大屏图表展示)
图像处理
OpenCV + Pillow
开发工具
PyCharm
数据库管理
Navicat

项目代码

整个项目采用 Django 的 MTV 模式组织。核心业务集中在 detection_app 这个应用里,包含了模型定义、视图逻辑、推理工具和前端模板。

数据库模型

系统主要用到 DetectionRecord 和 AlertLog 两张表,前者存检测记录,后者存预警日志,两者通过 OneToOneField 关联:

from django.db import modelsfrom django.contrib.auth.models import UserclassDetectionRecord(models.Model):    TYPE_CHOICES = [        ('image', '图片'),        ('video', '视频'),    ]    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="检测用户")    file_type = models.CharField(max_length=10, choices=TYPE_CHOICES, verbose_name="类型")    original_file = models.FileField(upload_to='uploads/', verbose_name="原始文件")    result_file = models.FileField(upload_to='results/', null=True, blank=True, verbose_name="结果文件")    is_fire = models.BooleanField(default=False, verbose_name="是否发现火情")    confidence = models.FloatField(default=0.0, verbose_name="最高置信度")    location = models.CharField(max_length=200, null=True, blank=True, verbose_name="位置描述")    created_at = models.DateTimeField(auto_now_add=True, verbose_name="检测时间")classAlertLog(models.Model):    record = models.OneToOneField(DetectionRecord, on_delete=models.CASCADE, verbose_name="关联记录")    message = models.TextField(verbose_name="预警内容")    is_handled = models.BooleanField(default=False, verbose_name="是否处理")    handled_at = models.DateTimeField(null=True, blank=True, verbose_name="处理时间")

YOLOv5 推理工具封装

为了避免每次请求都重新加载模型,在 utils.py 中做了一次加载和全局复用:

from ultralytics import YOLOimport osMODEL_PATH = 'weights/best.pt'model = YOLO(MODEL_PATH)defdetect_fire_media(file_path, save_dir='media/results'):"""    检测图片或视频中的火焰    返回: (is_fire, max_conf, result_path)    """    os.makedirs(save_dir, exist_ok=True)    filename = os.path.basename(file_path)    result_path = os.path.join(save_dir, f"detected_{filename}")    results = model(file_path, conf=0.4, iou=0.5)    result = results[0]    is_fire = False    max_conf = 0.0if result.boxes isnotNone:for box in result.boxes:            cls_id = int(box.cls[0])            conf = float(box.conf[0])            class_name = model.names[cls_id]if'fire'in class_name.lower():                is_fire = Trueif conf > max_conf:                    max_conf = conf    result.save(filename=result_path)return is_fire, max_conf, result_path

这里注意一个细节:类别 ID 和名称取决于训练数据集的标注方式,实际使用时要根据自己模型的类别映射调整判断逻辑。

视图中的检测流程

图片检测和视频检测的流程基本一致,以图片检测为例:

@login_requireddefimage_detect_view(request):if request.method == 'POST'and request.FILES.get('image'):        uploaded_file = request.FILES['image']        location = request.POST.get('location', '未知区域')        temp_path = f"media/uploads/{uploaded_file.name}"with open(temp_path, 'wb+') as destination:for chunk in uploaded_file.chunks():                destination.write(chunk)        is_fire, conf, result_path = detect_fire_media(temp_path)        record = DetectionRecord.objects.create(            user=request.user,            file_type='image',            original_file=temp_path,            result_file=result_path,            is_fire=is_fire,            confidence=conf,            location=location        )if is_fire:            AlertLog.objects.create(                record=record,                message=f"检测到火情!位置:{location},置信度:{conf:.2f}"            )return redirect('detect_result', record_id=record.id)return render(request, 'image_detect.html')

视频检测的逻辑类似,但实际场景中视频文件较大、推理耗时较长,生产环境建议配合 Celery 做异步任务,避免 HTTP 请求超时。

大屏视图的数据聚合

大屏需要展示总检测数、火情数、预警列表以及图表数据。视图中从数据库聚合数据后传给模板:

@login_requireddefdashboard_view(request):    total_records = DetectionRecord.objects.count()    fire_records = DetectionRecord.objects.filter(is_fire=True).count()    recent_alerts = AlertLog.objects.select_related('record').filter(is_handled=False)[:5]# 实际项目中应从数据库按日期聚合    labels = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]    data_fire = [2, 5, 3, 8, 1, 4, 6]    data_safe = [10, 12, 15, 10, 20, 18, 14]    context = {'total': total_records,'fire_count': fire_records,'alerts': recent_alerts,'chart_labels': json.dumps(labels),'chart_fire': json.dumps(data_fire),'chart_safe': json.dumps(data_safe),    }return render(request, 'dashboard.html', context)

项目效果

登录页面简洁,输入用户名密码后进入对应的管理界面。普通用户的界面以检测功能为主,上方是图片上传区域和位置输入框,下方显示最近几条检测记录。上传一张包含火焰的图片后,页面跳转到结果详情页,展示原始图片、标注了火焰边界框的结果图、置信度分数以及“火情”或“安全”的结论。

管理员登录后默认进入大屏页面。页面顶部展示总检测次数、火情预警数和在线设备数三张统计卡片,中间左右并排展示近七天火情趋势折线图和检测类型占比饼图。页面下方是未处理预警列表,每条预警都带有时间、位置、置信度信息和“处理”按钮,点击后标记为已处理。

整个系统操作下来,从上传到出结果大概 3 到 5 秒(取决于硬件配置),对于图片检测场景来说响应速度可以接受。

项目源码

项目目录结构如下:

fire_detection_system/├── manage.py├── fire_system/              # Django 项目配置│   ├── settings.py│   └── urls.py├── detection_app/            # 核心应用│   ├── models.py│   ├── views.py│   ├── urls.py│   ├── utils.py              # YOLO 推理工具│   ├── templates/            # HTML 模板│   │   ├── login.html│   │   ├── dashboard.html│   │   ├── image_detect.html│   │   ├── video_detect.html│   │   └── result_detail.html│   └── static/               # CSS / JS├── media/                    # 上传文件和结果文件│   ├── uploads/│   └── results/├── weights/                  # 模型权重│   └── best.pt└── requirements.txt

拿到源码后,按以下步骤即可跑起来:

1、用 PyCharm 打开项目,创建 Python 3.8 虚拟环境

2、执行 pip install -r requirements.txt 安装依赖

3、在 MySQL 中创建数据库 fire_db,修改 settings.py 中的数据库连接信息

4、执行 python manage.py makemigrations 和 python manage.py migrate

5、执行 python manage.py createsuperuser 创建管理员账号

6、将训练好的 best.pt 放入 weights 目录

7、执行 python manage.py runserver 启动服务,访问 http://127.0.0.1:8000/login/

总结

这套火焰检测系统把深度学习目标检测和 Web 管理后台结合在了一起,形成了一个从数据采集、算法分析、结果展示到预警处理的完整闭环。代码量适中,架构分层清楚,适合作为 AI 落地项目的参考模板。

有几个地方实际使用时要特别注意:一是模型的检测精度直接决定了预警的准确率,训练数据要覆盖足够多的场景(不同光照、不同角度、不同规模的火焰);二是视频检测的计算量较大,生产环境建议用异步任务处理,避免阻塞主线程;三是位置信息目前还是文本输入,后续可以接入地图 API,把检测点落到地图上,这样大屏的指挥效果会更好。

这套系统的设计思路不止局限于火焰检测,换一个训练好的模型(比如烟雾识别、人员闯入检测、设备故障识别),改一下类别判断逻辑,完全可以复用到其他安防或工业视觉场景中。

关键词

#火焰检测、#YOLOv5、#Django、MySQL、深度学习、#目标识别、#实时预警、#数据大屏、#ECharts、#图像识别、视频分析、#Python、#智慧消防

作者:小码编匠

出处:gitee.com/smallcore/DotNetCore

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

END
往
期
精
彩
Vue 3 + Tailwind CSS v4 后台管理系统模板(五种布局随意切换)

一套企业级的 RWA + AI 的Saas 应用平台

新一代企业级 AI 应用开发与编排平台(零代码构建智能体)

从拖拉拽到打印输出,一套 Web 打印服务解决方案

Vue 3 + Vite + Avue 搭建企业级大屏可视化方案

不想从头搭后台?这套开源免费可商用的 Java 后台管理系统了解一下

一款模块化的通用后端运行时框架

一款开源图像标注与模型训练工具

Vue3 开发的 Material 风格移动端组件库

开箱即用一款无授权费、可商用的中后台快速开发框架

一个入门简单、跨平台、企业级桌面软件开发框架

AI 大模型 + Asterisk 通信引擎构建的新一代智能客服呼叫中心系统

一款基于React生态的大屏数据可视化设计器

基于 React + FastAPI + 百炼大模型的智能运维诊断平台

一款开源企业级别的中后台管理系统

开源的快速开发平台(快速开发骨架 / 通用后台管理系统 / 完善的前后端代码)

JSON存储+拖拽设计,这款工作流引擎有点东西

微服务权限系统:Spring Cloud + React 19 的 RBAC 实践

企业后台、SaaS 管理端、数据可视化平台和内部低代码工具的中后台框架

面向企业后台、SaaS 管理端、数据可视化平台和内部低代码工具的中后台框架

一款面向数字化场景的可视化流程编排与数据交换平台

Vue 前后端分离的企业办公 OA 审批管理系统

接入 AI 辅助后,后台管理平台开发到底省了哪些事?

备注【开源】

方便大家交流、资源共享和共同成长

纯技术交流群、需要的小伙伴请扫码

有收获?不妨分享让更多人受益

关注「程序员开源栈」,共同提升技术实力

点分享
点收藏
点在看
点点赞

最新文章

随机文章