news 2026/9/8 9:18:11

基于YOLOv5的火灾烟雾检测实战:从数据集到部署全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于YOLOv5的火灾烟雾检测实战:从数据集到部署全流程

简介:面向目标检测与烟火识别场景,这套资源提供2059张已标注的火灾与烟雾图像数据集及配套的YOLOv5检测模型。数据按Pascal VOC格式组织,覆盖建筑、草原、森林、车辆起火及白天黑夜、室内外等多种条件,标签统一为fire,适合用于训练烟雾火灾检测模型或进行算法验证。压缩包共332个文件,除xml标注和jpg原图外,还包含VOC转YOLO格式的Python脚本、数据集划分配置、模型权重与推理说明,整体大小约200MB,目录结构清晰,便于直接复用。目前已有833人学习下载,适合有一定深度学习基础、需要真实烟火数据完成毕业设计或工程项目的开发者。结合附带的yolov5模型与使用文档,可以较快完成从数据集准备、格式转换到模型训练与检测的完整流程。 火灾烟火烟雾检测这个方向,这几年因为安全生产和智慧园区这类落地需求,关注度一直很高。前阵子我拿到一套2059张图像、全部带标签的火灾烟火烟雾检测数据集,配合YOLOv5从零搭了一条训练与推理链路,从数据检查、环境配置、模型训练,一直跑到导出部署。中间踩了不少坑,今天把整个流程和细节一起整理出来,内容包括数据集怎么检查整理、为什么选YOLOv5而不是其他检测框架、训练参数到底怎么定、评估指标该看什么,以及部署落地时容易被忽略的问题。给正在准备做烟雾火灾检测项目的人一份能直接照抄的实操记录。

先说总体的使用感受:这个组合非常接地气。2059张图像规模不大不小,足够把YOLOv5的完整流程跑通,并得到一个能用的检测模型;YOLOv5本身代码成熟、文档齐全、预训练权重和部署工具都是现成的,尤其适合毕设、比赛,或者厂区视觉预警的初版方案。如果你正在纠结"数据集不大多训练会不会废""模型选哪个版本",这篇文章基本都能回答。

1. 数据集先行:2059张带标签图像到底怎么处理

1.1 拿到数据集,先别急着训练

不管数据集来源是哪,第一步永远是检查而不是训练。拿到这套2059张图像后,首先把文件夹结构看一遍,确认图像和标签是不是一一对应。绝大多数检测数据集会用YOLO格式或VOC格式存放标签,如果是YOLO格式,每张图像对应一个同名txt文件,每一行代表一个目标框,结构是:

class_id center_x center_y width height

其中坐标值全部做了归一化,范围在0到1之间。我习惯先写一个小脚本统计每个txt标签的行数和类别id,如果发现某个类别的目标数量特别少,就得考虑后续做针对性的数据增强,或者在评估时不要太指望这一类能拿到多高的AP。

还需要检查图像后缀和实际解码是否正常,有些数据集从网上下载之后会混入损坏的图片文件,训练时读图报错很难排查。这里有一个我常用的笨办法:用脚本把图片统一转成JPG格式,顺便在转换过程中过滤掉无法解码的文件。虽然会损失一点点元数据,但能省掉后面大量训练中断的麻烦。

1.2 数据划分原则:场景不能串

2059张图的划分不能随手拖拽,关键原则是保证训练集和验证集的场景不重叠。如果数据集里存在从视频中连续抽帧的情况,同一个火源可能出现在几十张高度相似的图像里,此时如果一部分进训练集、一部分进验证集,最终验证分数会虚高,看起来mAP很高,换到真实场景马上露馅。

我建议按8:2左右的比例划分训练集和验证集,并且在划分时尽量让同一场景、同一火源的图像进同一个集合。操作上可以先按图像的文件名前缀或者场景ID做分组,再随机划分组,而不是直接随机划分图片。这个步骤虽然多写几行代码,但对后续模型泛化能力的评估非常关键。

1.3 标签质量的排查技巧

标签文件最容易出现两类问题:一类是坐标越界,某个坐标值超过1或者小于0,虽然YOLOv5代码内部会自动裁剪,但裁剪之后目标框位置可能已经偏移;另一类是类别id写错,比如标签里写了id=5,而你的data.yaml里只定义了2个类别,训练不会报错,但评估结果会非常奇怪。

我每拿到一套数据都会跑一段校验脚本,打印所有标签中出现的类别id、坐标最小值和最大值,然后随机抽取几十张图把标签框画出来人工过一眼。这一步大概花掉一两个小时,但能避免后面几天训练全部白费。

2. 模型选型:为什么YOLOv5仍是烟雾检测的稳妥选择

2.1 YOLOv5的核心优势不在性能,而在工程闭环

