火焰识别的基本方法

论文开源代码:https://github.com/YTCLCM/MBFD

数据集汇总

以后更新,时常联系

一、检测方式

1.1 传统方式
  • 基于颜色空间
    在这里、有时往往会将多种颜色空间的火焰检测技术结合到一起,如RGB+HSV。但火焰的颜色并非单一的,由内焰至外焰火焰颜色分别为白色、蓝白色、黄色、淡黄色、红色、暗红色。最外围可能还存在由火焰产生的红色烟雾。因此,基于火焰颜色空间的火焰识别往往需要选取多组阈值范围,不同的阈值可更好的分割火焰区域。
    • RGB [火焰像素:红色通道大于绿色通道,绿色通道大于蓝色通道。]
      在这里插入图片描述

    • HSV

    • YCbCr: Y是亮度,Cb和Cr是色度蓝色(Chrominance Blueand)和色度红色分量(Chrominance Red)。

  • 基于纹理特征
    一般是采用统计学的概念去探究相关像素点之间的关系及像素本身的特点。
  • 火焰的几何特征
    这里的几何特征可以考虑几个方面:火焰轮廓(火焰周长与火焰凸包周长比值)、火焰面积(火焰面积占火焰凸包的比值)、火焰面积变化(相邻帧火焰面积变化率)
  • 火焰轮廓
    使用经典的边缘检测算子去计算火焰的边缘值。
  • 高斯混合模型
  • 帧差法
    下一帧减去上一帧,得到火焰像素变化区域。
  • 背景/前景法
    在安装设备时进行初始化,设置为背景。之后的每一张图片减去背景图片,通过选取合适的阈值就可以得到火焰区域。
  • 光流法
    光流法也必须基于视频流才可以实现,具体的我暂时不清楚,就知道将像素周围分为多个方向用于构建等维度的特征向量
1.2 机器学习

往往会先通过通过传统的方式去提取火焰特征,然后通过这些特征去构建特征向量(比如光流法提取火焰特征向量),再代入特征向量到分类器中训练。同时,有人也会构建级联分类器,就是多个分类器之间采用投票的机制,预测类别多数获胜。

  • 支持向量机
  • 随机森林
  • 决策树
1.3 深度学习

基于卷积神经网络的火焰检测相对于传统方式而言,对火焰有着更高的精确率与召回率。可以大大的降低系统的误报率。这也是我现在所研究的一个重点方向。对于深度学习的重点可能会在改善现有的网络结构,改进loss…可能一个新的想法就可以让你创造一个新传奇。

  • 分类网络
    对于分类网络的选择,尽量选择网络规模较小的网络,因为可以大大的减少检测的时间。同时,经过时间证明这些网络结构对提取物体特征效果比较理想。
    • mobileNet
    • squeezeNet
    • VGG16
    • AlexNet
  • 目标检测
    • yolo系列
    • Fast R-CNN
  • 语义分割
    目前存在的问题是标注的数据集基本没有公开的。
    • FCN
    • UNet
    • SegNet
    • DeepLab

二、检测方式介绍

由于时间有限,在这会主讲基于颜色空间的传统方式及深度学习方式。还有日后我研一论文的实现细节,现在暂时不做叙述。关注我别迷失哦

2.1 基于YCbCr颜色空间的火焰检测

论文链接:https://www.academia.edu/download/45821410/1089.pdf
1、公式介绍

见论文

2、公式代码

def BGRToYCbCr(image):
    """
    颜色空间转换
    :param image: 图像
    :return:
    """
    image_B, image_G, image_R = cv2.split(image)
    y = np.array(0.2568 * image_R + 0.5041 * image_G + 0.0979 * image_B, dtype=np.uint8) + 16
    cb = np.array(-0.1482 * image_R - 0.2910 * image_G + 0.4392 * image_B, dtype=np.uint8) + 128
    cr = np.array(0.4392 * image_R - 0.3678 * image_G - 0.0714 * image_B, dtype=np.uint8) + 128
    return y, cb, cr

3、检测代码

def detectFireByYCbCr(Y, Cb, Cr, Y_decay=1.15, Cb_decay=0.75, Cr_decay=1.15, threshold=40):
    """
    通过YCbCr颜色空间进行火焰识别,为Y, Cb, Cr添加对应的权值衰减
    """
    rows, cols = Y.shape
    # 像素的个数
    numPixs = rows * cols
    zeros = np.zeros((rows, cols))
    ones = np.ones((rows, cols))
    # 等式3
    YgtCb = np.where(Y > Cb, ones, zeros)
    # 等式4
    CrgtCb = np.where(Cr > Cb, ones, zeros)
    # 等式5
    Y_mean = cv2.integral(Y)[-1, -1] / numPixs * Y_decay
    Cb_mean = cv2.integral(Cb)[-1, -1] / numPixs * Cb_decay
    Cr_mean = cv2.integral(Cr)[-1, -1] / numPixs * Cr_decay
    F = np.where(Y > Y_mean, np.where(Cb < Cb_mean, np.where(Cr > Cr_mean, ones, zeros), zeros), zeros)
    # 等式6
    Ft = np.where(np.abs(Cb - Cr) > threshold, ones, zeros)
    return YgtCb * CrgtCb * F * Ft

4、实验结果在这里插入图片描述

2.2 基于HSI颜色空间的火焰检测

1、BGR转HSI公式
在这里插入图片描述
2、公式代码

import cv2
HSV = cv2.cvtColor(BGR_image, cv2.COLOR_BGR2HSV)

3、阈值选取

H_min, H_max = 0, 60  # 0~360
S_min, S_max = 30, 180  # 0~255
I_min, I_max = 105, 255  # 0~255

4、检测效果
图片缩放的太小了,检测后的边缘有点看不清(可能是图片选取不当)。从图片上基本可以看出HSI判据对检测火焰边缘比较好。另外你们可以参考这篇博客:https://blog.csdn.net/qq_27569955/article/details/51531460
在这里插入图片描述
5、对HSI方法的改进
对图片先进行聚类,你可以使用k-mean进行聚类,但kmean聚类需要指定类个数,故你需要基于实际检测环境去指定这个值。然后使用聚类得到的类中心去完成火焰检测(注,通过聚类需要花费额外的时间成本)。我再来说一下为什么要进行聚类吧。因为聚类密度合适的话,可以将火焰聚类到一个簇中,或少量几个簇中。而你通过传统颜色空间将聚类中心点去检测的话,可以减少大量颜色像素误差。因此你在选取阈值的时候波动性不大。

2.3 基于深度学习的火焰检测

你需要去了解网络模型的结构,必须要求知道该网络模型是轻量型模型还是重量型模型,有什么特点,参数量如何,使用的是什么激活函数,损失函数如何。比如残差结构可以将低维特征向后传递,防止因网络结构太深造成的特征减弱,如果不使用,可能层数多的模型效果不如层数少的网络模型效果好。还有考虑到网络的轻量化,有些网络对特征向量进行升维再降维或降维再升维,但是也会造成特征的消失。为了加强特征的激活,有人使用通道注意力与空间注意力机制,都是对特征再乘上一个阈值。空洞卷积增加卷积的感受野。多尺度特征提取,使用不同尺度的卷积核分别进行卷积,再将结果进行拼接作为下一层的输入,这样做也是为了增强特征。但有时候对现有的模型进行修改,可能达不到原本的效果。我以前在squeezenet上添加通道注意力、空间注意力、空间注意力与空间注意力三种方式进行消融实验,但实验结果与原本的网络相比,基本都下降了3个点,而且在训练集上loss一直振荡没有收敛。说实话对模型修改真是一个调参的过程。

  • 9
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值