news 2026/8/28 6:24:44

YOLOv5火焰检测实战:从环境搭建到模型部署全流程详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5火焰检测实战:从环境搭建到模型部署全流程详解

简介:目标检测是计算机视觉的核心任务之一,旨在识别图像或视频中的特定物体并定位其位置。其原理通常基于深度学习模型,通过卷积神经网络提取特征,并利用回归或锚框机制预测目标边界。这项技术在安防监控、自动驾驶、工业质检等领域具有重要价值,能够实现自动化、智能化的视觉分析。在众多应用场景中,火焰识别是社区安防和灾害预警的关键需求,它要求模型具备实时性和高准确性。本文聚焦于使用YOLOv5这一流行的目标检测框架,结合一个包含4000张标注图片的火焰数据集,详细阐述了从环境配置、数据准备、模型训练调优到边缘部署的完整工程实践路径,并针对训练中常见的显存不足、过拟合等问题提供了解决方案。

1. 项目缘起:为什么选择YOLOv5来做火焰识别?

最近在做一个社区安防相关的项目,其中一个核心需求就是实现对监控画面中火焰的实时、自动识别与报警。市面上关于火焰检测的方案不少,从传统的基于颜色和纹理特征的方法,到各种深度学习模型都有尝试。但经过一番对比和实测,我最终还是决定用YOLOv5来落地。原因很简单:它够快、够准,而且生态成熟,从数据准备到模型部署,整个流程都有清晰的路径可循,特别适合我们这种需要快速验证和上线的场景。

你可能也搜过“yolov5安装步骤”、“yolov5训练自己的数据集”这些关键词,这说明大家普遍卡在入门和实操这一步。网上的教程很多,但要么过于简略,要么环境复杂容易报错。我这次的项目,从头到尾跑通了整个流程,并且整理了一个包含4000张标注好的火焰数据集。这篇文章,我就把自己从环境搭建、数据准备、模型训练、调优到最终测试的完整过程,以及中间踩过的各种坑和解决方案,毫无保留地分享出来。无论你是刚接触目标检测的新手,还是想找一个可靠的火焰识别方案,相信这篇内容都能给你提供一条清晰的“抄作业”路径。

2. 环境搭建与YOLOv5项目初始化

万事开头难,一个稳定、兼容的环境是后续所有工作的基础。很多人卡在第一步,就是因为环境依赖没处理好。

2.1 创建独立的Python虚拟环境

我强烈建议你使用condavenv创建一个独立的Python环境。这能避免与系统或其他项目的包版本冲突,是保持环境纯净的最佳实践。我使用的是Python 3.8,这是一个在深度学习领域兼容性非常广的版本。

# 使用conda创建环境(推荐) conda create -n yolov5_fire python=3.8 conda activate yolov5_fire # 或者使用venv python -m venv yolov5_fire_env source yolov5_fire_env/bin/activate # Linux/Mac # yolov5_fire_env\Scripts\activate # Windows

2.2 克隆YOLOv5官方仓库并安装依赖

YOLOv5的官方代码托管在GitHub上,更新活跃,社区支持好。我们直接克隆最新版本。

git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt

这里有个关键点:requirements.txt里包含的torchtorchvision通常是CPU版本。如果你有NVIDIA GPU并希望使用CUDA加速训练,需要根据你的CUDA版本重新安装PyTorch。可以去PyTorch官网使用对应的命令安装。例如,对于CUDA 11.3:

pip uninstall torch torchvision # 先卸载CPU版本 pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113

安装完成后,强烈建议运行一个快速验证脚本,确保核心功能正常:

python detect.py --weights yolov5s.pt --source data/images/bus.jpg

如果一切顺利,你会在runs/detect/exp目录下看到一张带有检测框的巴士图片。这证明你的YOLOv5环境基本没问题了。

注意:网络问题可能导致git clonepip install失败。如果遇到,可以尝试使用国内镜像源(如清华源、阿里云源)来加速 pip 安装。对于git clone,有时需要多试几次或使用代理(此处不展开讨论网络工具)。

3. 火焰数据集的准备与处理

模型训练,七分靠数据,三分靠调参。一个高质量的数据集是模型性能的天花板。我使用的这个4000张火焰数据集,是我从多个公开数据集(如野外火灾、建筑火灾视频)中精心筛选、整理并重新标注的。

3.1 数据集的结构与格式

YOLOv5要求的数据集格式是特定的。你需要将数据集组织成如下结构:

fire_dataset/ ├── images/ │ ├── train/ # 训练集图片,例如 3200张 │ └── val/ # 验证集图片,例如 800张 └── labels/ ├── train/ # 训练集标签文件,与图片一一对应 └── val/ # 验证集标签文件

