使用 FaceRecognizer OpenCV 训练人脸以获得最佳结果的最佳方法是啥?
Posted
技术标签:
【中文标题】使用 FaceRecognizer OpenCV 训练人脸以获得最佳结果的最佳方法是啥?【英文标题】:What is the best method to train the faces with FaceRecognizer OpenCV to have the best result?使用 FaceRecognizer OpenCV 训练人脸以获得最佳结果的最佳方法是什么? 【发布时间】:2017-11-28 20:34:51 【问题描述】:这里我说我已经尝试了很多tutorials在OpenCV 3.2中通过使用人脸模块中的FaceRecognizer类来实现人脸识别。但我没有如愿得到接受的结果。
在这里我想问一下,我想知道,在训练和识别过程中,什么是最好的方法或者什么是照顾的条件?
我为提高准确性所做的工作:
创建(至少)10 张面孔,以最佳质量、大小和角度训练每个人。 尝试在图像中拟合人脸。 均衡图像的 HIST然后我尝试了所有三个人脸识别器(EigenFaceRecognizer,FisherFaceRecognizer,LBPHFaceRecognizer),结果都一样,但是识别率真的很低,我只训练了三个人,但也识别不了好吧(第一个人被认为是第二个等等问题)。
问题:
进行训练和识别图像必须来自相同 相机? 手动裁剪训练图像(photoshop -> 读取图像然后训练)或此任务 必须以编程方式完成(检测-> 裁剪-> 调整大小然后训练)? 每个人脸识别器的最佳参数是什么(int num_components, double threshold)
以及如何设置训练算法在未知时返回 -1
人。
【问题讨论】:
Q1:首选但不强制,相机必须具有相当的质量 Q2:两者没有区别,但我会选择以编程方式进行,因为它可以节省我的一些时间。 Q3:您可以尝试使用文档中的默认参数,它们对我来说效果很好Q4:阅读line 134开斋节快乐跨度> @ZdaR 谢谢!你能在这里告诉我什么是高阈值,什么是低阈值,这有什么好的价值?这些参数是用于训练还是用于识别?因为当我训练数据时,我会保存它,然后在下一次我只加载数据。当我加载数据时,我还必须准备与训练时相同的参数吗? 你能附上文档的链接,这些术语是在哪里引用的? @ZdaR 谢谢,兄弟!也祝你开斋节快乐。我一步一步走的唯一文档是上面问题中的链接,我从 Stack Overflow 等其他论坛收集的另一个想法,所以没有任何确切的链接。但是参数并没有什么好的,例如:什么对什么样的情况有好处,以及这些参数在训练或识别过程中使用等等。 @BahramdunAdil 如需灵感,请查看Chapter 8 of Mastering OpenCV - 有一些关于预处理面部的非常方便的注释 【参考方案1】:扩展我的评论,掌握 OpenCV 中的第 8 章提供了非常有用的技巧,用于预处理人脸以帮助识别过程,例如:
仅在检测到双眼时才采样(通过 haar 级联)几何变换和裁剪:此过程包括缩放、旋转和平移图像以使眼睛对齐,然后从面部图像中移除前额、下巴、耳朵和背景。
左侧和右侧的单独直方图均衡化:此过程独立标准化面部左侧和右侧的亮度和对比度。
平滑:此过程使用双边滤波器降低图像噪声。
椭圆蒙版:椭圆蒙版从面部图像中去除一些剩余的头发和背景。
我已向my fork of the example code 添加了一个hacky 加载/保存,请随时尝试/根据需要对其进行调整。目前它非常有限,但它是一个开始。
此外,您还应该检查OpenFace and it's DNN face recognizer。 我还没有玩过,所以不能提供细节,但它看起来真的很酷。
【讨论】:
感谢您的解释,我有一个问题,我认为 preprocessing.cpp 文件中的第 224 行还有一些内容,即没有传递参数scaledWidth
并且也没有任何默认值为此的价值。如何解决?
@BahramdunAdil 我浏览了整章的示例代码,但找不到scaledWidth
,我不确定你指的是什么。
void detectLargestObject(const Mat &img, CascadeClassifier &cascade, Rect &largestObject, int scaledWidth)
我说在preprocessing.cpp文件的第224行,为什么scaledWidth
没有任何值你可以再仔细看看,也许你会看到。
我想我明白你的意思了:detectLargestObject()
call on line 224 in preprocessFace.cpp。函数定义实际上在detectObject.h at line 37 中,您会注意到scaledWidth
的默认值是320。如果您在调用时没有传递不同的值,则会使用默认值。
嗯,我明白了。谢谢!我正在使用 Java,所以我对 C++ 非常熟悉,我已经将代码翻译成 Java。但是现在剩下一个问题,就是这个subspaceProject
函数,我什至在OpenCV库中都没有找到,你觉得这个函数是什么。以上是关于使用 FaceRecognizer OpenCV 训练人脸以获得最佳结果的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenCV 2.4.8 为 Java 编写 FaceRecognizer 的问题
使用 FaceRecognizer OpenCV 训练人脸以获得最佳结果的最佳方法是啥?