7

我需要一些关于基于 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。

我读了一些论文,文章。但是没有一个清楚地描述基于 LBP 的人脸检测的工作原理或算法的详细信息。如果有人想自己开发人脸检测程序,他应该遵循哪些步骤——没有文档描述过。

如果可以的话,请帮助我。我将感激不尽。

4

1 回答 1

15

我向您推荐我自己过去的回答,该回答略微涉及该主题,但没有解释 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></_>

...

我们先来看一个阶段的标签:

  • maxWeakCountfor一个阶段是阶段中弱分类器的数量,在评论中称为a ,<!-- tree -->我称之为LBP特征。
    • 在这个例子中,阶段 0 的 LBP 特征的数量是 3
  • stageThreshold是特征的权重必须加起来至少才能通过该阶段。
    • 在此示例中,阶段阈值为 -0.75

转到描述 LBP 功能的标签:

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

最后是<feature>标签。它由一组<rect>标签组成,其中包含描述特征几何形状的 4 个整数。给定一个处理窗口(在您的情况下为 24x24),前两个整数描述其在处理窗口内的整数像素偏移量,接下来的两个整数描述xLBPy功能所需的 9 个子矩形中的一个子矩形的宽度高度进行评估。

本质上,<rect> ft.x ft.y ft.width ft.height </rect>位于处理窗口pW.widthx内的标签检查是否在xpW.height处存在人脸对应于...pW.xpW.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 (the <internalNodes>) 的索引,选择单个位。如果该位为1,则特征与人脸不一致;如果为0,则与人脸一致。然后返回适当的权重 ( <leafNode>) 并与所有其他特征的权重相加,以产生总体阶段总和。然后将其进行比较以<stageThreshold>确定该阶段是通过还是失败。

如果还有什么我解释得不够好,我可以澄清一下。

于 2014-03-21T17:31:22.223 回答