简介本资源面向计算机视觉初学者与火焰烟雾检测方向的开发者提供一套可直接复用的YOLOv8训练成果包含已训练好的检测模型以及配套标注数据集标签为txt格式类别涵盖fire与smoke两类基于PyTorch框架与Python代码实现适合用于课程设计、毕业项目或安防场景的快速验证与二次训练。压缩包共约2000个文件以1984个txt标注与说明文件为主另含13个md文档、2个pdf资料及1个yaml配置文件整体约339.34MB目录结构清晰便于按类别与用途检索。目前已有1369人学习下载说明该方案在同类资源中具备一定参考价值。读者可借此获得完整的模型权重、标注数据与配置说明省去从零采集与标注的成本快速跑通训练与推理流程并对照检测结果理解火焰烟雾识别的数据组织方式与调参思路。1. 火焰烟雾检测为什么总在关键时刻掉链子从一套 YOLOv8 权重加数据集说起厂区烟感摄像头拍到明火模型却把焊接火花标成火焰仓库角落阴燃冒白烟检测框迟迟不出现。这类翻车现场我见过太多次问题往往不在 YOLOv8 本身而在训练数据里火焰烟雾样本的分布和标注质量。一套「YOLOv8训练好的火焰烟雾检测模型数据集」的价值就是把别人已经踩过的数据坑、调参坑固化下来让你不用从零标注几千张图就能跑通一条可用的检测链路。它适合三类人想快速验证火焰烟雾检测可行性的算法工程师、需要给边缘设备加视觉告警的嵌入式开发者、以及拿它当毕设或课程项目底座的学生。读完你能判断这套权重能不能直接上你的场景不能的话该补什么数据、改哪些参数、怎么重新训练。2. 拆开这套火焰烟雾检测资产权重、数据集与标签格式到底长什么样2.1 火焰烟雾数据集通常包含什么为什么烟雾比火焰难标火焰烟雾检测数据集一般按 VOC 或 YOLO 两种格式组织。VOC 格式每张图配一个 XML里面是object节点YOLO 格式每张图配一个同名 txt每行class x_center y_center width height坐标全部归一化到 0 到 1。火焰和烟雾通常分成两个类有的数据集还会把烟雾细分为黑烟、白烟、灰烟但类别一多单类样本量就摊薄小数据集上反而掉点。烟雾比火焰难标原因有三个。第一烟雾没有硬边界标注框大小因人而异同一条烟柱两个人标出来的框面积可能差一倍。第二烟雾颜色受光照和背景影响极大白天白烟在灰墙上几乎隐形夜间黑烟在暗背景里也难分辨。第三早期阴燃阶段烟雾极淡标注员容易漏标模型学到的就是「浓烟才是烟」。我一般建议在标注规范里写死一条只要肉眼可辨的烟羽连续区域超过图像面积 1%就必须标且框要包住烟羽最外沿。数据集划分上常见做法是训练集 70%、验证集 20%、测试集 10%但火焰烟雾场景要额外注意「同场景泄漏」。如果同一段视频抽帧后随机分到训练和验证集验证指标会虚高因为相邻帧几乎一样。正确做法是按视频源或按拍摄日期划分确保验证集里的场景训练时没见过。2.2 YOLOv8 权重文件与配置文件的关系YOLOv8 训练好的权重是.pt文件里面既存了网络参数也存了类别名和输入尺寸等元信息。但很多人拿到权重后直接model YOLO(best.pt)就推理结果类别名对不上因为权重里的names字典可能和你的业务类别顺序不一致。这时候要么改权重里的 names要么在推理后用映射表转换。配置文件方面YOLOv8 用 YAML 描述数据集路径和类别。一个典型的火焰烟雾data.yaml长这样# 火焰烟雾检测数据集配置 path: /datasets/fire_smoke # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集图片相对路径可选 names: 0: fire # 火焰类 1: smoke # 烟雾类path是根目录train/val/test是相对path的图片文件夹YOLOv8 会自动去找同级的labels文件夹下同名 txt。这里最常见的翻车是图片和标签不同名比如fire_001.jpg配了fire_001.xml而不是fire_001.txt训练时直接报「No labels found」。另一个坑是names的顺序必须和标注时的 class id 一致标的时候 fire 是 0、smoke 是 1配置里写反了模型会把火焰认成烟雾。2.3 用一条命令验证权重和数据集是否匹配拿到权重和数据集后别急着训练先跑一次验证看类别和指标是否合理# 用验证集评估权重imgsz 保持和训练时一致 yolo val modelbest.pt datadata.yaml imgsz640 batch8 conf0.25 iou0.5这条命令会输出每类的 Precision、Recall、mAP50、mAP50-95。重点看两个地方一是类别名是否显示为 fire 和 smoke如果显示成 person、car说明权重不是火焰烟雾模型或者 names 被覆盖了二是 mAP50 是否在 0.5 以上低于这个值要么权重没训练好要么验证集和训练集分布差太远。conf0.25是置信度阈值iou0.5是 NMS 的 IoU 阈值这两个值在验证时可以先按默认后面调优再动。如果验证时提示「Dataset data.yaml images not found」先检查path是不是绝对路径写成了相对路径YOLOv8 对相对路径的解析基准是当前工作目录不是 yaml 文件所在目录。我一般直接把path写成绝对路径省得来回猜。3. 从零跑通火焰烟雾训练环境、参数与损失曲线怎么看3.1 Ubuntu 20.04 上配 YOLOv8 CPU 版环境的最小步骤不是所有人都有 GPU用 CPU 跑火焰烟雾训练虽然慢但小数据集几百张图也能出结果。Ubuntu 20.04 上最小依赖如下# 创建虚拟环境避免污染系统 Python python3 -m venv yolov8_env source yolov8_env/bin/activate # 安装 PyTorch CPU 版注意 torch 和 torchvision 版本要匹配 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu # 安装 ultralytics它会自动拉取 opencv、numpy 等依赖 pip install ultralytics # 验证安装 yolo checksyolo checks会打印环境信息重点看 Python 版本、PyTorch 版本和是否检测到 CUDA。CPU 版显示 CUDA 为 None 是正常的。如果pip install ultralytics卡在 opencv 编译可以先pip install opencv-python-headless服务器上没有图形界面时用 headless 版更省事。CPU 训练时把workers设小一点比如 2 或 4设太大反而因为进程切换拖慢速度。batch也别贪大CPU 内存有限batch8 或 16 比较稳。如果训练中途被 kill大概率是内存不够先降 batch 再试。3.2 火焰烟雾训练参数怎么设epochs、imgsz、batch 与学习率YOLOv8 训练命令的核心参数就几个但每个都影响收敛# 火焰烟雾检测训练CPU 环境示例 yolo train \ modelyolov8n.pt \ # 从预训练权重开始小数据集必须用预训练 datadata.yaml \ # 数据集配置 epochs100 \ # 训练轮数小数据集 100 够大数据集 300 起 imgsz640 \ # 输入尺寸火焰烟雾用 640 平衡速度和精度 batch16 \ # 批大小CPU 上 8 到 16GPU 上可到 64 lr00.01 \ # 初始学习率默认 0.01小数据集可降到 0.001 patience20 \ # 20 轮没提升就早停省时间 workers4 \ # 数据加载进程数 devicecpu \ # 有 GPU 就写 0 projectruns/fire_smoke \ # 输出目录 nameexp1 # 实验名modelyolov8n.pt是 nano 版参数量最小CPU 上也能跑。如果精度不够再换yolov8s.pt或yolov8m.pt但参数量翻倍CPU 训练时间也翻倍。imgsz640是火焰烟雾检测的常用值烟雾目标通常占画面比例不大再小会丢细节再大 CPU 扛不住。lr00.01是默认值但如果你的数据集只有几百张学习率太大会震荡降到 0.001 更稳。patience20是早停验证集指标 20 轮不提升就停避免过拟合。训练开始后终端会打印每轮的 box_loss、cls_loss、dfl_loss 和 mAP。box_loss 是边界框回归损失cls_loss 是分类损失dfl_loss 是分布焦点损失。三个 loss 都应该是下降趋势如果 cls_loss 一直不降检查类别是否标错如果 box_loss 震荡降学习率或增大 batch。3.3 用损失函数曲线判断过拟合与欠拟合训练结束后runs/fire_smoke/exp1/下会有results.csv和results.png。results.png里包含训练和验证的 loss 曲线以及 mAP 曲线。判断标准很简单训练 loss 降、验证 loss 也降mAP 升正常继续训。训练 loss 降、验证 loss 先降后升过拟合加数据增强或早停。训练 loss 和验证 loss 都不降欠拟合检查学习率是否太小或模型容量不够。火焰烟雾检测里过拟合特别常见因为公开数据集场景单一模型容易记住背景。YOLOv8 默认开了 mosaic、mixup、HSV 增强如果过拟合严重可以把mosaic0关掉或者把hsv_h、hsv_s调大让模型对颜色变化更鲁棒。验证集 mAP 曲线如果波动很大说明验证集样本太少增加验证集数量比调参更有效。4. 火焰烟雾检测的避坑与排查那些让模型「看起来能用」的陷阱4.1 坑一验证集 mAP 很高上线后漏报频繁现象验证集 mAP50 到 0.85部署到摄像头后火焰漏报率超过 30%。原因验证集和训练集来自同一批视频相邻帧泄漏导致指标虚高。上线后摄像头角度、光照、背景都和训练集不同模型泛化能力不足。解决按视频源重新划分数据集确保验证集场景训练时完全没见过。如果数据量够再留一个「跨场景测试集」专门放不同厂区、不同时段的图用这个测试集的指标做上线决策。我一般要求跨场景测试集 mAP50 不低于 0.6 才考虑部署。4.2 坑二烟雾标注框太大模型学会「见框就报」现象模型在没有任何烟雾的图上也会输出烟雾框置信度还不低。原因标注时烟雾框画得过大把大片背景包进去模型学到的是「这种背景纹理就是烟雾」而不是烟雾本身。或者标注员把云、雾、蒸汽也标成了 smoke。解决重新审查标注烟雾框只包烟羽主体不包背景。云、雾、蒸汽如果业务上不算烟雾就不要标。如果已经训练了可以用yolo train的rectTrue让数据加载时保持原始长宽比减少填充带来的背景干扰。4.3 坑三CPU 训练到一半内存溢出被 kill现象训练到第 30 轮左右进程突然消失终端只显示Killed。原因batch或workers设太大CPU 内存被数据加载进程占满系统 OOM killer 把主进程杀了。解决先降batch到 8再降workers到 2。如果还不行把imgsz从 640 降到 416内存占用会明显下降。另外可以在训练命令前加ulimit -v限制虚拟内存但更直接的办法是监控free -h看剩余内存再调参。4.4 坑四类别名对不上导致推理结果错乱现象推理时火焰被标成 smoke烟雾被标成 fire。原因data.yaml里names的顺序和标注时的 class id 不一致或者加载的权重不是火焰烟雾模型。解决用yolo val先验证看输出的类别名。如果类别名是 person、car说明权重用错了。如果类别名对但顺序反了改data.yaml里的names顺序重新训练。推理时也可以用model.names打印权重里的类别映射和业务类别做对照。4.5 坑五数据增强把火焰烟雾「增强没了」现象训练时 mAP 一直上不去loss 降得很慢。原因YOLOv8 默认的 mosaic 增强会把四张图拼成一张火焰烟雾目标本来就小拼完后每张图里的目标更小模型学不到有效特征。mixup 增强也会把两张图按透明度叠加烟雾和背景混在一起更难分辨。解决小数据集上先关掉 mosaic 和 mixup用mosaic0 mixup0训练一轮看效果。如果 mAP 明显提升说明增强过头了。然后逐步开启找到适合自己数据集的增强强度。HSV 增强一般可以保留火焰烟雾对颜色敏感适度的色调、饱和度扰动能提升鲁棒性。5. 让火焰烟雾模型真正可用的三个进阶技巧5.1 用滑动窗口推理提升小目标烟雾检出率火焰烟雾检测里早期烟雾在 640 输入下可能只有十几个像素直接推理容易漏。滑动窗口推理的思路是把大图切成有重叠的小块分别推理后再合并。YOLOv8 本身不直接支持滑动窗口但可以用 Python 写一个简单的切图推理循环import cv2 import numpy as np from ultralytics import YOLO model YOLO(best.pt) img cv2.imread(test.jpg) h, w img.shape[:2] win_size 640 stride 320 # 重叠一半减少边缘漏检 boxes [] for y in range(0, h, stride): for x in range(0, w, stride): # 切出窗口注意边界不超出图像 x2 min(x win_size, w) y2 min(y win_size, h) x1 max(0, x2 - win_size) y1 max(0, y2 - win_size) crop img[y1:y2, x1:x2] results model(crop, conf0.25, verboseFalse) for r in results: for box in r.boxes: # 把窗口内坐标映射回原图 bx1, by1, bx2, by2 box.xyxy[0].tolist() boxes.append([bx1 x1, by1 y1, bx2 x1, by2 y1, box.conf[0].item(), box.cls[0].item()]) # 对所有框做 NMS 合并 boxes np.array(boxes) if len(boxes) 0: indices cv2.dnn.NMSBoxes( boxes[:, :4].tolist(), boxes[:, 4].tolist(), 0.25, 0.5 ) final_boxes boxes[indices.flatten()] print(f检出 {len(final_boxes)} 个目标)win_size640和训练输入一致stride320是窗口滑动步长重叠一半能减少边缘目标被切掉的风险。每个窗口推理后把坐标加回原图偏移最后用 OpenCV 的 NMS 合并重叠框。这个方法的代价是推理时间成倍增加适合对漏报零容忍的场景比如变电站火焰监测。如果速度要求高可以只对图像下半部分或烟雾易发区域做滑动窗口。5.2 用置信度分层和告警去抖降低误报模型输出置信度 0.3 到 0.5 之间的框往往是「疑似」直接告警会烦死人。我一般做两层过滤第一层置信度低于 0.5 的框不告警只记录第二层连续 3 帧同一位置都检出火焰或烟雾才触发告警。去抖逻辑可以用一个简单的计数器实现from collections import defaultdict track_history defaultdict(list) ALARM_THRESHOLD 3 # 连续 3 帧才告警 def check_alarm(frame_id, detections): alarms [] for det in detections: # 用检测框中心点粗略匹配实际可用 IoU 或卡尔曼跟踪 cx (det[0] det[2]) / 2 cy (det[1] det[3]) / 2 key (int(cx // 50), int(cy // 50)) # 50 像素网格粗匹配 track_history[key].append(frame_id) # 只保留最近 10 帧记录 track_history[key] track_history[key][-10:] if len(track_history[key]) ALARM_THRESHOLD: alarms.append(det) return alarmsALARM_THRESHOLD3是连续帧数阈值网格大小 50 像素是粗匹配实际项目里用 IoU 或轻量跟踪器更稳。这个逻辑能过滤掉单帧噪声引起的误报代价是告警延迟 2 到 3 帧对火焰烟雾场景完全可以接受。5.3 用 RK3588 或边缘设备部署时的模型转换注意点如果要把火焰烟雾模型部署到 RK3588 这类边缘芯片不能直接跑.pt需要先转 ONNX 再转 RKNN。转换时最容易翻车的是输入尺寸和归一化参数。YOLOv8 默认输入是 640x640归一化是x/255但 RKNN 工具链对均值和方差有要求常见做法是把归一化写进模型里或者在前处理时手动做。# 导出 ONNXopset 用 12RKNN 工具链兼容性较好 yolo export modelbest.pt formatonnx opset12 imgsz640 simplifyTruesimplifyTrue会调用 onnx-simplifier 去掉冗余节点转 RKNN 时更顺。导出后先用onnxruntime验证 ONNX 推理结果和 PyTorch 一致再转 RKNN。RKNN 转换时注意mean_values和std_values要和训练时一致YOLOv8 训练时没做额外归一化所以 mean 是 0、std 是 255。如果转完后检测框全乱先查这两个参数。我在 RK3588 上跑火焰烟雾模型时最深的教训是别迷信 INT8 量化。火焰和烟雾的颜色特征在量化后容易丢失mAP 可能掉 10 个点以上。如果精度要求高先用 FP16 跑实在要 INT8 就用混合量化把检测头保留 FP16。这个方案值不值得做取决于你的场景能不能接受精度换速度我的习惯是先在 PC 上把精度调到位再考虑边缘部署的量化损失别反过来。希望帮到你。本文还有配套的精品资源点击获取