我一直在OpenCV(开源计算机视觉库)中尝试人脸检测,并且发现可以使用Haar级联来检测人脸,因为OpenCV提供了多种级联。然而,我注意到也有几个LBP级联。经过一些研究,我发现LBP代表局部二值模式,根据OpenCV人脸检测文档,它也可以用于人脸检测。
我想知道的是哪个更好?哪一个执行速度更快,哪一个更精确?似乎LBP的执行速度更快,但我也不完全确定。谢谢。
我一直在OpenCV(开源计算机视觉库)中尝试人脸检测,并且发现可以使用Haar级联来检测人脸,因为OpenCV提供了多种级联。然而,我注意到也有几个LBP级联。经过一些研究,我发现LBP代表局部二值模式,根据OpenCV人脸检测文档,它也可以用于人脸检测。
我想知道的是哪个更好?哪一个执行速度更快,哪一个更精确?似乎LBP的执行速度更快,但我也不完全确定。谢谢。
LBP比Haar更快(快几倍),但是精度较低(比Haar低10-20%)。
如果您想在嵌入式系统上检测人脸,则LBP是默认选择,因为它的计算使用整数。
Haar使用浮点数进行处理,在嵌入式和移动处理器上支持较差。因此,性能损失非常大,足以使其在手机上的使用不切实际。
一个LBP级联可以被训练得和Haar级联执行相似(或更好),但是开箱即用,Haar级联大约慢3倍,而且根据您的数据,在准确检测人脸位置方面要好1-2%。考虑到人脸检测可以在95%以上的准确度范围内运行,这种增加的准确性是相当显著的。
下面是使用MUCT数据集时的一些结果。
当地面真实坐标和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 交叉验证。
此外,在训练阶段,LBP比Haar更快。使用2000个正样本和300个负样本进行Haar类型的训练,需要5-6天才能完成,但是使用LBP只需要几个小时。