首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV/JavaCV人脸识别-非常相似的置信度

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

Stack Overflow用户
提问于 2012-07-04 00:23:06
回答 2查看 18.1K关注 0票数 12

我会解释我正在尝试做什么,因为它似乎是相关的,以便理解我的问题。

我目前正在尝试根据数据库中的已知照片,对站在相机前的人进行人脸识别。

这些已知图片是从识别智能卡(仅包含单个正面面部图片)或来自社交网络的正面面部档案图片收集的。根据我到目前为止所读到的,似乎要想获得一个好的人脸识别,需要大量的训练图像(50+)。因此,由于我收集的图像非常少,无法创建可靠的训练集,因此我尝试使用我的实时相机帧捕获(当前使用150)作为训练集,并将之前收集的识别出的照片作为测试集。我不确定我尝试的是不是正确的,所以如果我搞砸了,请让我知道。

所以,问题是,假设我从智能卡上获得了5张识别出的照片,我尝试使用摄像头捕捉到的150帧作为训练集进行人脸识别。在尝试识别时,5个测试面的置信度非常相似,这使得整个程序无用,因为我无法准确地识别任何人。通常,使用不同的相机捕捉作为训练,我从随机人的照片中获得比我自己的照片更高的置信度。

如果你能给我任何帮助,我将不胜感激,因为我对此一无所知。

谢谢。

注意:我使用OpenCV的JavaCV包装器来制作我的程序,以及包中包含的haarcascades。本征面是使用的算法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-07 18:27:46

人脸识别

简介

我想加上这一点。官方OpenCV 2.4.2中已经包含了libfacerec,请查看:

  • http://opencv.org/opencv-v2-4-2-released.html

这意味着如果您使用的是OpenCV 2.4.2,那么在contrib模块中就有了新的cv::FaceRecognizer。我知道最近添加了一个Python包装器(感谢它!),可能在写这篇文章的时候Java也已经包装好了。

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

  • http://docs.opencv.org/trunk/modules/contrib/doc/facerec/index.html

如果你想知道可用的人脸识别算法(特征脸,鱼子脸,局部二进制模式直方图)是如何工作的,那么特别要阅读Guide To Face Recognition with OpenCV。在这里,我解释了算法是如何工作的,并提到了它们的缺点:

  • http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_tutorial.html

少量图像的人脸识别

现在来看看最初的人脸识别问题,当你的训练数据集很小时。我会给你写一份完整的答案,所以它可能会对从谷歌来这里的人有所帮助。

实际上,当你的数据集中每个人只有很少的样本时,不应该使用特征面和鱼子面。,你需要这些模型的数据才能工作,我再怎么强调也不为过。越多越好。这些方法是基于估计数据中的方差,所以给他们一些数据来估计你的模型!不久前,我在AT&T Facedatabase (使用facerec framework)上运行了一个小测试,显示了这些方法在每个人不同数量的图像下的性能:

我在这里不是在写出版物,也不会用详细的数学分析来支持这些数字。以前已经做过了,所以我建议每个对这些数字有疑问的人去看看(2),以便看到对小训练数据集的PCA (特征脸)和LDA (鱼子脸)的非常详细的分析。

因此,我建议在小样本场景中使用局部二进制模式直方图(3)进行人脸识别。这些也包括在OpenCV FaceRecognizer中,并且已经被证明在小的训练数据集上表现得非常好。如果您将其与TanTriggs预处理(4)相结合,您应该拥有一个真正健壮的人脸识别模型。TanTriggs预处理在Python语言中是一个8行代码(大约是8行代码),有关实现,请参阅https://github.com/bytefish/facerec/blob/master/py/facerec/preprocessing.py#L41。这应该很容易适应Java (或者如果人们需要的话,我也可以用OpenCV实现它)。

文学作品

  • (1) Belhumeur,P. N.,Hespanha,J.,和Kriegman,D.特征脸与渔夫脸:使用类特定线性投影进行识别。
  • (2) Martinez,A和Kak,A. PCA与LDA IEEE关于模式分析和机器智能的事务,卷23,No.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。
票数 27
EN

Stack Overflow用户

发布于 2012-07-04 16:15:50

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

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

在你计算了你的脸部空间后,你可以训练出尽可能多的脸部。在您的情况下,您只有一个。根据你想要对多少不同的主题进行分类,这可能已经奏效了。

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

简写:

使用haarcascades

  • calculate your face space从每个图像中提取人脸classification

  • take

  • 训练每个人脸

  • 询问人脸classification

  • take最可能的分类并检查人脸特征

如果你还没有找到它,OpenCV还有一个人脸识别库:https://github.com/bytefish/libfacerec

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11315157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档