选YOLOv5不是因为它是当前精度最高的模型,而是在"训练+调优+部署"整个链条上综合成本最低。YOLOv5的网络结构主干是CSPDarknet,特征融合用PANet,检测头为anchor-based结构,这套组合对烟雾这类半透明、形状不规则的动态目标是有优势的:多尺度特征融合能同时照顾到大范围弥漫的烟雾和远处的早期小火点。相比两阶段的Faster R-CNN,YOLOv5端到端直接回归目标框,训练和推理速度明显快;相比YOLOv8,YOLOv5的生态更成熟,网上能搜到的坑和解决方案也更多。

我见过很多人一上来就追新模型,结果卡在环境依赖或者部署环节,反而拖慢进度。做项目首先要考虑时间成本和可维护性,YOLOv5在这类目标检测任务里就是一个非常稳的基线。

2.2 模型体积怎么选:n、s、m、l版本对比

YOLOv5官方提供了n、s、m、l、x几个不同尺寸的模型,选型主要看你的算力和部署平台。我把自己常用的选型思路整理成一个对比:

模型版本参数量适用场景我的建议
YOLOv5n约250万树莓派、手机端精度偏低,烟雾这种弱纹理目标不推荐
YOLOv5s约920万主流显卡、边缘盒子最均衡,项目首选
YOLOv5m约2100万训练速度要求不高精度提升明显,适合离线分析
YOLOv5l约4600万服务器推理小目标提升有限,部署成本高

烟雾火灾检测往往需要部署在厂区、园区边缘端,设备算力不会太强。我的实际体验是YOLOv5s在精度和速度上最平衡,用2080Ti级别的显卡训练完全够用,导出TensorRT之后在Jetson Nano上也能跑到每秒10帧以上。

2.3 迁移学习:COCO预训练权重是起点

训练时强烈建议加载COCO数据集的预训练权重。有人会觉得火灾烟雾场景和COCO里的日常物体差异太大,预训练权重意义不大,但实测下来,加载预训练权重之后模型收敛速度明显加快,最终精度也要高一些。原因是网络浅层学习到的边缘、纹理、颜色等基础特征在不同数据集之间是通用的,烟雾虽然特殊,但底层特征仍然可以复用。

我习惯在训练脚本里设置--weights yolov5s.pt,而不是从零开始随机初始化。如果网络不好下载权重,也可以使用官方仓库里提供的镜像下载,然后把.pt文件放到项目根目录下。

3. 环境和数据准备:训练前必须做好的三件事

3.1 环境版本搭配,别再因为CUDA抓狂

YOLOv5对硬件要求和依赖版本要求并不苛刻,但为了少踩坑,我推荐一套经过多次验证的稳定组合:Python 3.8 + PyTorch 1.10 + CUDA 11.3。如果你的显卡驱动比较新,直接装PyTorch 2.x也能跑,但在训练过程中偶尔会遇到一些算子兼容性的小问题,不太好排查。

环境搭建的完整流程如下:

conda create -n fire_detect python=3.8 conda activate fire_detect pip install torch==1.10.0 torchvision==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt

装完依赖后,先用官方自带的权重跑一次推理测试,确认环境本身没有问题再进入下一步。我遇到过不少人直接把训练数据集丢进来跑,报错后再排查发现是环境问题,白白浪费大量时间。

3.2 数据目录结构必须符合YOLOv5的约定

YOLOv5对数据集目录结构有明确约定,默认要求图片和标签分别放在images和labels目录下,并且images和labels内部再分train和val子集。最容易被忽略的是:图片文件名的前缀必须完全一致,例如images/train/fire_001.jpg对应labels/train/fire_001.txt。如果格式对不上,训练时会提示"No labels found"之类的错误。

我习惯把数据集整理成这样的结构:

fire_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml

划分完目录之后,一定要写代码统计一下train和val下各有多少张图片,并与对应的标签数量做比对。常见的坑是分割脚本只处理了图片,忘记同步移动标签文件,最后训练集与验证集出现大量无标签图片。

3.3 写好data.yaml:训练的第一步

data.yaml是整个训练流程的入口配置,核心内容就是路径、类别数和类别名称:

path: /home/user/fire_dataset train: images/train val: images/val nc: 2 names: ['smoke', 'fire']

这里的path建议写绝对路径,相对路径在部分情况下会导致图像加载失败。nc必须和标签文件里的最大类别id匹配,names里的顺序也最好固定下来,因为后续推理时画框显示的标签名就是从这里读取的。写完data.yaml之后,我习惯再用几行Python代码从标签里随机读取几个框,画到原图上确认坐标显示正常,提前发现标注格式错位之类的问题。

4. 训练实操:参数设置与全流程记录

4.1 一条完整的训练命令

