YOLOv5火灾检测实操指南:从权重推理到微调避坑
简介面向准备毕业设计或目标检测实战的开发者这份YOLOv5火灾与烟雾检测资源提供可直接运行的完整方案。资源包内含训练权重.pt、Python推理脚本.py以及示例图片.jpg并附带预测结果图便于用户快速验证模型效果也可作为论文实验环节的参考基线。压缩包共4个文件整体大小仅4.86MB轻量易下载适合快速入门YOLOv5在安全监测场景下的应用。该资源已受到221人关注学习热度可观。对于需要完成火灾检测相关课题的高校学生可借助已训练好的best.pt权重与推理代码跳过繁重的训练环节直接开展模型测试、结果可视化和指标分析有效缩短毕业设计周期。1. 用别人的训练权重跑通火灾检测先别急着训练拿到一份带best.pt权重的YOLOv5火灾烟雾检测资源第一反应不应该是立刻去搜集数据集、从头训练而是先把这个权重当成一个“黑匣子”跑一次推理。这个v5_fire_smoke.zip压缩包里恰好就有推理代码fs_infer.py、示例图片fire_000824.jpg和预测结果results.jpg正好完整演示了“加载权重 → 传入图片 → 输出检测框”的闭环。对准备毕业设计的同学来说最省力、也最不容易翻车的路径是先用这份现成权重把检测效果跑出来再搞清楚如何换成你自己的数据集做微调。这篇笔记我会按“推理 → 结果解读 → 数据准备 → 超参数调整 → 避坑 → 进阶移植”的顺序把每一步的实操细节和我的血泪经验都摊开讲。2. 跑通推理代码从一行命令到看懂输出对于一份开源YOLOv5资源最核心的落地动作是把fs_infer.py运行起来。这份代码解决的关键问题是你不需要配置训练环境、不需要准备标注数据集只需要有best.pt权重文件和一张待检测图片就能立刻得到火灾烟雾的边界框结果。在实际项目中这种“即时推理”能力通常用于摄像头实时检测或巡检图片筛查而毕业设计里更多是先用它拿到可视化结果截图证明方案可行。2. 推理脚步读代码、装环境、跑通它先说运行前提。YOLOv5 的推理依赖环境比较固定Python 版本建议 3.8 到 3.10PyTorch 装 1.8 以上即可。我不建议直接下载 YOLOv5 官方仓库再把fs_infer.py扔进去跑更稳妥的做法是用现有这份 zip 里的文件然后单独拉一份对应版本的 YOLOv5 源码作为依赖包。实际操作顺序如下# 解压资源包后保持 best.pt 与 fs_infer.py 在同一目录 # 安装必要依赖这里以 pip 为例 pip install torch torchvision pip install opencv-python pip install numpy # 如果你本机已经有 YOLOv5 的仓库环境可以直接复用 # 如果没有把 fs_infer.py 里对 yolov5 模块的 import 相对路径改成绝对路径指向 # 最简单的方式把本项目文件放到 yolov5 官方仓库的根目录下运行 python fs_infer.py这段代码的逻辑是程序启动后读取当前目录下的best.pt权重加载 YOLOv5 模型结构然后读取fire_000824.jpg跑一次前向推理最后把画好检测框的结果保存为results.jpg。参数默认值一般写死在脚本里你需要重点关注两个点--weights指向的.pt文件路径是否正确--source指向的输入图片路径是否存在。如果是在新学期新电脑上跑常见报错是No module named torch或者 CUDA 不可用前者直接按上面的 pip 命令补依赖后者把模型加载方式改成devicecpu即可。# fs_infer.py 的核心推理逻辑关键行已加注释 import torch from models.experimental import attempt_load from utils.general import non_max_suppression # 加载训练好的权重map_locationcpu 保证无 GPU 也能跑 model attempt_load(best.pt, map_locationcpu) model.eval() # 对输入图片做推理img 是预处理后的张量 results model(img, size640) # 这里的 pred 是原始预测结果需要非极大值抑制去除重复框 pred non_max_suppression(results, conf_thres0.25, iou_thres0.45)这段代码里conf_thres0.25和iou_thres0.45是两个最需要解释的参数。conf_thres是置信度阈值低于这个分数的检测框会被丢弃值调低能检出更多目标但同时增加误报我通常在做火灾检测时保持在 0.25 到 0.35 之间iou_thres是 NMS 的交并比阈值控制两个重叠框是否合并0.45 是常见默认值。如果你是第一次跑这个脚本直接使用默认值即可后续调优阶段再根据验证集表现调整。跑通之后results.jpg会显示火灾或被火焰包围的区域上有一个个矩形框框上有类别标签和置信度。3. 读懂预测结果精度与误检的平衡看到results.jpg上画出检测框只是第一步更重要的问题是这些框是否准确地框住了火苗和烟雾有没有漏检或误检如果你只是拿这个结果图去应付毕业设计开题那确实足够了但如果要做更深一层的分析你需要结合输出数据去评估模型表现。3.1 输出指标置信度、类别与边界框坐标YOLOv5 推理时每个检测框包含四部分信息中心点坐标 (x, y)、框宽高 (w, h)、置信度、类别 ID。这份权重能识别的类别数量取决于训练时的数据集配置。对于火灾烟雾检测通常模型输出两个类别一类是火苗fire一类是烟雾smoke。# 解析推理结果打印每个目标的检测信息 for *xyxy, conf, cls in pred[0]: label int(cls) # 0 代表 fire1 代表 smoke x1, y1, x2, y2 [int(i) for i in xyxy] print(f类别: {label}, 置信度: {conf:.2f}, 坐标: ({x1},{y1})-({x2},{y2}))这段代码的价值在于它把视觉上的检测框转换成可比较的数值。你可以批量检测多张图片把置信度低于某个阈值的样本挑出来看判断是漏检还是背景误检。如果你手头有几张标注好的火灾测试图可以用torchmetrics或手工计算平均精度但更省事的做法是直接看模型输出框是否稳定贴合火源轮廓——如果框总是偏大、包含大量背景区域说明训练时用的标注框本身就粗糙或者模型泛化能力不足。3.2 火苗与烟雾的特征差异模型为什么能区分它们实际做火灾检测时火苗和烟雾在视觉上有明显不同的梯度特征。火苗区域通常色彩饱和度极高边缘不规则且有强烈明暗变化烟雾则是半透明、纹理模糊经常遮挡背景边界呈渐变过渡。YOLOv5 的卷积网络能捕捉到这些差异但它也有明显的弱点。类别视觉特征YOLOv5 检测难点常见误检场景火苗高亮、橘红色、边缘锐利夜间火光与暗背景对比强容易漏检小目标晚霞、红色车灯烟雾半透明、灰白色、边界模糊烟雾形状不固定容易与云层、雾气混淆云层、蒸汽、雾霾火苗烟雾共存火源中心亮外围烟雾扩散两个类别重叠NMS 可能合并或漏检远处火灾现场的亮斑如果你在验证图片上看到模型把晚霞或红色墙面误判为火灾这属于正常的类别混淆。解决方案有两个方向一是收集更多包含这类“难例”的负样本图片加入训练集让模型学会区分二是调高置信度阈值牺牲一点召回率换取更少的误报这在安全检测场景里往往是更好的策略。我会在后面的避坑章节详细展开。4. 训练自己的数据集从零到一的关键路径如果你对现有权重的检测效果不满意或者需要检测特定场景比如森林火灾、化工厂烟雾就要考虑用自己标注的数据集做微调。这里有一个很实际的前提v5_fire_smoke这份资源本身不包含标注好的训练集它只提供权重和推理脚本。因此自建数据集的工作量是需要你自行承担的。下面是标准流程我按 YOLOv5 数据配置要求逐层说明。4.1 数据标注与目录结构搭建火灾检测的数据标注和通用目标检测没有本质区别。你可以用 LabelImg 或 X-AnyLabeling 这类工具画边界框输出格式选择 YOLO 格式也就是每个图片对应一个.txt文件每行记录“类别ID 中心点x 中心点y 宽 高”所有值均归一化到 [0,1]。火灾检测通常只需两类如果你只关注火源也可以简化为单类。# 推荐的数据集目录结构放到 YOLOv5 仓库的 datasets/ 下 fire_smoke_dataset/ ├── images/ │ ├── train/ # 训练图片建议 70% │ └── val/ # 验证图片建议 20% │ └── test/ # 测试图片建议 10%可选 ├── labels/ │ ├── train/ # 与 train 图片对应的 txt 标注 │ └── val/ │ └── test/ └── fire_smoke.yaml # 数据集配置文件需手动编写这个目录结构是 YOLOv5 官方约定的标准布局。fire_smoke.yaml文件里要写清楚类别数量和类别名示例如下。训练脚本会通过这个 yaml 文件定位图片与标注文件。# fire_smoke.yaml 内容示例 train: fire_smoke_dataset/images/train val: fire_smoke_dataset/images/val test: fire_smoke_dataset/images/test nc: 2 # 类别数量这里是 fire 和 smoke 两类 names: [fire, smoke] # 按顺序对应标注文件中的类别 ID这份 yaml 里的路径建议写相对路径相对 YOLOv5 仓库根目录而言。如果你把数据集放在别的位置务必改成绝对路径否则训练启动时会报AssertionError: train: 找 不到图片。4.2 使用 best.pt 做迁移学习参数与命令有了标注数据后你不必从头训练直接用这份资源里的best.pt做迁移学习起点即可。YOLOv5 官方训练脚本train.py提供了--weights参数用于加载预训练权重。这里有一个很多人不知道的细节如果你加载的是这份 fire_smoke 权重它已经有完整的类别输出层跑迁移学习比从 COCO 预训练权重开始收敛更快因为你只需要在小规模数据集上做局部微调不必重新学会通用特征。# 用 best.pt 在自建数据集上微调 python train.py \ --data fire_smoke_dataset/fire_smoke.yaml \ --cfg models/yolov5s.yaml \ --weights ../v5_fire_smoke/best.pt \ --batch-size 16 \ --epochs 100 \ --img 640 \ --device 0参数含义--cfg models/yolov5s.yaml指定模型网络结构这里以 s 版本为例推理快、显存占用小适合毕业设计和低成本部署--batch-size 16取决于你的 GPU 显存大小8GB 显存建议 16 或 32显存不足就降到 8--epochs 100是迭代轮数小规模数据集 100 轮足够收敛过多反而会过拟合--device 0指定 GPU 编号没有 GPU 就写--device cpu但训练速度会很慢。如果你是在校生用笔记本电脑建议直接租云 GPU 跑成本控制在几十元内就能完成一个像样的微调实验。5. 超参数调优与模型评估让毕业设计不止于“能跑”训练完成不等于实验结束你还要面对一个问题模型在验证集上精度是多少哪些超参数影响最大这一部分要拉开差距把实验数据整理成表格让导师看到你系统性的调优过程。5.1 关键超参数学习率、批次大小、置信度阈值YOLOv5 的训练超参数很多但真正需要手工重点调的是学习率lr、批次大小batch-size和置信度阈值conf_thres。学习率控制收敛速度具体到训练上YOLOv5 在data/hyp.scratch-low.yaml里定义了初始学习率通常不需要改动。由于实际训练时默认开启cosine annealing学习率调度即使初始学习率设置不当模型也能在中后期自动调整到合适范围。你但可以手动指定例如--lr 0.001。超参数常见范围调高效果调低效果初始学习率 lr0.001 ~ 0.01收敛快易震荡不收敛收敛慢但更稳定batch-size8 ~ 32梯度更稳定显存占用大梯度噪声大可能不收敛conf_thres0.2 ~ 0.5误报减少漏检增加漏检减少误报增加iou_thres0.4 ~ 0.6重叠框更少被合并重叠框更容易合并我在实际操作中得到的经验是如果你的数据集只有几百张图片batch-size尽量保持在 16 以下过大容易在验证集上迅速过拟合。而conf_thres不用急着在训练阶段调因为训练和评估时用的是同一个conf_thres推理应用时再单独调就行。5.2 评估指标mAP、召回率与可视化验证训练结束后YOLOv5 会在runs/train/exp*/目录下生成results.png其中包含训练过程中的 loss 曲线、精确率、召回率和 mAP 曲线。你要重点看mAP0.5这个值它是目标检测最通用的评价指标代表 IoU 阈值 0.5 时的平均精度均值。火灾检测场景中我建议同时关注单类别的AP_fire和AP_smoke因为二者难度差异很大烟雾 AP 通常比火苗低 5 到 10 个百分点。# 训练完成后用验证集做标准评估 python val.py \ --data fire_smoke_dataset/fire_smoke.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --conf-thres 0.25 \ --iou-thres 0.45评估标注输出里每一行的格式是类别名、AP 值、精确率、召回率。如果发现fire的召回率低优先检查标注框是否完整覆盖了所有火苗如果smoke的精确率低说明背景误检多你可以尝试在验证阶段提高conf-thres——虽然这会降低召回率但最终论文里的可视化效果会干净很多。评估结束后的最后一个实操步骤是输出可视化结果。用val.py生成的runs/val/exp*/目录下有模型预测的带框图片和标注 GT 的对比图。在毕业设计论文里放两张预测结果图再配一个 mAP 指标表这个工作量在答辩时足够支撑“实验”章节。6. 火灾检测常见问题排查我的五条翻车记录从拿到这份资源到完成自己的微调实验我踩过不少坑这里挑五条最典型的记录按“现象 → 原因 → 解决”来写希望对你有帮助。6.1 推理时报错KeyError: model这个报错通常发生在attempt_load(best.pt)加载权重失败时。文件能打开但结构不匹配常见原因是你的 YOLOv5 仓库版本和权重训练时的版本不一致比如权重是用 6.0 版本训练的而你用的是 7.0 或 5.0 的代码。解决方法是把权重文件重新用官方仓库的转换脚本生成或者直接更换仓库版本到与权重匹配的 tag。最稳妥的方式是查看权重文件里保存的 YOLOv5 版本信息。# 查看 pt 文件里记录的版本字段 import torch ckpt torch.load(best.pt, map_locationcpu) print(ckpt[model].yaml) # 能看到网络结构定义也可确认版本渊源6.2 训练开始时 loss 为 nan训自己的数据集时出现nan多是因为学习率过高或标注数据有异常。这事件的常见诱因是标注文件里出现了0宽高的框或坐标超出图片范围。你把labels/train/下的 txt 文件打开检查是否有维度值为 0。另外用--lr 0.001起步能规避大部分nan情况。6.3 检测框整体偏移特别是小目标位置偏下这类问题在火灾图片中很常见尤其是远处的烟雾边界模糊。现象是框的中心点略高于或低于实际火苗位置。原因主要有两个一是标注时边界框不准确二是输入图片的缩放方式导致坐标映射偏差。解决方式是统一验证时的输入尺寸尽量用训练时相同的--img尺寸不要随意用其他分辨率输入。6.4 白天天空中的云被误判为烟雾这是火灾检测中不可避免的类别混淆现象。云和烟雾外观高度相似模型会给出大约 0.5 到 0.7 的置信度。解决思路是收集一些清晰无火灾的天空云层图片作为负样本标注为空背景加入训练数据集让模型学会抑制这些输出。如果不想重新训练就把conf_thres调高到 0.4 以上误报会显著减少。6.5 训练时显存不足显存溢出是最常见的资源问题尤其在学校机房或游戏本上。解决方式其实都是套路把--batch-size减半或降低--img尺寸如果这两项已经很低仍然溢出就在train.py里关闭--multi-scale因为多尺度训练会额外占用显存资源而关闭它通常对精度影响不大可控性强。7. 进阶用法把推理脚本改造成实时视频检测拿到fs_infer.py的代码逻辑你完全可以在此基础上扩展成视频或摄像头实时检测。这个进阶改造是毕业设计答辩中很亮眼的加分项同时工作量绝对可控。我提供一个改造成视频处理的思路数据流上直接复用整份权重和推理参数所以它的入口和前面说过的一样重点在于补一个视频读取循环和结果输出逻辑。# 改造后的视频检测示例逐帧读取检测并保存 import cv2 import torch from models.experimental import attempt_load # 同样的权重加载只是输入从图片变为视频帧 model attempt_load(best.pt, map_locationcpu) model.eval() cap cv2.VideoCapture(test_video.mp4) # 视频编码器参数需按需调整这里使用 MP4V 编码 fourcc cv2.VideoWriter_fourcc(*mp4v) out cv2.VideoWriter(fire_detection_result.mp4, fourcc, 30.0, (640, 480)) while cap.isOpened(): ret, frame cap.read() if not ret: break frame cv2.resize(frame, (640, 480)) # 转成模型输入格式然后推理 results model(frame, size640) # 画出检测框写入输出视频 for *xyxy, conf, cls in results.xyxy[0]: label int(cls) cv2.rectangle(frame, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 0, 255), 2) out.write(frame) cap.release() out.release()这段代码里的results.xyxy[0]是 YOLOv5 内置的快捷输出它已经帮你完成了 NMS 和坐标格式转换比第一段的non_max_suppression手动处理更省事。对毕设来说这段逻辑可以配合一个定时截图函数实现“检测到火苗就自动截图保存”的效果。改造时最容易忽略的是视频帧的尺寸必须和输入 size 一致否则检测框坐标会和原图对不齐。把这个视频检测脚本跑通后你会对整份资源的价值有更完整的认识——它不是一套只能在静态图片上演示的玩具而是一个能从图片检测平滑过渡到流式检测的可用结构。这也是我作为一线工程师最愿意推荐给毕设同学的使用方式先别急着动网络结构也不建议一上来就重新收集上千张图片做训练就对照这份资源和这篇拆解步骤一步步把基础流程跑通再决定下一步往哪走。以后我再拿到类似的模型包第一件事永远是先用best.pt配一张示例图跑通推理确认输入输出的数据格式和默认参数边界之后再去看训练代码和数据标注脚本而且每个实验我都会把conf_thres、iou_thres、batch-size、epochs这四个参数强制记下来形成表格数据。这个习惯帮我避免了很多“模型过期、参数白调”的返工。希望这份笔记也能帮你省掉同样多的摸索时间。本文还有配套的精品资源点击获取