我向您推荐我自己过去的回答,该回答略微涉及该主题,但没有解释 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 ,<!-- tree -->
我称之为LBP特征。
- 在这个例子中,阶段 0 的 LBP 特征的数量是
3
。
- 这
stageThreshold
是特征的权重必须加起来至少才能通过该阶段。
转到描述 LBP 功能的标签:
- 是 11 个整数的
internalNodes
数组。前两个对于 LBP 级联没有意义。第三个是在XML 文件末尾的 s<features>
表中的索引(A描述了特征的几何形状)。最后 8 个值是 8 个 32 位值,它们共同构成了我在之前的回答中提到的 256 位 LUT。这个 LUT 是由训练过程计算出来的,我自己并不完全理解。
<rect>
<rect>
- 在这个例子中,舞台的第一个特征引用了矩形
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
LBPy
功能所需的 9 个子矩形中的一个子矩形的宽度和高度进行评估。
本质上,<rect> ft.x ft.y ft.width ft.height </rect>
位于处理窗口pW.width
x内的标签检查是否在xpW.height
处存在人脸对应于...pW.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 (the <internalNodes>
) 的索引,选择单个位。如果该位为1,则特征与人脸不一致;如果为0,则与人脸一致。然后返回适当的权重 ( <leafNode>
) 并与所有其他特征的权重相加,以产生总体阶段总和。然后将其进行比较以<stageThreshold>
确定该阶段是通过还是失败。
如果还有什么我解释得不够好,我可以澄清一下。