公司动态

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

📅 2026/8/28 6:25:10
YOLOv5火焰检测实战:从环境搭建到模型部署全流程详解
简介目标检测是计算机视觉的核心任务之一旨在识别图像或视频中的特定物体并定位其位置。其原理通常基于深度学习模型通过卷积神经网络提取特征并利用回归或锚框机制预测目标边界。这项技术在安防监控、自动驾驶、工业质检等领域具有重要价值能够实现自动化、智能化的视觉分析。在众多应用场景中火焰识别是社区安防和灾害预警的关键需求它要求模型具备实时性和高准确性。本文聚焦于使用YOLOv5这一流行的目标检测框架结合一个包含4000张标注图片的火焰数据集详细阐述了从环境配置、数据准备、模型训练调优到边缘部署的完整工程实践路径并针对训练中常见的显存不足、过拟合等问题提供了解决方案。1. 项目缘起为什么选择YOLOv5来做火焰识别最近在做一个社区安防相关的项目其中一个核心需求就是实现对监控画面中火焰的实时、自动识别与报警。市面上关于火焰检测的方案不少从传统的基于颜色和纹理特征的方法到各种深度学习模型都有尝试。但经过一番对比和实测我最终还是决定用YOLOv5来落地。原因很简单它够快、够准而且生态成熟从数据准备到模型部署整个流程都有清晰的路径可循特别适合我们这种需要快速验证和上线的场景。你可能也搜过“yolov5安装步骤”、“yolov5训练自己的数据集”这些关键词这说明大家普遍卡在入门和实操这一步。网上的教程很多但要么过于简略要么环境复杂容易报错。我这次的项目从头到尾跑通了整个流程并且整理了一个包含4000张标注好的火焰数据集。这篇文章我就把自己从环境搭建、数据准备、模型训练、调优到最终测试的完整过程以及中间踩过的各种坑和解决方案毫无保留地分享出来。无论你是刚接触目标检测的新手还是想找一个可靠的火焰识别方案相信这篇内容都能给你提供一条清晰的“抄作业”路径。2. 环境搭建与YOLOv5项目初始化万事开头难一个稳定、兼容的环境是后续所有工作的基础。很多人卡在第一步就是因为环境依赖没处理好。2.1 创建独立的Python虚拟环境我强烈建议你使用conda或venv创建一个独立的Python环境。这能避免与系统或其他项目的包版本冲突是保持环境纯净的最佳实践。我使用的是Python 3.8这是一个在深度学习领域兼容性非常广的版本。# 使用conda创建环境推荐 conda create -n yolov5_fire python3.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 # Windows2.2 克隆YOLOv5官方仓库并安装依赖YOLOv5的官方代码托管在GitHub上更新活跃社区支持好。我们直接克隆最新版本。git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt这里有个关键点requirements.txt里包含的torch和torchvision通常是CPU版本。如果你有NVIDIA GPU并希望使用CUDA加速训练需要根据你的CUDA版本重新安装PyTorch。可以去PyTorch官网使用对应的命令安装。例如对于CUDA 11.3pip 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 clone或pip 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 heightclass_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 数据标注工具与技巧如果你需要从头标注自己的数据推荐使用LabelImg或Roboflow。LabelImg是本地开源工具Roboflow是在线平台功能更强大支持团队协作和自动预处理。在标注火焰时有几个经验性的技巧框要尽可能紧贴火焰边缘但不要包含过多无关的烟雾或发光区域除非你的需求就是检测“火情区域”。对于摇曳、不规则的火焰用矩形框将其主体部分框住即可不必追求完美贴合每一个火苗。注意小目标远处的火焰可能只有几个像素点对于安防场景很重要不要遗漏。可以适当放大图片进行标注。数据平衡确保你的数据集中包含不同场景室内、室外、白天、夜晚、不同大小、不同形态的火焰。我的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目录下生成大量有用的文件和可视化结果。你需要重点关注以下几个results.csv和results.png: 这是训练过程的“仪表盘”。results.png是一张综合图表包含损失曲线Box, Objectness, Classification训练损失和验证损失都应随着epoch增加而下降并趋于平缓。如果验证损失上升可能是过拟合了。精度指标Precision, Recall, mAP0.5, mAP0.5:0.95Precision精确率模型预测为火焰的框中有多少是真正的火焰。越高越好表示误报少。Recall召回率所有真实的火焰框中有多少被模型找出来了。越高越好表示漏报少。mAP0.5在IoU交并比阈值为0.5时的平均精度是衡量检测性能的核心指标。对于火焰检测我们通常更关注高召回率不漏报所以这个值达到0.85以上就算不错。mAP0.5:0.95在不同IoU阈值下的平均mAP更严格。confusion_matrix.png: 混淆矩阵。对于我们单类别任务主要看背景被误判为火焰False Positive和火焰被漏判False Negative的比例。理想情况是左上角True Positive数值最大其他格子都是0。val_batchX_labels.jpg和val_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 复杂场景下的误报与漏报火焰检测最大的挑战在于区分真正的火焰和类似火焰的干扰物。以下是我遇到的一些典型误报场景及应对思路红色/橙色物体如红色衣服、夕阳、车尾灯。解决方案在数据集中加入大量此类“负样本”即没有火焰但包含干扰物的图片并确保它们被正确标注为“无目标”。模型在学习过程中会逐渐学会区分火焰的纹理、动态特征和静态颜色块。技术增强可以尝试在模型输入端除了RGB三通道外是否可以利用HSV颜色空间中对火焰更敏感的通道如饱和度S、明度V进行辅助但这需要对模型结构或输入预处理进行修改复杂度较高。更实用的方法是在后处理阶段结合火焰区域的闪烁频率如果处理的是视频进行过滤。小目标火焰漏检远处的火焰在画面中可能只有10x10像素。解决方案这是目标检测的通用难题。可以尝试使用更大的输入分辨率--img 1280进行训练和推理但这会牺牲速度。使用专门针对小目标优化过的模型变体或者修改YOLOv5的锚框Anchor参数使其更适配小目标。在数据标注时对小目标进行更精细的标注并确保训练集中小目标样本充足。火焰被部分遮挡例如被烟雾、物体遮挡。解决方案数据增强在训练时使用YOLOv5自带的遮挡增强如随机擦除、Mosaic拼接时可能产生自然遮挡让模型学会从局部特征推断火焰。6.2 模型轻量化与边缘部署考量搜索热词中出现了“rv1106搭建yolov5模型”、“yolov5在rk3568上”这说明边缘部署需求旺盛。将YOLOv5部署到这些算力有限的嵌入式芯片上需要额外的步骤模型转换通常需要将PyTorch模型先转为ONNX再通过芯片厂商提供的工具链如RKNN Toolkit for瑞芯微芯片NNIE for海思芯片转换为专属格式。精度验证转换过程可能引入量化误差必须在转换后在目标平台上用测试集重新评估精度确保损失在可接受范围内。性能调优调整输入分辨率、模型精度FP16/INT8、推理框架的线程数等参数在速度和精度间找到最佳平衡点。一个实用的建议在PC端训练时就使用目标平台计划采用的输入分辨率如320x320或416x416进行训练这样能避免因分辨率缩放带来的性能差异。6.3 构建持续迭代的数据闭环模型上线不是终点。在实际应用中你会收集到大量模型判断错误漏报、误报的案例。这些案例是提升模型性能的“金矿”。建立一个简单的流程定期如每周从线上系统导出这些困难样本经过人工复核确认后加入到你的训练数据集中。然后用扩充后的数据集重新训练模型可以基于之前的best.pt进行微调。这样迭代2-3个周期后模型在特定场景下的性能会有显著提升。这就是AI工程中常说的“数据闭环”是让模型真正落地、产生价值的核心。7. 项目总结与扩展思考回顾整个“使用YOLOv5实现火焰识别”的项目从环境搭建到模型部署其实是一个标准的深度学习目标检测应用流程。通过这个具体的项目你掌握的不仅仅是一个火焰检测模型更是一套解决类似视觉检测问题的方法论。我个人的体会是数据质量决定上限模型调优决定下限而工程化能力决定它能否真正用起来。4000张数据集是一个不错的起点但要想达到商用级的可靠度可能还需要在数据的多样性、困难样本的覆盖上继续投入。YOLOv5s模型在NVIDIA Tesla T4上可以轻松达到100FPS的推理速度这为实时视频流分析提供了可能。这个项目还可以向多个方向扩展多模态检测除了视觉火焰是否可以接入温度传感器或烟雾报警器的数据进行融合判断进一步提高报警准确率火情分析不仅检测“有没有火”还可以估计火焰的大小、蔓延速度为应急决策提供更多信息。部署优化探索使用TensorRT、OpenVINO等工具对模型进行极致优化使其能在更低功耗的硬件上运行。最后关于数据集我使用的这个4000张火焰数据集包含了多种场景标注质量也经过了检查。如果你需要用于学术或开源项目研究我可以提供获取途径。希望这篇超详细的实践记录能帮你绕过我踩过的那些坑顺利搭建出自己的火焰检测系统。本文还有配套的精品资源点击获取