【YOLO26 系列】基于YOLO26火灾检测系统【python源码Pyqt5界面/WEB数据集训练代码】导读本文基于最新YOLO26目标检测模型开发了一套适用于监控场景的火灾检测系统。项目针对火灾场景中的烟雾、火焰两类目标进行检测配套包含数千张标注完成的火灾场景图像数据集支持从数据集标注转换、模型训练到部署的全流程落地。系统同时提供PyQt5桌面GUI界面与Flask Web网页端两种交互方式集成单张图片检测、文件夹批量检测、视频检测、实时摄像头检测四大核心功能支持检测结果保存与报告导出兼具高精度与实时推理能力可广泛应用于森林防火、工业监控、楼宇安防等多种火灾预警场景。演示视频基于yolo26的火灾检测系统一、软件功能演示本项目提供桌面GUI界面和Web网页端两种交互方式核心功能保持一致包含以下五大核心子功能1.1 单张图片检测操作流程点击【 模型选择】按钮加载训练完成的YOLO26火灾检测权重文件点击【️ 图片检测】按钮选择待检测的单张火灾场景图片系统自动完成推理在界面展示检测结果并统计检测信息检测结果示例序号图片名称检测类型检测类别置信度坐标位置1test_001.jpg图片检测fire0.92(35, 120)-(280, 360)2test_001.jpg图片检测smoke0.87(250, 40)-(420, 180)1.2 文件夹批量检测操作流程加载模型权重后点击【 文件夹检测】按钮选择包含多张待检测图片的目标文件夹系统自动批量检测文件夹内所有支持格式的图片并将所有检测结果保存至输出目录自动生成检测结果统计报告批量检测结果统计示例总检测图片数20张检测到火灾目标16张总检测目标数28个fire12个smoke16个1.3 视频文件检测操作流程加载模型权重后点击【 视频检测】按钮选择本地视频文件支持mp4、avi等常见格式系统逐帧进行检测实时在界面展示带检测框的推理画面检测完成后可选择保存带标注的检测视频视频实时检测结果示例序号画面位置检测类型检测类别置信度坐标位置1第128帧视频检测fire0.89(182, 142)-(320, 286)2第128帧视频检测smoke0.78(86, 52)-(220, 168)3第128帧视频检测fire0.65(340, 210)-(412, 298)1.4 实时摄像头检测操作流程确保本地电脑连接可用摄像头加载模型权重点击【 实时摄像头】按钮启动摄像头实时采集系统对摄像头每一帧画面进行实时推理并展示检测结果点击【⏹️ 停止检测】可终止摄像头采集1.5 检测结果保存操作流程完成任意类型的检测后点击【 保存结果】按钮系统自动将带检测框的结果图片/视频保存至配置的输出目录同时导出txt/csv格式的检测结果报告包含所有目标的类别、置信度、坐标信息二、环境搭建本项目基于PyTorch框架开发提供两种环境搭建方式请根据自身情况选择2.1 PyTorch手动安装推荐本项目未包含torch和torchvision需手动安装适配本地电脑CUDA版本的PyTorch官方下载地址如下torch下载torchvision下载若对环境配置不熟悉可参考B站详细安装教程torch环境配置从零开始安装2.2 pip安装其他依赖配置好PyTorch环境后进入项目根目录执行以下命令安装剩余依赖pipinstall-rrequirements.txtrequirements.txt包含的依赖列表aiohttp3.14.1 albumentations2.0.8 ax0.52.0 clip0.2.0 comet_ml3.58.3 ConfigSpace1.2.2 coremltools9.0 dvclive3.49.1 dx_com2.3.0 faster_coco_eval1.7.2 Flask3.1.3 hub_sdk0.0.24 ipython8.12.3 lap0.5.13 matplotlib3.11.0 mct_quantizers1.7.0 MNN3.6.0 mobileclip0.0.1 model_compression_toolkit2.6.0 moviepy2.2.1 pyqt5 # 若使用GUI界面需额外安装2.3 Conda环境安装可选若使用Anaconda管理环境可通过以下命令创建新环境并安装依赖# 创建新环境conda create-nyolo26-firepython3.10-yconda activate yolo26-fire# 安装PyTorch以CUDA11.8为例condainstallpytorch torchvision pytorch-cuda11.8-cpytorch-cnvidia# 安装其他依赖pipinstall-rrequirements.txt三、模型训练、评估、预测3.1 数据集上传说明3.1.1 数据集格式要求本项目使用标准YOLO格式数据集目录结构如下VOCData/ └── VOdevkit/ ├── dataset.yaml # 数据集配置文件 ├── train/ │ ├── images/ # 训练集图片 │ └── labels/ # 训练集标签txt格式 ├── val/ │ ├── images/ # 验证集图片 │ └── labels/ # 验证集标签 └── test/ ├── images/ # 测试集图片 └── labels/ # 测试集标签3.1.2 YOLO格式标签说明YOLO格式中每个图片对应一个同名txt标签文件每一行代表一个目标格式为class_id x_center y_center width height所有坐标均为归一化后的数值范围0~1示例1 0.432 0.356 0.215 0.420 0 0.218 0.126 0.154 0.218本项目中0代表smoke1代表fire3.1.3 从VOC格式转换XML转YOLO格式若数据集为VOC标注格式XML标注文件可使用本项目提供的xml2txt.py脚本完成格式转换完整代码如下importosimportxml.etree.ElementTreeasET# 定义本项目类别顺序categories[smoke,fire]category_to_index{category:indexforindex,categoryinenumerate(categories)}# 替换为实际的XML文件夹路径和输出TXT文件夹路径input_folderr./VOCData/Annotationsoutput_folderr./VOCData/labels# 确保输出文件夹存在os.makedirs(output_folder,exist_okTrue)# 遍历输入文件夹中的所有XML文件forfilenameinos.listdir(input_folder):iffilename.endswith(.xml):xml_pathos.path.join(input_folder,filename)# 解析XML文件treeET.parse(xml_path)roottree.getroot()# 提取图像的尺寸sizeroot.find(size)widthint(size.find(width).text)heightint(size.find(height).text)# 存储目标信息objects[]# 遍历XML中的object标签forobjinroot.findall(object):nameobj.find(name).textifnameincategory_to_index:category_indexcategory_to_index[name]else:continue# 如果name不在指定类别中跳过该objectbndboxobj.find(bndbox)xminint(bndbox.find(xmin).text)yminint(bndbox.find(ymin).text)xmaxint(bndbox.find(xmax).text)ymaxint(bndbox.find(ymax).text)# 转换为中心点坐标和宽高并归一化x_center(xminxmax)/2.0y_center(yminymax)/2.0wxmax-xmin hymax-ymin xx_center/width yy_center/height w_normw/width h_normh/height objects.append(f{category_index}{x}{y}{w_norm}{h_norm})# 输出结果到对应的TXT文件txt_filenameos.path.splitext(filename)[0].txttxt_pathos.path.join(output_folder,txt_filename)withopen(txt_path,w)asf:forobjinobjects:f.write(obj\n)print(VOC格式转换YOLO格式完成)运行前请修改input_folder和output_folder为本地实际路径。3.1.4 数据集划分脚本格式转换完成后使用SplitDataset.py将数据集划分为训练集、验证集、测试集完整代码如下importosimportshutilimportrandom# random.seed(0) # 固定随机种子可开启以保证划分结果可复现defsplit_data(file_path,label_path,new_file_path,train_rate,val_rate,test_rate):imagesos.listdir(file_path)labelsos.listdir(label_path)images_no_ext{os.path.splitext(image)[0]:imageforimageinimages}labels_no_ext{os.path.splitext(label)[0]:labelforlabelinlabels}matched_data[(img,images_no_ext[img],labels_no_ext[img])forimginimages_no_extifimginlabels_no_ext]unmatched_images[imgforimginimages_no_extifimgnotinlabels_no_ext]unmatched_labels[labelforlabelinlabels_no_extiflabelnotinimages_no_ext]ifunmatched_images:print(未匹配的图片文件:)forimginunmatched_images:print(images_no_ext[img])ifunmatched_labels:print(未匹配的标签文件:)forlabelinunmatched_labels:print(labels_no_ext[label])random.shuffle(matched_data)totallen(matched_data)train_datamatched_data[:int(train_rate*total)]val_datamatched_data[int(train_rate*total):int((train_rateval_rate)*total)]test_datamatched_data[int((train_rateval_rate)*total):]# 处理训练集forimg_name,img_file,label_fileintrain_data:old_img_pathos.path.join(file_path,img_file)old_label_pathos.path.join(label_path,label_file)new_img_diros.path.join(new_file_path,train,images)new_label_diros.path.join(new_file_path,train,labels)os.makedirs(new_img_dir,exist_okTrue)os.makedirs(new_label_dir,exist_okTrue)shutil.copy(old_img_path,os.path.join(new_img_dir,img_file))shutil.copy(old_label_path,os.path.join(new_label_dir,label_file))# 处理验证集forimg_name,img_file,label_fileinval_data:old_img_pathos.path.join(file_path,img_file)old_label_pathos.path.join(label_path,label_file)new_img_diros.path.join(new_file_path,val,images)new_label_diros.path.join(new_file_path,val,labels)os.makedirs(new_img_dir,exist_okTrue)os.makedirs(new_label_dir,exist_okTrue)shutil.copy(old_img_path,os.path.join(new_img_dir,img_file))shutil.copy(old_label_path,os.path.join(new_label_dir,label_file))# 处理测试集forimg_name,img_file,label_fileintest_data:old_img_pathos.path.join(file_path,img_file)old_label_pathos.path.join(label_path,label_file)new_img_diros.path.join(new_file_path,test,images)new_label_diros.path.join(new_file_path,test,labels)os.makedirs(new_img_dir,exist_okTrue)os.makedirs(new_label_dir,exist_okTrue)shutil.copy(old_img_path,os.path.join(new_img_dir,img_file))shutil.copy(old_label_path,os.path.join(new_label_dir,label_file))print(数据集划分完成)if__name____main__:# 修改为你本地的实际路径file_pathr./VOCData/images# 所有图片所在文件夹label_pathr./VOCData/labels# 所有标签所在文件夹new_file_pathr./VOCData/VOdevkit# 划分后数据存放位置# 划分比例80%训练集10%验证集10%测试集split_data(file_path,label_path,new_file_path,train_rate0.8,val_rate0.1,test_rate0.1)运行脚本后即可生成符合YOLO要求的数据集目录结构。3.1.5 配置数据集yaml文件最后在VOCData/VOdevkit目录下创建dataset.yaml内容如下适配本项目火灾检测场景# 数据集路径相对于项目根目录path:../VOCData/VOdevkittrain:train/images# 训练集图片路径val:val/images# 验证集图片路径test:test/images# 测试集图片路径可选# 类别信息nc:2names:[smoke,fire]3.2 模型训练数据集准备完成后即可开始训练核心训练代码train.py如下importwarnings warnings.filterwarnings(ignore)fromultralyticsimportYOLOif__name____main__:# 加载YOLO26n预训练模型modelYOLO(yolo26n.pt)# 开始训练resultsmodel.train(datar./VOCData/VOdevkit/dataset.yaml,# 数据集配置文件路径epochs100,# 训练轮次总数batch16,# 批量大小根据显卡显存调整imgsz640,# 训练输入图像尺寸workers8,# 数据加载线程数device0,# 训练设备GPU填0/1/...CPU填cpuoptimizerSGD,# 优化器可选auto, SGD, Adam, AdamWampFalse,# 自动混合精度训练cacheFalse# 缓存数据集到内存大内存服务器可开启)训练参数说明参数说明推荐值epochs训练总轮次火灾检测推荐100~150batch批量大小需根据显卡显存调整8G显存推荐816G显存推荐16imgsz输入图像尺寸通用场景640小目标检测可调整为800workers数据加载线程数一般设置为CPU核心数的一半device训练设备支持多GPU并行有NVIDIA显卡使用GPU填0无显卡填cpuamp自动混合精度训练可减少显存占用、加快训练速度大部分场景可开启启动训练命令python train.py训练启动成功后日志会输出模型信息、数据加载进度随后开始逐轮训练。3.3 训练结果评估训练完成后所有训练结果将保存至runs/detect/train/目录下核心内容如下文件名/文件夹说明weights/保存训练得到的权重文件├─best.pt验证集表现最优的权重推荐实际部署使用├─last.pt最后一轮训练结束时的权重└─epoch*.pt每N轮训练保存的阶段性权重需在训练参数中配置args.yaml本次训练的完整参数配置记录results.csv每轮训练的精度、损失等指标数值记录results.png训练指标变化曲线可视化图如损失曲线、精度曲线confusion_matrix.png混淆矩阵展示模型对各类别的分类情况confusion_matrix_normalized.png归一化混淆矩阵消除类别样本数量差异的影响BoxF1_curve.pngF1分数曲线反映模型在不同置信度阈值下的综合性能BoxPR_curve.pngPR曲线展示精确率与召回率的权衡关系BoxP_curve.png精确率曲线反映不同置信度阈值下模型的精确率变化BoxR_curve.png召回率曲线反映不同置信度阈值下模型的召回率变化labels.jpg数据集标签分布可视化展示各类别样本数量占比train_batch*.jpg训练批次样本可视化展示数据增强后的效果val_batch*_labels.jpg验证集标签可视化展示验证集原始标注情况val_batch*_pred.jpg验证集预测结果可视化对比模型预测与原始标注的差异可使用项目提供的val.py脚本在验证集上评估模型性能fromultralyticsimportYOLOimportnumpyasnpfromdatetimeimportdatetime# 加载训练完成的最优权重modelYOLO(rruns/detect/train/weights/best.pt)# 在验证集上进行评估metricsmodel.val(datarVOCData/VOdevkit/dataset.yaml)# 计算均值精确率、均值召回率mean_pnp.mean(metrics.box.p)mean_rnp.mean(metrics.box.r)# 整理评估结果content[]content.append(*60)content.append(f验证时间{datetime.now().strftime(%Y-%m-%d %H:%M:%S)})content.append(*60)content.append(f整体 mAP50:{metrics.box.map50:.4f})content.append(f整体 mAP50-95:{metrics.box.map:.4f})content.append(f平均 Precision:{mean_p:.4f})content.append(f平均 Recall:{mean_r:.4f})content.append(-*60)content.append(f{类别:12}{Precision:12}{Recall:12}{AP50:12})content.append(-*60)# 输出每个类别的指标fori,class_nameinenumerate([smoke,fire]):ap50metrics.box.ap50[i]precisionmetrics.box.p[i]recallmetrics.box.r[i]content.append(f{class_name:12}{precision:12.4f}{recall:12.4f}{ap50:12.4f})# 保存结果到文件os.makedirs(results,exist_okTrue)withopen(results/detection_report.txt,w,encodingutf-8)asf:f.write(\n.join(content))print(\n.join(content))执行评估命令python val.py3.4 模型预测本项目支持单张图片、文件夹批量、视频、实时摄像头多种预测方式单张图片预测示例代码如下fromultralyticsimportYOLOimportos# 获取项目根目录rootos.getcwd()# 加载训练好的最优模型modelYOLO(rf{root}/runs/detect/train/weights/best.pt)# 待预测图片路径修改为本地实际路径sourcerimg_video/test_imgs/test_fire_01.jpg# 运行推理resultsmodel.predict(source,saveTrue,# 自动保存结果到 runs/detect 目录conf0.45,# 置信度阈值过滤低置信度预测结果iou0.25# NMS IOU阈值控制重复框的合并)# 弹窗展示检测结果results[0].show()# 自定义保存路径os.makedirs(results,exist_okTrue)results[0].save(filenamerresults/test_fire_01_result.jpg)启动预测命令python predict.py四、项目目录结构基于YOLO26火灾检测系统/ │ ├── README.md # 项目说明文档 ├── requirements.txt # Python依赖列表 ├── yolo26n.pt # YOLO26n预训练权重 │ ├── train.py # 模型训练入口脚本 ├── predict.py # 模型预测/推理入口脚本 ├── val.py # 模型验证/评估脚本 │ ├── UI/ # 界面相关代码 │ ├── web.py # Flask/Web后端主程序 │ ├── GUI.py # PyQt5 GUI界面逻辑 │ ├── config.yaml # UI全局配置文件 │ ├── user.txt # 用户信息存储 │ ├── templates/ │ │ ├── index.html # Web主页面 │ │ └── login.html # Web登录页面 │ └── models/ │ └── best.pt # UI使用的最优模型权重 │ ├── img_video/ # 测试素材目录 │ ├── test_imgs/ # 测试图片 │ │ ├── test_001.jpg │ │ └── ... │ └── test_MP4.mp4 # 测试视频 │ ├── results/ # 推理结果输出目录 │ ├── runs/ # 训练运行记录 │ └── detect/train/ │ ├── args.yaml # 训练参数配置 │ ├── results.csv # 训练指标记录 │ ├── results.png # 训练指标曲线图 │ ├── confusion_matrix.png # 混淆矩阵 │ ├── ... # 各类指标图表 │ └── weights/ │ ├── best.pt # 最优权重 │ └── last.pt # 最后一轮权重 │ ├── VOCData/ # 数据集处理工具 │ ├── SplitDataset.py # 数据集划分脚本 │ ├── ViewCategory.py # 类别统计脚本 │ ├── xml2txt.py # VOC XML转YOLO TXT格式 │ ├── pic_to_mp4.py # 图片转视频脚本 │ └── VOdevkit/ │ ├── dataset.yaml # 数据集配置文件 │ └── 数据集单独下载.txt # 数据集下载说明 │ ├── ultralytics/ # Ultralytics YOLO框架源码 │ ├── cfg/ # 模型和数据集配置 │ ├── data/ # 数据加载和增强 │ ├── engine/ # 训练/预测/验证引擎 │ ├── models/ # 模型定义 │ └── ... │ └── .idea/ # PyCharm IDE配置可忽略五、项目README摘要本项目是基于YOLO26目标检测模型开发的火灾检测系统包含完整的数据集处理、模型训练、桌面GUI部署、Web部署全流程代码。项目核心特点基于最新YOLO26模型兼顾检测精度与推理速度支持烟雾、火焰两类火灾相关目标的精准检测同时提供PyQt5桌面端和Flask Web端两种交互方式集成单图检测、文件夹批量检测、视频检测、实时摄像头检测四种模式支持检测结果可视化保存与结构化报告导出提供完整的数据集处理脚本支持VOC格式转YOLO格式可快速适配自定义数据集使用流程按照第二章说明配置Python运行环境按照第三章说明准备并配置火灾检测数据集运行train.py启动模型训练训练完成后运行python GUI.py启动桌面界面或运行python web.py启动Web服务文末互动区如果您觉得本项目有帮助欢迎点击【分享】【推荐】支持我们如需获取完整项目代码与数据集可回复基于YOLO26火灾获取。