OpenCV Haar Classifier 结果表说明

Posted

技术标签:

【中文标题】OpenCV Haar Classifier 结果表说明【英文标题】:OpenCV Haar Classifier result table explanation 【发布时间】:2015-01-14 07:27:10 【问题描述】:

我正在尝试创建一个 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|
+----+---------+---------+

我不确定NHRFA 在每种情况下指的是什么。有人能解释一下它们代表什么以及它们的含义吗?

【问题讨论】:

【参考方案1】:

在OpenCV source 中搜索“HR”会将我们带到this 文件。 CvCascadeBoost::isErrDesired 内的第 1703-1707 行打印表格:

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 = 负样本错误分类为正样本的百分比。

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

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

do

    [...]

while( !isErrDesired() && (weak->total < params.weak_count) );

只看这一点,并且对提升的具体细节了解不多,我们可以做出有根据的猜测,即训练一直有效,直到误差足够低,如 falseAlarm 所衡量。

【讨论】:

只有一个关于 % 的问题。当它打印1 时,是 1% 还是 100%,0.7432 分别是 0.7% 或 74%? 这里 1 是 100%,0.7432 是 74.32% 预计算时间的单位是什么?分钟还是小时? @monusuri 预计算时间以秒为单位。如果您给它更多内存以加快处理速度,则实际上需要更多的预计算时间来加载该内存。在我的情况下,预计算 60 秒,处理一个小时左右。 显然再输入几个字符会杀死 OpenCV 开发人员:|感谢您的回答顺便说一句

以上是关于OpenCV Haar Classifier 结果表说明的主要内容,如果未能解决你的问题,请参考以下文章

Opencv:图片中检测人脸并保存

Opencv 人脸检测与跟踪

使用OpenCV,Haar级联检测器进行面部眼睛嘴部检测

如何利用OpenCV自带的级联分类器训练程序训练分类器

OpenCV + Python 人脸检测

OpenCV中的Haar级联分类器数据: