OpenCV 3.0 中的人脸地标提取。任何人都可以建议任何可以让我提取面部地标的好的开源库吗?

Posted

技术标签:

【中文标题】OpenCV 3.0 中的人脸地标提取。任何人都可以建议任何可以让我提取面部地标的好的开源库吗?【英文标题】:Face landmark extraction in OpenCV 3.0. Can anyone suggest any good open source libraries that will allow me to extract facial landmarks? 【发布时间】:2015-04-15 18:10:28 【问题描述】:

我目前正在使用 OpenCV3.0,希望能够创建一个执行 3 件事的程序。首先,在实时视频源中查找面孔。其次,使用 ASM 或 AAM 提取面部标志的位置。最后,使用 SVM 对视频中人脸的面部表情进行分类。

我对此进行了大量研究,但找不到最合适的开源 AAM 或 ASM 库来完成此功能。另外,如果可能的话,我希望能够训练 AAM 或 ASM 来提取我需要的特定面部标志。例如,下面链接的图片中的所有编号点: www.imgur.com/XnbCZXf

如果我建议有任何替代方案来获得所需的功能,请随时向我提出建议。

提前感谢您的任何回答,欢迎所有建议帮助我完成这个项目。

【问题讨论】:

dlib 规则。您也可以传递 cv::Mat 和 Rect 进行检测。 @berak 我想知道为什么这么好的工具没有更受欢迎,但后来我看到它在 SF。 @berak 经过更多挖掘后,它现在似乎在 GitHub 上 (github.com/davisking/dlib),尽管他们网站上的一些链接仍然指向 SF,这非常好。 嘿@dashesy,你有机会给我发你的电子邮件吗?我想和你讨论一下计算机视觉(如果可能的话)。谢谢! 【参考方案1】:

在 cmets 中,我看到您选择使用 dlib 库来训练自己的面部标志检测器。您对 dlib 用于生成他们提供的“shape_predictor_68_face_landmarks.dat”模型的训练集有几个问题。

一些提示:

作者(Davis King)表示他使用了来自 iBUG 300-W 数据集的注释图像。该数据集共有 11,167 张使用 68 点约定注释的图像。作为一个标准技巧,他还对每个图像进行镜像以有效地使训练集大小翻倍,即 11,167*2=22334 个图像。这是数据集的链接:http://ibug.doc.ic.ac.uk/resources/facial-point-annotations/ 注意:iBUG 300-W 数据集包括两个非免费/公开可用的数据集:XM2VTS 和 FRGCv2。不幸的是,这些图片占 ibug 300-W 的大部分(7310 张图片,或 65.5%)。 原始论文仅在 HELEN、AFW 和 LFPW 数据集上进行训练。因此,您应该能够仅在公开可用的图像(HELEN、LFPW、AFW、IBUG)上生成相当好的模型,即 3857 图像。 如果您在 Google 上搜索“一毫秒人脸对齐 kazemi”,则该论文(和项目页面)将是热门文章。

您可以通过阅读这篇 dlib 博客文章的 cmets 部分了解更多关于训练过程的详细信息。他特别简要讨论了他为训练选择的参数:http://blog.dlib.net/2014/08/real-time-face-pose-estimation.html

考虑到训练集的大小(数千张图像),我认为仅使用少量图像就无法获得可接受的结果。幸运的是,那里有许多公开可用的人脸数据集,包括上面链接的数据集:)

希望有帮助!

【讨论】:

我使用减少的标记集对 60 张图像进行了训练 - 我认为我对相关因素很认真,图像很好,但无论如何,结果很差...... Don '虽然从评论中得到的不多,但我不知道我对实施流程有什么不了解。【参考方案2】:

AAM 和 ASM 是相当老派的,结果有点令人失望。

大多数面部标志跟踪器都使用级联补丁或深度学习。你的 DLib 使用这个 demo、github 上的其他一些或像 one 这样的一堆 API 可以免费使用。

您还可以查看我的project,使用 C++/OpenCV/DLib 以及您引用的所有功能并完美运行。

【讨论】:

非常感谢您的详细回复,我觉得我知道我现在需要去哪个方向了。非常感谢。 我刚刚下载并测试了您的程序,给我留下了深刻的印象。目前,我的人脸检测使用 OpenCV 运行得非常好。您能否指出我接下来需要做什么,使用 DLib 来跟踪我在视频中的面部标志(类似于在您的程序中选择模型 1 时显示的网格)。最重要的是如何提取这些值的坐标?提前谢谢你,我感谢任何建议和帮助。 查看文档和演示,但您需要将 opencv mat 转换为 dlib 格式,然后在 dlib 函数中使用 face rect、image 和 model 来获取面部标志。 很抱歉再次打扰您,但我已经开始使用“shape_predictor_68_face_landmarks.dat”从实时网络摄像头源跟踪我自己的程序中的面部标志。但是我想知道是否可以更改它以更紧密地反映我想在上面链接的图像中跟踪的几个地标?或者我需要做什么来实现这些结果。再次感谢您的时间和帮助。 别担心,我已经找到了如何训练此类数据文件的示例,并将很快为自己尝试。我将使用我自己的包含人脸的图像进行训练。在示例中,他们使用了 4 张标记了几张脸的图像,以及另外 5 张标记了脸部的图像以供测试。您是否碰巧知道有多少张包含多少张用于训练和测试的面孔的图像是最佳的?还是我应该密切模仿那些用于训练原始文件的那些?如果您不知道或没有动力再回答,请不要担心,我已经烦透了您:)【参考方案3】: 试试 Stasm4.0.0。它在脸上给出了大约 77 分。

【讨论】:

【参考方案4】:

我建议你使用FaceTracker 库。它是使用 OpenCV 2.x 用 C++ 编写的。不会让你失望的。

【讨论】:

以上是关于OpenCV 3.0 中的人脸地标提取。任何人都可以建议任何可以让我提取面部地标的好的开源库吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 从图像中识别地标和裁剪嘴的脚本看不到人脸

如何从漫画人脸中检测地标位置?

Android 人脸地标裁剪

opencv中检测出人脸之后,需要把检测出的人脸区域提取出来,用作人脸识别,那么如何提取人脸区域

Opencv 3.0 加载人脸级联时出错

地标检测与人脸识别