火焰检测的算法本身已经比较成熟了,YOLO 系列做目标识别效果不错,把算法和一套完整的 Web 管理系统串起来,其实就是一个可以落地的小型智慧消防系统。于是花了两周时间,基于 Django + MySQL + YOLOv5 搭了一套完整的火焰检测系统,从用户上传图片/视频到检测结果展示、预警推送、大屏统计,全流程跑通。
这篇文章就分享一下这个系统的完整实现过程。
一个基于 Python + Django + YOLOv5 的火焰检测系统,名字暂叫 FireGuard。系统通过深度学习算法自动识别图片或视频中的火焰,检测到火情后记录预警信息,并在管理后台和大屏上实时展示。
项目采用 B/S 架构,用户通过浏览器访问。前端负责上传文件和展示结果,后端 Django 处理业务逻辑、调用 YOLOv5 推理,MySQL 存储所有数据。整体分两层权限:管理员可以查看全站数据和用户管理,普通用户只负责上传检测和查看自己的记录。

算法与 Web 整合:YOLOv5 推理作为后端的一个工具模块,与 Django 的视图逻辑解耦,调用清晰
双模态输入支持:同时支持图片和视频两种检测方式,覆盖不同使用场景
实时预警闭环:检测到火焰后自动落库预警,大屏和预警列表同步更新,闭环速度快
大屏可视化:基于 ECharts 的动态图表展示数据趋势和占比,适合监控中心展示
位置信息追踪:每次检测都记录位置描述,便于后续定位和地图扩展
权限分层清晰:管理员和普通用户的界面和数据范围分离,符合多级管理需求
整个项目采用 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
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!
Vue 3 + Vite + Avue 搭建企业级大屏可视化方案
不想从头搭后台?这套开源免费可商用的 Java 后台管理系统了解一下
AI 大模型 + Asterisk 通信引擎构建的新一代智能客服呼叫中心系统
基于 React + FastAPI + 百炼大模型的智能运维诊断平台
开源的快速开发平台(快速开发骨架 / 通用后台管理系统 / 完善的前后端代码)
微服务权限系统:Spring Cloud + React 19 的 RBAC 实践
企业后台、SaaS 管理端、数据可视化平台和内部低代码工具的中后台框架


方便大家交流、资源共享和共同成长
纯技术交流群、需要的小伙伴请扫码
有收获?不妨分享让更多人受益
关注「程序员开源栈」,共同提升技术实力



