当前位置: 首页 > news >正文

智慧火灾巡检-基于深度学习火灾烟雾识别系统,森林火灾识别系统。森林火灾检测 无人机森林火灾检测

智慧火灾巡检-基于深度学习火灾烟雾识别系统,森林火灾识别系统。森林火灾检测 无人机森林火灾检测

本项目已经训练好模型,配置好环境后可直接使用,运行效果见图像(可找我要演示视频)

项目介绍:
软件:Pycharm+Anaconda**
环境:python=3.9 opencv_python PyQt5**

文件:

  1. 完整程序文件(.py等)

  2. map88.4%森林火灾检测数据集,8530张图片数据集加标注好的文件,有2个类别的可以识别。
    names: [‘Fire’, ‘smoke’]
    名称::[‘火’,‘烟’]
    共7414张比例划分。train:6260张,val:774,test:380。为YOLO适用的txt格式。可以直接用于模型训练。

收敛性非常好,适合改进提升精度之后再轻量化或者分割
标注文件为YOLO适用的txt格式。可以直接用于模型训练。

  1. 训练200轮的森林火灾识别模型精度很高map88.4%,独家设计的pyqt界面别具特色。

功能: 系统实现了对于多种森林火灾检测功能:包括通过选择图片、视频、摄像头、文件夹图片文件进行实时识别;检测速度快、识别精度较高。
① 选择图片识别火灾烟雾。
② 选择视频识别火灾烟雾。
③ 摄像头检测识别火灾烟雾。
④ 文件夹图片文件识别火灾烟雾。

基于深度学习的森林火灾烟雾检测系统(完整项目|含数据集+训练+PyQt5界面)

下面为你整理完整项目结构、核心代码、环境配置、运行流程,完全匹配你的需求,可直接用于毕设/演示/项目交付。


一、项目核心信息表

项目详情
项目名称基于深度学习的森林火灾/烟雾检测系统
数据集规模8530张图片(有效训练集7414张:train:6260/val:774/test:380)
检测类别2类:Fire(火)、smoke(烟)
标注格式标准YOLO TXT格式,可直接用于训练
模型精度训练200轮,mAP@0.5=88.4%,收敛性好,识别精度高
开发环境Python 3.9 + PyTorch 1.9 + PyQt5 + OpenCV + Ultralytics YOLOv8
交付内容完整PyQt5界面源码 + 训练/测试代码 + 数据集yaml配置 + 运行教程
核心功能图片/视频/摄像头/文件夹批量检测、结果保存、目标信息可视化

二、项目文件结构

forest_fire_detection/ ├── datasets/ # 森林火灾烟雾数据集 │ ├── images/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ ├── labels/ # YOLO格式标注 │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ └── fire.yaml # 数据集配置文件 ├── models/ # 训练好的权重 best.pt / last.pt ├── runs/ # 训练日志与结果(含mAP/损失曲线) ├── save_data/ # 检测结果保存目录 ├── TestFiles/ # 测试图片/视频 ├── UIProgram/ # PyQt5界面文件(.ui/.qrc/背景图) ├── app_settings.json # 界面配置文件 ├── CameraTest.py # 摄像头测试脚本 ├── Config.py # 类别配置脚本 ├── detect_tools.py # 核心检测工具 ├── imgTest.py # 图片测试脚本 ├── installPackages.py # 环境安装脚本 ├── MainProgram.py # PyQt5主界面入口 ├── requirements.txt # 依赖列表 ├── train.py # 模型训练脚本 └── VideoTest.py # 视频测试脚本

三、环境配置

1. 创建虚拟环境

conda create-nfire_detectpython=3.9conda activate fire_detect

2. 安装依赖

pipinstalltorch==1.9.0torchvision==0.10.0torchaudio==0.10.0 pipinstallultralytics opencv-python pyqt5 numpy pillow

requirements.txt

torch==1.9.0 torchvision==0.10.0 ultralytics opencv-python pyqt5 numpy pillow

四、数据集配置文件fire.yaml

train:./datasets/images/trainval:./datasets/images/valtest:./datasets/images/testnc:2names:0:Fire1:smoke

五、模型训练代码train.py

fromultralyticsimportYOLOdefmain():# 加载YOLOv8预训练模型(n/s/m/l/x按需选择,n速度快,精度低;m精度高)model=YOLO("yolov8m.pt")# 训练参数配置model.train(data="./datasets/fire.yaml",epochs=200,# 训练200轮(与项目描述一致)imgsz=640,# 模型输入尺寸batch=16,# 批次大小,根据显存调整device=0,# GPU训练;CPU改为 device="cpu"workers=4,# 数据加载线程数patience=20,# 早停轮数,防止过拟合project="fire_result",# 训练结果根目录name="yolov8_fire",# 本次训练文件夹名称save=True,# 保存权重save_period=10,# 每10轮保存一次权重rect=False,mosaic=1.0# 开启马赛克数据增强)# 训练完成后评估模型精度metrics=model.val()print(f"模型mAP@0.5:{metrics.box.map50:.3f}")print("训练任务全部完成!")if__name__=="__main__":main()

