简介基于YOLOv7的火焰与烟雾检测方案面向计算机视觉开发者、消防预警领域研究者、安全监控项目人员以及正在入门目标检测的学员适合作为模型训练、推理验证和二次开发的参考基础。资源包含训练好的模型权重下载后可直接加载推理同时提供1000张已标注的火焰与烟雾图片标注格式分为xml和txt两种类别名为fire和smoke整体基于PyTorch框架代码使用Python编写。压缩包共188个文件约659MB文件类型涵盖pt权重、py脚本、yaml配置、ipynb示例、png示意图以及xml/txt标注文件等并包含训练日志事件文件与Dockerfile便于查看训练流程、修改参数、复现环境并完成验证。目前已有744人学习下载。借助这份资源可快速搭建火焰烟雾检测流程节省标注与训练时间适合在消防监控、园区预警等场景中做实验验证或二次开发落地参考。1. 火焰和烟雾检测:一张标注好的数据集能让小白直接做出可用的YOLOv7报警模型做安防和工业视觉的同行应该都有这种体验火焰和烟雾检测看着比行人检测简单真正上手才发现全是坑。火焰没有固定形状烟雾是半透明的白天和晚上同一个火苗在画面里的特征完全不一样。很多算法在公开测试集上准确率不错一放到园区监控或者工厂车间里就疯狂误报——把红色卡车报成火焰把蒸汽报成烟雾。YOLOv7在这个任务上有一个很实际的优势它对小目标的召回率比前代有明显提升而早期火焰往往就是画面里几十个像素的小区域。再配合一套训练好的权重和千张标注级别的数据集即使你没做过目标检测也能在一天之内跑通推理在几天之内把模型微调成能用的报警系统。这篇笔记不聊论文公式只讲落地。我假设你的目标非常明确手里有一段监控视频或者一个摄像头画面你希望用一个本地或边缘设备上的模型对火焰和烟雾实时给框并报警。为了这个目标你会遇到模型怎么选、权重怎么用、标注数据怎么检查、微调参数怎么设、误报怎么压五个问题。下面我把每一步的做法、参数和踩过的坑按顺序讲清楚。2. 搭建YOLOv7推理环境从权重文件到第一张检测图全程避坑的实操步骤2.1 为什么选择YOLOv7而不是YOLOv5或YOLOv8做火焰烟雾检测先说选型。火焰烟雾检测和通用目标检测有个本质差异烟雾是极端非刚性目标它会变形、会分裂、还会逐渐透明化。YOLOv5的Backbone对于这种纹理较弱的目标容易漏检YOLOv8虽然精度高但对显存的要求也相应提高。YOLOv7在MS COCO上的AP和YOLOv8接近但模型体积和推理延迟更低——这在边缘设备上很关键因为火焰检测通常需要长时间挂在后台跑发热和功耗是实际问题。另一个理由是E-ELAN结构。YOLOv7的Backbone通过扩展和混洗不同通道的特征在保持计算量不暴涨的前提下增强了梯度路径。实测下来的体感是当烟雾浓度很低、背景又有树丛或水汽干扰时YOLOv7比v5更容易给出较低的置信度框而不是直接漏掉。这对报警系统很重要——漏报比误报危险得多宁可多报几个疑似目标最终由人去判断。此外YOLOv7支持训练时用普通的RTX 30系显卡完成推理时导出为TensorRT或ONNX能直接跑在Jetson Nano这类低功耗设备上。整套链路成熟网上踩坑案例多问题容易搜到。2.2 环境清单与安装命令CUDA、PyTorch、YOLOv7仓库一次装到位我用的环境是Windows 11和Ubuntu 20.04双系统以下命令在两套系统下均验证过。需要说明的是YOLOv7的作者仓库对PyTorch版本有适配范围要求不要盲目装最新版我建议锁定在PyTorch 1.12到2.0之间新版PyTorch因为内部API调整有时会在loss计算时报兼容性错误。# 创建虚拟环境Python版本推荐3.8或3.9 conda create -n yolo7 python3.9 -y conda activate yolo7 # 安装CUDA版PyTorch # 这里使用CUDA 11.8对应的版本兼容性最稳 pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 # 克隆YOLOv7官方仓库 git clone https://github.com/WongKinYiu/yolov7.git cd yolov7 # 安装依赖 pip install -r requirements.txt逻辑说明先建立独立的conda环境避免和系统其他Python项目互相污染依赖这一步的重要性会在后面踩坑章节专门展开。CUDA版的PyTorch决定了YOLOv7能否调用GPU做推理和训练如果装成CPU版后面跑训练会慢到无法接受。需要重点关注的是torch版本和CUDA版本的匹配。如果本机显卡驱动较老可以把cu117换成cu113但不要换成cu118以上的版本否则有可能触发底层的cuDNN不兼容现象是推理时偶尔报CUDA error: device-side assert triggered这个报错最迷惑人的地方在于它不总出现容易被忽略。2.3 放置权重文件并跑通检测命令的完整流程训练好的权重文件一般是用YOLOv7仓库里的yolov7.pt通用预训练继续在火焰烟雾数据集上微调得到的。拿到权重文件后需要确认文件格式是PyTorch的.pt或.ckpt。作者仓库的官方权重是.pt自定义权重有时会保存为.pth或.ckpt都可用只要在加载时把文件名后缀写对即可。# 正确放置训练好的权重 mkdir -p weights # 假设你已经将权重文件下载到本地这里把它移动到weights目录 cp /path/to/your/yolov7-fire.pt weights/ # 跑第一张火焰检测图 python detect.py --weights weights/yolov7-fire.pt --source test_fire.jpg --conf-thres 0.5 --iou-thres 0.45 --device 0逻辑说明source参数可以是图片路径、视频路径、摄像头索引或文件夹路径YOLOv7会自动识别。图片推理结果默认保存在runs/detect/exp目录下如果多次运行同一命令则依次生成exp2、exp3。参数说明里优先级最高的是--conf-thres它代表检测框的可信度阈值。做火焰烟雾检测我习惯先把阈值设到0.5左右跑一遍目的不是看输出效果而是看有没有漏检。如果漏检明显先降到0.25确认模型对目标的定位能力再结合后续的依概率融合策略或背景差分方法提高置信度。这个逻辑新手容易搞反——直接设0.8只会让输出图看起来更干净但很多小火苗其实已经被当成背景过滤掉了。2.4 验证权重效果用视频测试观察稳定性和误报倾向图片只能验证模型有没有被正确加载火焰烟雾检测最需要的是视频测试。因为在视频序列中真正的火焰会有闪烁频率、烟雾会有扩散趋势这些时序特征能帮我们判断模型是否真的学到了目标特性还是只是学会了颜色纹理。# 视频推理检测结果写入runs/detect/exp/ python detect.py --weights weights/yolov7-fire.pt --source test_video.mp4 --conf-thres 0.3 --device 0 --project results --name video-test --save-txt --save-conf逻辑说明这里把--save-txt和--save-conf同时打开目的是把每一帧检测到的目标类别、置信度、边界框坐标写入同名txt文件。后续做报警逻辑时这些数据可以直接被python脚本读取判断火焰是否存在不必再重复推理一次。执行这个命令时观察三个点第一对真实火焰的检测是否持续稳定中间不能出现连续十几帧丢框的现象第二对红灯、红色车漆、晚霞这类接近火焰颜色物体的反应——如果都报出来了说明模型过拟合颜色特征第三对蒸汽、炊烟、雾气的误报比例。我通常会在测试视频里混入一段夜晚的城市红灯素材如果误报框超过5%后面微调时就要考虑提高难例挖掘比例。2.5 设备选择与推理速度边界火焰检测对延迟的容忍度比大多数视觉任务高因为火焰从起火到蔓延至少需要几十秒但报警系统仍然希望推理单帧小于100ms否则在多路摄像头场景中GPU会被占满而无法扩展。我分别在Jetson Nano和RTX 3060上做过测试。RTX 3060上用416分辨率推理batch size为1FP16模式下速度约6ms一帧占用显存不到1.5GB这个余量足够同时开视频解码和报警线程。Jetson Nano用TensorRT FP16加速后单帧约25ms也够用。如果设备比Jetson Nano还弱建议不要用YOLOv7原版而是将输入分辨率降到320并关闭一半以上数据增强做剪枝后的模型蒸馏否则延迟会 превысить1秒并出现明显发热。3. 理解你的数据集1000张火焰烟雾标注图的内部结构与检查方法3.1 标注文件格式YOLOv7需要什么样的txt标签拿到标注好的数据集之后你需要确认它的格式。YOLOv7的训练格式与YOLOv5一致即每张图片对应一个同名的txt文件txt内每行代表一个目标框格式为class_id x_center y_center width height。这里的坐标是归一化后的数值范围在0到1之间不是像素坐标。# 这张图里有2个火焰实例和1个烟雾实例 # 格式类别ID 中心点x 中心点y 框宽 框高均为归一化值 0 0.521093 0.620370 0.134375 0.201852 0 0.823437 0.638889 0.093750 0.154630 1 0.701563 0.770370 0.128125 0.203704强调一个常见错误容易导致训练直接崩溃YOLOv7的类别ID从0开始编号。如果数据集定义了类别顺序为[fire, smoke]那么fire的ID0smoke的ID1对应的names配置也是0: fire, 1: smoke。有些标注工具导出时会从1计数如果沿用会导致类别错位特征完全学偏训练完成后一个火焰都检不出来。另一个值得检查的关键点是框的宽高是否越界。由于是归一化坐标合法的x_center和y_center必须在(0,1)之间width和height也必须在(0,1)之间。若标注工具处理不慎坐标值恰好为1.000000归一化后边界刚好压在图像边缘训练时边界框就被当作无效框丢弃导致该目标被静默忽略。可以用下面的python脚本检查所有标注文件。import os def check_labels(label_dir, img_dir): errors [] for label_file in os.listdir(label_dir): if not label_file.endswith(.txt): continue # 跳过只有一个类别文件的空标注空标注是合法的负样本 if os.path.getsize(os.path.join(label_dir, label_file)) 0: continue with open(os.path.join(label_dir, label_file)) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: errors.append(f{label_file}: 列数不是5) continue try: cls, cx, cy, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) except ValueError: errors.append(f{label_file}: 数值转换失败 - {line}) continue # 检查坐标范围 if not (0 cx 1 and 0 cy 1): errors.append(f{label_file}: 中心点越界 - {line}) if not (0 w 1 and 0 h 1): errors.append(f{label_file}: 框尺寸越界 - {line}) if errors: print(f发现 {len(errors)} 个错误:) for err in errors[:50]: print(err) else: print(所有标注坐标合法) # 使用示例 check_labels(path/to/labels, path/to/images)这段脚本的关键逻辑是逐行解析标注坐标并逐一验证边界条件。执行时重点不是看脚本跑完是否打印了错误而是看是否存在坐标为0.000000的情况。例如0 0.0 0.620370 0.134375 0.201852看起来是中心点x在边界上但在YOLO格式中x_center0意味着框的左边缘重叠在图像左边界之外而实际标注时不可能有物体中心正好出现在像素坐标0上这通常是标注工具导出bug的迹象需要删除或修正对应样本。3.2 数据集的三种拆分模式固定划分与跨视频验证的区别1000张标注图不算大拆分方式直接影响模型的泛化能力。常见的划分方式是按照80%训练集、10%验证集、10%测试集随机打乱文件。这种拆分方式实现起来最快但如果这1000张图来自同一批视频帧随机拆分会导致训练集和验证集存在大量相似帧验证集的mAP虚高。import os import random from collections import defaultdict # 把图片和标签配对按视频来源分组后划分 image_dir path/to/images label_dir path/to/labels output_dir path/to/split # 假设文件名格式为 video1_00123.jpg 形式按前缀分组 videos defaultdict(list) for img_name in os.listdir(image_dir): if not img_name.endswith(.jpg): continue video_id img_name.rsplit(_, 1)[0] videos[video_id].append(img_name) # 按视频分组划分保证同视频的所有帧只出现在一个集合中 all_videos list(videos.keys()) random.shuffle(all_videos) train_vids all_videos[:int(0.8 * len(all_videos))] val_vids all_videos[int(0.8 * len(all_videos)):int(0.9 * len(all_videos))] test_vids all_videos[int(0.9 * len(all_videos)):] # 写入train.txt / val.txt / test.txt 文件列表 with open(os.path.join(output_dir, train.txt), w) as f: for vid in train_vids: for img_name in videos[vid]: f.write(os.path.join(image_dir, img_name) \n) # val.txt 和 test.txt 依此类推这里的关键点是按视频分组而不是按帧随机划分。火焰数据集里常见的情况是同一段火灾视频连续抽帧相邻帧高度相似。如果随机划分模型相当于见过验证集里的大部分像素分布验证结果虚高部署时才发现新场景漏检严重。3.3 检查类别平衡火焰和烟雾的样本比率要调到多少1000张标注图中火焰和烟雾的实例数往往并不均衡。我见过一个数据集火焰框有1200个烟雾框只有350个训练出来的模型对烟雾召回率非常低——因为烟雾框被当成难例抑制模型学会了忽略它。# 快速统计每个类别的目标框数量 # 适用于Linux和macOS环境Windows下可以用python脚本代替 cat path/to/labels/*.txt | cut -d -f1 | sort | uniq -c运行后如果是0 1200和1 350烟雾类别严重偏少。常见的补救做法有两种第一种是对烟雾类别做数据增强对包含烟雾的图片做水平翻转、随机旋转、亮度调整扩充到接近火焰的数量第二种是在数据加载时引入类别权重让损失函数在计算时给烟雾更高的惩罚权重。我个人更偏向第一种因为类别权重改变了损失分布有时会导致训练波动变大。3.4 负样本的重要性为什么只有正样本的数据集会不断误报如果数据集里所有图片都是火焰或烟雾出现的画面模型的决策边界会天然放大。部署后一块红色的广告牌、一根排气管的蒸汽都会被当作目标输出。因此向数据集里加入无目标的负样本是必要的。建议每5到10张正样本配1张负样本。负样本的来源可以是监控视频里没有火焰的帧、黄昏的红云场景、工厂排放的水蒸气画面。加入负样本后需要重新检查类别平衡因为负样本只是图片不产生标注框所以只需要注意不要加入太多导致正样本占比过低否则模型会偏向不检测。3.5 数据增强的合理范围Mosaic和MixUp对火焰烟雾检测的影响YOLOv7在训练时默认启用Mosaic增强它把四张图拼成一张训练。对于火焰和烟雾检测我建议训练前期启用Mosaic后期关闭或降低概率。原因是火焰边缘是重要的识别特征Mosaic裁剪会截断火焰边缘导致小火焰目标更难被定位。具体参数在YOLOv7的train.py中和hyp.scratch.yaml中调整。在hyp.scratch.yaml里mosaic设置为1.0表示每批图都执行Mosaic在训练最后20个epoch将其改为0.3有助于模型在接近真实分布的数据上精修。# hyp.scratch.yaml 中关于增强的常见配置片段 mosaic: 1.0 mixup: 0.15 fliplr: 0.5 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4参数解读mixup将两张图按透明度叠加火焰目标会变透明这个增强对烟雾检测有一定正向作用因为烟雾本身就是半透明的但建议保持在0.1到0.2之间过大容易让模型对小火焰目标产生幻觉。fliplr水平翻转对火焰检测是安全的因为火焰是形态特征不依赖左右方向。hsv色相调整的h值不要超过0.02否则红色的火苗可能被扭曲成紫色或绿色破坏颜色语义。4. 用1000张标注数据微调YOLOv7训练命令、关键参数与效果验证4.1 准备数据和配置文件训练前需要三个文件train.txt、val.txt和data.yaml。data.yaml中声明了类别名称、类别数量和训练/验证数据路径。这个文件看似简单但路径写错导致的报错频率极高。# data.yaml train: /home/user/yolov7/datasets/fire/train.txt val: /home/user/yolov7/datasets/fire/val.txt test: /home/user/yolov7/datasets/fire/test.txt nc: 2 names: [fire, smoke]这里要留意的配置细节是train字段指向的是包含图片路径列表的txt文件而不是图片目录本身这一点和YOLOv5官方文档一致。绝对路径在训练时最不容易出错不建议写相对路径。nc必须等于标注格式中的最大类ID加1如果你的标注里只有0和1两个类但nc写成1训练时读取该类标注会直接报错。4.2 加载预训练权重做迁移学习的训练命令使用训练好的火焰烟雾权重做charm点在自有数据集上微调收敛速度远快于从零训练。常见的做法是把它当作--weights参数传入同时配合--freeze参数冻结骨干层使前几层不在反向传播时更新。python train.py --workers 4 --batch-size 8 --img 640 640 \ --data data.yaml --weights weights/yolov7-fire.pt \ --cfg cfg/training/yolov7.yaml --name fire-finetune \ --hyp data/hyp.scratch.yaml --epochs 150 --freeze 10参数说明--img 640 640是训练输入分辨率如果推理时会用416训练时可以降到416以加快速度。不过火焰目标偏小我建议保持640。--batch-size 8这个值需要根据显存微调RTX 3060 12GB跑8batch的640分辨率大约占用8.5GB如果显存只有6GB降到4。--freeze 10表示冻结前10层即Backbone的大部分浅层这些层提取的是通用低级特征冻结它们可防止数据集太小时破坏已学好的能力同时减少反向传播的显存开销。4.3 学习率和epoch的推荐设置与调整方法如果是在已有的火焰烟雾权重上微调初始学习率不要设太高我一般用0.001到0.002之间。YOLOv7默认使用余弦退火调度器它会从初始学习率波动下降至接近0。数据集只有1000张时学习率过高很容易在刚起步就把预训练特征冲到崩溃表现为前两个epoch的loss不降反升。# 训练时观察输出日志确认两个关键指标的变化趋势 # 关注日志末尾的 [fire] 类和 [smoke] 类的 mAP0.5 数值训练过程中我建议每10个epoch记录一次验证集mAP。如果mAP上升缓慢检查train loss是否降到5以下loss长期在7以上说明模型没有有效学习。此时可以尝试把--hyp中的lr0从默认0.01改为0.005以及确认数据增强中的mosaic是否导致小目标被截断。150个epoch对于1000张图是足够的更多epoch可能出现验证集mAP下降的过拟合信号这时早停即可。4.4 训练中常见状态解读Loss值多少算正常什么时候可以停下来YOLOv7训练日志里包含box_loss,obj_loss,cls_loss三个指标。火焰和烟雾是两类形态差异大的目标box_loss的数值主要衡量框的回归误差obj_loss衡量前景和背景的判别能力。如果obj_loss一直在0.2以上降不下去大概率是负样本不足导致模型对背景的抑制差。以我的经验数据集质量正常、1000张图微调150个epoch后验证集mAP0.5能达到0.85以上。mAP在0.7以下时先别急着调参检查标注框是否贴合目标边缘常见问题是标注框把火焰周边光晕也框进去了导致模型学习到的框偏大。提示训练结束后的runs/train/fire-finetune/weights/目录下会生成best.pt和last.pt。best.pt是验证集mAP最高的权重用于部署推理last.pt是最后一个epoch的权重用于断点续训。不要两个搞混了。4.5 使用训练好的权重推理并用mAP值评估模型训练完成后的验证方式不能只看训练日志要跑一遍独立的测试集。YOLOv7仓库提供了test.py用于评估验证集或测试集的mAP指标。python test.py --data data.yaml --weights runs/train/fire-finetune/weights/best.pt --img 640 --conf-thres 0.25 --iou-thres 0.5 --task val逻辑说明--task val表示读取data.yaml中val字段指定的验证集图片输出每个类别的mAP0.5和mAP0.5:0.95。这里conf-thres设为0.25比推理时的0.5低是为了把模型的实际召回能力评估出来推理时可以再把阈值提回0.5来压误报。5. 火焰烟雾检测避坑指南6条从训练到部署的真实踩坑记录5.1 现象训练时报错IndexError: index 2 is out of bounds for axis 0 with size 2训练刚开始就崩溃报错指向上面的行。刚开始检查的人往往以为网络结构有问题反复修改cfg文件问题不在那里。真实原因几乎都是数据集中存在类别ID超过nc值的标注。比如nc: 2但某个txt标注里写了2class索引越界。解决用前面章节中的python检查脚本扫描全部标注文件对错误行直接筛选掉或重新标注。先在原始标注目录跑一遍脚本所有报越界的txt逐一手工修正再训练。5.2 现象训练loss正常下降但推理时对红色物体大量误报模型把红色卡车、红色横幅、红色衣服都框成火焰这是火焰检测最常见的翻车现场。原因是数据集里的火焰样本多为橙红色模型学到的主要特征是颜色而不是纹理和动态形态。烟雾误报则是模型把白色水汽、白色墙壁高光区识别成烟雾。解决将该类误报图片加入训练集负样本中并用较低置信度阈值筛选出疑似目标的负样本。具体做法是先用当前权重对误报图片推理把置信度在0.4到0.7之间的框截取出来人工确认为误报后切成对应的负样本加入训练集。这个步骤就是常说的hard negative mining。坚持做两轮误报率能明显下降。5.3 现象每次训练结果差异很大有的权重很好用有的完全不能用在数据集较小的情况下随机初始化、增强参数和数据加载顺序会显著影响结果。尤其使用Mosaic增强时每次组合的图片不同模型整体走向会偏移。这不是环境问题而是小数据集训练的本质差异。解决一种办法是调整--epochs以找到稳定的收敛区间另一种是训练3次取验证集mAP最高的一次权重作为发布版本。少数几次训练结果差异如果特别大检查是否在训练过程中开了随机增强但未提供固定种子建议在train.py中设置--seed 42。5.4 现象模型在白天良好晚上连续漏检火灾大部分在夜间发生使这个场景极具讽刺。原因是夜间的火焰周围亮度低传统数据增强方法加大对比度时火焰区域被压暗和背景融为一体。数据集里夜间样本少且标注不完整。解决在数据集中单独加入夜间火灾图片并在训练时提高hsv_v的增强范围使模型适应夜间低照度。测试时把夜间视频作为专门的验证集不要只看综合mAP。夜间样本不足时也可用RetinaNet的亮度增强方式对白天火焰图做压暗转换。5.5 现象推理正常但视频检测延迟越来越高模型推理延迟逐渐变长最终程序卡死。这个不是模型问题而是推理代码中没有显存清理视频推理时每帧结果被保留显存最终被占满。YOLOv7官方detect.py没有这个问题但如果用自定义的api脚本就会踩坑。解决完成一次推理后调用torch.cuda.empty_cache()或使用with torch.no_grad():包裹推理代码避免梯度图被保存。如果检测逻辑嵌在长时间运行的循环里建议将推理结果用队列发送而不是同步处理。5.6 现象输出框抖动但未做任何修改模型权重没变、输入图片没变、输出框每帧都在轻微变化。这种情况常见于视频输入时因为MP4解码的帧存在delta帧的压缩噪声某些帧在火焰边缘的像素值有细小波动。经过正常卷积后这些波动被放大导致框坐标出现像素级别的跳变。解决在送入模型前对连续两帧做加权平均或用OpenCV的accumulateWeighted()做背景建模。大多数情况下框抖动不影响报警功能但如果把框输出到像素级坐标的机械臂控制就需要用卡尔曼滤波做平滑。注意不要通过提升置信度阈值来减少抖动这样只会让帧率降低和漏检增加。6. 训练到落地之间的事提高小火焰召回的使用技巧与部署检查网络训练完之后距离一个真正可用的火焰烟雾检测系统还有几步。这里把最值得投入的三件事展开讲它们能直接提升最终现场效果。第一件是调整推理输入分辨率。训练时用的640分辨率推理时可以降到512或416。火焰烟雾是开放域目标分辨率降低后小目标会变得更小但换来的是更高帧率。我的经验是固定摄像头画面场景下416足够球机控制画面建议保留640所以先测量再设计。第二件是数据层面的技巧——把视频抽帧改为滑动窗口连续采集而不是每隔几秒抽1帧。1000张标注图如果不连续火焰的从小到大的变化过程被割裂模型不容易学到火焰成长早期的特征。重新标注时建议在火焰刚出现的头3到5秒密集抽帧这个阶段是报警系统最关注的早期阶段。第三件值得做的是检测结果的后处理。只靠置信度阈值直接报警误报无法压到最低。我习惯在detect.py的基础上增加一个简单的时间维滤波一帧检测到火焰不立刻报警连续三帧都检测到且框位置重叠区域超过上一帧面积的50%才触发报警。这个办法能过滤掉闪电、屏幕闪烁等单帧干扰而对真实火焰的报警延迟不到0.5秒。为了验证这套流程的最终效果我的固定步骤是用一段30分钟的夜间园区监控视频作为验收样本里面包含一个点火实验的真实火焰、一辆夜间经过的红色轿车、路灯下的水雾蒸汽。要求是真实火焰在出现后5秒内必报全程误报不超过2次。如果达不到优先回去调置信度阈值和时间维滤波的参数而不是重新训练——多数情况下模型本身已经够用是阈值化和后处理没有配合好。另外把路侧常见干扰源整理成一张表在验收时逐项过一遍能比较客观地判断模型会不会在关键场合翻车。干扰源模型误报概率建议处理方法红色车灯或红色卡车中加入负样本训练后做形态学后处理落日晚霞中分析框内纹理低纹理区域降权工业水蒸气高加入时间维滤波多帧确认后报警玻璃反射光低一般可通过置信度阈值过滤光源闪烁低多帧框重叠判断最后一个习惯是不要只看mAP这个数字就决定上线。mAP对火焰烟雾检测的指导意义有限它把每张图的检测结果做平均但如果白天误报被晚间漏检抵消综合mAP看着还行实际上线后会发现晚间安全性不达标。把测试集按白天、夜晚、阴天、室内、室外拆开分别报mAP才是能支撑决策的数据。希望这篇实战笔记帮你避开那些我已经趟过的坑。火焰和烟雾检测不是一个遥不可及的算法研究课题用好YOLOv7加一套质量达标的标注数据配合合理的阈值和后处理完全可以做成一个在真实场景中稳定工作的报警系统。如果训练和部署过程中还有拿不准的地方把这些参数的调整日志保留下来对比着看也许比再跑一轮训更有效。本文还有配套的精品资源点击获取