news 2026/9/28 4:59:19

YOLOv5火灾烟雾检测实战:从best.pt权重加载到论文级结果可视化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5火灾烟雾检测实战:从best.pt权重加载到论文级结果可视化

简介:这份资源面向准备毕业设计的学生,提供一套基于YOLOv5的火灾与烟雾检测完整方案,帮助解决从模型训练到推理落地的全流程问题。包内共4个文件,包含2张jpg示例图片、1个py推理脚本和1个pt训练权重,压缩包约4.86MB,体量轻便,便于快速上手与二次开发。资源覆盖数据准备、模型训练、超参数优化、指标评估、预测应用与结果可视化等关键环节,读者可借助训练权重直接运行推理脚本,在示例图片上验证火灾与烟雾的检测效果,并参考预测结果图分析边界框与类别输出。已有221人学习下载,适合作为毕业设计中的算法实现与实验验证素材,也可用于课程项目或原型演示,帮助理解目标检测在火灾预警场景中的实际应用方式。

1. 拆开 v5_fire_smoke.zip:一份能直接跑通的 YOLOv5 火灾烟雾检测资源

毕业设计选题卡在“火焰与烟雾检测”上的同学,最缺的往往不是算法思路,而是一份能立刻跑起来、看到框、拿到权重的完整工程。v5_fire_smoke.zip就是冲着这个场景来的:里面放了示例图片、推理代码fs_infer.py、预测结果results.jpg、训练权重best.pt,还有一张fire_000824.jpg作为单图验证样本。它解决的不是“从零训练一个模型”的问题,而是“我已经知道 YOLOv5 能做目标检测,现在要一个能演示、能截图、能写进论文的火烟检测闭环”。适合谁?适合需要快速搭出答辩演示、又不想在环境配置上耗掉两周的本科生,也适合想拿现成权重做二次微调的熟手。下面按“资源是什么 → 怎么用 → 坑在哪”的顺序,把这份包拆开讲透。

2. 环境配置与权重加载:让 best.pt 在 conda 里跑起来

2.1 为什么优先用 conda 隔离 YOLOv5 环境

YOLOv5 的依赖链对 PyTorch、torchvision、numpy 的版本相当敏感,直接装在系统 Python 里,十有八九会和已有的包打架。常见做法是单独建一个 conda 环境,把 Python 版本锁在 3.8 到 3.10 之间,再按官方requirements.txt装依赖。这一步不是玄学,而是因为best.pt这类权重文件在加载时会反序列化模型结构,如果 torch 版本跨度过大,轻则警告,重则直接报UnpicklingError。我一般会先确认显卡驱动和 CUDA 版本,再决定装哪一版 torch,而不是反过来。

# 创建并激活独立环境,Python 版本建议 3.8~3.10 conda create -n fire_smoke python=3.9 -y conda activate fire_smoke # 安装 PyTorch,这里以 CUDA 11.8 为例,CPU 用户去掉 --index-url 那行 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 YOLOv5 其余依赖 pip install -r requirements.txt

逻辑说明:第一行建环境,第二行激活,第三行装 torch 和 torchvision,第四行补齐 YOLOv5 运行所需的其余包。参数上,python=3.9是兼容性最稳的区间;cu118对应 CUDA 11.8,如果你机器上是 12.x,换成cu121即可。装完用python -c "import torch; print(torch.cuda.is_available())"验证,返回True才说明 GPU 可用。

2.2 加载 best.pt 并跑通第一张图

权重best.pt是这份资源的核心,它决定了模型能不能直接出框。推理代码fs_infer.py通常已经写好了模型加载、图像预处理、前向推理和结果绘制。第一次跑,建议先用fire_000824.jpg这张单图验证,不要一上来就批量处理整个文件夹。命令层面,常见写法是:

# 单图推理,指定权重、输入图片和输出目录 python fs_infer.py --weights best.pt --source fire_000824.jpg --output runs/detect

逻辑说明:--weights指向训练好的best.pt,--source是待检测图片,--output是结果保存路径。参数上,如果fs_infer.py用的是 argparse,通常还会有--conf和--iou两个阈值。--conf控制置信度下限,默认 0.25 左右;--iou控制 NMS 的 IoU 阈值,默认 0.45。火焰和烟雾的边界本身比较模糊,--conf设太高会漏检,设太低会满屏框,建议先在 0.25 到 0.4 之间试。

