【问题标题】:Understanding OpenCV LBP implementation了解 OpenCV LBP 实现
【发布时间】:2014-04-29 05:16:56
【问题描述】:

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

我有以下关于在 OpenCV 上实现的人脸检测的问题:

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

  3. 文献中的所有论文仅提供高级概述。他们的 描述主要包括来自邻域的 LBP 计算 像素。但是如何将这个 LBP 值用于 分类器?

  4. 积分图像如何帮助计算像素的 LBP 值? 我知道如何使用 HAAR。我需要了解 LBP。

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

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

【问题讨论】:

    标签: algorithm opencv face-detection lbph-algorithm


    【解决方案1】:

    我向您推荐我过去的own 回答,该回答略微涉及该主题,但没有解释 XML 级联格式。

    让我们看一个 fake,为 clarity 修改了一个只有一个阶段和三个特征的级联示例。

    <!-- 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 是阶段中弱分类器的数量,在cmets 中称为&lt;!-- tree --&gt;,我称之为LBP 特征。
      • 在本例中,第 0 阶段的 LBP 特征数为3
    • stageThreshold 是特征的权重必须加起来至少才能通过阶段。
      • 在这个例子中,阶段阈值是-0.75

    转向描述 LBP 功能的标签:

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

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

    本质上,位于处理窗口pW.widthxpW.height 内的标签&lt;rect&gt; ft.x ft.y ft.width ft.height &lt;/rect&gt; 检查pW.xxpW.y 处是否存在人脸对应于...

    然后,要评估 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(&lt;internalNodes&gt;)的索引,选择单个位。如果该位为1,则特征与人脸不一致;如果为0,则与人脸一致。然后返回适当的权重 (&lt;leafNode&gt;) 并与所有其他特征的权重相加,以产生总体阶段总和。然后将其与&lt;stageThreshold&gt; 进行比较,以确定该阶段是通过还是失败。

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

    【讨论】:

    • @warmspringwinds 您的主旨是正确的:负值仅表示已设置 MSB。我可能已经摆脱了使用int32_t's,但我决定直接将数组比特转换为uint32_t's,因为我确信uint32_t's 上的 31 的移位是明确定义的并且可以预测在所有架构上给出正确的结果。
    • @warmspringwinds 是的,所有阶段都必须通过,并且人脸的比例必须为 24x24 才能被检测到。
    • @warmspringwinds 我的描述来自我对 OpenCV 代码的理解。而你确实是at the right place:注意node.left 对应于左(第一)叶值;它是negative 的那个,如果LUT 中的位是set 时选择的那个。然后条件表达式将评估非零 (true),并选择 node.left。右(第二)叶值为正,当 LUT 中的位为 unset 时被选中。
    • @warmspringwinds 我发现 LBP 人脸检测器对人脸大小和外观非常敏感。头部或面部的大小必须约为 24x24 像素(下巴到头顶或发际线),平面外倾斜或旋转不超过 10-15º。如果您过早退出,请尝试砍掉最后的 3-5 个阶段(只是不要运行它们),看看剩余的“幸存者”是否在您期望的位置。如果是这样,那么可能是 XML 中描述的级联对您的需求来说过于选择性了。
    • @warmspringwinds 如果您进行了有品位的编辑,我将很高兴批准并为您获得 +2 代表!
    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 2016-01-10
    • 2014-01-02
    • 1970-01-01
    • 2017-11-15
    • 2013-06-15
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多