关键点在于标签文件。YOLO格式的标签是一个.txt文件,与图片同名,每一行代表图片中的一个目标物体,格式为:class_id x_center y_center width height

  • class_id: 类别索引,从0开始。对于我们单类别的火焰检测,这里就是0
  • x_center, y_center, width, height: 边界框的中心点坐标和宽高,这些值都是归一化后的,即相对于图片宽度和高度的比例,范围在0到1之间。

例如,一张图片fire_001.jpg的标签文件fire_001.txt内容可能是:0 0.5 0.5 0.3 0.4这表示图片正中央有一个物体,其宽度占图宽的30%,高度占图高的40%。

3.2 数据标注工具与技巧

如果你需要从头标注自己的数据,推荐使用LabelImgRoboflowLabelImg是本地开源工具,Roboflow是在线平台,功能更强大,支持团队协作和自动预处理。

在标注火焰时,有几个经验性的技巧:

  1. 框要尽可能紧贴火焰边缘,但不要包含过多无关的烟雾或发光区域,除非你的需求就是检测“火情区域”。
  2. 对于摇曳、不规则的火焰,用矩形框将其主体部分框住即可,不必追求完美贴合每一个火苗。
  3. 注意小目标:远处的火焰可能只有几个像素点,对于安防场景很重要,不要遗漏。可以适当放大图片进行标注。
  4. 数据平衡:确保你的数据集中包含不同场景(室内、室外、白天、夜晚)、不同大小、不同形态的火焰。我的4000张数据集中,就包含了森林火、房屋火、篝火、蜡烛火等多种类型。

3.3 创建数据集配置文件

为了让YOLOv5知道你的数据集在哪里、有哪些类别,你需要创建一个数据集配置文件,通常是一个.yaml文件。我在项目根目录下创建了fire_data.yaml

# fire_data.yaml path: ../fire_dataset # 数据集的根目录 train: images/train # 训练集路径,相对于 path val: images/val # 验证集路径,相对于 path # 类别数量 nc: 1 # 类别名称列表 names: ['fire'] # 可选:下载地址/说明 # download: https://your-dataset-url.com

这个文件是连接你的数据和训练脚本的桥梁,非常重要。路径一定要写对,否则训练时会报“找不到图片”的错误。

4. 模型训练:从零开始教会YOLOv5认识火焰

有了数据和环境,我们就可以开始训练了。这是最核心也最耗时的步骤。

4.1 选择预训练模型与超参数解析

YOLOv5提供了从轻量到重量的多个模型:yolov5n(纳米),yolov5s(小),yolov5m(中),yolov5l(大),yolov5x(特大)。模型越大,精度通常越高,但速度越慢,需要的显存也越多。

对于火焰检测这种相对单一的类别,并且考虑到部署可能是在算力有限的设备(如边缘计算盒子NVIDIA Jetson、瑞芯微RK3568/RV1106等)上,我选择了yolov5s.pt作为预训练模型。它是在COCO这个大而全的数据集上预训练的,已经学会了识别通用物体的特征,我们通过“微调”让它专门化到火焰识别上,可以大大加快训练速度,提升小数据集上的性能。

启动训练的命令如下:

python train.py \ --img 640 \ # 训练图片尺寸,必须是32的倍数 --batch 16 \ # 批次大小,根据你的GPU显存调整 --epochs 100 \ # 训练轮数 --data fire_data.yaml \ # 上一步创建的数据集配置文件 --weights yolov5s.pt \ # 预训练权重 --device 0 \ # 使用GPU 0,如果是CPU则用 --device cpu --name fire_detection_v1 \ # 本次实验的名称 --cache # 使用缓存加速数据加载(需要足够的内存)

这里解释几个关键超参数,也是大家搜“yolov5超参数”时关心的:

  • --img 640: 输入图片会被缩放到640x640。更大的尺寸(如1280)可能提升对小火焰的检测能力,但会显著增加计算量和显存消耗,需要同步调整--batch大小。
  • --batch 16: 一次迭代送入模型的图片数量。越大训练越稳定,越快,但需要更多显存。如果出现“CUDA out of memory”错误,就减小这个值(如8或4)。
  • --epochs 100: 整个数据集被遍历的次数。对于我们的4000张图,100个epoch通常是一个合理的起点。可以通过观察验证集损失是否不再下降来判断是否早停。
  • --cache: 将图片缓存到内存或磁盘,可以极大加速训练,尤其是当你的图片存储在慢速硬盘上时。首次训练会慢一点,因为要创建缓存,后续epoch会快很多。

