ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于YOLOv8/YOLOv5与PySide6的火灾火焰检测识别系统实战

基于YOLOv8/YOLOv5与PySide6的火灾火焰检测识别系统实战 之前在做一个火灾检测相关的视觉项目时最大的感受是模型算法本身不难选真正花时间的是把数据集准备好、把 YOLO 模型训练跑通再把它塞进一个看得见摸得着的桌面程序里。很多教程要么只讲 YOLO 训练要么只讲 PySide6 界面控件很少有人把整条链路串起来讲清楚。这篇文章就围绕“基于 YOLOv8 和 YOLOv5 PySide6 的火灾火焰检测识别系统”展开把火灾数据集准备、YOLOv8 / YOLOv5 模型训练、PySide6 桌面端开发、图片检测、视频检测、摄像头实时检测整条流程完整串起来。适合目标检测初学者、做毕业设计的同学以及想在监控或消防场景快速落地视觉应用的开发者。学完本文你会掌握火焰检测数据集的整理与标注思路YOLOv8 训练自己数据集的完整流程YOLOv5 与 YOLOv8 在训练和使用上的差异用 PySide6 开发桌面检测界面并集成 YOLO 推理视频和摄像头检测时如何用多线程避免界面卡死常见报错的排查方向和工程化部署建议。1. 项目背景与整体技术选型1.1 为什么要做火灾火焰检测火灾是安全监控中最需要“早发现、早报警”的场景之一。传统烟雾传感器需要一定浓度才能触发而视频监控覆盖范围广、响应速度快如果能通过摄像头画面直接识别火焰就能大幅缩短预警时间。火焰检测属于目标检测任务目标是在图像或视频帧中定位火焰的位置并画出检测框。早期方案多基于颜色阈值、帧差法、光流法这类方法在简单背景下有效但一到室外、夜间、灯光干扰多的场景就很容易误报。深度学习目标检测算法出现后火焰检测的准确率有了明显提升。YOLO 系列因为速度快、部署方便成为实时监控场景的首选。火焰目标的一个特点是形状不规则、边缘扩散、颜色跨度大但 YOLO 的 anchor-free 回归方式对这类非刚性目标也有不错的适应能力所以很适合用来做火焰检测。1.2 技术选型YOLOv8、YOLOv5 与 PySide6项目标题中提到了 YOLOv8 和 YOLOv5这两个版本在实际项目中都有大量使用者YOLOv5发布早、生态成熟网上资料最多很多旧的工程项目还在用它。训练方式和部署方式都比较稳定。YOLOv8ultralytics 官方维护接口更统一内置了新的 C2f 模块、Decoupled Head、Anchor-Free 检测头训练代码更简洁还集成了模型导出到 ONNX、TensorRT 等能力。PySide6 是 Qt for Python 的官方绑定库相比 Tkinter 界面更现代相比 PyQt 授权更友好支持信号槽机制特别适合开发带实时画面显示的桌面应用。这个项目的技术组合可以这样理解YOLO 负责“看见火焰”PySide6 负责“把火焰显示给用户看”。1.3 系统整体功能拆解一个完整的火灾火焰检测识别系统按功能划分如下模块功能数据模块收集火焰图片标注类别划分训练集和验证集训练模块使用 YOLOv8 / YOLOv5 训练火焰检测模型检测模块加载训练好的权重对图片、视频、摄像头进行推理界面模块基于 PySide6 显示画面、检测框、类别信息和置信度交互模块打开图片、打开视频、打开摄像头、停止检测等操作优化模块模型导出、推理加速、误报抑制、报警联动后面所有实战内容都围绕这张表展开。2. 环境准备与项目目录设计2.1 开发环境说明本文示例以常见环境为例重点演示配置思路。具体版本需要根据你本机的 Python 和 CUDA 环境微调。我建议的环境如下操作系统Windows 10 / 11 或 Ubuntu 20.04 / 22.04Python3.8 及以上深度学习框架PyTorch 2.xYOLO 工具库ultralytics界面框架PySide6图像处理OpenCVIDEPyCharm 或 VS Code 均可。如果电脑是 NVIDIA 显卡建议先安装对应版本的 CUDA 和 cuDNN这样训练和推理速度会快很多。没有独立显卡的话也可以先用 CPU 跑小模型 YOLOv8n 做验证。2.2 安装依赖创建虚拟环境后执行以下命令安装核心依赖pip install ultralytics pyside6 opencv-python如果你需要记录完整依赖可以维护一份requirements.txtultralytics pyside6 opencv-python numpyultralytics会同时安装 PyTorch、torchvision 等依赖。如果网络不好也可以先单独安装 PyTorch再安装 ultralytics。安装完成后可以检查版本python -c from ultralytics import YOLO; print(YOLO.__module__) python -c import PySide6; print(PySide6.__version__)2.3 项目目录结构为了让代码清晰建议按下面的结构创建项目fire_detection_system/ ├── datasets/ │ └── fire/ │ ├── images/ │ │ ├── train/ │ │ └── val/ │ ├── labels/ │ │ ├── train/ │ │ └── val/ │ └── fire.yaml ├── weights/ │ └── best.pt ├── detector.py ├── main.py └── requirements.txtdatasets/fire存放火灾数据集和数据集配置文件weights存放训练好的模型权重detector.py封装 YOLO 模型加载和推理逻辑main.pyPySide6 主程序requirements.txt项目依赖。3. YOLOv8 / YOLOv5 核心原理与火焰检测难点3.1 YOLOv8 网络结构简述YOLOv8 的网络结构可以分成三部分Backbone主干网络负责提取图像特征。YOLOv8 使用 C2f 模块替换了 YOLOv5 中的 C3 模块C2f 通过更丰富的梯度流让特征提取能力更强。Neck特征融合使用 PAN-FPN 结构把不同尺度的特征图融合起来让网络既能检测大目标也能检测小目标。Head检测头YOLOv8 使用 Decoupled Head把分类和回归分成两个分支同时采用 Anchor-Free 方式不再依赖预定义的 anchor 框。对于火焰检测来说火焰大小变化很大可能占据整个画面也可能只是一个很小的火苗。YOLOv8 的多尺度特征融合能力对这种情况很有帮助。YOLOv5 与之相比主要区别在于YOLOv5 使用 C3 模块和 Anchor-Based 检测头YOLOv8 使用 C2f 模块和 Anchor-Free 检测头YOLOv8 在训练时会使用 Task-Aligned Assigner 样本分配策略正样本匹配更精准。实际项目中YOLOv5 在低配置设备上的推理速度仍然不错YOLOv8 则在使用便捷性和精度上更有优势。3.2 火焰目标检测的难点火焰检测不是简单“找一个红色物体”它有以下几个难点颜色相似干扰火焰颜色接近夕阳、灯光、红色衣物单靠颜色阈值一定会误报。形态变化大火焰一直在跳动、扩散、分裂同一段视频里火焰可能从一个小点变成一大片。半透明特性火焰边缘会透出背景检测框的边界不好确定。小目标多远处监控画面中火焰可能只有十几个像素。夜间和强光夜间火焰亮度高会产生光晕模型容易把光晕也识别成火焰。所以在标注数据和训练模型时要特别注意样本的多样性。不要只标大火也要标小火苗、初期火灾、不同光线条件下的火焰。3.3 数据标注与增强策略火焰检测的数据集可以来自公开火灾数据集也可以从监控视频、短视频平台火灾片段中截取帧。如果做企业项目最好能拿到现场监控数据。标注工具推荐 LabelImg 或 Labelme。YOLO 格式的标注文件是.txt每一行表示一个目标class_id x_center y_center width height其中坐标值都是相对于图片宽高的归一化值。标注建议类别统一命名为fire不要拆成small_fire、big_fire等类别除非业务有特殊要求火焰主体明显时标注火焰中心区域如果火焰被烟雾遮挡可以只标可见部分不要把所有火星都单独标注否则会干扰模型学习。数据增强方面YOLOv8 在训练时默认会做 Mosaic、随机透视、颜色扰动等增强。对于火焰检测建议额外增加亮度调整和对比度调整因为火焰在不同光照下亮度差异很大。4. 火灾火焰检测模型训练实战4.1 准备火焰数据集假设数据集目录结构如下datasets/fire/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── fire.yaml训练集和验证集的图片数量建议控制在一定比例比如 9:1 或 8:2。数据集总量越大越好但如果只是课程设计或原型验证几百张火焰图片也能跑出一个可用的模型。4.2 编写数据集配置文件在datasets/fire/fire.yaml中写入以下配置# 文件路径datasets/fire/fire.yaml path: ./datasets/fire train: images/train val: images/val names: 0: firepath表示数据集根目录train和val是相对于根目录的图片路径names定义了类别 ID 对应的类别名。这里只有一个类别fire。如果你手头有 YOLOv5 格式的数据集字段基本一致可以直接复用。4.3 训练 YOLOv8 模型新建一个 Python 脚本train_yolov8.py内容如下# 文件路径train_yolov8.py from ultralytics import YOLO if __name__ __main__: model YOLO(yolov8n.pt) model.train( datadatasets/fire/fire.yaml, epochs100, imgsz640, batch8, device0, workers4, namefire_yolov8n, projectruns/fire )参数说明yolov8n.pt官方预训练权重n 表示 nano 版本体积最小适合快速验证epochs训练轮数数据量小的时候 100 轮足够imgsz输入图片尺寸640 是默认值batch批大小根据显存调整。显存只有 6GB 的话建议从 4 或 8 开始device0表示第一块 GPUCPU 训练填cpuworkers数据加载线程数project和name训练结果保存路径。如果你的显存比较小比如 GTX 1660 Ti 这类 6GB 显存的显卡推荐使用yolov8n.pt或yolov8s.ptimgsz可以降到 480 或 512batch设为 4 到 8。大模型和大分辨率在训练时很容易爆显存。训练结束后权重会保存在runs/fire/fire_yolov8n/weights/目录下其中best.pt是验证集上表现最好的权重last.pt是最后一轮的权重。训练结果目录下还会生成results.png可以看到损失曲线和 mAP 曲线用于判断模型是否收敛。4.4 训练 YOLOv5 模型的区别如果你的项目需要继续使用 YOLOv5训练方式略有不同。YOLOv5 是独立仓库需要先克隆代码git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt然后在项目根目录下执行训练命令python train.py \ --data ../datasets/fire/fire.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 8 \ --epochs 100 \ --device 0YOLOv5 使用的数据格式和 YOLOv8 基本一致fire.yaml可以直接复用。训练完成后权重保存在runs/train/exp/weights/下。YOLOv5 在 PySide6 中的接入方式和 YOLOv8 不一样。YOLOv5 权重可以用torch.hub方式加载import torch model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadTrue) results model(frame)results对象可以直接通过results.pandas().xyxy[0]获取检测框坐标、置信度和类别。不过这里要提醒一点YOLOv5 和 YOLOv8 的推理对象结构不同。如果你的 GUI 同时要兼容两个版本的权重最好把推理逻辑封装成一个统一接口避免在界面上写两套逻辑。4.5 模型评估与导出训练完成后可以用测试图片看一下效果# 文件路径test_inference.py from ultralytics import YOLO model YOLO(runs/fire/fire_yolov8n/weights/best.pt) results model(test_fire.jpg, conf0.35, saveTrue) results[0].show()如果检测框置信度太低可以调低conf阈值如果误报太多则调高conf。如果需要部署到其他环境可以导出为 ONNX 格式yolo export modelruns/fire/fire_yolov8n/weights/best.pt formatonnx导出后的 ONNX 文件可以用 ONNX Runtime 或 OpenVINO 加载不依赖 PyTorch 环境适合在生产环境部署。5. PySide6 桌面检测系统开发5.1 模型推理封装把推理逻辑封装成独立模块后续界面层只调用接口不用关心模型细节。# 文件路径detector.py import cv2 from ultralytics import YOLO class FireDetector: 火焰检测器封装 YOLOv8 模型加载与推理 def __init__(self, weights_path: str, conf: float 0.35, iou: float 0.5): self.model YOLO(weights_path) self.conf conf self.iou iou def predict(self, frame): 输入 BGR 图像返回检测结果 results self.model.predict(frame, confself.conf, iouself.iou, verboseFalse) return results[0] def draw_and_get(self, frame): 返回绘制了检测框的图像和结果对象 results self.predict(frame) annotated results.plot() return annotated, resultsresults.plot()会在原图上绘制检测框、类别和置信度返回一个 numpy 数组表示的图像。需要注意plot()返回的图像格式通常是 BGR。如果你的界面显示颜色不对比如火焰颜色偏蓝可以在转换时把COLOR_BGR2RGB改成COLOR_RGB2BGR。5.2 主窗口界面布局在main.py中实现主窗口。界面设计如下顶部工具栏打开模型、打开图片、打开视频、打开摄像头、停止检测中部显示区使用QLabel显示检测结果;底部状态栏显示当前检测信息比如画面来源、检测目标数量。完整代码如下# 文件路径main.py import sys import cv2 from PySide6.QtCore import Qt, QThread, Signal from PySide6.QtGui import QImage, QPixmap from PySide6.QtWidgets import ( QApplication, QFileDialog, QHBoxLayout, QLabel, QMainWindow, QMessageBox, QPushButton, QStatusBar, QVBoxLayout, QWidget, ) from detector import FireDetector class DetectionThread(QThread): 视频和摄像头检测线程 change_frame Signal(object) change_status Signal(str) def __init__(self, source, detector, parentNone): super().__init__(parent) self.source source self.detector detector self._running True def run(self): cap cv2.VideoCapture(self.source) if not cap.isOpened(): self.change_status.emit(无法打开视频源请检查路径或摄像头索引) return self.change_status.emit(检测中按“停止检测”结束) while self._running: ret, frame cap.read() if not ret: break annotated, results self.detector.draw_and_get(frame) self.change_frame.emit(annotated) self.msleep(30) # 限制帧率避免界面卡顿 cap.release() self.change_status.emit(检测已停止) def stop(self): self._running False self.wait() class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(火灾火焰检测识别系统) self.resize(960, 640) self.detector None self.thread None self.init_ui() def init_ui(self): central_widget QWidget() self.setCentralWidget(central_widget) layout QVBoxLayout(central_widget) # 顶部按钮栏 btn_layout QHBoxLayout() self.btn_model QPushButton(选择模型) self.btn_image QPushButton(打开图片) self.btn_video QPushButton(打开视频) self.btn_camera QPushButton(打开摄像头) self.btn_stop QPushButton(停止检测) self.btn_model.clicked.connect(self.open_model) self.btn_image.clicked.connect(self.open_image) self.btn_video.clicked.connect(self.open_video) self.btn_camera.clicked.connect(self.open_camera) self.btn_stop.clicked.connect(self.stop_detection) btn_layout.addWidget(self.btn_model) btn_layout.addWidget(self.btn_image) btn_layout.addWidget(self.btn_video) btn_layout.addWidget(self.btn_camera) btn_layout.addWidget(self.btn_stop) btn_layout.addStretch() layout.addLayout(btn_layout) # 图像显示区 self.image_label QLabel(请选择模型并打开图片或视频) self.image_label.setAlignment(Qt.AlignCenter) self.image_label.setMinimumSize(640, 480) self.image_label.setStyleSheet(border: 1px solid #ccc; background: #f5f5f5;) layout.addWidget(self.image_label) # 状态栏 self.status QStatusBar() self.setStatusBar(self.status) self.status.showMessage(未加载模型) def open_model(self): path, _ QFileDialog.getOpenFileName( self, 选择模型权重, weights, Model Files (*.pt *.onnx) ) if not path: return try: self.detector FireDetector(path) except Exception as e: QMessageBox.critical(self, 模型加载失败, str(e)) return self.status.showMessage(f已加载模型: {path}) def open_image(self): if not self.check_detector(): return path, _ QFileDialog.getOpenFileName( self, 选择图片, , Images (*.jpg *.jpeg *.png *.bmp) ) if not path: return frame cv2.imread(path) if frame is None: QMessageBox.warning(self, 警告, 图片读取失败) return annotated, results self.detector.draw_and_get(frame) self.show_frame(annotated) count len(results.boxes) if results.boxes is not None else 0 self.status.showMessage(f图片检测完成检测到火焰目标: {count} 个) def open_video(self): if not self.check_detector(): return path, _ QFileDialog.getOpenFileName( self, 选择视频文件, , Videos (*.mp4 *.avi *.mov) ) if not path: return self.start_thread(path) def open_camera(self): if not self.check_detector(): return self.start_thread(0) def start_thread(self, source): if self.thread and self.thread.isRunning(): self.thread.stop() self.thread DetectionThread(source, self.detector) self.thread.change_frame.connect(self.show_frame) self.thread.change_status.connect(self.status.showMessage) self.thread.start() def stop_detection(self): if self.thread and self.thread.isRunning(): self.thread.stop() self.status.showMessage(检测已手动停止) def show_frame(self, frame): rgb_image cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch rgb_image.shape bytes_per_line ch * w qimg QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888).copy() pixmap QPixmap.fromImage(qimg) scaled_pixmap pixmap.scaled( self.image_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation ) self.image_label.setPixmap(scaled_pixmap) def check_detector(self): if self.detector is None: QMessageBox.warning(self, 提示, 请先选择模型文件) return False return True if __name__ __main__: app QApplication(sys.argv) window MainWindow() window.show() sys.exit(app.exec())这段代码已经是一个可运行的桌面火焰检测系统。下面逐个介绍核心设计。5.3 信号槽机制与界面更新PySide6 的核心机制是信号槽。简单理解某个事件发生时发送信号对应槽函数自动执行。在本项目中视频检测线程不能直接操作界面控件因为子线程和主线程的上下文不同。正确的做法是在DetectionThread中定义信号change_frame Signal(object)在线程中使用self.change_frame.emit(annotated)发送画面在主窗口中使用self.thread.change_frame.connect(self.show_frame)绑定槽函数主线程收到信号后调用show_frame更新界面。这样做的原因是如果直接在子线程里调用label.setPixmap()界面可能出现崩溃或刷新异常。信号槽机制会自动把跨线程调用转换到主线程执行安全且规范。5.4 多线程防卡顿设计如果直接把视频帧读取和模型推理放在主线程点击“打开视频”后界面会立刻卡住窗口无法拖动、按钮无法点击直到视频结束或程序崩溃。DetectionThread解决了这个问题class DetectionThread(QThread): def run(self): cap cv2.VideoCapture(self.source) while self._running: ret, frame cap.read() if not ret: break annotated, results self.detector.draw_and_get(frame) self.change_frame.emit(annotated) self.msleep(30) cap.release()线程内部完成读帧、推理、发送信号三个动作主线程只负责接收画面并显示。self.msleep(30)大约控制 30 FPS避免频率太高导致主线程渲染不过来。停止检测时调用self.thread.stop()设置_running False线程会在下一轮循环退出。5.5 运行与验证在项目目录下执行python main.py运行时按以下顺序操作点击“选择模型”选择训练好的best.pt点击“打开图片”选择一张包含火焰的图片界面显示检测结果状态栏显示火焰目标数量点击“打开视频”或“打开摄像头”切换为连续检测模式点击“停止检测”结束。如果模型没有加载就点击检测按钮程序会弹出提示框避免空指针异常。6. 常见问题与排查思路6.1 问题排查表问题现象常见原因解决思路训练时 loss 不下降学习率过高/过低、样本量太少、标注错误多检查数据标注降低或提高学习率增加样本量CUDA out of memorybatch 太大、imgsz 过大、显卡显存不足减小 batch降低 imgsz使用更小的 yolov8nPySide6 界面拖动卡顿推理操作放在主线程将检测逻辑放入 QThread通过信号更新界面界面显示颜色偏蓝或偏红BGR 和 RGB 通道未正确转换检查cv2.cvtColor的参数替换为相反的转换方式摄像头打不开摄像头索引不对、驱动异常、被其他程序占用将索引换成1测试或检查设备管理器检测不到火焰置信度阈值过高、模型训练不足调低conf增加火焰样本重新训练视频检测中画面卡顿每帧推理时间过长或 emit 频率过高换小模型降低推理分辨率适当增加msleep加载 YOLOv5 权重到 YOLOv8 报错两个版本的权重格式不兼容使用torch.hub.load加载或统一导出为 ONNX6.2 视频终止不生效stop()方法中调用self.wait()会阻塞主线程直到线程退出。如果视频卡在阻塞的读取操作上线程无法及时退出此时可以修改为def stop(self): self._running False self.wait(1000)甚至可以在主窗口关闭时判断线程状态def closeEvent(self, event): if self.thread and self.thread.isRunning(): self.thread.stop() event.accept()这样关闭窗口时就不容易残留后台线程。6.3 ONNX 模型显示异常有些项目会直接加载导出的 ONNX 模型ultralytics 支持YOLO(best.onnx)但 ONNX 运行环境缺少时可能报错。建议先安装onnxruntimepip install onnxruntime如果加载失败优先在命令行用 YOLO 自带的导出验证一次python -c from ultralytics import YOLO; m YOLO(best.onnx); print(m.predict(test.jpg, verboseFalse))7. 工程化最佳实践与优化建议7.1 数据集与训练优化火焰检测的误报率和漏报率往往取决于训练集的覆盖面。建议从这几个方向收集数据白天室内火焰、白天室外火焰夜间火焰、暗光环境火焰电气火灾、森林火灾、垃圾燃烧等不同场景被烟雾遮挡的火焰与火焰颜色相近的负样本比如夕阳、车灯、红色灯光、反光物体。负样本对降低误报率非常重要。你可以专门建立负样本目录图片不包含火焰但颜色或纹理容易让模型“误判”。YOLO 允许图片没有标注文件模型会把它当作背景训练。训练时如果发现验证集 mAP 很高但实际测试误报多通常是数据分布和真实场景差异大需要补充更多真实场景数据。7.2 GUI 与模型推理优化在桌面应用中推理速度直接影响用户体验。可以从几个方面优化选用轻量模型优先使用yolov8n或yolov8s如果精度不够再尝试yolov8m。控制输入分辨率监控画面不一定要原图推理可以缩放后推理再映射回原图火焰目标中等以上时可以明显提速。导出加速格式生产环境优先导出 ONNX 或 TensorRT推理速度比原始 PyTorch 模型快很多。避免频繁创建对象在视频循环中不要每次创建新的YOLO对象应该复用同一个 detector 实例。控制界面刷新频率不需要每帧都刷新可以通过msleep(30)或跳帧处理。7.3 安全与生产环境注意事项火焰检测涉及消防预警生产环境要非常谨慎不要只依赖纯视觉模型作为唯一报警依据应结合烟雾传感器、温度传感器等多维数据模型报警阈值要经过充分测试宁缺勿误和宁误勿缺需要根据业务场景权衡系统长时间运行时要考虑摄像头断线、画面冻结、光线突变等异常情况并加入心跳检测和画面异常检测保存检测结果时应记录时间、摄像头编号、截图和置信度方便事后追溯代码中涉及模型路径、摄像头索引等配置建议通过配置文件或环境变量管理不要写死在代码里。7.4 代码结构建议不要把模型推理和界面代码写在一个文件里。推荐的分层思路detector.py只负责模型加载和推理main.py只负责界面布局和交互detection_thread.py负责视频线程管理config.py负责模型路径、置信度阈值等参数。这样后续新增烟雾检测、报警联动等功能时不会把界面代码越改越乱。8. 总结与后续学习方向这篇文章围绕火灾火焰检测识别系统完整走了一遍从数据集准备、YOLOv8 / YOLOv5 模型训练到 PySide6 桌面应用开发的全流程。核心收获可以总结为四点火焰检测的本质是目标检测任务难点在数据多样性和误报抑制而不只是模型本身YOLOv8 使用ultralytics一行命令就能训练YOLOv5 作为经典方案仍然在很多旧项目中存在PySide6 开发检测界面时视频和摄像头检测必须使用 QThread 做多线程通过信号槽更新界面工程落地时模型导出、推理优化和多维联动报警比算法本身更重要。接下来如果想继续深入可以按这几个方向学习给 YOLOv8 增加改进模块比如替换主干网络为 ConvNeXt V2、引入多头注意力机制 MHSA进一步提升检测精度学习 ONNX 或 TensorRT 导出部署把模型接入边缘设备或监控平台给系统增加烟雾检测、温度传感器联动、声光报警功能做一个更完整的消防预警系统研究增量训练在新场景数据到来时用旧权重继续训练避免模型遗忘之前学会的特征。最后给一个实用建议先不要急着改进模型结构用一套干净的数据把基础训练流程跑通再用 PySide6 把这套模型做成一个可以交互的桌面程序。当你看到摄像头画面里火焰被准确框出来的时候这整条链路才算真正掌握。
返回列表