简介:这份资源面向准备毕业设计的学生,提供一套基于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.5 | IoU 阈值为 0.5 时的平均精度 | 反映模型在宽松匹配下的检测能力 |
| Precision | 预测为正的样本中真正为正的比例 | 高精度说明误报少 |
| Recall | 真正为正的样本中被预测出来的比例 | 高召回说明漏报少 |
| F1 | 精度和召回的调和平均 | 综合衡量模型平衡性 |
5.4 一个我踩过的坑:别在答辩前夜换环境
我见过太多人在答辩前一晚想“优化一下环境”,结果把 conda 环境搞崩,第二天连best.pt都加载不了。从那以后我每次跑通一个能出图的配置,都会用conda env export > environment.yml把环境冻住,再复制一份权重和脚本到 U 盘。演示机器上只做一件事:按environment.yml重建环境,然后跑fs_infer.py。这套习惯让我再也没在关键时刻翻过车。希望帮到你。
本文还有配套的精品资源,点击获取