4.2 训练过程监控与指标解读

训练开始后,控制台会输出日志,同时会在runs/train/fire_detection_v1目录下生成大量有用的文件和可视化结果。你需要重点关注以下几个:

  1. results.csvresults.png: 这是训练过程的“仪表盘”。results.png是一张综合图表,包含:

    • 损失曲线(Box, Objectness, Classification):训练损失和验证损失都应随着epoch增加而下降并趋于平缓。如果验证损失上升,可能是过拟合了。
    • 精度指标(Precision, Recall, mAP@0.5, mAP@0.5:0.95)
      • Precision(精确率):模型预测为火焰的框中,有多少是真正的火焰。越高越好,表示误报少。
      • Recall(召回率):所有真实的火焰框中,有多少被模型找出来了。越高越好,表示漏报少。
      • mAP@0.5:在IoU(交并比)阈值为0.5时的平均精度,是衡量检测性能的核心指标。对于火焰检测,我们通常更关注高召回率(不漏报),所以这个值达到0.85以上就算不错。
      • mAP@0.5:0.95:在不同IoU阈值下的平均mAP,更严格。
  2. confusion_matrix.png: 混淆矩阵。对于我们单类别任务,主要看背景被误判为火焰(False Positive)和火焰被漏判(False Negative)的比例。理想情况是左上角(True Positive)数值最大,其他格子都是0。

  3. val_batchX_labels.jpgval_batchX_pred.jpg: 随机抽取的验证集批次图片,分别显示了真实的标签框和模型的预测框。这是最直观的检查方式,可以立刻看出模型在哪些图片上表现好,哪些图片上漏检或误检。

4.3 训练中遇到的典型问题与解决策略

第一次训练很少能一帆风顺,下面是我遇到并解决的几个典型问题:

问题一:显存不足(CUDA out of memory)这是最常见的问题。除了降低--batch-size,还可以尝试:

  • 使用更小的模型,如yolov5n.pt
  • 减小--img尺寸,如从640降到416。
  • 使用--workers 0关闭多进程数据加载,有时能省点显存。
  • 确保没有其他程序占用GPU。

问题二:损失不下降或波动很大

  • 检查数据:首先用python train.py --data fire_data.yaml --weights yolov5s.pt --epochs 1快速跑一个epoch,看看数据加载是否正常,标签格式是否正确。查看生成的train_batch0.jpg,确认标注框是否在正确的位置。
  • 学习率问题:YOLOv5有自动调整学习率的功能。但如果损失一直很高,可以尝试在命令中显式指定一个更小的初始学习率--lr 0.001(默认是0.01)。
  • 数据太简单或太复杂:如果数据质量极好且单一,模型可能很快收敛;如果数据非常复杂、模糊,损失下降会慢。耐心增加epoch数。

问题三:验证集mAP很低,但训练集损失正常这是典型的过拟合。模型“死记硬背”了训练集,但没学会泛化。

  • 增加数据多样性:这是根本方法。使用数据增强。
  • 使用更强的数据增强:YOLOv5默认开启了Mosaic、MixUp等增强。你可以在data/hyps/hyp.scratch-low.yaml等超参数文件中调整增强强度,或直接在命令中加--hyp指定。
  • 加入正则化:尝试减小模型,或增加--weight-decay参数(如从默认的0.0005增加到0.001)。
  • 早停:监控验证集mAP,如果连续多个epoch不再提升,就停止训练。

5. 模型评估、优化与测试

训练完成后,我们得到了一个模型权重文件,通常保存在runs/train/fire_detection_v1/weights/目录下,其中best.pt是在验证集上表现最好的权重,last.pt是最后一个epoch的权重。我们使用best.pt进行后续操作。

5.1 模型性能的定量评估

使用专门的评估脚本,在验证集上获得更详细的指标:

python val.py \ --weights runs/train/fire_detection_v1/weights/best.pt \ --data fire_data.yaml \ --img 640 \ --batch 32 \ --task val \ --name fire_eval_v1

运行后,它会输出一个包含各类别AP(平均精度)的表格,以及最终的mAP值。同时,在runs/val/fire_eval_v1目录下,会生成预测结果的可视化图片,方便你逐一检查模型在验证集上的表现。

5.2 模型优化与剪枝尝试(可选)

如果你的模型是为了部署到资源受限的边缘设备(如RK3568、RV1106),可能会考虑模型优化。常见方法有:

  • 模型剪枝:移除网络中不重要的连接或通道,减小模型大小和计算量。有专门的剪枝工具,但需要谨慎操作,因为会损失精度。
  • 量化:将模型参数从32位浮点数转换为8位整数,可以大幅减少模型体积和加速推理。PyTorch提供了量化工具。
  • 转换为ONNX等中间格式:便于在不同推理引擎(如TensorRT, OpenVINO, NCNN)上部署。

