红外火灾检测项目开发日志②
本文记录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 创建方法
-
在数据集根目录同级新建文本文件,重命名为
fire.yaml(注意:删除.txt后缀,开启文件扩展名显示可避免误操作); -
用记事本/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)。
解决方案:
-
使用绝对路径指定fire.yaml(如
data="D:/xxx/fire.yaml"); -
开启文件扩展名显示,确认文件名是fire.yaml(无.txt后缀);
-
通过
os.path.exists("xxx/fire.yaml")验证路径。
5.2 报错2:SyntaxError: 'train:' key missing
原因:fire.yaml缺少train/val键,或语法错误(如冒号后无空格、用中文符号)。
解决方案:
-
确保配置文件包含train、val、nc、names四个键;
-
严格遵守YAML语法:冒号后加空格(
train: 路径)、用英文符号、缩进用空格; -
直接复制本文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文件为空或仅含注释,无有效键值对。
解决方案:
-
重新打开fire.yaml,粘贴正确配置内容;
-
保存时选择UTF-8编码,确保文件大小>0字节;
-
更换编辑器(如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:扩充数据集与优化标注(最有效)
-
补充样本:重点收集小火焰、夜晚火焰、遮挡火焰、不同背景的火焰图片,训练集≥1000张;
-
数据增强:使用Roboflow或Ultralytics内置增强(augment=True),提升模型泛化能力;
-
优化标注:确保所有火焰都被标注,标注框完整覆盖火焰区域,剔除错误标注。
方案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文件,替换推理代码中的模型路径即可使用。
更多推荐
所有评论(0)