跑完后打开输出目录,应该能看到一张带框的图,框上标着类别和置信度。如果框的位置明显偏移,先别怀疑权重,检查输入图片是否被正确 resize 到模型要求的尺寸,YOLOv5 默认是 640×640。

2.3 用 results.jpg 做快速回归验证

results.jpg是资源里自带的预测结果图,它的价值在于给你一个“标准答案”的视觉参照。你跑完fs_infer.py后,把自己生成的图和results.jpg对比:框的数量、位置、类别标签是否一致。如果差异很大,说明推理参数或环境有问题,而不是权重坏了。这一步能帮你快速排除“模型没加载成功”这类低级错误。

提示:如果fs_infer.py里写死了图片路径或权重路径,先改成相对路径或命令行参数,否则换台机器就翻车。

3. 推理代码 fs_infer.py 拆解:从读图到画框的完整链路

3.1 预处理、前向推理与后处理三段式

fs_infer.py虽然短,但完整覆盖了 YOLOv5 推理的三段式:预处理、前向推理、后处理。预处理负责把任意尺寸的图片 letterbox 到 640×640,同时记录缩放比例和填充量;前向推理把张量送进模型,得到三个尺度的输出;后处理做置信度过滤和 NMS,再把框映射回原图坐标。很多人只关心“框画出来没有”,但真正决定框准不准的,是后处理里的坐标还原。如果 letterbox 的 padding 算错,框就会整体偏移。

# 简化版推理链路,帮助理解 fs_infer.py 内部逻辑 import cv2 import torch import numpy as np def letterbox(img, new_shape=640): # 将图片等比缩放并填充到 640x640,返回图片和缩放比例 h, w = img.shape[:2] r = min(new_shape / h, new_shape / w) new_unpad = (int(round(w * r)), int(round(h * r))) dw, dh = new_shape - new_unpad[0], new_shape - new_unpad[1] dw, dh = dw // 2, dh // 2 img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR) top, bottom = dh, dh left, right = dw, dw img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(114, 114, 114)) return img, r, (dw, dh) def postprocess(pred, conf_thres=0.25, iou_thres=0.45): # pred 形状为 [1, N, 5+nc],这里只做置信度过滤示例 pred = pred[0] mask = pred[:, 4] > conf_thres return pred[mask]

逻辑说明:letterbox负责等比缩放并填充灰边,返回缩放比例和填充量,供后续坐标还原使用;postprocess先按置信度过滤,再交给 NMS。参数上,new_shape=640是 YOLOv5 的默认输入尺寸,conf_thres和iou_thres就是前面提到的两个阈值。实际fs_infer.py里还会处理类别分数、多尺度输出拼接,但核心逻辑就是这两步。

3.2 置信度阈值与 NMS 的调参边界

火焰和烟雾检测有个特殊之处:火焰边缘和烟雾边缘都是渐变的,模型容易在同一个目标上产生多个重叠框。NMS 的iou_thres设得太高,重叠框去不掉;设得太低,相邻的两个火点会被合并成一个。我的经验是,火焰检测iou_thres放在 0.45 到 0.5 之间比较稳,烟雾可以稍微降到 0.4,因为烟雾区域大、重叠多。conf_thres则要看你的演示需求:答辩截图希望框少而准,就调到 0.4;希望不漏掉任何可疑区域,就降到 0.2。

# 调整置信度和 IoU 阈值重新推理 python fs_infer.py --weights best.pt --source fire_000824.jpg --conf 0.35 --iou 0.45

逻辑说明:这条命令在原有基础上显式传入--conf和--iou,方便你对比不同阈值下的框数量和位置。参数上,--conf 0.35表示只保留置信度大于 0.35 的框,--iou 0.45表示 NMS 时 IoU 超过 0.45 的框会被抑制。建议把两组结果都保存下来,写进论文的对比分析里。

3.3 批量推理与结果落盘