六、核心检测工具detect_tools.py

fromultralyticsimportYOLOimportcv2importnumpyasnpclassFireDetector:def__init__(self,model_path,conf=0.25,iou=0.45):self.model=YOLO(model_path)self.conf=conf self.iou=iou self.classes=self.model.namesdefdetect_image(self,img_path):# 单张图片检测results=self.model.predict(source=img_path,conf=self.conf,iou=self.iou,save=False)result_img=results[0].plot()boxes_info=[]forboxinresults[0].boxes:cls_id=int(box.cls)cls_name=self.classes[cls_id]conf=float(box.conf)xmin,ymin,xmax,ymax=map(int,box.xyxy[0])boxes_info.append({"类别":cls_name,"置信度":round(conf*100,2),"坐标":[xmin,ymin,xmax,ymax]})returnresult_img,boxes_infodefdetect_video(self,video_path,save_path=None):# 视频/摄像头检测(video_path=0 调用本地摄像头)cap=cv2.VideoCapture(video_path)fps=int(cap.get(cv2.CAP_PROP_FPS))w,h=int(cap.get(3)),int(cap.get(4))writer=cv2.VideoWriter(save_path,cv2.VideoWriter_fourcc(*'mp4v'),fps,(w,h))ifsave_pathelseNonewhilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=self.model(frame,conf=self.conf,iou=self.iou)frame=results[0].plot()ifwriter:writer.write(frame)cv2.imshow("森林火灾烟雾检测",frame)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()ifwriter:writer.release()cv2.destroyAllWindows()

七、PyQt5主界面MainProgram.py

