14

我正在尝试创建一个 Haar 分类器来识别对象,但是我似乎无法弄清楚每个阶段生成的结果表代表什么。

例如 1

===== TRAINING 1-stage =====
<BEGIN
POS count : consumed   700 : 700
NEG count : acceptanceRatio    2500 : 0.452161
Precalculation time: 9
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|        1|
+----+---------+---------+
|   4|        1|        1|
+----+---------+---------+
|   5|        1|   0.7432|
+----+---------+---------+
|   6|        1|   0.6312|
+----+---------+---------+
|   7|        1|   0.5112|
+----+---------+---------+
|   8|        1|   0.6104|
+----+---------+---------+
|   9|        1|   0.4488|
+----+---------+---------+
END>

例如 2

===== TRAINING 2-stage =====
<BEGIN
POS count : consumed   500 : 500
NEG count : acceptanceRatio    964 : 0.182992
Precalculation time: 49
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+

我不确定在每种情况下N,HRFA指的是什么。有人可以解释他们代表什么以及他们的意思吗?

4

1 回答 1

24

在OpenCV 源代码中搜索“HR”会将我们带到这个文件。第 1703-1707 行CvCascadeBoost::isErrDesired打印表格:

cout << "|"; cout.width(4); cout << right << weak->total;
cout << "|"; cout.width(9); cout << right << hitRate;
cout << "|"; cout.width(9); cout << right << falseAlarm;
cout << "|" << endl;
cout << "+----+---------+---------+" << endl;

所以 HR 和 FA 代表命中率和误报。从概念上讲:hitRate = 正确分类的正样本的百分比。falseAlarm = 负样本错误分类为正样本的百分比。

阅读 for 的代码CvCascadeBoost::train,我们可以看到如下的 while 循环

cout << "+----+---------+---------+" << endl;
cout << "| N  | HR      | FA      |" << endl;
cout << "+----+---------+---------+" << endl;

do
{
    [...]
}
while( !isErrDesired() && (weak->total < params.weak_count) );

只看这一点,并且对提升的细节知之甚少,我们可以做出有根据的猜测,即训练一直有效,直到误差足够低,如 falseAlarm 所衡量的那样。

于 2014-11-17T13:22:39.160 回答