我一直在 OpenCV(开源计算机视觉库)中尝试人脸检测,发现可以使用 Haar 级联来检测人脸,因为 OpenCV 提供了几种人脸。但是,我注意到还有几个 LBP 级联。经过一番研究,我发现 LBP 代表 Local Binary Patterns,根据OpenCV 人脸检测文档,它也可以用于人脸检测。
我想知道的是,哪个效果更好?哪一个执行得更快,哪一个更准确?似乎 LBP 执行得更快,但我也不是 100% 确定这一点。谢谢。
我一直在 OpenCV(开源计算机视觉库)中尝试人脸检测,发现可以使用 Haar 级联来检测人脸,因为 OpenCV 提供了几种人脸。但是,我注意到还有几个 LBP 级联。经过一番研究,我发现 LBP 代表 Local Binary Patterns,根据OpenCV 人脸检测文档,它也可以用于人脸检测。
我想知道的是,哪个效果更好?哪一个执行得更快,哪一个更准确?似乎 LBP 执行得更快,但我也不是 100% 确定这一点。谢谢。
LBP 更快(快几倍)但不太准确。(比 Haar 少 10-20%)。
如果要在嵌入式系统上检测人脸,LBP 是默认选择,因为它以整数进行计算。
Haar 使用浮点数进行处理,对嵌入式和移动处理器的支持较差;结果,性能损失是显着的——大到足以使其在手机上的使用变得不切实际。
可以训练 LBP 级联以执行与 Haar 级联相似(或更好)的性能,但开箱即用,Haar 级联慢约 3 倍,并且根据您的数据,在准确检测一张脸。鉴于人脸检测可以在 95% 以上的准确度范围内运行,这种准确度的提高非常显着。
以下是使用MUCT数据集时的一些结果。
当 ground-truth 和 OpenCV 检测到的坐标之间至少有 50% 的重叠时,就会注意到正确的检测。
Cascade:haarcascade_frontalface_alt2.xml
Datafile:muct.csv
|---------------------------------------------------|
| Hits | Misses | False Detects | Multi-hit |
| 3635 | 55 | 63 | 5 |
|---------------------------------------------------|
Time:4m2.060s
与:
Cascade:lbpcascade_frontalface.xml
Datafile:muct.csv
|---------------------------------------------------|
| Hits | Misses | False Detects | Multi-hit |
| 3569 | 106 | 77 | 3 |
|---------------------------------------------------|
Time:1m12.511s
我个人的观点是,你应该为所有检测相关任务研究 LBP,因为 LBP 训练可能需要几分钟,而 HAAR 训练可能需要几天时间来处理相同的训练数据集和参数。
您提出的问题将具有不同的性能,具体取决于被检测事物的类型、训练设置和检测期间使用的参数以及测试级联的标准。
HAAR 和 LBP 级联的准确性取决于用于训练它们的数据集(正样本和负样本)以及训练期间使用的参数。
根据Lienhart 等人,2002 年,在人脸检测的情况下:
-numStages
,-maxDepth
和-maxWeakCount
参数应该足够高以实现所需的-minHitRate
和-maxFalseAlarmRate
。此外,detectMultiScale() 中使用的标志会在给定硬件配置上产生速度和准确性的巨大变化。
为了测试级联,您应该选择一个数据集和一种方法,例如 k-fold cross validation。
此外,在训练阶段,LBP 比 Haar 更快。使用 2000 个 pos 样本和 300 个 neg 样本,使用 Haar 类型进行训练,大约需要 5-6 天才能完成,但使用 LBP,只需要几个小时。