1.摘要
本文实现了实现了一个完整的火灾检测工作流,从数据预处理、模型训练到最终的推理和报警功能。首先基于卷积神经网络(CNN)模型,设计实现了一个可分离卷积(SeparableConv2D
)和残差连接的卷积神经网络模型,该模型经过实验证明能够适用于图像分类任务,特别是火灾检测任务。最后本文基于训练好的参数实现了一个火灾检测系统,该系统能够高效、准确地检测图像或视频中的火灾,并通过报警提示用户。
2.模型设计与实现
核心代码如下:
input_shape = image_size + (3,)
num_classes = 2
inputs = keras.Input(shape=input_shape)
x = inputs
#x = data_augmentation(inputs)
x = layers.experimental.preprocessing.Rescaling(1.0 / 255)(x)
#x = layers.Conv2D(32, 3, strides=2, padding="same")(x)
x = layers.Conv2D(8, 3, strides=2, padding="same")(x)
x = layers.BatchNormalization()(x)
x = layers.Activation("relu")(x)
previous_block_activation = x
for size in [8]:x = layers.Activation("relu")(x)x = layers.SeparableConv2D(size, 3, padding="same")(x)x = layers.BatchNormalization()(x)x = layers.Activation("relu")(x)x = layers.SeparableConv2D(size, 3, padding="same")(x)x = layers.BatchNormalization()(x)x = layers.MaxPooling2D(3, strides=2, padding="same")(x)residual = layers.Conv2D(size, 1, strides=2, padding="same")(previous_block_activation)x = layers.add([x, residual])previous_block_activation = x
x = layers.SeparableConv2D(8, 3, padding="same")(x)
x = layers.BatchNormalization()(x)
x = layers.Activation("relu")(x)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.5)(x)
activation = "sigmoid" if num_classes == 2 else "softmax"
units = 1 if num_classes == 2 else num_classes
outputs = layers.Dense(1, activation='sigmoid')(x)
该模型是一个带有深度可分离卷积(SeparableConv2D)和残差连接的卷积神经网络,适用于图像分类任务,特别是火灾检测任务。通过以下几层构成:
1.输入层:输入形状为 (height, width, 3),即 RGB 图像。
2.卷积层 + 批归一化 + 激活函数:多层卷积和激活函数,通过 SeparableConv2D 层实现深度可分离卷积,减少计算量。
3.池化层:最大池化层(MaxPooling2D)用于下采样。
4.残差连接:部分层包含残差连接,用于缓解深层网络中的梯度消失问题。
5.全局平均池化层:用来减少特征图的维度,并生成一个固定长度的输出向量。
6.Dropout:防止过拟合,通过丢弃一部分神经元来正则化网络。
7.输出层:使用 sigmoid 激活函数,适用于二分类任务(火灾 vs 非火灾)
整个模型结构较为简单但有效,特别适合于资源有限的设备(如边缘设备),因为深度可分离卷积显著减少了计算量。
训练数据集可见之前博客内容。
3.系统实现
实现的系统该利用 深度学习模型进行火灾检测,能够在用户上传的图片或视频中识别火灾并发出报警。
-
支持两种用户输入选择:
- 上传视频:用户上传视频文件进行实时检测。
- 上传图片:用户上传单张图片进行火灾检测。
-
视频或图像处理:
- 若选择视频输入,系统通过
OpenCV
打开视频文件,逐帧读取并进行检测。 - 若选择图片输入,系统会加载上传的图片,并进行处理。
- 每帧图像或单张图片经过 模型的推理,检测其中是否存在火灾。
- 若选择视频输入,系统通过
-
火灾检测与报警:
- 在图像或视频帧中,若检测到火灾(即模型预测出火灾类别且置信度大于50%),系统会在火灾区域绘制矩形框,并标注置信度。
- 若火灾被检测到,系统触发报警,通过
Pygame
播放火灾报警声音。 - 在未检测到火灾时,系统会停止播放报警声音。
当选择视频时:
当选择图像时:
环境配置:ultralytics、streamlit、cvzone、opencv-python-headless
代码下载:
https://download.csdn.net/download/weixin_40651515/90059765