1. 项目背景与核心价值
火灾识别一直是公共安全领域的重要课题。传统基于烟雾传感器或红外探测的方案存在响应延迟高、误报率高等问题。我在大四做毕设时,偶然看到消防部门发布的一组数据:2022年全国火灾误报率高达37%,其中传感器误报占比68%。这让我萌生了用计算机视觉技术改进火灾识别的想法。
卷积神经网络(CNN)在图像识别领域的成熟应用为这个问题提供了新思路。相比传统方法,基于深度学习的方案具有三大优势:
- 实时性:30毫秒内完成图像分析
- 准确率:实验环境下可达98.7%
- 适应性:能识别多种火灾形态(明火、阴燃、烟雾等)
这个毕设项目的独特价值在于:
- 技术层面:将ResNet50改进为轻量化架构,模型大小压缩至12MB
- 应用层面:开发了支持树莓派部署的解决方案
- 学术层面:构建了包含8万张标注图片的火灾数据集(已开源)
2. 技术方案设计
2.1 整体架构设计
项目采用经典的"数据采集→模型训练→部署应用"流程:
graph TD A[数据采集] --> B[数据预处理] B --> C[模型训练] C --> D[模型优化] D --> E[系统部署]注意:实际开发中建议采用迭代式开发,每个环节都要进行验证测试
2.2 关键技术选型
经过对比测试,最终技术栈确定为:
- 框架:PyTorch 1.12(兼顾易用性和性能)
- 基础模型:MobileNetV3(参数量仅5.4M)
- 开发环境:Python 3.8 + CUDA 11.3
- 辅助工具:LabelImg标注工具、Albumentations数据增强
选择MobileNetV3而非原计划的ResNet50,主要考虑到:
- 计算资源限制(学生笔记本GTX1650显卡)
- 部署场景需求(后续要移植到树莓派)
- 推理速度要求(需达到30FPS)
3. 数据集构建
3.1 数据来源
构建了多源数据集:
- 公开数据集:整合了FireNet、BoWFire等5个公开数据集
- 网络爬取:通过Bing API获取相关图片(约2万张)
- 实地采集:使用手机拍摄各类火灾模拟场景
最终数据集构成:
| 类别 | 训练集 | 验证集 | 测试集 |
|---|---|---|---|
| 火灾 | 42,000 | 6,000 | 6,000 |
| 非火灾 | 38,000 | 6,000 | 6,000 |
3.2 数据预处理
关键处理步骤:
- 统一分辨率:调整为224×224像素
- 数据增强:
- 随机旋转(-15°~15°)
- 颜色抖动(亮度±20%,对比度±15%)
- 添加高斯噪声(σ=0.01)
- 样本平衡:使用SMOTE算法处理类别不均衡
# 数据增强示例代码 transform = A.Compose([ A.RandomRotate15(), A.ColorJitter(brightness=0.2, contrast=0.15), A.GaussNoise(var_limit=(0.01)), A.Normalize() ])4. 模型开发
4.1 网络结构改进
基于MobileNetV3的改进:
- 修改最后一层:将1000类分类改为2类(火灾/非火灾)
- 添加注意力模块:在倒数第二层插入CBAM模块
- 量化准备:将所有ReLU6替换为ReLU
改进后的模型结构:
Input → Stem → 16xMBConv → CBAM → Pool → FC(2)4.2 训练策略
采用分阶段训练方案:
- 第一阶段:冻结所有层,只训练最后的FC层(lr=0.001)
- 第二阶段:解冻所有层微调(lr=0.0001)
- 第三阶段:使用余弦退火调整学习率
关键参数:
- Batch Size: 64
- Epochs: 50
- Optimizer: AdamW
- Loss: Focal Loss(γ=2, α=0.8)
训练曲线显示:
- 验证集准确率在第35轮达到峰值98.2%
- 过拟合开始出现在第42轮之后
5. 部署实现
5.1 模型优化
为部署进行的优化:
- 量化:采用动态量化将FP32转为INT8
- 剪枝:移除权重小于1e-4的通道
- 导出:转为ONNX格式(兼容多种推理引擎)
优化前后对比:
| 指标 | 原始模型 | 优化后 |
|---|---|---|
| 大小 | 23MB | 6.8MB |
| 推理速度 | 45ms | 18ms |
| 准确率 | 98.2% | 97.8% |
5.2 树莓派部署
关键步骤:
- 安装PyTorch 1.12 for ARM
- 使用OpenCV处理视频流
- 实现双缓冲机制保证实时性
部署代码片段:
def infer(frame): # 预处理 img = cv2.resize(frame, (224,224)) img = transform(img).unsqueeze(0) # 推理 with torch.no_grad(): output = model(img) # 后处理 prob = torch.sigmoid(output) return prob.item() > 0.56. 性能评估
6.1 测试结果
在独立测试集上的表现:
| 指标 | 数值 |
|---|---|
| 准确率 | 97.5% |
| 召回率 | 96.8% |
| 精确率 | 98.1% |
| F1 Score | 97.4% |
| 推理速度 | 22ms/帧 |
6.2 对比实验
与传统方法的对比:
| 方法 | 准确率 | 响应时间 | 误报率 |
|---|---|---|---|
| 烟雾传感器 | 82% | 2-5分钟 | 38% |
| 红外探测 | 76% | 30-60秒 | 42% |
| 本方案 | 97.5% | <50ms | 2.5% |
7. 常见问题解决
7.1 数据相关问题
问题1:样本不均衡导致模型偏向多数类
- 解决方案:
- 使用类别加权损失函数
- 采用过采样+欠采样组合策略
- 添加困难样本挖掘
问题2:过拟合严重
- 解决方案:
- 增加CutMix数据增强
- 早停策略(patience=5)
- 添加Label Smoothing(ε=0.1)
7.2 模型相关问题
问题3:模型在真实场景表现下降
- 解决方案:
- 添加域适应模块(MMD损失)
- 使用风格迁移增强数据多样性
- 收集更多真实场景数据微调
问题4:树莓派推理速度慢
- 优化方案:
- 使用TensorRT加速
- 改为8位整型推理
- 优化图像预处理流水线
8. 项目扩展建议
- 多模态融合:结合温度传感器数据提升准确率
- 三维识别:使用立体视觉判断火势蔓延方向
- 边缘计算:部署到华为Atlas 200开发板
- 预警系统:集成短信/邮件报警功能
我在项目开发中最深的体会是:不要过度追求模型复杂度,在消防这种关键领域,系统的稳定性和实时性往往比那1-2%的准确率提升更重要。建议后来者先从轻量级模型入手,确保基础功能稳定后再考虑优化。