对于YOLOv5,官方支持一键导出为ONNX格式:

python export.py \ --weights runs/train/fire_detection_v1/weights/best.pt \ --img 640 \ --batch 1 \ --include onnx \ --simplify # 简化ONNX模型

注意:优化和转换是一个专业领域,可能会引入精度损失和兼容性问题。建议先在PC上对优化后的模型进行严格测试,再部署到边缘设备。

5.3 使用模型进行推理测试

这是最有成就感的环节——用你训练的模型去检测新的图片或视频。YOLOv5的detect.py脚本非常强大:

检测单张图片:

python detect.py \ --weights runs/train/fire_detection_v1/weights/best.pt \ --source path/to/your/test_image.jpg \ --conf 0.25 \ # 置信度阈值,高于此值才显示 --save-txt # 保存检测结果的标签文件

结果会保存在runs/detect/exp下。

检测视频文件:

python detect.py \ --weights runs/train/fire_detection_v1/weights/best.pt \ --source path/to/your/test_video.mp4 \ --conf 0.3

使用摄像头实时检测:

python detect.py \ --weights runs/train/fire_detection_v1/weights/best.pt \ --source 0 \ # 0代表默认摄像头 --conf 0.4

在测试时,你需要根据实际场景调整--conf置信度阈值。在安防场景下,为了减少漏报,可以适当调低(如0.2),但会引入更多误报(如将夕阳、红色灯光误认为火焰)。反之,为了减少误报,可以调高(如0.5)。这是一个需要权衡的参数。

6. 实战中的挑战与解决方案

在实际部署和测试中,纯粹的模型精度指标还不够,我们会遇到许多在干净数据集上遇不到的问题。

6.1 复杂场景下的误报与漏报

火焰检测最大的挑战在于区分真正的火焰和类似火焰的干扰物。以下是我遇到的一些典型误报场景及应对思路:

  1. 红色/橙色物体:如红色衣服、夕阳、车尾灯。

    • 解决方案:在数据集中加入大量此类“负样本”(即没有火焰但包含干扰物的图片),并确保它们被正确标注为“无目标”。模型在学习过程中会逐渐学会区分火焰的纹理、动态特征和静态颜色块。
    • 技术增强:可以尝试在模型输入端,除了RGB三通道外,是否可以利用HSV颜色空间中对火焰更敏感的通道(如饱和度S、明度V)进行辅助,但这需要对模型结构或输入预处理进行修改,复杂度较高。更实用的方法是在后处理阶段,结合火焰区域的闪烁频率(如果处理的是视频)进行过滤。
  2. 小目标火焰漏检:远处的火焰在画面中可能只有10x10像素。

    • 解决方案:这是目标检测的通用难题。可以尝试:
      • 使用更大的输入分辨率--img 1280进行训练和推理,但这会牺牲速度。
      • 使用专门针对小目标优化过的模型变体,或者修改YOLOv5的锚框(Anchor)参数,使其更适配小目标。
      • 在数据标注时,对小目标进行更精细的标注,并确保训练集中小目标样本充足。
  3. 火焰被部分遮挡:例如被烟雾、物体遮挡。

    • 解决方案:数据增强!在训练时,使用YOLOv5自带的遮挡增强(如随机擦除、Mosaic拼接时可能产生自然遮挡),让模型学会从局部特征推断火焰。

6.2 模型轻量化与边缘部署考量

搜索热词中出现了“rv1106搭建yolov5模型”、“yolov5在rk3568上”,这说明边缘部署需求旺盛。将YOLOv5部署到这些算力有限的嵌入式芯片上,需要额外的步骤:

  1. 模型转换:通常需要将PyTorch模型先转为ONNX,再通过芯片厂商提供的工具链(如RKNN Toolkit for瑞芯微芯片,NNIE for海思芯片)转换为专属格式。
  2. 精度验证:转换过程可能引入量化误差,必须在转换后,在目标平台上用测试集重新评估精度,确保损失在可接受范围内。
  3. 性能调优:调整输入分辨率、模型精度(FP16/INT8)、推理框架的线程数等参数,在速度和精度间找到最佳平衡点。

一个实用的建议:在PC端训练时,就使用目标平台计划采用的输入分辨率(如320x320或416x416)进行训练,这样能避免因分辨率缩放带来的性能差异。

6.3 构建持续迭代的数据闭环

