我一直在OpenCV(开源计算机视觉库)中进行面部检测实验,发现人们可以使用Haar级联来检测面部,因为其中有几个提供了OpenCV。但是,我注意到还有几个LBP级联。经过一些研究,我发现LBP代表局部二进制模式,根据OpenCV Face Detection Documentation,它也可以用于人脸检测。
我想知道的是哪个更好?哪一个表现得更快,哪一个更准确?似乎LBP表现得更快,但我也不是100%肯定。感谢。
答案 0 :(得分:59)
LBP更快(速度提高几倍)但准确度更低。 (比哈尔少10-20%)。
如果你想在嵌入式系统上检测面部,我认为LBP是选择,因为它以整数进行所有计算。哈尔使用浮动,这是嵌入式/移动的杀手。
答案 1 :(得分:22)
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
VS
Cascade:lbpcascade_frontalface.xml
Datafile:muct.csv
|---------------------------------------------------|
| Hits | Misses | False Detects | Multi-hit |
| 3569 | 106 | 77 | 3 |
|---------------------------------------------------|
Time:1m12.511s
答案 2 :(得分:13)
我个人认为,您应该查看LBP所有与检测相关的任务,因为LBP培训可能需要几分钟,而HAAR培训可能需要数天才能获得相同的培训数据集和参数。
您提出的问题将具有不同的性能,具体取决于被检测物的类型,训练设置和检测期间使用的参数以及测试级联的标准。
HAAR和LBP级联的准确性取决于用于训练它们的数据集(阳性和阴性样本)以及训练期间使用的参数。
根据Lienhart et al, 2002,在面部检测的情况下:
-numStages
,-maxDepth
和-maxWeakCount
参数应足够高,以达到所需的-minHitRate
和-maxFalseAlarmRate
。 此外,detectMultiScale()中使用的标志会在给定硬件配置上产生速度和精度的急剧变化。
要测试级联,您应确定数据集以及k-fold cross validation等方法。
答案 3 :(得分:10)
可能会对你有用:
有Simd Library,其中有implementation个HAAR和LBP级联分类器。它可以使用OpenCV的标准HAAR和LBP casscades。该实现具有使用SSE4.1,AVX2,AVX-512和NEON(ARM)的SIMD优化,因此其工作速度比原始OpenCV快2-3倍。
答案 4 :(得分:7)
此外,在训练阶段,LBP比哈尔快。使用哈尔类型的2000个样本和300个样本进行训练,完成需要大约5-6天,但是使用LBP只需要几个小时。