gpt4 book ai didi

algorithm - 了解 OpenCV LBP 实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:35:26 25 4
gpt4 key购买 nike

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

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

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

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

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

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

如果可以的话,请帮我解决这些问题。我将不胜感激。

最佳答案

我建议您引用我的 own以前的回答稍微涉及到这个话题,但没有解释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 for a stage是该阶段弱分类器的个数,评论里叫什么<!-- tree -->以及我所说的 LBP 特征。
    • 在此示例中,阶段 0 中的 LBP 特征数为 3 .
  • stageThreshold是特征的权重必须加起来至少才能让阶段通过。
    • 在此示例中,阶段阈值为 -0.75 .

转向描述 LBP 特征的标签:

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

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

本质上,标签 <rect> ft.x ft.y ft.width ft.height </rect>位于处理窗口内pW.width x pW.height检查人脸是否存在于 pW.x x 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> 进行比较以确定该阶段是通过还是失败。

如果还有其他我没有解释清楚的地方,我可以澄清。

关于algorithm - 了解 OpenCV LBP 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22565531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com