模型上线不是终点。在实际应用中,你会收集到大量模型判断错误(漏报、误报)的案例。这些案例是提升模型性能的“金矿”。

建立一个简单的流程:定期(如每周)从线上系统导出这些困难样本,经过人工复核确认后,加入到你的训练数据集中。然后用扩充后的数据集重新训练模型(可以基于之前的best.pt进行微调)。这样迭代2-3个周期后,模型在特定场景下的性能会有显著提升。这就是AI工程中常说的“数据闭环”,是让模型真正落地、产生价值的核心。

7. 项目总结与扩展思考

回顾整个“使用YOLOv5实现火焰识别”的项目,从环境搭建到模型部署,其实是一个标准的深度学习目标检测应用流程。通过这个具体的项目,你掌握的不仅仅是一个火焰检测模型,更是一套解决类似视觉检测问题的方法论。

我个人的体会是,数据质量决定上限,模型调优决定下限,而工程化能力决定它能否真正用起来。4000张数据集是一个不错的起点,但要想达到商用级的可靠度,可能还需要在数据的多样性、困难样本的覆盖上继续投入。YOLOv5s模型在NVIDIA Tesla T4上可以轻松达到100+FPS的推理速度,这为实时视频流分析提供了可能。

这个项目还可以向多个方向扩展:

  • 多模态检测:除了视觉火焰,是否可以接入温度传感器或烟雾报警器的数据,进行融合判断,进一步提高报警准确率?
  • 火情分析:不仅检测“有没有火”,还可以估计火焰的大小、蔓延速度,为应急决策提供更多信息。
  • 部署优化:探索使用TensorRT、OpenVINO等工具对模型进行极致优化,使其能在更低功耗的硬件上运行。

最后,关于数据集,我使用的这个4000张火焰数据集,包含了多种场景,标注质量也经过了检查。如果你需要用于学术或开源项目研究,我可以提供获取途径。希望这篇超详细的实践记录,能帮你绕过我踩过的那些坑,顺利搭建出自己的火焰检测系统。

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

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

快速降低维普AIGC率办法

手写论文也会被判AI?掌握这几招,快速降低维普AIGC重复值 现在高校毕业论文审核,维普AIGC人工智能检测已经成为必过项目。很多学生都遇到过同一个难题:论文查重率完全达标,全文纯手动撰写,却因为AI机器特征过…

作者头像 李华
网站建设 2026/8/28 6:13:14

TOPSIS优劣解距离法:从原理到MATLAB实现的数学建模实战指南

1. 项目概述:为什么TOPSIS是数学建模的“万金油”?在数学建模的赛场上,无论是国赛、美赛还是亚太杯,评价与决策类问题几乎年年不缺席。题目可能让你给城市宜居性排个序,或者从一堆方案里选出最优的供应商,核…

作者头像 李华
网站建设 2026/8/28 6:11:06

python cxfreeze Python cxfreeze打包慢如蜗牛?Go两行代码就秒了,气死

若进展顺遂, 我已然使你信服Go是一种出色的编程语言, 除非缘其他缘由, 有些人不会觉得我于整篇文章里对Go的阐述糟糕透顶。此刻我们来探讨一下其生产率/性能究竟如何。生产率其一且最为关键的,极易开展学习。此亦为于当下获高评价的美国大学内会被当作首选教学语言的缘由。那等…

作者头像 李华
网站建设 2026/8/28 6:10:42

大模型路由中枢:统一API网关与智能调度架构

简介:大模型路由是AI工程化落地的关键基础设施,其本质是通过协议抽象、动态调度与状态协调,解决多厂商API碎片化带来的开发运维困境。核心原理在于构建分层架构——从统一入口网关、可配置路由引擎、协议适配器到能力增强中间件,实…

作者头像 李华
网站建设 2026/8/28 6:07:52

蓝桥杯Java国赛B组核心考点解析与备赛实战指南

1. 从“国赛”到“实战”:一次Java竞赛的深度复盘与价值提炼又到了每年蓝桥杯国赛尘埃落定的时候。对于很多Java方向的选手,尤其是大学B组的同学来说,国赛的结束往往意味着一个阶段的终结,但在我看来,这恰恰是另一个更…

作者头像 李华
网站建设 2026/8/28 6:06:42

Zig Io.Threaded解析:线程池如何重构I/O执行策略

Zig 的 Io.Threaded 到底妙在哪?一个线程池如何重新定义 I/O 执行策略在系统编程里,线程池几乎是“默认正确”的并发方案:任务来了进队列,线程去队列取任务,执行完继续等下一个。大多数语言的线程池本质都是这个模型&a…

作者头像 李华