本文记录YOLO11火焰检测项目的完整实现过程,涵盖环境搭建、数据集准备、配置文件创建、模型训练与验证、常见报错解决及性能优化等核心环节。适合目标检测新手入门,所有代码可直接复用,最终实现基础可用的火焰检测模型,并针对低召回率等问题给出针对性优化方案。

项目核心目标:基于YOLO11构建火焰检测模型,实现图片/视频中火焰的实时检测,适用于火灾预警等场景。

技术栈:Python3.12 + Ultralytics8.3.228 + PyTorch2.9.1 + OpenCV + ONNX Runtime

一、项目环境搭建

首先安装项目所需依赖库,推荐使用虚拟环境(避免版本冲突):详细可参考25年Opencv超详细教程,从安装入门说起!小白看完也能轻松学会!!_哔哩哔哩_bilibili

pip install ultralytics==8.3.228  # YOLO11依赖此版本ultralytics
pip install torch==2.9.1+cpu  # CPU版本,有GPU可替换为GPU版本
pip install opencv-python pillow numpy yaml onnxruntime

二、数据集准备与目录结构

火焰检测属于单类别目标检测,数据集需包含图片和对应的YOLO格式标注文件,按以下规范组织目录:

2.1 标准目录结构

fire_dataset/  # 数据集根目录
├── images/     # 图片文件夹
│   ├── train/  # 训练集图片(建议≥1000张)
│   └── val/    # 验证集图片(建议≥200张)
└── labels/     # 标注文件夹(与images目录结构完全对应)
    ├── train/  # 训练集标注文件(.txt格式)
    └── val/    # 验证集标注文件(.txt格式)

2.2 标注文件规范

标注文件为.txt格式,每张图片对应一个同名标注文件,内容格式:

0 0.45 0.52 0.3 0.4  # 类别ID(火焰固定为0) 归一化x_center y_center width height

说明:坐标需归一化(取值0~1),可通过LabelImg、LabelMe等工具标注生成。

三、关键配置文件创建(fire.yaml)

YOLO模型通过.yaml文件读取数据集信息,核心是指定训练集/验证集路径和类别信息,创建步骤如下:

3.1 创建方法

  1. 在数据集根目录同级新建文本文件,重命名为fire.yaml(注意:删除.txt后缀,开启文件扩展名显示可避免误操作);

  2. 用记事本/VS Code打开,粘贴以下配置内容,修改为自己的数据集路径。

3.2 正确配置内容

# fire.yaml 火焰检测数据集配置
train: D:/图像处理/venv/数据集/1/dataset1/images/train  # 训练集图片绝对路径
val: D:/图像处理/venv/数据集/1/dataset1/images/val      # 验证集图片绝对路径
nc: 1                                                    # 类别数(火焰为1类)
names: [ 'fire' ]                                        # 类别名称(ID0对应fire)

3.3 配置文件验证

创建后通过以下代码验证语法和路径正确性,避免后续报错:

import yaml
import os

yaml_path = "D:/图像处理/venv/数据集/1/fire.yaml"  # 你的fire.yaml路径
try:
    with open(yaml_path, "r", encoding="utf-8") as f:
        cfg = yaml.safe_load(f)
    print("✅ YAML配置解析成功:", cfg)
    # 验证路径是否存在
    print(f"训练集路径存在:{os.path.exists(cfg['train'])}")
    print(f"验证集路径存在:{os.path.exists(cfg['val'])}")
except Exception as e:
    print(f"❌ 配置错误:{e}")

四、模型训练与验证

基于YOLO11n预训练模型训练,训练完成后验证模型性能(精确率、召回率、mAP50)。

from ultralytics import YOLO

# 加载YOLO11n预训练模型(轻量快速,适合入门)
model = YOLO('yolov11n.pt')

# 启动训练
results = model.train(
    data="D:/图像处理/venv/数据集/1/fire.yaml",  # 配置文件路径
    epochs=100,        # 训练轮数
    batch=8,           # 批次大小(CPU训练设8,GPU可设16)
    imgsz=640,         # 输入图片尺寸
    device="cpu",      # CPU训练(有GPU设0)
    lr0=0.01,          # 初始学习率
    patience=50,       # 早停耐心值(验证集精度不提升则停止)
    save=True,         # 保存最佳模型
    project='fire_train',  # 结果保存目录
    name='fire_model'  # 模型名称
)

4.2 模型验证代码

训练完成后加载最佳模型(best.pt)验证性能:

from ultralytics import YOLO

# 加载训练好的模型
model = YOLO("D:/图像处理/venv/数据集/best.pt")

# 执行验证
metrics = model.val(
    data="D:/图像处理/venv/数据集/1/fire.yaml",
    imgsz=640,
    batch=8,
    device="cpu"
)

