You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

火灾检测模型训练准确率85%却误判所有图像为无火的问题

问题排查与解决方法

1. 检查数据集类别分布

训练准确率85%但测试全判为无火,大概率是类别不平衡导致模型偏向多数类。

  • 排查步骤:
    1. 统计训练集和测试集中两类样本的数量:
      print(f"训练集火灾样本数: {np.sum(y_train)}, 无火样本数: {len(y_train)-np.sum(y_train)}")
      print(f"测试集火灾样本数: {np.sum(y_test)}, 无火样本数: {len(y_test)-np.sum(y_test)}")
      
    2. 如果无火样本占比极高(比如90%以上),模型会倾向于预测0来获取高准确率,这就是问题根源。
  • 解决方法:
    • 对火灾样本进行过采样:复制现有火灾样本,或用SMOTE生成合成样本;
    • 对无火样本进行欠采样:随机删除部分无火样本;
    • 训练时添加类别权重:在model.fit()中加入class_weight={0: 1, 1: len(y_train)/(2*np.sum(y_train))}(根据实际比例调整权重);
    • 改用F1-score、AUC等适合不平衡数据集的评估指标,替代准确率。

2. 验证数据拆分与标签对应

  • 排查步骤:
    1. 随机抽取几个样本,确认火灾样本标签为1、无火样本标签为0,避免加载数据时标签对应错误;
    2. 检查测试集是否存在类别极端分布(比如全是无火样本)。
  • 解决方法:
    • 修正标签对应错误的代码;
    • 拆分数据时添加stratify=y参数,让训练/测试集的类别分布与原数据集一致:
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42, shuffle=True, stratify=y)
      

3. 检查模型预测阈值与输出概率

sigmoid默认以0.5为分类分界,但如果模型对火灾样本的预测概率普遍低于0.5,就会全判为0。

  • 排查步骤:
    1. 获取测试集的预测概率,查看分布:
      y_pred_proba = model.predict(np.array(X_test))
      print(y_pred_proba[:10])  # 查看前10个样本的预测概率
      
    2. 统计火灾样本的概率分布,确认是否普遍低于0.5。
  • 解决方法:
    • 调整分类阈值:比如将阈值设为0.3,只要概率>0.3就判为火灾;
    • 如果训练准确率远高于验证准确率,说明模型过拟合,需要调整模型结构或增加数据增强。

4. 排查模型训练与过拟合问题

  • 排查步骤:
    1. 查看model.fit()的输出日志,对比训练集和验证集的损失、准确率:
      • 若训练准确率持续上升,验证准确率停滞或下降,说明过拟合;
      • 若两者准确率都很低,说明模型欠拟合,没学到有效特征。
  • 解决方法:
    • 过拟合时:
      • 添加Dropout层:在Flatten后或Dense层后加入Dropout(0.5);
      • 降低模型复杂度:减少Conv2D的滤波器数量或Dense层神经元数;
      • 增加数据增强:用ImageDataGenerator对训练集做随机翻转、旋转、缩放等操作;
    • 欠拟合时:
      • 增加模型复杂度:添加更多Conv2D层或增大滤波器数量;
      • 调整学习率:减小Adam的学习率,让模型更稳定学习;
      • 增加训练轮次(注意配合早停避免过拟合)。

5. 检查数据预处理问题

OpenCV默认以BGR格式读取图像,而火灾的红色/橙色特征在RGB格式下更容易被识别,格式不匹配可能导致模型失效。

  • 排查步骤:
    1. 修改图像读取函数,转换为RGB格式:
      def imageresize(path):
          img = cv2.imread(path)
          img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转换为RGB
          img = cv2.resize(img,(196,196))
          img = img / 255
          return img
      
    2. 显示几个预处理后的样本,确认颜色正常。

6. 补充优化建议

  • 添加早停机制:当验证损失不再下降时自动停止训练,避免过拟合:
    from tensorflow.keras.callbacks import EarlyStopping
    early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
    model.fit(..., callbacks=[early_stop])
    
  • 可视化模型中间层输出,检查是否提取到火焰的边缘、颜色等有效特征。

内容的提问来源于stack exchange,提问作者Haamed Rahman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:06:25