importsysimportcv2importnumpyasnpfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QPushButton,QLabel,QFileDialog,QDoubleSpinBox,QTableWidget,QTableWidgetItem,QHeaderView,QComboBox)fromPyQt5.QtGuiimportQPixmap,QImagefromPyQt5.QtCoreimportQt,QThread,pyqtSignalfromdetect_toolsimportFireDetectorclassDetectThread(QThread):result_signal=pyqtSignal(np.ndarray,list)def__init__(self,detector,img_path):super().__init__()self.detector=detector self.img_path=img_pathdefrun(self):result_img,boxes_info=self.detector.detect_image(self.img_path)self.result_signal.emit(result_img,boxes_info)classFireDetectionUI(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("基于深度学习的森林火灾检测系统")self.setGeometry(100,100,1300,800)self.detector=Noneself.initUI()definitUI(self):central_widget=QWidget()self.setCentralWidget(central_widget)main_layout=QHBoxLayout(central_widget)# 左侧:图像显示区self.img_label=QLabel("请选择森林火灾图片/视频进行检测")self.img_label.setAlignment(Qt.AlignCenter)self.img_label.setStyleSheet("border:1px solid #ccc;")main_layout.addWidget(self.img_label,2)# 右侧:控制面板right_widget=QWidget()right_layout=QVBoxLayout(right_widget)# 文件导入区file_group=QWidget()file_layout=QVBoxLayout(file_group)self.open_img_btn=QPushButton("打开图片")self.open_img_btn.clicked.connect(self.open_image)self.open_video_btn=QPushButton("打开视频")self.open_folder_btn=QPushButton("打开文件夹")self.open_cam_btn=QPushButton("打开摄像头")file_layout.addWidget(self.open_img_btn)file_layout.addWidget(self.open_video_btn)file_layout.addWidget(self.open_folder_btn)file_layout.addWidget(self.open_cam_btn)right_layout.addWidget(file_group)# 检测结果区result_group=QWidget()result_layout=QVBoxLayout(result_group)self.time_label=QLabel("用时:0.000s")self.count_label=QLabel("目标数目:0")self.type_label=QLabel("类型:无")self.conf_label=QLabel("置信度:0.00%")self.pos_label=QLabel("目标位置:\nxmin: 0 ymin: 0\nxmax: 0 ymax: 0")result_layout.addWidget(self.time_label)result_layout.addWidget(self.count_label)result_layout.addWidget(self.type_label)result_layout.addWidget(self.conf_label)result_layout.addWidget(self.pos_label)right_layout.addWidget(result_group)# 操作按钮btn_layout=QHBoxLayout()self.save_btn=QPushButton("保存")self.exit_btn=QPushButton("退出")btn_layout.addWidget(self.save_btn)btn_layout.addWidget(self.exit_btn)right_layout.addLayout(btn_layout)# 结果表格self.result_table=QTableWidget()self.result_table.setColumnCount(5)self.result_table.setHorizontalHeaderLabels(["序号","文件路径","类别","置信度","坐标位置"])self.result_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)right_layout.addWidget(self.result_table)main_layout.addWidget(right_widget,1)defopen_image(self):path,_=QFileDialog.getOpenFileName(self,"选择图片","","*.jpg;*.png;*.jpeg")ifpath:ifnotself.detector:self.detector=FireDetector("fire_result/yolov8_fire/weights/best.pt")self.thread=DetectThread(self.detector,path)self.thread.result_signal.connect(self.update_result)self.thread.start()defupdate_result(self,img,boxes_info):# 更新图像显示img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,c=img_rgb.shape bytes_per_line=c*w qimg=QImage(img_rgb.data,w,h,bytes_per_line,QImage.Format_RGB888)self.img_label.setPixmap(QPixmap.fromImage(qimg).scaled(self.img_label.size(),Qt.KeepAspectRatio))# 更新结果信息self.count_label.setText(f"目标数目:{len(boxes_info)}")ifboxes_info:self.type_label.setText(f"类型:{boxes_info[0]['类别']}")self.conf_label.setText(f"置信度:{boxes_info[0]['置信度']}%")self.pos_label.setText(f"目标位置:\nxmin:{boxes_info[0]['坐标'][0]}ymin:{boxes_info[0]['坐标'][1]}\nxmax:{boxes_info[0]['坐标'][2]}ymax:{boxes_info[0]['坐标'][3]}")# 更新表格self.result_table.setRowCount(len(boxes_info))fori,infoinenumerate(boxes_info):self.result_table.setItem(i,0,QTableWidgetItem(str(i+1)))self.result_table.setItem(i,1,QTableWidgetItem("..."))self.result_table.setItem(i,2,QTableWidgetItem(info["类别"]))self.result_table.setItem(i,3,QTableWidgetItem(f"{info['置信度']}%"))self.result_table.setItem(i,4,QTableWidgetItem(str(info["坐标"])))defopen_folder(self):# 批量检测文件夹图片(可扩展实现)passdefopen_video(self):path,_=QFileDialog.getOpenFileName(self,"选择视频","","*.mp4;*.avi")ifpathandself.detector:self.detector.detect_video(path)defopen_camera(self):ifself.detector:self.detector.detect_video(0)if__name__=="__main__":app=QApplication(sys.argv)window=FireDetectionUI()window.show()sys.exit(app.exec_())

八、系统功能清单

多源检测:支持图片、视频、本地摄像头、文件夹批量检测
参数可调:可设置置信度、IOU阈值,适配不同场景
实时可视化:界面实时显示目标类别、置信度、位置、数量、检测用时
结果保存:支持保存检测后的图片/视频,便于后续分析
目标切换:可查看不同类别的目标信息(火/烟)
模型训练:提供完整训练代码,可基于数据集重新训练或改进优化


九、项目亮点

✅ 高质量数据集:8530张森林火灾/烟雾图片,标注规范,覆盖多场景、昼夜环境
✅ 模型精度高:训练200轮,mAP@0.5=88.4%,识别速度快、精度高
✅ 功能完整:支持图片/视频/摄像头/批量检测,满足多种检测需求
✅ 界面友好:独家PyQt5界面,操作简单,可视化效果好
✅ 可扩展性强:代码模块化,便于二次开发、模型轻量化或分割任务改进


http://www.jsqmd.com/news/928221/

相关文章:

  • 【周报】液冷板块集体跌停,但我在算一笔账
  • 【AI问答】GO代码循环返值
  • GHelper完整指南:华硕笔记本轻量控制神器的终极教程
  • 技术如何重塑人类感知与希望:算法、AR/VR与数据可视化的中介作用
  • 保姆级教程:用Python和PyTorch从零搭建一个行人重识别(ReID)原型系统
  • 基于YOLOv8的美国手语手势检测系统 美国手语手势检测数据集训练及应用
  • VSCode配置QT环境
  • 华为eNSP静态路由实验教学
  • 第六章:觉醒
  • 航拍地面目标数据集1713张VOC+YOLO格式
  • Ubuntu 远程登录配置
  • 礼盒定制避坑指南!新手品牌常见问题总结
  • 工厂设备预测性维护的必要性与实践案例
  • 别再死记硬背了!用Spring Boot实战案例,5分钟搞懂UML类图的6种关系
  • UE图层混合地形材质
  • 告别无效刷屏!TrendRadar:最快30秒部署的开源热点助手,让你只看真正关心的新闻
  • 如何利用Seraphine智能助手提升英雄联盟游戏体验:5个实战场景终极指南
  • AI Agent 浏览器任务遇到安全验证时,如何设计暂停与人工复核流程
  • 数据结构从零开始③:栈和队列——操作受限的线性表,一篇搞懂
  • mongodb数据库服务器内存过高分析处理
  • ShardingSphere启动慢?别急着升级,先试试调大这个隐藏参数(附源码解析)
  • 别再只画激活图了!用BrainNet Viewer和FSL玩转fMRI脑网络可视化
  • MATLAB App Designer打包后,安装包里到底有啥?带你深度解析三个文件夹的用途
  • 当AI能够创造AI时,人类该如何与其共舞?
  • 企业资产管理软件选型全攻略:选对不选贵,落地是核心
  • Win10用户目录迁移翻车实录:我踩过的三个坑和最终解决方案
  • 从保温杯到CPU散热:聊聊不良导体热导率测量的那些事儿
  • 面试邀约率太低?2026年8个简历模板网站推荐:直接填内容就能用
  • 构建实时事件驱动AI预测系统:从流处理到模型服务的架构实践
  • 从图形学老将到NeRF新贵:聊聊Instant-NGP里球谐函数的前世今生