我使用 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算法的论文。但我不是很明白。
谢谢
最佳答案
挖了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 的计算方式,那将是我查询的完整解决方案。
谢谢
关于opencv - 如何理解人脸检测xml,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25840310/