火焰识别的基本方法

一、检测方式

1.1 传统方式

  • 基于颜色空间
    在这里、有时往往会将多种颜色空间的火焰检测技术结合到一起,如RGB+HSV。但火焰的颜色并非单一的,由内焰至外焰火焰颜色分别为白色、蓝白色、黄色、淡黄色、红色、暗红色。最外围可能还存在由火焰产生的红色烟雾。因此,基于火焰颜色空间的火焰识别往往需要选取多组阈值范围,不同的阈值可更好的分割火焰区域。
    • RGB
    • HSV
    • YCbCr
  • 基于纹理特征
    一般是采用统计学的概念去探究相关像素点之间的关系及像素本身的特点。
  • 火焰的几何特征
    这里的几何特征可以考虑几个方面:火焰轮廓(火焰周长与火焰凸包周长比值)、火焰面积(火焰面积占火焰凸包的比值)、火焰面积变化(相邻帧火焰面积变化率)
  • 火焰轮廓
    使用经典的边缘检测算子去计算火焰的边缘值。
  • 高斯混合模型
  • 帧差法
    下一帧减去上一帧,得到火焰像素变化区域。
  • 背景/前景法
    在安装设备时进行初始化,设置为背景。之后的每一张图片减去背景图片,通过选取合适的阈值就可以得到火焰区域。
  • 光流法
    光流法也必须基于视频流才可以实现,具体的我暂时不清楚,就知道将像素周围分为多个方向用于构建等维度的特征向量

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、实验结果火焰识别的基本方法_第1张图片

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

1、BGR转HSI公式
火焰识别的基本方法_第2张图片
2、公式代码

def BGR2HSI(image):
    if np.max(image) > 1:
        center = image / 255.0
    B = image[:, :, 0]
    G = image[:, :, 1]
    R = image[:, :, 2]
    theta = np.arccos((((R - B) + (R - G)) / (2 * np.sqrt(np.abs((R - G) ** 2 + (R - B) * (G - B))))))
    H = np.where(G >= B, theta, 2 * np.pi - theta) / (2 * np.pi) * 360
    S = (1 - (3 * (np.min(center, axis=2)) / (np.sum(center, axis=2) + 1e-9))) * 255
    I = np.sum(center, axis=2) / 3 * 255
    return H, S, I

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
火焰识别的基本方法_第3张图片
5、对HSI方法的改进
以后说…

你可能感兴趣的:(计算机视觉,计算机视觉)