当数据和配置都准备好之后,训练命令比想象中简单:

python train.py --data data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --batch-size 16 --epochs 200 --img 640

这里几个参数值得认真解释。--data指定数据集配置,--cfg指定模型结构,--weights指定初始权重,--batch-size--epochs是训练批大小和轮数,--img是训练分辨率。分辨率我固定用640,这个尺寸能兼顾小目标和显存开销。如果显存不够,可以降到416或者512,但小烟雾目标的检出率会跟着下降。

4.2 超参数调整:照抄默认值并不一定合适

YOLOv5自带的超参数文件data/hyps/hyp.scratch-low.yaml对大多数场景是有效的,但烟雾和火灾这类目标有自己的特殊性,主要调整集中在两个方面。

第一是Mosaic增强。默认开启的Mosaic增强在训练前期作用很大,能把多张图拼接在一起,相当于提高模型的场景多样性。但对于烟雾这种大面积半透明目标,如果启用的概率设置过高,拼接后的图像会非常不自然,反而干扰学习。我个人会把Mosaic概率适当调低到0.8左右。

第二是早停参数。默认的patience是100,也就是连续100轮验证精度没有提升才停止。对2059张图的小数据集,这个值偏大,我通常改成50,能节省不少训练时间。

4.3 训练过程中到底该盯哪些指标

训练日志里每轮都会输出box_loss、cls_loss、obj_loss和验证集的precision、recall等指标。多数人只盯着mAP看,我建议重点关注两个东西:一个是obj_loss的变化趋势,另一个是验证集上的PR曲线。

obj_loss代表的是模型对"这个位置到底有没有目标"的判断能力。如果这个loss一直降不下来,模型在部署时容易出现边界框闪烁、对背景区域误检的问题。PR曲线则能直观反映模型在不同置信度阈值下的查准率和查全率表现,帮助你在后续推理时选择合适的阈值。观察曲线的同时也要看是否存在明显的过拟合信号:训练loss持续下降但验证loss开始回升,此时应当停止训练或加强数据增强。

4.4 中断恢复与多轮实验

训练中途断电或者显存溢出导致中断是家常便饭。YOLOv5会自动保存last.ptbest.pt,续训时只需要执行:

python train.py --weights runs/train/exp/weights/last.pt --resume

还有个小技巧:每跑完一组实验,把runs/train下的目录改名或复制一份,避免后续实验覆盖掉之前的结果。不同超参数组合之间的对比,如果日志被覆盖了,后续分析起来会非常痛苦。我习惯用"exp_smoke_baseline""exp_smoke_mosaic08"这类命名方式记录每次实验的改动点。

5. 评估与部署:从mAP到实际可用

5.1 评估指标的选择:烟雾场景别死盯高IoU

训练结束后,执行验证命令可以得到标准的评估结果:

python val.py --data data.yaml --weights runs/train/exp/weights/best.pt --img 640

输出结果里有mAP@0.5和mAP@0.5:0.95。在烟雾和火灾这类场景中,重点看mAP@0.5,对mAP@0.5:0.95不用太纠结。因为烟雾目标边界模糊,标注框本身就是人为主观画的,预测框与标注框的IoU很难达到0.75以上。如果你的场景主要在远距离检测早期小火点,更要把注意力放在recall(查全率)上,漏报的代价远比误报高。

5.2 用训练好的模型做图片、视频和摄像头推理

推理演示是检验模型效果最直观的方式。用下面这条命令可以处理图片、视频文件,甚至本地摄像头:

python detect.py --weights runs/train/exp/weights/best.pt --source test.mp4 --conf-thres 0.35 --iou-thres 0.45

--source可以接单张图片路径、文件夹路径、视频文件路径,也可以填摄像头对应的设备编号。在实际测试中,--conf-thres这个阈值对结果影响最大。阈值调太高会漏掉远处的小烟雾,调太低则会把球形建筑物、路灯反光等误判为烟雾。我一般以0.3为起点,先看误报情况再逐步上调,最终找到那个"误报还能接受且漏报不严重"的平衡点。

5.3 导出ONNX与TensorRT:边缘部署的准备

要把模型部署到边缘设备,通常需要先导出ONNX格式,再转成TensorRT的engine文件。YOLOv5自带的导出脚本封装了这一步:

python export.py --weights runs/train/exp/weights/best.pt --include onnx --opset 12

导出之后记得先对比一下ONNX和PyTorch输出的结果是否一致,我遇到过导出后由于输入格式问题导致推理结果乱框的情况。导出TensorRT时要注意固定输入尺寸,推荐固定为640×640,避免动态尺寸在部署时带来额外的性能损失。性能方面,在Jetson Nano这类低算力设备上,转换成TensorRT之后推理速度通常能提升3到5倍,这个步骤值得花时间做。

