尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于YOLOv5的工业火焰检测:从数据准备到嵌入式部署全流程实战

基于YOLOv5的工业火焰检测:从数据准备到嵌入式部署全流程实战 简介本资源是一套面向电力行业智能化升级需求的火焰识别检测实战方案基于YOLOv5算法构建适用于智慧电网、智慧工地、智慧小区等工业级安防场景助力开发者快速落地高精度火焰检测能力。压缩包共2000个文件包含约3700张高质量火焰JPEG图像、配套的TXT标签文件已按YOLO格式预转换、XML标注文件、训练配置YAML及核心Python脚本整体体积275.8MB开箱即用无需额外格式转换。目前已有7274人学习下载反映出其在工业安全AI应用中的广泛认可度。资源提供完整训练流程支持含数据加载、模型训练、推理测试及评估脚本并附多语言README文档、代码规范说明与安全指南目录结构清晰适配CPU/GPU/ARM64多平台部署显著降低工程化门槛。1. 项目概述从火焰识别到工业安全预警最近在做一个工业安全相关的项目客户需要在仓库、车间等场景下部署一套实时的火焰预警系统。传统的烟雾传感器响应慢而且对开放空间或初期明火不敏感。基于深度学习的视觉火焰检测就成了一个很自然的选择。在众多目标检测框架里YOLOv5以其出色的速度-精度平衡和友好的工程化部署特性脱颖而出成为了我的首选。这个项目不仅涉及模型的训练和调优更关键的是如何构建一个高质量、有代表性的数据集以及如何将模型真正落地到边缘设备上。今天我就把从数据准备、模型训练到优化部署的全流程梳理一遍希望能给想做类似视觉安防项目的朋友一些参考。简单来说这个项目的核心就是利用YOLOv5算法训练一个能够准确、快速识别图像或视频流中火焰的模型。它要解决的痛点很明确在复杂的真实环境中比如有相似颜色的灯光、反光物体干扰如何降低误报率在火焰初起、面积较小时如何保证检测的灵敏度以及最终如何以最小的计算成本在嵌入式设备或普通工控机上实现实时如30FPS检测。我手头整理了一个包含约4000张标注图片的火焰数据集这个规模对于此类垂直场景的模型训练来说是一个比较理想的起点。2. 核心思路与方案选型为什么是YOLOv5在决定用YOLOv5之前我也对比过其他方案。比如两阶段检测器Faster R-CNN精度固然高但速度难以满足实时监控的要求。YOLO系列作为单阶段检测器的代表天生就是为了速度而生。而YOLOv5虽然不是官方YOLO作者的作品但其在GitHub上活跃的社区、清晰的代码结构、以及丰富的文档和预训练模型让它成为了工业界落地最广泛的版本之一其易用性远超早期的v3、v4。2.1 YOLOv5的核心优势解析首先YOLOv5的网络结构采用了CSPDarknet作为主干特征提取网络并加入了Focus切片操作和SPP空间金字塔池化模块。Focus模块在输入阶段通过切片操作将通道数扩充四倍能在不损失信息的前提下减少计算量这对于后续的特征融合很有帮助。SPP模块则通过不同尺度的最大池化融合多尺度特征增强了模型对不同大小火焰的感知能力。其次它的数据增强策略非常丰富且自动化。在data/hyps/hyp.scratch.yaml等超参数文件中内置了Mosaic数据增强将四张图拼成一张、随机仿射变换、色彩空间调整HSV-Hue, Saturation, Value等。对于火焰检测这种目标颜色特征比较鲜明的任务随机调整色调和饱和度能极大地提升模型对火光颜色变化的鲁棒性避免因为灯光色温不同而误判。最后也是最重要的一点YOLOv5的工程化工具链非常完善。从数据标注格式YOLO格式的txt文件到模型训练、验证、导出支持ONNX, TorchScript, CoreML等格式整个流程都有现成的脚本。特别是其模型导出功能可以很方便地将PyTorch模型转换为其他推理框架需要的格式为后续在RV1106、RK3568这类嵌入式芯片上的部署扫清了障碍。2.2 数据集的核心考量拥有4000张标注图像是一个很好的基础但数据的“质”比“量”更重要。对于火焰检测数据集需要覆盖以下关键场景不同环境室内仓库、厨房、室外停车场、野外、白天、夜晚、光线过曝或不足的情况。不同火焰状态初起小火苗、稳定燃烧的火焰、大火产生的烟雾边缘、火焰在不同材质上的反射如金属、玻璃。干扰项红色警示灯、夕阳、电焊光、车尾灯、暖色照明灯等。这些负样本对于降低误报率至关重要。我们的数据集需要尽可能均衡地包含这些场景。如果数据集中夜晚场景太少模型在夜间监控中的表现就会很差。这就是为什么在开始训练前必须对数据集进行详细的分析和可能的补充采集或合成。3. 环境搭建与数据准备工欲善其事必先利其器。一个稳定、可复现的开发环境是项目成功的基石。3.1 开发环境配置详解我强烈建议使用Anaconda来管理Python环境避免包版本冲突。以下是具体的步骤和版本选择原因# 1. 创建并激活一个独立的conda环境 conda create -n yolov5-fire python3.8 conda activate yolov5-fire # 2. 安装PyTorch。选择CUDA版本取决于你的显卡。 # 以CUDA 11.3为例去PyTorch官网获取最准确的安装命令。 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 3. 克隆YOLOv5官方仓库并安装依赖 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt这里选择Python 3.8是因为它在深度学习生态中兼容性最广。PyTorch 1.12是一个长期支持版本相对稳定。安装后务必验证GPU是否可用import torch print(torch.__version__) print(torch.cuda.is_available()) # 应返回True3.2 数据集组织结构与标注规范YOLOv5要求特定的数据集目录结构。假设我们的项目根目录为fire_detection结构应如下fire_detection/ ├── yolov5/ # 克隆的YOLOv5代码 └── datasets/ └── fire/ ├── images/ │ ├── train/ # 存放训练图片例如 fire_001.jpg │ └── val/ # 存放验证图片 └── labels/ ├── train/ # 存放训练标签与图片同名后缀为.txt └── val/ # 存放验证标签标签文件.txt的格式是YOLO标准格式每一行代表一个标注框格式为class_id x_center y_center width height。所有坐标值都是相对于图片宽度和高度的归一化值0到1之间。例如一张图片中有一个火焰其标注框信息可能为0 0.45 0.32 0.15 0.20这里的0代表类别ID我们只有“火焰”一类所以是00.45和0.32是边界框中心点的归一化坐标0.15和0.20是边界框的归一化宽高。注意标注的准确性直接决定模型上限。火焰的标注框应紧密包裹火焰区域包括摇曳的火苗尖端但不必包含过多烟雾。对于被部分遮挡的火焰也应尽可能标注可见部分。3.3 数据集划分与配置文件生成将4000张图片按大约8:1:1的比例划分为训练集、验证集和测试集。测试集不参与训练和调参仅用于最终评估。划分完成后需要创建一个数据集配置文件fire.yaml放在yolov5/data/目录下# fire.yaml path: ../datasets/fire # 数据集根目录 train: images/train # 训练集路径相对于path val: images/val # 验证集路径相对于path test: images/test # 测试集路径可选 # 类别数 nc: 1 # 类别名称列表 names: [fire]这个配置文件将告诉训练脚本在哪里找到数据和标签。4. 模型训练与超参数调优数据准备好后就可以开始训练模型了。YOLOv5提供了从轻量到高精度的多种预训练模型如YOLOv5s, YOLOv5m, YOLOv5l, YOLOv5x。我们需要根据部署设备的算力进行选择。4.1 启动训练与关键参数解析对于火焰检测我们通常不需要特别巨大的模型。YOLOv5ssmall或YOLOv5mmedium在精度和速度上往往能取得很好的平衡。使用预训练权重可以加速收敛并提升最终性能。cd yolov5 python train.py --img 640 --batch 16 --epochs 100 --data data/fire.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name fire_detection_v1这条命令的参数含义如下--img 640: 输入图像尺寸。YOLOv5会统一将图片缩放到此尺寸。更大的尺寸如1280可能提升小目标检测精度但会显著增加计算量和内存消耗。640是一个兼顾速度和精度的常用值。--batch 16: 批次大小。取决于你的GPU显存。如果出现CUDA out of memory错误需要减小batch或--img。--epochs 100: 训练轮数。对于4000张图的数据集100轮通常足够。可以通过观察验证集损失曲线来判断是否早停。--data: 指定我们刚创建的数据集配置文件路径。--cfg: 指定模型结构配置文件。yolov5s.yaml定义了YOLOv5s的网络结构。--weights: 加载预训练权重。yolov5s.pt是在COCO数据集上预训练的权重这提供了通用的物体特征提取能力。--name: 本次实验的名称。所有输出模型权重、日志、图表都会保存在runs/train/fire_detection_v1目录下。训练开始后终端会输出每一轮epoch的训练损失和验证损失以及mAP0.5等指标。更重要的是TensorBoard日志会被自动记录我们可以通过tensorboard --logdir runs/train来启动可视化面板实时监控训练过程。4.2 超参数调优实战YOLOv5的超参数定义在data/hyps/目录下。默认使用的是hyp.scratch-low.yaml如果使用预训练权重则会用hyp.finetune.yaml。我们可以复制一份进行修改以更好地适配火焰检测任务。关键超参数及其影响lr0(初始学习率): 微调任务通常使用较小的学习率如0.01或0.001避免破坏预训练权重中已有的良好特征。hsv_h,hsv_s,hsv_v: 控制HSV颜色空间增强的强度。火焰颜色集中在红色、黄色通道。可以适当增加hsv_h色调抖动范围让模型学会识别不同色温的火焰但hsv_s饱和度和hsv_v明度的抖动不宜过大以免将非火焰的红色物体增强进来。flipud和fliplr: 上下/左右翻转的概率。火焰没有固定的方向所以可以设置较高的翻转概率如0.5。mosaic: Mosaic数据增强的概率。它能极大地提升小目标检测能力建议保持默认的1.0。一个针对火焰检测的微调超参数示例在hyp.finetune.yaml基础上修改lr0: 0.01 # 初始学习率微调时调小 lrf: 0.01 # 最终学习率因子 (lr0 * lrf) hsv_h: 0.015 # 色调增强略微提升以增加颜色鲁棒性 hsv_s: 0.7 # 饱和度增强保持较高值以突出火焰颜色特征 hsv_v: 0.4 # 明度增强保持中等避免过暗或过亮 flipud: 0.5 # 上下翻转概率 fliplr: 0.5 # 左右翻转概率 mosaic: 1.0 # 启用mosaic使用自定义超参数文件进行训练python train.py --data data/fire.yaml --hyp data/hyps/hyp.fire.yaml ...其他参数4.3 训练过程监控与评估训练过程中要重点关注runs/train/expX目录下生成的几个关键图表results.png: 展示了所有关键指标随训练轮数的变化包括训练/验证框损失box_loss、分类损失cls_loss、目标性损失obj_loss以及精确度precision、召回率recall、mAP0.5和mAP0.5:0.95。混淆矩阵confusion_matrix.png: 查看模型在验证集上分类的混淆情况。理想情况下主对角线正确分类的值应该最高。labels.jpg和labels_correlogram.jpg: 显示数据集中标注框的分布包括中心点位置、宽高比等。这有助于判断数据集是否存在偏差例如火焰是否都集中在图像中央。实操心得不要只看最后的mAP值。如果验证集损失在后期开始上升而训练集损失持续下降这是典型的过拟合现象。此时应该提前停止训练Early Stopping或者增加数据增强的强度、添加Dropout层、进行更激进的正则化。对于火焰数据集我常发现模型容易将橙红色的衣物或灯光误判为火焰这说明数据集中此类“困难负样本”不足需要针对性补充。5. 模型验证、测试与性能分析训练完成后我们会在runs/train/fire_detection_v1/weights目录下得到两个最重要的权重文件best.pt验证集上表现最好的权重和last.pt最后一轮的权重。通常我们使用best.pt进行后续操作。5.1 模型验证与指标解读使用验证集评估模型性能python val.py --weights runs/train/fire_detection_v1/weights/best.pt --data data/fire.yaml --img 640评估报告会输出一系列关键指标Precision精确率: 所有被预测为火焰的框中真正是火焰的比例。高精确率意味着低误报。Recall召回率: 所有真实的火焰框中被模型找出来的比例。高召回率意味着漏报少。mAP0.5: 在IoU交并比阈值为0.5时的平均精度均值。这是目标检测的核心指标综合了精确率和召回率。对于安防场景我们通常更关注召回率宁可误报也不能漏报但误报率太高也会导致系统不可用需要在两者间权衡。mAP0.5:0.95: 在IoU阈值从0.5到0.95步长0.05区间内的平均mAP这是一个更严格的指标。5.2 可视化测试与错误分析仅仅看数字不够直观我们需要可视化模型在测试集上的预测结果python detect.py --weights runs/train/fire_detection_v1/weights/best.pt --source ../datasets/fire/images/test --save-txt --save-conf这个命令会在runs/detect/expX目录下生成带预测框的图片以及包含预测结果的标签文件。仔细查看这些图片特别是那些假阳性把非火焰物体识别为火焰和假阴性漏掉了真实火焰的案例是优化模型和数据集的黄金机会。例如如果发现模型频繁将夕阳误判为火焰那么就需要在数据集中加入更多带有夕阳、朝霞的负样本图片并重新训练。如果模型总是漏掉远处的小火苗可能需要考虑在训练时使用更大的输入图像尺寸如--img 1280或者专门收集更多包含小火焰的图片进行数据增强。5.3 模型性能瓶颈分析使用python benchmarks.py --weights best.pt可以对模型进行速度基准测试得到在不同批处理大小和图像尺寸下的推理时间GPU/CPU、以及模型复杂度参数量、GFLOPs。这对于预估模型在部署环境如RK3568芯片上的性能至关重要。如果目标设备算力有限而当前模型如YOLOv5m推理速度不达标就需要考虑换用更小的模型YOLOv5s或者进行模型剪枝、量化等优化。6. 模型优化与部署实战训练出一个精度尚可的模型只是第一步要让它在实际场景中稳定、高效地运行还需要一系列的优化和工程化工作。6.1 模型导出与格式转换YOLOv5训练出的.pt文件是PyTorch模型。为了在更多平台部署我们需要将其转换为通用格式。ONNX是一个开放标准被众多推理引擎支持如OpenVINO, TensorRT, ONNX Runtime。python export.py --weights runs/train/fire_detection_v1/weights/best.pt --include onnx --img 640 --batch 1 --simplify参数说明--include onnx: 指定导出为ONNX格式。--img 640: 指定模型的输入尺寸必须与训练时一致。--batch 1: 指定批处理大小为1这是大多数嵌入式部署场景的设定。--simplify: 启用ONNX简化器优化计算图结构有时能提升推理速度。导出成功后你会得到一个best.onnx文件。可以使用Netron工具netron.app打开它可视化模型结构确认输入输出节点名称。6.2 针对嵌入式设备的优化以RV1106/RK3568为例瑞芯微的RV1106/RK3568芯片通常使用其自家的RKNN Toolkit进行模型部署。流程大致如下模型转换使用RKNN Toolkit将ONNX模型转换为芯片专用的.rknn格式。这个过程会进行量化将FP32浮点数转换为INT8整数能大幅提升推理速度并减少内存占用但可能会带来一定的精度损失。# 伪代码示意RKNN转换流程 from rknn.api import RKNN rknn RKNN() rknn.config(target_platformrk3568) rknn.load_onnx(modelbest.onnx) rknn.build(do_quantizationTrue, dataset./dataset.txt) # 量化需要校准数据集 rknn.export_rknn(./fire_detection.rknn)精度验证在转换后必须在PC上使用模拟器或连接实际开发板用测试集验证量化后模型的精度确保损失在可接受范围内。编写推理代码在嵌入式设备上使用C或Python调用RKNN Runtime API加载.rknn文件完成图像预处理、推理、后处理将输出张量解码为边界框的全流程。避坑指南量化是部署的关键也是难点。量化校准数据集dataset.txt里列举的图片最好能覆盖所有可能遇到的场景明暗、颜色等。如果量化后精度下降太多可以尝试“混合量化”策略或者调整量化算法参数。另一个常见问题是训练时用的图像预处理归一化到0-1必须与部署时的预处理完全一致否则会导致性能严重下降。6.3 工程化部署考量一个完整的火焰检测系统不仅仅是模型推理还包括视频流处理使用OpenCV或FFmpeg读取RTSP摄像头流并拆解成帧。多线程/进程将视频采集、模型推理、结果绘制/告警发送放在不同的线程中避免因模型推理阻塞导致视频卡顿。告警逻辑不是检测到一帧有火焰就告警通常需要设置一个持续时间和置信度阈值。例如“连续5帧内有3帧检测到置信度大于0.7的火焰目标”才触发告警这能有效过滤瞬时误报。资源监控在嵌入式设备上需要监控CPU、内存和温度设计降级策略如当温度过高时降低推理帧率。7. 常见问题与排查技巧实录在实际操作中你一定会遇到各种各样的问题。下面是我总结的一些典型问题及其解决方案。7.1 训练阶段问题问题现象可能原因排查与解决思路Loss为NaN或突然变得巨大学习率设置过高数据标注有严重错误如坐标超出0-1范围数据中存在损坏的图片。1. 检查数据标注格式是否正确。2. 使用--hyp调低学习率lr0。3. 使用python -c from utils.datasets import LoadImages; [print(img) for img in LoadImages(datasets/fire/images/train)]遍历检查图片是否能正常打开。mAP始终很低0.5数据集质量差标注不准、类别不平衡模型容量不足或过大超参数严重不合适。1. 可视化检查训练集和验证集的标注使用python train.py --data ... --rect查看。2. 尝试更换模型尺寸如从YOLOv5s换到YOLOv5m。3. 检查超参数文件特别是数据增强部分是否过于激进导致图像失真。过拟合训练集loss下降验证集loss上升训练数据量太少模型复杂度过高数据增强不够。1. 增加数据增强强度Mosaic, MixUp等。2. 在模型配置文件中增加正则化如Dropout层。3. 如果数据量确实有限考虑使用更小的模型YOLOv5s或采用迁移学习冻结主干网络的部分层进行训练。7.2 推理与部署阶段问题问题现象可能原因排查与解决思路推理速度远慢于预期部署环境如ARM CPU未启用NEON等SIMD指令优化模型转换时未进行优化推理代码存在效率瓶颈。1. 在嵌入式平台确保使用的推理库如RKNN, NCNN, Tengine是针对该平台编译优化的版本。2. 检查预处理和后处理代码避免使用Python循环尽量使用NumPy或库提供的向量化操作。3. 使用性能分析工具如py-spyfor Python定位热点函数。部署后检测精度大幅下降训练与部署的预处理不一致量化损失过大部署环境与训练环境存在域差异如摄像头色彩偏差。1.严格对齐预处理将训练时utils/datasets.py中的letterbox函数和归一化参数除以255完全复现到部署代码中。2.检查量化在PC上用RKNN Toolkit的模拟器验证量化模型精度。3.域适应如果摄像头画面色偏考虑在部署代码中加入简单的色彩校正或者收集该摄像头的少量数据对模型进行微调。误报率高将灯光等识别为火焰数据集中负样本不足特别是“困难负样本”。这是火焰检测最常见的问题。主动学习将部署初期误报的截图收集起来标注为负样本加入到训练集中重新训练模型。迭代几次后误报率会显著下降。7.3 数据相关技巧小目标检测优化如果火焰目标普遍很小可以尝试训练时增大输入图像尺寸--img 1280。修改模型结构在models/yolov5s.yaml中将浅层特征图如P3也连接到检测头增强小目标检测能力YOLOv5默认设计已考虑。使用更密集的锚框anchor聚类。使用utils/autoanchor.py脚本基于你的数据集重新计算锚框尺寸。数据不平衡处理如果数据集中“大火”和“小火”图片数量悬殊模型会偏向于学习数量多的类别。可以通过过采样复制少样本类别的图片或在数据增强时对少样本类别使用更强的增强来缓解。最后我想强调的是任何一个成功的视觉AI项目都是一个“数据-模型-部署”不断迭代优化的闭环。不要指望一次训练就能得到完美的模型。将模型部署到测试环境收集它犯错的案例用这些案例不断丰富你的数据集再进行下一轮训练。这个迭代过程才是提升模型在实际场景中表现的最有效方法。我自己的这个火焰检测项目就是经过了三轮这样的数据迭代才将误报率降低到客户可接受的水平。希望这些经验能帮你少走些弯路。本文还有配套的精品资源点击获取
返回列表