人脸识别
简介
我想补充一点内容。libfacerec 已经被包含在官方的 OpenCV 2.4.2 中,详情请参见:
这意味着如果您使用的是OpenCV 2.4.2,则在
contrib模块中有新的
cv::FaceRecognizer。我知道最近添加了Python封装(感谢!),可能在编写本文时也已经包装了Java。
cv::FaceRecognizer附带了详细的文档,将向您展示如何使用
许多完整源代码示例进行人脸识别:
如果您想了解可用的人脸识别算法(Eigenfaces、Fisherfaces、局部二进制模式直方图),那么特别是要阅读
OpenCV人脸识别指南。在那里,我将解释这些算法的工作原理并提及它们的缺点。
使用少量图像进行人脸识别
现在来解决你的问题,即当你的训练数据集很小时如何识别人脸。我会给你写一篇详细的答案,这可能会帮助从谷歌搜索而来的人们。
实际上,在数据集中每个人只有非常少的样本时,不应该使用特征脸或费舍尔脸。这些模型需要数据才能发挥作用,我再次强调这点。数据越多越好。这些方法是基于估计数据中的方差,因此请提供一些数据以估算模型!不久前,我在AT&T人脸数据库上运行了一个小测试(使用facerec framework),显示了这些方法在每个人的图像数量不同的情况下的性能:
![enter image description here](https://istack.dev59.com/ZsjDl.webp)
我在这里不写一篇出版物,也不会用详细的数学分析来支持这些数字。这已经做过了,所以我建议每个怀疑这些数字的人去参考(2),以便看到PCA(Eigenfaces)和LDA(Fisherfaces)在小训练数据集上的非常详细的分析。
因此,我建议在小样本场景中使用局部二进制模式直方图(3)进行面部识别。这些也包含在OpenCV
FaceRecognizer中,并且已被证明在小训练数据集上表现非常好。如果将其与TanTriggs预处理(4)结合使用,您应该拥有一个非常强大的面部识别模型。 TanTriggs预处理是Python中的8行代码(左右),请参见
https://github.com/bytefish/facerec/blob/master/py/facerec/preprocessing.py#L41以获取实现。这应该很容易适应Java(或者如果需要,我可以使用OpenCV实现它)。
(1) Belhumeur, P. N., Hespanha, J., and Kriegman, D.《利用类别特定线性投影的特征脸与Fisherfaces进行识别》。IEEE模式分析与机器智能交易,19卷7期(1997年),711-720页。
(2) Martinez, A和Kak, A.《PCA与LDA对比》。IEEE模式分析与机器智能交易,第23卷,第2期,第228-233页,2001年。
(3) Ahonen, T.,Hadid, A.,和Pietikainen, M.《使用局部二进制模式进行人脸识别》。计算机视觉-ECCV 2004(2004年),469-481页。
(4) Tan, X.和Triggs, B.《增强的本地纹理特征集用于在困难照明条件下进行人脸识别》。IEEE图像处理交易,19(2010年),1635-650页。