ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv5火灾图像识别实战:从best.pt推理到自定义数据训练

YOLOv5火灾图像识别实战:从best.pt推理到自定义数据训练 简介这份资源面向希望入门目标检测与火灾图像识别的Python开发者提供基于yolov5框架的完整实践方案涵盖从数据准备、模型训练到预测应用的闭环流程。压缩包共19个文件约30.45MB包含pt预训练权重、yaml配置文件、ipynb训练笔记、png与jpg训练曲线及验证图、mp4与gif演示素材、md说明文档和license等覆盖模型定义、数据加载、参数配置与结果可视化各环节。资源内附火灾与非火灾标注数据集可直接用于训练与验证帮助读者理解边界框预测与类别概率输出机制。目前已有239人学习下载适合具备一定Python与深度学习基础、想掌握yolov5实战及数据集处理技巧的读者参考也可作为课程设计或竞赛项目的起步模板。1. 火灾图像识别为什么值得单独拆一个 YOLOv5 项目去年帮一个做园区安防的朋友看他们早期烟雾报警的误报记录一天能刷出几十条厨房蒸汽、焊接火花、夕阳反光全被当成火情。传统传感器在开放空间里基本靠天吃饭而摄像头本来就在那儿缺的只是一套能跑在边缘盒子上的检测模型。这个fire-main.zip就是干这件事的Python YOLOv5 的火灾图像识别完整工程压缩包里带了训练好的best.pt、fire_config.yaml、train.ipynb、datasets目录还有一整套训练曲线和验证图。它解决的不是从零训一个检测器的问题而是让你在已有权重和数据集结构上快速跑通推理、复现训练、再换成自己场景的数据。适合两类人一类是想拿 YOLOv5 练手但不想从标注开始的新手另一类是手里有摄像头、想先验证火灾检测可行性的工程人员。下面按资源里有什么 → 怎么跑起来 → 怎么换成自己的数据 → 坑在哪的顺序拆。2. 拆开 fire-main.zip目录结构与 YOLOv5 火灾检测的选型逻辑2.1 压缩包里每个文件对应哪一步先把包解开对照目录看一遍心里有个流程地图。这个工程的结构基本是 YOLOv5 官方仓库裁剪后的样子加上火灾场景的配置和权重。文件/目录作用在流程里的位置fire_config.yaml数据集路径、类别数、类别名配置训练和验证的入口配置train.ipynb训练流程的 Notebook含环境、数据、超参设置复现训练的主脚本datasets/火灾与非火灾图像及标注数据来源models/best.pt训练好的权重文件直接推理或微调的起点results/训练曲线、PR 曲线、验证批次图判断模型好坏的依据input.mp4示例视频验证推理效果readme.md/README.md使用说明先读这个results目录里的东西别忽略。F1_curve.png、P_curve.png、R_curve.png、PR_curve.png是评估指标曲线results.png是训练过程的 loss 和 mAP 汇总val_batch2_pred_1.jpg和val_batch2_labels_1.jpg是同一批验证图的预测结果和真实标注对照。看这两组图能最快判断模型有没有漏检、误检比只看一个 mAP 数字靠谱得多。2.2 为什么火灾检测选 YOLOv5 而不是别的火灾图像识别本质是目标检测不是图像分类。分类只告诉你这张图里有火检测要告诉你火在画面哪个位置、多大范围后者才能驱动摄像头云台、联动喷淋或者推送带框的告警截图。YOLO 系列把检测当成回归问题一次前向就出框和类别速度上天然适合视频流。选 YOLOv5 而不是更新的版本在这个场景里有几个现实理由。一是工程成熟度高best.pt这种权重加载、detect.py推理、导出 ONNX 或 RKNN 的链路资料最全树莓派、RK3568 这类边缘设备部署案例多。二是这个包已经给了训练好的权重和配置你不需要纠结版本差异直接能跑。三是火灾检测对精度要求没那么极端YOLOv5s 或 YOLOv5m 在自建小数据集上微调就能到可用水平参数量和推理延迟对边缘盒子友好。提示如果你后续要上嵌入式设备先确认权重是哪个规模s/m/l/x。best.pt的文件大小能反推s 约 14MBm 约 40MB越大越慢越准。2.3 环境准备Python 版本与依赖的取舍YOLOv5 对 Python 和 PyTorch 版本比较敏感装错版本会在加载权重或训练时报一堆看不懂的错。常见做法是 Python 3.8 到 3.10PyTorch 1.8 以上配对应 CUDA。没有 GPU 也能跑推理只是训练会很慢。# 建议用 conda 隔离环境避免和系统 Python 打架 conda create -n fire python3.9 -y conda activate fire # 安装 PyTorch按你的 CUDA 版本去官网选对应命令 # 下面是无 GPU 的 CPU 版本示例有卡请换成 cu 版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu # 安装 YOLOv5 运行依赖 pip install -r requirements.txt这段命令的逻辑先建独立环境防止依赖冲突PyTorch 单独装是因为它的安装源和普通包不一样混在 requirements 里容易装错最后再装 YOLOv5 的其余依赖。参数上python3.9是兼容性最稳的区间--index-url指定 PyTorch 官方源别用默认源硬装版本对不上。装完验证一下python -c import torch; print(torch.__version__, torch.cuda.is_available())输出里True表示 GPU 可用False就是 CPU 模式。这一步别跳过后面训练脚本会根据这个自动选设备。3. 用 best.pt 跑通推理从单图到视频的完整命令3.1 加载权重做单张图像检测拿到best.pt第一件事是确认它能正常出框。YOLOv5 的推理入口是detect.py指定权重和输入源即可。# 对单张图片推理结果默认存到 runs/detect/exp python detect.py \ --weights models/best.pt \ --source test_fire.jpg \ --img-size 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --device 0逐参数说明--weights指向训练好的权重--source可以是单图、目录、视频或摄像头编号--img-size 640是推理分辨率和训练时一致效果最好--conf-thres 0.25是置信度阈值低于它的框被丢弃火灾场景建议先设低一点看召回--iou-thres 0.45是 NMS 的 IoU 阈值控制重叠框合并--device 0用第一块 GPUCPU 就写cpu。跑完去runs/detect/exp看输出图框上会带类别和置信度。如果一张明显有火的图没框先别怀疑模型把--conf-thres降到 0.1 再看很多时候是阈值卡掉了。3.2 对 input.mp4 做视频流推理包里带了input.mp4正好用来验证时序上的稳定性。视频推理和单图命令几乎一样只是 source 换成视频文件。python detect.py \ --weights models/best.pt \ --source input.mp4 \ --img-size 640 \ --conf-thres 0.3 \ --view-img--view-img会实时弹窗显示方便肉眼观察有没有闪烁式误检。视频场景里单帧误检会被时间平滑掉但连续误检就要警惕。如果要做成实时告警通常会在 detect 外面套一层逻辑连续 N 帧检测到火才触发避免单帧噪声。3.3 看懂 results 目录里的评估曲线推理跑通后回头读results里的图判断这个权重能不能用。PR_curve.png是各类别的精度-召回曲线曲线下面积就是 APF1_curve.png告诉你哪个置信度阈值下 F1 最高这个值可以直接拿来设--conf-thresresults.png里看mAP0.5和mAP0.5:0.95前者宽松后者严格。val_batch2_labels_1.jpg和val_batch2_pred_1.jpg要对着看。左边是标注真值右边是模型预测如果某张图真值有框而预测没有就是漏检预测框位置偏得离谱可能是标注格式或 anchor 不匹配。这一步是判断要不要重训的关键别跳过。注意曲线好看不代表你的场景好用。公开或自建数据集和你的摄像头视角、光照、火焰形态差异大时mAP 再高也可能翻车务必用自己场景的图做一轮验证。4. 用 train.ipynb 复现训练配置、数据与超参怎么改4.1 fire_config.yaml 里到底配了什么训练能不能跑起来八成看这个配置文件。YOLOv5 的数据配置一般长这样# fire_config.yaml 典型结构 path: ../datasets/fire # 数据集根目录 train: images/train # 训练集图像相对路径 val: images/val # 验证集图像相对路径 nc: 2 # 类别数 names: [fire, smoke] # 类别名顺序必须和标注一致path是根train和val是相对它的子路径。nc是类别数量改数据时最容易错的就是这里——你标了 3 类却写nc: 2训练直接报维度不匹配。names的顺序必须和标注文件里类别索引一一对应索引 0 对应names[0]错位会导致模型把火学成烟。标注格式是 YOLO 的 txt每行类别索引 中心x 中心y 宽 高坐标都归一化到 0 到 1。常见错误是直接拿 VOC 的 xml 或 COCO 的 json 塞进去格式不对训练会静默出错或报解析异常。4.2 在 train.ipynb 里启动训练train.ipynb把训练流程拆成了可逐格运行的单元核心是调用train.py或直接调 YOLOv5 的训练接口。命令行等价写法如下python train.py \ --data fire_config.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --hyp data/hyps/hyp.scratch-low.yaml \ --device 0参数逐个说--data指向数据配置--weights这里用官方预训练权重做迁移学习起点比从零训收敛快得多如果你只想在已有best.pt上继续微调就把它换成models/best.pt--img 640训练分辨率--batch 16批大小显存不够就降到 8 或 4--epochs 100训练轮数小数据集 50 到 100 通常够--hyp是超参文件hyp.scratch-low.yaml适合小数据集学习率更保守。训练开始后终端会打印每个 epoch 的 box_loss、obj_loss、cls_loss 和 mAP。loss 不降反升多半是学习率太大或标注有问题mAP 长时间不动检查数据里有没有大量空标注或错标。4.3 换成自己的火灾数据集想用自己的摄像头数据按这个顺序来。第一步把视频抽帧成图用 labelImg 或 CVAT 标框导出 YOLO 格式 txt。第二步按 8:1:1 或 7:2:1 划分 train/val目录结构对齐fire_config.yaml里的路径。第三步改nc和names。第四步先冻结主干训几轮再解冻全量训能减少小数据集过拟合。# 抽帧示例每秒取一帧 ffmpeg -i your_video.mp4 -vf fps1 frames/frame_%04d.jpg抽帧频率看火焰变化速度明火场景每秒 1 帧通常够要抓早期阴燃可以加密。标完检查一遍有没有漏标和错类标注质量比数量重要几百张干净数据往往胜过几千张脏数据。提示小数据集训练时把--hyp换成低学习率配置并开启 mosaic、mixup 增强能明显缓解过拟合。但火灾场景慎用过度颜色抖动可能把火焰颜色特征破坏掉。5. 火灾检测落地避坑五条血泪经验5.1 现象模型在验证集 mAP 很高实际摄像头全是误报原因验证集和真实场景分布不一致。公开数据集多是白天、近距离、大火焰你的摄像头可能是夜间、远距离、小目标加上车灯、路灯、红色衣物干扰。解决用自己场景的负样本无火但易误报的图补进训练集专门训一轮。负样本比例可以占到三到四成让模型学会区分像火但不是火。5.2 现象训练报 nc mismatch 或类别维度错误原因fire_config.yaml里的nc和标注实际类别数不一致或者names顺序和标注索引错位。解决统计所有 txt 里出现过的类别索引最大值加一就是真实nc。写个脚本扫一遍最稳import glob, os ids set() for f in glob.glob(datasets/**/labels/**/*.txt, recursiveTrue): with open(f) as fp: for line in fp: if line.strip(): ids.add(int(line.split()[0])) print(类别索引:, sorted(ids), nc 应为:, max(ids) 1)跑完对照配置文件改别凭记忆。5.3 现象推理速度慢边缘设备上跑不动原因权重规模太大或--img-size设太高或没导出成推理友好的格式。解决换 YOLOv5s 权重把--img-size降到 416 或 320 试精度损失导出 ONNX 或针对 RK3568 这类芯片转 RKNN。量化能进一步提速但要重新验证精度。5.4 现象视频推理框闪烁同一团火时有时无原因单帧置信度在阈值附近抖动NMS 和阈值设置敏感。解决加时序平滑连续 N 帧命中才确认或对检测框做跟踪如 ByteTrack再判断。单纯调阈值治标不治本。5.5 现象加载 best.pt 报 unpickling 或版本错误原因权重是用不同 PyTorch 或 YOLOv5 版本存的反序列化不兼容。解决对齐训练时的环境版本或用torch.load时指定map_location。实在不行用官方yolov5s.pt重新微调别硬啃不兼容的权重。6. 进阶把火灾检测接到实时告警链路里跑通推理只是第一步真正落地要解决检测到之后干什么。我一般会在 detect 外面包一层业务逻辑核心是去抖和分级。下面是一个最小可用的连续帧确认逻辑思路是维护一个滑动窗口窗口内命中比例超过阈值才触发告警。from collections import deque class FireAlarm: def __init__(self, window10, ratio0.6): # window: 滑动窗口帧数ratio: 触发告警的命中比例 self.window deque(maxlenwindow) self.ratio ratio def update(self, detections): # detections: 当前帧检测到的火灾框列表 hit 1 if len(detections) 0 else 0 self.window.append(hit) if len(self.window) self.window.maxlen: return False return sum(self.window) / len(self.window) self.ratiowindow10表示看最近 10 帧ratio0.6表示 6 帧以上有火才报警。这两个参数按帧率和场景调帧率高可以加大窗口要求快速响应就降低 ratio。这样能过滤掉单帧误检又不会漏掉持续火情。再往上走可以把检测框位置和大小作为火势估计的输入框面积占比大且持续增长就升级告警等级。联动上输出可以是 MQTT 消息、HTTP 回调或者直接写数据库看你的平台接口。验证方法很直接拿一段包含真实火焰和干扰物的视频跑一遍统计误报次数和漏报次数调窗口参数直到两者都可接受。我踩过最深的一个坑是只盯着 mAP 调模型忽略了业务层的去抖结果演示时被一个红色广告牌反复触发场面很尴尬。从那以后我每次上线前都强制走一遍真实场景负样本 连续帧确认的验证模型指标再好看也不跳过。希望帮到你。本文还有配套的精品资源点击获取
返回列表