基于LBP特征的级联分类器检测与训练原理解析

文章目录

      • LBP特征
      • Adaboost分类器
      • 层次聚类


LBP特征

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和 D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征。

  • 原始的LBP算子
    原始的LBP算子定义为在3x3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3x3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:
    基于LBP特征的级联分类器检测与训练原理解析_第1张图片
  • 圆形LBP算子
    基本的 LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala等对 LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子。如下图所示:
    基于LBP特征的级联分类器检测与训练原理解析_第2张图片
  • LBP旋转不变模式
    从 LBP 的定义可以看出,LBP 算子是灰度不变的,但却不是旋转不变的。图像的旋转就会得到不同的 LBP值。具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。如下图所示:
    基于LBP特征的级联分类器检测与训练原理解析_第3张图片
  • LBP等价模式
    • 一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生P2种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。例如:5×5邻域内20个采样点,有220=1,048,576种二进制模式。如此多的二值模式无论对于纹理的提取还是对于纹理的识别、分类及信息的存取都是不利的。同时,过多的模式种类对于纹理的表达是不利的。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的代表图像的信息。
    • 为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。
  • LBP特征向量提取步骤
    (1)首先将检测窗口划分为16×16的小区域(cell);
    (2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
    (3)然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理;
    (4)最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量。
    (5)然后便可利用Adaboost或者其他机器学习算法进行分类了。

Adaboost分类器

Boosting算法是一种通过多次学习来提升算法精度的方法,它采用的是综合的原则使得算法的效率明显改善,是一种将弱分类器提升为强分类器的方法,AdaBoost算法是一种自适应Boosting算法,自适应在于将前一个分类器分错的样本会被用来训练下一个分类器,这种方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost方法能“聚焦于”那些较难分(更富信息)的样本上。

Adaboost算法基本原理就是将多个弱分类器(弱分类器一般选用单层决策树)进行合理的结合,使其成为一个强分类器。Adaboost采用迭代的思想,每次迭代只训练一个弱分类器,训练好的弱分类器将参与下一次迭代的使用。也就是说,在第N次迭代中,一共就有N个弱分类器,其中N-1个是以前训练好的,其各种参数都不再改变,本次训练第N个分类器。其中弱分类器的关系是第N个弱分类器更可能分对前N-1个弱分类器没分对的数据,最终分类输出要看这N个分类器的综合效果。
基于LBP特征的级联分类器检测与训练原理解析_第4张图片

  • Adaboost 训练过程:
  1. 训练第一个分类器(弱分类器为单层决策树),样本的权值D为相同的权值,通过一个弱分类器得到样本的分类预测标签、与给定的真实值对比,有:误差ε=未正确分类分类数/总样本数。如果某个样本预测错误,则它对应的错误值为该样本的权重,如果分类正确,则错误值为0. 最后累加样本的错误率之和,记为ε。
  2. 通过ε来计算该弱分类器的权重α,公式如下:
    α = 1 2 l n ( 1 − ε ε ) α = \dfrac{1}{2} ln(\dfrac{1-ε}{ε}) α=21ln(ε1ε)
  3. 通过α来计算训练下一个弱分类器样本的权重D,如果对应样本分类正确,则减小该样本的权重,公式为:
    D i ( t + 1 ) = D i t e − α S u n ( D ) D_i ^{(t+1)} = \dfrac {D_i^{t}e^{-α}}{Sun(D)} Di(t+1)=Sun(D)Diteα
    如果样本分类错误,则增加该样本的权重,公式为:
    D i ( t + 1 ) = D i t e α S u n ( D ) D_i ^{(t+1)} = \dfrac {D_i^{t}e^{α}}{Sun(D)} Di(t+1)=Sun(D)Diteα
  4. 通过加权投票表决的方法,让所有弱分类器进行加权投票表决的方法得到最终预测输出,计算最终分类错误率,如果最终错误率低于设定阈值(比如5%),那么迭代结束;如果最终错误率高于设定阈值,那么更新数据权重得到W(i+1)。
  • Adaboost 分类器的分类过程如下:
  1. 设定初始累积置信度为 d = 0,输入数据为 x
  2. 假设 Adaboost 中包含T个决策树,则令 k = 1…T
  3. d = d + α k h k d = d + α_kh_k d=d+αkhk ,如果 d < t h r e s h o l d ( k ) d<threshold(k) d<threshold(k)则将数据判定为负类,分类终止。
    否则返回第 2 步。( α k α_k αk为k级分类器的权重, h k ( x ) h_k(x) hk(x)为第k个弱分类器的分类结果)
  4. 如果 x 通过了全部 N 级的判定,那么将 x 判定为正类,置信度为 d。
  • 级联分类器

    AdaBoost训练出来的强分类器一般具有较小的误识率,但检测率并不很高,一般情况下,高检测率会导致高误识率,这是强分类阈值的划分导致的,要提高强分类器的检测率既要降低阈值,要降低强分类器的误识率就要提高阈值,这是个矛盾的事情。据参考论文的实验结果,增加分类器个数可以在提高强分类器检测率的同时降低误识率,所以级联分类器在训练时要考虑如下平衡,一是弱分类器的个数和计算时间的平衡,二是强分类器检测率和误识率之间的平衡。

    级联分类器由若干个简单的AdaBoost分类器串接得来。假设AdaBoost分类器要实现99%的正确率,1%的误检率需要200维特征,而实现具有99.9%正确率和50%的误检率的AdaBoost分类器仅需要10维特征,那么通过级联,假设10级级联,最终得到的正确率和误检率分别为:
    T P R = ( 0.999 ) 10 = 99.0 % TPR=(0.999)^{10} = 99.0\% TPR=(0.999)10=99.0%
    F P R = ( 0.5 ) 10 = 0.1 % FPR=(0.5)^{10} = 0.1\% FPR=(0.5)10=0.1%
    可以看到通过级联Adaboost分类器们能够使用较少的特征和较简单的分类器更快更好的实现分类。另外在检测的过程中,因为TPR较高,所以一旦检测到某区域不是目标就可以直接停止后续检测,这样大部分检测窗口都能够很快停止,分类速度得到很大的提高。

    	具体的训练过程如下:
    	确定每级的最大误识率f,最小要达到的检测率d;
    	最终级联分类器的误识率Ftarget;
    	P=正样本
    	N=负样本
    	F0=1.0,D0=1.0
    	i=0
    	For Fi

层次聚类

k-means算法却是一种方便好用的聚类算法,但是始终有K值选择和初始聚类中心点选择的问题,而这些问题也会影响聚类的效果。为了避免这些问题,我们可以选择另外一种比较实用的聚类算法-层次聚类算法。顾名思义,层次聚类就是一层一层的进行聚类,可以由上向下把大的类别(cluster)分割,叫作分裂法;也可以由下向上对小的类别进行聚合,叫作凝聚法;但是一般用的比较多的是由下向上的凝聚方法。

  • 分裂法
    分裂法指的是初始时将所有的样本归为一个类簇,然后依据某种准则进行逐渐的分裂,直到达到某种条件或者达到设定的分类数目。用算法描述:

    输入:样本集合D,聚类数目或者某个条件(一般是样本距离的阈值,这样就可不设置聚类数目)
    输出:聚类结果
    将样本集中的所有的样本归为一个类簇;
    repeat:
    在同一个类簇(计为c)中计算两两样本之间的距离,找出距离最远的两个样本a,b;
    将样本a,b分配到不同的类簇c1和c2中;
    计算原类簇(c)中剩余的其他样本点和a,b的距离,若是dis(a) util:达到聚类的数目或者达到设定的条件

  • 凝聚法
    凝聚法指的是初始时将每个样本点当做一个类簇,所以原始类簇的大小等于样本点的个数,然后依据某种准则合并这些初始的类簇,直到达到某种条件或者达到设定的分类数目。用算法描述:

    输入:样本集合D,聚类数目或者某个条件(一般是样本距离的阈值,这样就可不设置聚类数目)
    输出:聚类结果
    将样本集中的所有的样本点都当做一个独立的类簇;
    repeat:
    计算两两类簇之间的距离(后边会做介绍),找到距离最小的两个类簇c1和c2;
    合并类簇c1和c2为一个类簇;
    util:达到聚类的数目或者达到设定的条件

你可能感兴趣的:(机器学习)