6. 实操中的高频问题与排查技巧

6.1 训练时找不到标签文件

这是最常遇到的问题。打开训练日志,如果看到大量"Can't find labels"的警告,多半是标签目录结构不对,或者图片和标签的文件名不匹配。检查顺序为先确认data.yaml路径正确,再确认images与labels下的train和val子目录结构一致,最后确认图片和标签文件除了后缀名之外的前缀完全一致。

6.2 显存溢出怎么处理

如果8GB显存跑yolov5s的640分辨率,batch-size设为16很容易报CUDA out of memory。处理顺序建议先降低batch-size到8或4,如果仍然不够,再把workers从默认值改到2,最后再考虑换用yolov5n结构。要注意batch-size调小之后,学习率也要相应调低,否则模型更新步长过大导致训练震荡。

6.3 误报严重时的三板斧

烟雾火灾检测的误报来源很多:路灯、晚霞、白墙反光、厨房蒸汽都可能触发检测。我在实际项目中总结了三招:

第一,往训练集里加负样本,也就是那些包含类似烟雾但实际不是烟雾的图片,标签文件可以为空。让模型学到"没有目标"的分布,这一招对降低误报非常有效。

第二,把--conf-thres适当提高,从0.3调到0.4甚至0.5,很多低置信度的误检会直接消失。

第三,在应用层加入帧间过滤逻辑,例如连续3帧中同一位置都要检测到目标并且置信度超过阈值,才触发报警。这样可以过滤掉单帧的随机抖动。

6.4 夜间和远距离小目标检测效果差

烟雾火灾检测在夜间通常会受到光线干扰,红外或低照度图像中烟雾与背景的对比度更低。解决办法是训练时加入夜色图像的数据增强,比如降低亮度、增加噪声,更重要的是确认你的GPU显存够大就把训练分辨率调到1280试试。分辨率提高对小目标检测非常有帮助,但推理速度也会明显下降,需要在部署前评估是否可接受。

最后再分享一个让我少走很多弯路的习惯:不要一上来就追求最好的模型,先把最简流程从数据到部署完整跑通,清楚每一步的时间和瓶颈在哪里,再做针对性优化。火灾烟火烟雾检测这类项目,真正消耗时间的往往不是训练本身,而是数据整理、环境配置和部署调试这些环节。一套2059张图像、带好标签的数据集配合YOLOv5,能让你在起步阶段不被数据卡住,剩下的就是踏踏实实把流程跑明白,然后在这个基线上一点点迭代。这比一开始就纠结用yolov5还是yolov8、用s还是用l,实际得多。

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

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

研究生论文写作效率提升:九大工具从文献到排版全指南

研究生阶段写论文,尤其是在读研二研三的老油条眼里,最痛苦的不是没想法,而是被文献、格式、英文润色、参考文献排序这些琐碎事情拖垮。市面上叫“一键生成论文工具”的东西很多,有些确实是深度学习模型包装出来的半成品&#xff0…

作者头像 李华
网站建设 2026/9/8 9:15:34

GPU嵌入推理与批处理:AI搜索服务性能优化实践

最近在折腾一套语义搜索服务的时候,我又把 Perplexity 的公开技术分享翻出来看了一遍。Perplexity 这个产品看起来是个“搜索框 大模型回答”,但真正撑住它每天海量查询的,是背后那条大规模搜索结果服务链路。而这条链路里最容易被低估、又最…

作者头像 李华
网站建设 2026/9/8 9:14:03

GitHub 热榜的正确打开方式:从收藏到本地跑通的实操指南

9月4日早上,我照例先打开 GitHub Trending,扫一眼当天涨 star 最快的那一批项目。页面里躺着的,大致还是几幅熟悉的面孔:学习资料型仓库、AI Agent 示例、可视化工具、前后端分离的实战项目。如果只看标题,会觉得今天的…

作者头像 李华
网站建设 2026/9/8 9:13:42

Go Context取消信号机制深度解析:从原理到工程实践

做 Go 开发,有几件事你迟早要正面撞上:goroutine 泄漏、超时控制失效、服务一重启整个依赖链跟着雪崩。这三件事背后的元凶往往指向同一个——你根本没掌握 Context 的取消信号机制。我见过不少项目,context.Background()从头传到底&#xff…

作者头像 李华
网站建设 2026/9/8 9:11:33

函数计算+AgentRun打造赛博朋克智能眼镜:硬件改造与云端编排实战

1. 项目概述与整体设计思路 1.1 先从一副眼镜说起:这里要做的到底是什么 看到标题点进来的朋友,估计都是对硬件改造和 AI Agent 感兴趣的同道中人。先交代下背景,我做这个项目的时间窗口非常紧,只有 2 天,目标是把手头…

作者头像 李华