OpenCV/JavaCV人脸识别 - 非常相似的置信度值

Fáb*_*ino 12 java opencv eigenvector javacv

我将解释我想要做什么,因为它似乎与理解我的问题有关.

我目前正在尝试基于数据库中的已知图片对在摄像机前面的人进行人脸识别.

这些已知图片是从识别智能卡(其仅包含单个正面图片)或来自社交网络的正面脸部图片中收集的.从我到目前为止所看到的情况来看,似乎要获得良好的人脸识别,需要大量的训练图像(50+).因此,由于我收集的图像很少能够创建可靠的训练集,所以我尝试使用我的实时相机帧捕获(当前使用150)作为训练集,并且先前收集的识别图像作为测试集.我不确定我正在尝试的是否正确,所以如果我搞砸了,请告诉我.

所以,问题是,在我说了之后,我从智能卡中找到了5张识别出来的图片,我尝试使用相机拍摄的150帧作为训练集进行人脸识别.当试图识别时,5个测试面中每个测试面的置信度值非常相似,使得整个程序无用,因为我无法准确识别任何人.通常,使用不同的相机捕捉作为训练我从随机人物的照片中获得比自己的照片更高的置信度值.

我很感激你能给我的任何帮助,因为我在这里不知所措.

谢谢.

注意:我正在使用OpenCV的JavaCV包装器来创建我的程序,以及包中包含的haarcascades.特征脸是使用的算法.

byt*_*ish 27

人脸识别

介绍

我想补充一下.libfacerec已包含在官方OpenCV 2.4.2中,请参阅:

这意味着如果您使用OpenCV 2.4.2,那么您在contrib模块中拥有新的cv :: FaceRecognizer.我知道最近添加了一个Python包装器(感谢你!),也许Java在编写时也被包装了.

cv :: FaceRecognizer附带了大量文档,它将向您展示如何使用大量完整的源代码示例进行人脸识别:

如果您想知道可用的人脸识别算法(特征脸,Fisherfaces,局部二值模式直方图)如何工作,那么请特别阅读使用OpenCV的人脸识别指南.在那里,我解释算法是如何工作的,并提到它们的缺点:

几乎没有图像的人脸识别

现在,您的训练数据集很小,这是识别面部的原始问题.我会给你一个彻底的答案,所以它可能会帮助那些从谷歌来这里的人.

实际上,当您的数据集中每人只有极少数样本时,不应使用Eigenfaces和Fisherfaces.你需要这些模型的数据才能工作,我不能强调这一点.越多越好.这些方法基于估计数据的方差,因此请给它们一些数据来估算您的模型!不久之前,我在AT&T Facedatabase(使用facerec框架)上进行了一个小测试,它显示了这些方法的性能,每个人的图像数量不同:

在此输入图像描述

我不是在这里写一篇出版物,也不会用详细的数学分析来回溯这些数字.之前已经完成了,所以我建议每个人都怀疑这些数字来研究(2),以便对小型训练数据集进行非常详细的PCA(特征脸)和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,PN,Hespanha,J.和Kriegman,D.Eigenfaces vs. Fisherfaces:使用类特定线性投影的识别.IEEE Transactions on Pattern Analysis and Machine Intelligence 19,7(1997),711-720.
  • (2)Martinez,A和Kak,A.PCA与LDA IEEE Transactions on Pattern Analysis and Machine Intelligence,Vol.23,No.2,pp.228-233,2001.
  • (3)Ahonen,T.,Hadid,A.和Pietikainen,M.面部识别与局部二元模式.计算机视觉 - ECCV 2004(2004),469-481.
  • (4)Tan,X.和Triggs,B.在困难的光照条件下用于人脸识别的增强的局部纹理特征集.IEEE Transactions on Image Processing 19(2010),1635-650.


luk*_*ger 6

您想知道的是如何只用一张训练图像进行人脸识别.这是可能的,但也取决于您想要分类的不同人数.

当然不需要50多个训练图像.对于基本的人脸识别,您需要大约50个面来计算您的面部空间(特征脸).也许你把它搞砸了.看到这些面孔有很多变化(肤色,眼镜,形状......)你可以从你喜欢的任何面部数据库中取出这些面孔.http://www.face-rec.org/列出了几个数据库并解释了不同的算法.

计算好您的面部空间后,您可以使用尽可能多的面部进行训练.在你的情况下,你只有一个.根据您想要分类的不同主题数量,这可能已经有效.

如果你得到太多错误的分类,我会看看混合方法.混合方法将模板匹配算法(特征脸,fisherfaces)与基于特征的算法相结合.在这种情况下,您将获取第一个算法的输出,并将眼睛,鼻子,眉毛,下巴形状等与您的测试面相匹配.

简而言之:

  1. 用haarcascades从每个图像中提取面部
  2. 计算你的面部空间
  3. 为每张脸训练
  4. 要求面部分类
  5. 采取最可能的分类并检查面部特征

如果您还没有找到它,OpenCV还有一个面部识别库:https: //github.com/bytefish/libfacerec

编辑:我不会使用超过10-15个组件(特征脸).