了解OpenCV LBP实现

Lun*_*iam 7 algorithm opencv face-detection lbph-algorithm

我需要一些基于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的人脸检测是如何工作的或详细的算法.如果有人想要自己开发一个人脸检测程序,他应该遵循的步骤是什么 - 没有文件描述.

如果可以,请帮助我.我会很感激.

Iwi*_*ist 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></_>
Run Code Online (Sandbox Code Playgroud)

稍后......

<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></_>
Run Code Online (Sandbox Code Playgroud)

...

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

  • maxWeakCount一个阶段是在阶段弱分类,什么是所谓的评论的数量<!-- tree -->,我叫LBP特征是什么.
    • 在此示例中,阶段0中的LBP功能的数量是 3.
  • stageThreshold就是特征的权重必须至少为要传递的阶段加起来.
    • 在此示例中,阶段阈值为 -0.75.

转到描述LBP功能的标签:

  • internalNodes是一个由11个整数组成的数组.对于LBP级联,前两个是没有意义的.第三个是XML文件末尾<features><rect>s 表索引(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个描述特征几何的整数.给定的处理窗口(24×24在你的情况下),第一两个整数描述其xy整数像素的偏移的处理窗内,且接下来的两个整数描述了宽度高度一个子矩形的的是,需要用于LBP特征9的待评估.

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

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