报告要求

报告的主题是video based smoke detection。

提供train、test两个数据集,每个数据集内部均有smoke和non两个文件夹,文件夹内有若干100*100大小的图片。

报告内容包括四部分:1、特征表示;2、降维及聚类;3、分类;4、模型评价及选择。

LBP算法

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子。主要分为传统lbp算子、圆形lbp算子、lbp旋转不变模式和lbp等价模式等。本此作业主要使用LBP的传统模式。
传统的LBP算子,定义在3* 3的窗口cell内,以cell中心像素为阈值,向相邻的8个像素的灰度值进行比较。若相邻像素大于中心像素的灰度值,则标记该位置为 ’ 1 ‘ ;否则,标记为 ‘ 0 ’ 。以此类推,可以将该cell外侧的8个点生成二进制数,从左上角第一个元素开始,顺时针旋转,得到一个8位二进制数。该数即为此中心像素点的LBP值,并用这个值反映该区域的纹理信息。一张图片所有的像素都经过LBP算子的处理,得到该图片的特征向量。
每个中心像素的传统的lbp共有2^8 = 256 种,故此特征向量位256维。若图片大小为100* 100,则该图片的特征向量表现为100 * 100的矩阵,矩阵内的存储这该点的特征向量。上一篇使用hog算法,得到的特征向量是12996维。大作业第二部分的要求之降维就是在此进行,将其维度降到最小不失真的值。
lbp的改进算法中,就存在一种实现降维的模式,即LBP等价模式,可以将传统LBP算法的256维将到59维。感兴趣的小伙伴可以了解以下,本文最后附有链接。

程序设计

在上节中介绍了使用HOG算法分类的实现,总结来说又以下几个步骤:

①读取数据集内的图片,将其存储到pos和neg两个列表内;

②分别对上述列表的每张图片处理,即经过灰度化、均衡化后提取出hog特征向量,将所有图片的特征向量保存在gradient_list列表内;

③根据正负数据集的数量,设置标签,将有烟图片标为+1,无烟图片标为-1,得到数据集标签信息label;

④根据需求设置学习算法SVM参数,将gradient_list和label放入SVM算法内,生成数据集的hog特征模型hog.xml;

⑤对测试集的图片提取hog特征向量,将新提取的向量与hog.xml内的特征向量对比,得出相似程度;

⑥根据需求设置不同的阈值,将测试集内图片分为有烟和无烟两部分;

⑦将分类器分出的有烟无烟与真实情况对比分析,得到一组性能指标;

⑧更改阈值,得到不同的分类器,将各分类器的性能指标对比,得到最优分类器。

使用lbp算法提取特征值分类,整体上还是以上的步骤,有区别是第②和第⑤步。将其更改为利用lbp算法提取特征向量即可。

        img  = img_list[i]#第i张图片
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    #灰度化
        
        lbp_mqa = skimage.feature.local_binary_pattern(gray,8,1.0,method='default')
        #使用的传统lbp算法提取特征
        lbp_mqa = lbp_mqa.astype(np.uint8)#类型转换
        hist = cv2.calcHist([lbp_mqa],[0],None,[256],[0,256])
        
        hist = cv2.normalize(hist,hist)

关键函数

def mqa_hog_predict(mqa_img,i,z):
       
        gray = cv2.cvtColor(mqa_img, cv2.COLOR_BGR2GRAY)    #灰度化
        
        img_ku = skimage.feature.local_binary_pattern(gray,8,2.0,method='default')
        #img_ku = skimage.feature.local_binary_pattern(gray,8,1.0,method='ror')
        img_ku = img_ku.astype(np.uint8)
        hist = cv2.calcHist([img_ku],[0],None,[256],[0,256])
        
        hist = cv2.normalize(hist,hist)
        a, res = svm_lbp.predict(np.array([hist]), flags=cv2.ml.STAT_MODEL_RAW_OUTPUT)
        _, result = svm_lbp.predict(np.array([hist]))
        score = res[0][0]
        #if result[0][0] == 1 :#and score > my_res :
        if score < -0.2 :
            z+=1
    
    return  score,z

输入待测图片,输出该图片与烟雾模型的相似程度,并对判定为有烟的图片进行累加求和。

效果实现

对整个测试集的图片进行测试,得到此分类器的精度维88.6%。

有烟、无烟测试集测试后得以下二图,横坐标是相识程度,纵坐标是数量。(具体作用在作业第四部分模型评价讲解)

将正常大小图片放入test.py可得以下图片。

 


LBP原理介绍以及算法实现_holly的专栏-CSDN博客

Python实现LBP算法_小白一直白-CSDN博客



 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