了解OpenCV LBP实现

时间:2014-03-21 17:27:01

标签: algorithm opencv face-detection lbph-algorithm

我需要一些基于LBP的脸部检测的帮助,这就是我写这篇文章的原因。

我在OpenCV上实现了与面部检测相关的以下问题:

  1. 在lbpCascade_frontal_face.xml中(这是来自opencv):是什么 internalNodes,leafValues,tree,features等?我知道他们被使用了 在算法中。但我不明白每个人的意思 他们例如,为什么我们采取特定的功能,而不是 其他特定阶段?我们如何决定哪个功能/ 节点选择?
  2. LBP_frontal_face_classifier.xml中的功能值是什么?一世 知道它们是4个整数的向量。但我应该如何使用它 特征?我认为第0阶段访问第一个功能但访问 不是这种模式。这个功能的访问模式是什么?

  3. 文献中的所有论文仅提供高级概述。其     描述主要包括邻域的LBP计算     像素。但是如何使用这个LBP值来对抗那些元素     分类器?

  4. 积分图像如何帮助计算像素的LBP值? 我知道如何使用HAAR。我需要了解LBP。
  5. 我读了一些文章,文章。但没有一个清楚地描述基于LBP的人脸检测是如何工作的或详细的算法。如果有人想要自己开发一个人脸检测程序,他应该遵循的步骤是什么 - 没有文件描述过。

    如果可以,请帮助我。我将不胜感激。

1 个答案:

答案 0 :(得分:15)

我引用你的过去的own回答,轻轻触及了这个主题,但没有解释XML级联格式。

让我们看一下,修改清晰度只有一个阶段和三个功能的级联示例。

<!-- stage 0 -->
<_>
  <maxWeakCount>3</maxWeakCount>
  <stageThreshold>-0.75</stageThreshold>
  <weakClassifiers>
    <!-- tree 0 -->
    <_>
      <internalNodes>
        0 -1 3 -67130709 -21569 -1426120013 -1275125205 -21585
        -16385 587145899 -24005</internalNodes>
      <leafValues>
        -0.65 0.88</leafValues></_>
    <!-- tree 1 -->
    <_>
      <internalNodes>
        0 -1 0 -163512766 -769593758 -10027009 -262145 -514457854
        -193593353 -524289 -1</internalNodes>
      <leafValues>
        -0.77 0.72</leafValues></_>
    <!-- tree 2 -->
    <_>
      <internalNodes>
        0 -1 2 -363936790 -893203669 -1337948010 -136907894
        1088782736 -134217726 -741544961 -1590337</internalNodes>
      <leafValues>
        -0.71 0.68</leafValues></_></weakClassifiers></_>

稍晚......

<features>
  <_>
    <rect>
      0 0 3 5</rect></_>
  <_>
    <rect>
      0 0 4 2</rect></_>
  <_>
    <rect>
      0 0 6 3</rect></_>
  <_>
    <rect>
      0 1 4 3</rect></_>
  <_>
      <rect>
      0 1 3 3</rect></_>

...

让我们先看看舞台的标签:

  • 阶段的maxWeakCount是阶段中弱分类器的数量,在注释a <!-- tree -->中调用的内容以及我称之为LBP功能的内容。
    • 在此示例中,阶段0中的LBP要素数为 3
  • stageThreshold是要素的权重必须加到至少才能传递的阶段。
    • 在此示例中,阶段阈值为 -0.75

转向描述LBP特征的标签:

  • internalNodes是一个包含11个整数的数组。对于LBP级联,前两个是没有意义的。第三个是XML文件末尾的<features> <rect>表的索引(A <rect>描述了该功能的几何)。最后8个值是8个32位值,这些值一起构成我在前面的答案中提到的256位LUT。该LUT由训练过程计算,我自己并不完全了解。
    • 在此示例中,舞台的第一个要素引用矩形 3由四个整数 0 1 4 3描述。
  • leafValues是与要素关联的两个权重(通过/失败)。根据在特征评估期间从internalNodes中选择的位,将这两个权重中的一个添加到总计中。该总数与阶段的<stageThreshold>进行比较。然后,bool stagePassed = (sum >= stageThreshold - EPS);,其中EPS是1e-5,确定舞台是通过还是失败。权重也由训练过程确定。
    • 在此示例中,第一个要素的失败权重为 -0.65 ,并且传递权重为 0.88

最后,<feature>标记。它由一组<rect>标记组成,其中包含4个描述特征几何的整数。给定一个处理窗口(在您的情况下为24x24),前两个整数在处理窗口中描述其xy整数像素偏移,接下来的两个整数描述 width height 在评估LBP要素所需的9个子矩形中。

从本质上讲,位于处理窗口<rect> ft.x ft.y ft.width ft.height </rect> x pW.width内的标记pW.height检查pW.x x pW.y处是否存在面部对应于...

http://i.stack.imgur.com/NL0XX.png

然后,为了评估LBP,只需在点p[0..15]读取积分图像并使用p[BR]+p[TL]-p[TR]-p[BL]计算九个子矩形的积分就足够了。将中心子矩形R4与其他8个子矩阵进行比较,顺时针从R0开始,产生一个8位LBP(这些位被打包[msb 01258763 lsb])。

然后将该8位LBP用作特征的(2 ^ 8 = 256)位LUT(<internalNodes>)的索引,选择单个位。如果该位为1,则该特征与面部不一致;如果为0,则与面部一致。然后返回适当的权重(<leafNode>)并添加所有其他特征的权重以产生总体阶段总和。然后将其与<stageThreshold>进行比较,以确定阶段是通过还是失败。

如果还有别的东西我说得不够清楚,我可以澄清一下。