单图跑通后,下一步通常是把--source指向一个文件夹,批量出图。YOLOv5 的推理脚本一般支持目录输入,输出会按文件名保存在runs/detect/exp下。批量推理时要注意显存占用,如果图片数量多,可以加--batch-size控制每次送入的图片数。CPU 用户把--device设为cpu,但速度会明显下降,答辩演示前最好提前跑完。

# 批量推理整个文件夹,指定 batch size 和设备 python fs_infer.py --weights best.pt --source ./test_images --batch-size 4 --device 0

逻辑说明:--source ./test_images表示输入目录,--batch-size 4表示每次处理 4 张图,--device 0表示用第一块 GPU。参数上,batch size 越大越快,但显存不够会报CUDA out of memory,此时降到 2 或 1 即可。批量结果建议单独建目录保存,避免和单图结果混在一起。

4. 避坑与排查:火烟检测里最容易翻车的五件事

4.1 现象:模型加载报 UnpicklingError 或缺模块

原因:best.pt是在特定 YOLOv5 版本下训练的,你当前环境的模型定义和权重里的结构对不上,或者 torch 版本跨度过大。解决:先确认你用的 YOLOv5 仓库版本和权重训练时一致,常见做法是切到官方 v7.0 标签;再检查 torch 版本,尽量和训练环境对齐。如果只是缺某个模块,按报错信息补装即可。

4.2 现象:推理结果框全偏了,或者框跑到图像外

原因:letterbox 的缩放比例和 padding 计算错误,后处理还原坐标时用了错误的系数。解决:打印预处理返回的r和(dw, dh),和原图尺寸做手工验算。常见错误是把dw和dh当成缩放比例,实际上它们是填充量。修正后框会回到正确位置。

4.3 现象:置信度阈值调了但框数量没变化

原因:fs_infer.py里可能把conf写死了,或者 argparse 的参数名和实际使用的不一致。解决:打开脚本搜索conf和iou,确认命令行参数真正传进了后处理函数。如果脚本里用的是--confidence而不是--conf,命令就得跟着改。这种参数名不一致是血泪经验里最常见的一类。

4.4 现象:GPU 显存够但推理速度很慢

原因:模型没有真正加载到 GPU,或者输入尺寸被隐式放大。解决:用torch.cuda.is_available()确认 GPU 可用,再在脚本里打印模型所在的 device。如果模型在 CPU 上,检查--device参数是否生效。另外,确认输入图片没有被 resize 到超过 640 的尺寸,否则计算量会成倍增加。

4.5 现象:烟雾检测漏检严重,火焰正常

原因:训练数据里烟雾样本偏少,或者烟雾的标注框过大导致模型学不到局部特征。解决:如果只是演示,可以适当降低conf_thres到 0.2 左右,让更多候选框保留;如果要真正提升,需要补充烟雾数据做微调。常见做法是把best.pt作为预训练权重,在自己的烟雾数据集上跑几十个 epoch,学习率设小一点,比如 0.001。

注意:不要用测试集图片去调阈值然后宣称模型效果好,这是自欺欺人,答辩时老师一问就露馅。

5. 从演示到论文:用 best.pt 做微调与指标验证的进阶手法

5.1 把 best.pt 当预训练权重做小样本微调

如果你手头有自己标注的火烟数据,哪怕只有几百张,也可以拿best.pt做微调,而不是从官方预训练权重重新训。这样做的好处是收敛快,通常 30 到 50 个 epoch 就能看到明显提升。微调时把学习率调低,常见做法是设成 0.001 或 0.0005,batch size 根据显存拉满。训练命令大致如下:

# 用 best.pt 作为初始权重,在自定义数据集上微调 python train.py --weights best.pt --data fire_smoke.yaml --epochs 50 --batch-size 8 --lr0 0.001 --img 640

逻辑说明:--weights best.pt表示从已有权重开始训练,--data fire_smoke.yaml是你的数据集配置文件,--epochs 50是训练轮数,--lr0 0.001是初始学习率,--img 640是输入尺寸。参数上,--batch-size 8需要根据显存调整,显存不够就降到 4。微调后重新生成的best.pt会保存在runs/train/exp/weights下,替换原来的权重即可。

5.2 用验证集算清楚 mAP、召回率和 F1