# 打印核心指标(注意:数组类型指标需取第一个元素)
print(f"验证集mAP50: {metrics.box.map50:.3f}")
print(f"精确率: {metrics.box.p[0]:.3f}")  # 单类别取数组第0个元素
print(f"召回率: {metrics.box.r[0]:.3f}")

五、项目核心问题排查(实战避坑)

项目实施过程中遇到的典型报错及解决方案,覆盖配置、路径、语法等核心问题。

5.1 报错1:FileNotFoundError: 'fire.yaml' does not exist

原因:代码无法找到fire.yaml文件,多为路径错误或文件名错误(如fire.yaml.txt)。

解决方案

  1. 使用绝对路径指定fire.yaml(如data="D:/xxx/fire.yaml");

  2. 开启文件扩展名显示,确认文件名是fire.yaml(无.txt后缀);

  3. 通过os.path.exists("xxx/fire.yaml")验证路径。

5.2 报错2:SyntaxError: 'train:' key missing

原因:fire.yaml缺少train/val键,或语法错误(如冒号后无空格、用中文符号)。

解决方案

  1. 确保配置文件包含train、val、nc、names四个键;

  2. 严格遵守YAML语法:冒号后加空格(train: 路径)、用英文符号、缩进用空格;

  3. 直接复制本文3.2节的正确配置,修改路径即可。

5.3 报错3:TypeError: unsupported format string passed to numpy.ndarray.__format__

原因:精确率、召回率是numpy数组类型,直接用:.3f格式化报错。

解决方案:对数组取第一个元素(单类别)或求均值:

print(f"精确率: {metrics.box.p[0]:.3f}")  # 单类别推荐
# 或 print(f"精确率: {metrics.box.p.mean():.3f}")  # 多类别适用

5.4 报错4:YAML解析结果为None

原因:fire.yaml文件为空或仅含注释,无有效键值对。

解决方案

  1. 重新打开fire.yaml,粘贴正确配置内容;

  2. 保存时选择UTF-8编码,确保文件大小>0字节;

  3. 更换编辑器(如VS Code)重新保存,避免记事本格式问题。

六、模型性能分析与优化

训练完成后得到初始指标:mAP50=0.708、精确率=0.718、召回率=0.611,结合火焰检测场景分析并优化。

6.1 指标解读

  • mAP50=0.708:综合检测能力中等,达到基础可用标准,但离优秀(≥0.9)有差距;

  • 精确率=0.718:71.8%的预测结果为真实火焰,存在28.2%误检(如烟雾、灯光);

  • 召回率=0.611:仅能检测61.1%的真实火焰,39%漏检,火灾预警场景风险较高。

核心问题:召回率偏低(漏检严重),需优先解决。

6.2 针对性优化方案

方案1:优化推理阈值

降低置信度阈值,保留更多低置信度的火焰检测结果,减少漏检

方案2:扩充数据集与优化标注(最有效)
  1. 补充样本:重点收集小火焰、夜晚火焰、遮挡火焰、不同背景的火焰图片,训练集≥1000张;

  2. 数据增强:使用Roboflow或Ultralytics内置增强(augment=True),提升模型泛化能力;

  3. 优化标注:确保所有火焰都被标注,标注框完整覆盖火焰区域,剔除错误标注。

方案3:调整训练参数,提升模型收敛效果
from ultralytics import YOLO

model = YOLO('yolov11s.pt')  # 更换更大模型(yolov11s),增强特征提取能力
results = model.train(
    data="D:/图像处理/venv/数据集/1/fire.yaml",
    epochs=200,        # 增加训练轮数至200
    batch=8,
    imgsz=640,
    device="cpu",
    lr0=0.001,         # 降低初始学习率至0.001,避免震荡
    patience=100,      # 调大早停耐心值
    augment=True,      # 开启数据增强
    mixup=0.2,         # 混合数据增强
    mosaic=1.0         # 马赛克增强
)

6.3 优化预期效果

执行优化方案后,预期指标提升:

  • 召回率提升至0.75以上(漏检率显著降低);

  • mAP50提升至0.8以上,综合性能达到良好水平;

  • 精确率可能略有下降,可通过添加背景样本训练平衡。

七、模型导出与部署

将训练好的.pt模型导出为ONNX格式,适配实际部署场景(如C++、嵌入式):

from ultralytics import YOLO

# 加载最佳模型
model = YOLO("数据集所在的文件路径")

# 导出为ONNX格式
model.export(
    format="onnx",
    opset=21,         # 与ONNX Runtime兼容
    imgsz=640,        # 与训练尺寸一致
    simplify=True     # 简化模型,提升推理速度
)

导出后得到best.onnx文件,替换推理代码中的模型路径即可使用。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