Algorithm 理解OpenCV LBP实现

Algorithm 理解OpenCV LBP实现,algorithm,opencv,face-detection,lbph-algorithm,Algorithm,Opencv,Face Detection,Lbph Algorithm,我需要一些基于LBP的人脸检测方面的帮助,这就是我写这篇文章的原因 我有以下与OpenCV上实现的人脸检测相关的问题: 在lbpCascade_frontial_face.xml(来自opencv)中:什么是 内部节点、叶值、树、特征等?我知道他们被利用了 在算法中。但我不明白每一个的意思 是的。例如,为什么我们采用特定的功能而不是 对于特定的阶段,还有其他的吗?我们如何决定哪种功能/ 要选择的节点 LBP_frontial_face_classifier.xml中的特征值是什么?我 知道它们是

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

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

  • 在lbpCascade_frontial_face.xml(来自opencv)中:什么是 内部节点、叶值、树、特征等?我知道他们被利用了 在算法中。但我不明白每一个的意思 是的。例如,为什么我们采用特定的功能而不是 对于特定的阶段,还有其他的吗?我们如何决定哪种功能/ 要选择的节点
  • LBP_frontial_face_classifier.xml中的特征值是什么?我 知道它们是由4个整数组成的向量。但是我该怎么用这个呢 特征?我认为第0阶段访问第一个功能,但访问 不是这种模式。此功能的访问模式是什么

  • 所有文献中的论文只提供了一个高层次的概述。他们的 描述主要包括从邻域计算LBP 像素。但是这个LBP值是如何针对这些元素使用的呢 分类器

  • 积分图像如何帮助计算像素的LBP值? 我知道哈尔是怎么用的。我需要了解LBP
  • 我读了一些报纸、文章。但是没有人清楚地描述基于LBP的人脸检测是如何工作的,也没有人详细描述该算法。如果有人想自己开发一个人脸检测程序,他应该遵循哪些步骤?没有任何文件对此进行描述

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

    请您参考我过去的回答,其中略微涉及了这个主题,但没有解释XML级联格式

    让我们来看一个为清晰起见而修改的,它是一个只有一个阶段和三个功能的级联示例

    
    3.
    -0.75
    0 -1 3 -67130709 -21569 -1426120013 -1275125205 -21585
    -16385 587145899 -24005
    -0.65 0.88
    0 -1 0 -163512766 -769593758 -10027009 -262145 -514457854
    -193593353 -524289 -1
    -0.77 0.72
    0 -1 2 -363936790 -893203669 -1337948010 -136907894
    1088782736 -134217726 -741544961 -1590337
    -0.71 0.68
    
    稍晚些时候

    <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></_>
    
    
    0 0 3 5
    0 0 4 2
    0 0 6 3
    0 1 4 3
    0 1 3 3
    

    让我们先看看阶段的标签:

    • 阶段的
      maxWeakCount
      是阶段中弱分类器的数量,在注释中称为
      ,我称之为LBP功能。
      • 在本例中,阶段0中LBP特征的数量为
        3
    • stageThreshold
      是特征权重的总和,至少是阶段通过的权重。
      • 在此示例中,阶段阈值为
        -0.75
    转到描述LBP功能的标签:

    • internalNodes
      是由11个整数组成的数组。前两个对于LBP级联没有意义。第三个是XML文件末尾
      表的索引(一个
      描述了特征的几何结构)。最后8个值是8个32位值,它们共同构成了我在前面的回答中提到的256位LUT。这个LUT是通过训练过程计算的,我自己也不完全了解。
      • 在此示例中,阶段的第一个特征引用矩形
        3
        ,该矩形由四个整数
        0 1 4 3
        描述
    • leafValues
      是与特征相关联的两个权重(通过/失败)。根据特征评估期间从
      内部节点
      中选择的位,这两个权重中的一个将添加到总数中。此总数与阶段的
      进行比较。然后,
      boolstagepassed=(sum>=stageThreshold-EPS),其中
      EPS
      为1e-5,确定阶段是否通过或失败。权重也由训练过程确定。
      • 在此示例中,第一个特征的失败权重为
        -0.65
        ,通过权重为
        0.88
    最后是
    标记。它由一组
    标记组成,这些标记包含4个描述特征几何结构的整数。给定一个处理窗口(在您的示例中为24x24),前两个整数描述其在处理窗口内的
    x
    y
    整数像素偏移,接下来两个整数描述待评估LBP特征所需的9个子矩形中的一个子矩形的宽度和高度

    因此,本质上,位于处理窗口内的标签
    ft.x ft.y ft.width ft.height
    检查
    pW.x
    x
    pW.height
    是否在
    pW.x
    x
    pW.y
    对应于

    为了计算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(代码)的索引,选择单个位。如果该位为1,则特征与面不一致;如果为0,则与面一致。然后返回适当的权重(
    ),并将其与所有其他功能的权重相加,以生成整个阶段的总和。然后将其与
    进行比较,以确定该阶段是通过还是失败


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

    @warmspringfinds您的观点是正确的:负值只表示MSB已设置。我可能已经走了