我使用opencv_trainedcascade.exe训练面孔。我有一系列不同阶段的xml文件。 对于每个xml文件,都有内部节点和leafVlaues,其中一个如下所示。
<?xml version="1.0"?>
<opencv_storage>
<stage0>
<maxWeakCount>3</maxWeakCount>
<stageThreshold>-1.3019366264343262e+000</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 2711 -2099201 -2623493 -774797061 -2162625 -827343685
-5535541 -1163949377 -21761</internalNodes>
<leafValues>
-9.2679738998413086e-001 6.0445684194564819e-001</leafValues></_>
<_>
<internalNodes>
0 -1 1533 -252379683 -203697739 1410462197 1435881947 -74449473
-1147414357 1510080511 -1</internalNodes>
<leafValues>
-9.1606438159942627e-001 6.2200444936752319e-001</leafValues></_>
<_>
<internalNodes>
0 -1 917 -42468780 -11479728 -745548289 -2371181 -23070497
-552607093 -74777633 -536871937</internalNodes>
<leafValues>
-9.2716777324676514e-001 5.4092508554458618e-001</leafValues></_></weakClassifiers></stage0>
</opencv_storage>
我的疑问是 (1)那些stageThreshold,internalNodes和leafValues是什么意思? (2)在实际人脸检测中,如何在级联分类器中使用,我为Adaboost算法阅读了一些论文。但我不太了解。 感谢
答案 0 :(得分:3)
在挖掘detection_based_tracker.cpp之后,现在我了解了什么是internalNodes,leafValues和stagethreshold以及它们的使用方式。当我们查看lbpcascade_frontalface.xml时,我们会看到一个矩形列表。这些是训练的面部图像的矩形(即,这些区域具有不同的特征并且可以用于区分面部与非面部图像)。对于lbpcascade_frontalface.xml有139个矩形。 每个矩形的x,y点乘以一个常数,以制作另外三个矩形,因此一个矩形实际上代表四个矩形。
然后我将解释什么是internalNode。
<internalNodes>
0 -1 13 -163512766 -769593758 -10027009 -262145 -514457854
-193593353 -524289 -1</internalNodes>
前两个数字0 -1代表左和右。我认为它们代表左叶值和右叶值。第三个是特征索引。如果我们将这139个矩形放入一个数组中,那个特征索引就是指数组索引。这意味着要表示哪个矩形。最后八个数字表示来自四个矩形的角点减法。这些是从积分图像计算出来的,因此数字非常大。
但是我不太确定如何计算leafValues,但是将这些leafValues的总和与stageThreshold进行比较以决定面部或非面部。
这是我从调试代码中理解的。 如果有人解释了如何计算leafValues,那将是我查询的完整解决方案。 感谢