论文里不能只放几张带框的图,得有量化指标。YOLOv5 训练结束后会自动在验证集上跑一遍,输出mAP@0.5、mAP@0.5:0.95、precision、recall 等指标。如果你只有best.pt没有训练日志,可以用val.py单独跑验证:

# 在验证集上评估 best.pt 的性能 python val.py --weights best.pt --data fire_smoke.yaml --img 640 --task val

逻辑说明:--task val表示只做验证不训练,--data指向数据集配置,--img 640保持和训练一致。跑完后终端会打印每一类的 P、R、mAP@0.5。火焰和烟雾通常分成两类,如果烟雾的 mAP 明显低于火焰,说明烟雾样本不足,论文里可以据此写“数据不平衡对烟雾检测的影响”。

5.3 结果可视化与论文配图技巧

results.jpg和fs_infer.py生成的图可以直接放进论文,但要注意两点:一是框的颜色和线宽要清晰,二是最好把原图和检测结果并排展示。常见做法是用 OpenCV 把两张图横向拼接,再加一行文字说明。如果你想让配图更专业,可以把置信度标在框的左上角,保留两位小数。这样老师一眼就能看出模型不是随便画框。

指标含义论文里怎么写
mAP@0.5IoU 阈值为 0.5 时的平均精度反映模型在宽松匹配下的检测能力
Precision预测为正的样本中真正为正的比例高精度说明误报少
Recall真正为正的样本中被预测出来的比例高召回说明漏报少
F1精度和召回的调和平均综合衡量模型平衡性

5.4 一个我踩过的坑:别在答辩前夜换环境

我见过太多人在答辩前一晚想“优化一下环境”,结果把 conda 环境搞崩,第二天连best.pt都加载不了。从那以后我每次跑通一个能出图的配置,都会用conda env export > environment.yml把环境冻住,再复制一份权重和脚本到 U 盘。演示机器上只做一件事:按environment.yml重建环境,然后跑fs_infer.py。这套习惯让我再也没在关键时刻翻过车。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 4:58:46

基于YOLOv8的社区高空抛物监测系统:从数据集训练到部署全攻略

简介:基于YOLOv8的社区高空抛物监测系统提供了一套可直接运行的完整工程,面向计算机视觉、人工智能等相关专业的毕业设计或课程设计场景,覆盖目标检测模型训练、预测视频检测及可视化页面交互等功能。包内共有8个文件,包括3个Pyth…

作者头像 李华
网站建设 2026/9/28 4:58:44

金西福自动波服务态度怎么样

立足南宁本地汽车服务市场,践行变速箱专项领域的随着国内汽车保有量持续增长,汽车后市场的细分服务需求正在发生深刻变化。消费者从以往关注整车基础保养,转向对细分领域专项服务的品质要求,尤其是变速箱这类汽车核心传动部件&…

作者头像 李华
网站建设 2026/9/28 4:58:40

德州扑克人工智能算法优化:遗憾最小化与深度CFR训练实践

简介:这份资源围绕基于Python深度强化学习的德州扑克AI算法优化展开,核心agent位于“实验环境/agents/DeepCFRagent3.py”,由DeepCFR改进而来。资源在Limit与NoLimit Leduc Holdem Poker上用exploitability衡量与纳什均衡的距离,并…

作者头像 李华
网站建设 2026/9/28 4:58:33

德州扑克AI深度强化学习优化:算法选型、奖励塑形与实战避坑

简介:基于Python深度强化学习的德州扑克AI算法优化项目,面向希望系统学习强化学习与博弈算法的小白及进阶学习者,适合作为毕业设计、课程设计、大作业、工程实训或初期项目立项。项目以自行改进的DeepCFR agent为核心,在Leduc&…

作者头像 李华
网站建设 2026/9/28 4:55:52

Python开发必会的十个高效技巧

Python 写起来简单,但写得好和写得快是两回事。很多开发者停留在“能跑就行”的阶段,代码冗长、效率低下。下面十个技巧,每一个都能让你的代码更短、更快、更 Pythonic。1. 列表推导式替代循环 appendpython复制下载# 不推荐 squares [] for…

作者头像 李华