我需要一些基于LBP的脸部检测的帮助,这就是我写这篇文章的原因。
我在OpenCV上实现了与面部检测相关的以下问题:
LBP_frontal_face_classifier.xml中的功能值是什么?一世 知道它们是4个整数的向量。但我应该如何使用它 特征?我认为第0阶段访问第一个功能但访问 不是这种模式。这个功能的访问模式是什么?
文献中的所有论文仅提供高级概述。其 描述主要包括邻域的LBP计算 像素。但是如何使用这个LBP值来对抗那些元素 分类器?
我读了一些文章,文章。但没有一个清楚地描述基于LBP的人脸检测是如何工作的或详细的算法。如果有人想要自己开发一个人脸检测程序,他应该遵循的步骤是什么 - 没有文件描述过。
如果可以,请帮助我。我将不胜感激。
答案 0 :(得分:15)
我引用你的过去的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
是阶段中弱分类器的数量,在注释a <!-- tree -->
中调用的内容以及我称之为LBP功能的内容。
3
。stageThreshold
是要素的权重必须加到至少才能传递的阶段。
-0.75
。转向描述LBP特征的标签:
internalNodes
是一个包含11个整数的数组。对于LBP级联,前两个是没有意义的。第三个是XML文件末尾的<features>
<rect>
表的索引(A <rect>
描述了该功能的几何)。最后8个值是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),前两个整数在处理窗口中描述其x
和y
整数像素偏移,接下来的两个整数描述 width 和 height 在评估LBP要素所需的9个子矩形中。
从本质上讲,位于处理窗口<rect> ft.x ft.y ft.width ft.height </rect>
x pW.width
内的标记pW.height
检查pW.x
x pW.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(<internalNodes>
)的索引,选择单个位。如果该位为1,则该特征与面部不一致;如果为0,则与面部一致。然后返回适当的权重(<leafNode>
)并添加所有其他特征的权重以产生总体阶段总和。然后将其与<stageThreshold>
进行比较,以确定阶段是通过还是失败。
如果还有别的东西我说得不够清楚,我可以澄清一下。