一尘不染

了解OpenCV LBP实施

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。

我读了一些论文。但是没有人清楚描述基于LBP的人脸检测的工作原理或算法细节。如果某人想自己开发面部检测程序,应该遵循哪些步骤-没有文档对此进行描述。

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


阅读 238

收藏
2020-07-28

共1个答案

一尘不染

我请您参考我过去的答案,该答案略微涉及到该主题,但是没有解释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一个阶段是在阶段弱分类,什么是所谓的评论的数量<!-- tree -->,我叫LBP特征是什么。
    • 在此示例中,阶段0的LBP特征数量为 3
  • stageThreshold是什么样的特征的权重相加之和必须 至少 为舞台传递。
    • 在此示例中,阶段阈值为 -0.75

转到描述LBP功能的标签:

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

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

在本质上,然后,标签<rect> ft.x ft.y ft.width ft.height </rect>位于一个处理窗口内pW.widthX
pW.height检查面是否存在于pW.xX pW.y对应于…

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

为了评估LBP,就足以读取点处的积分图像p[0..15]并用于p[BR]+p[TL]-p[TR]-p[BL]计算九个子矩形的积分。比较 中心子
矩形R4和其他八个子矩形,从R0开始顺时针旋转,以产生8位LBP(这些位打包[msb 01258763 lsb])。

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

如果还有其他问题,我还不能解释清楚。

2020-07-28