Android - 人脸特征检测

Posted

技术标签:

【中文标题】Android - 人脸特征检测【英文标题】:Android - Face feature detection 【发布时间】:2012-04-04 18:04:10 【问题描述】:

目前我正在开发一款适用于 android 手机的应用。我们想要检测人脸的特征。程序应该能够检测眼睛、鼻子、嘴巴和脸部边缘的位置。

准确度应该没问题,但不需要完美。可以放松一些准确性以加快速度。所有的脸都是正面的,我们会知道之前特征的大致位置。我们不需要活体检测。应从保存的图像中提取特征。检测时间只要不影响用户体验即可。因此,即使 2 或 3 秒也可以。

有了这个假设,找到一个能让我们实现这一目标的库应该不会太难。但我的问题是,最好的方法是什么?你有什么建议?这是我第一次为 Android 开发,我不想走错方向。对我们来说,图书馆是个好主意还是自己实现一些现有算法更好(更快/更高的准确性)?

我搜索了很多,发现了很多有趣的东西。 Android API 中还有人脸检测功能。但是返回的人脸类(http://developer.android.com/reference/android/media/FaceDetector.Face.html)只包含眼睛的位置。这对我们的应用程序来说是更少的。然后还有适用于 Android 或 JavaCV 的 OpenCV。你认为合作的好主意是什么?哪些库有好的文档、教程?

【问题讨论】:

请问您的研究取得了成功吗?我正在尝试做类似的事情。请告诉我! 【参考方案1】:

OpenCV 有 a tutorial for this purpose,不幸的是只有 C++,所以你必须将它转换为 Android。

如果您从可绘制或 sdcard 图像中检测图像,您也可以尝试 Android 中的 FaceDetection API,this is a simple example。或者更新的Camera.Face API,它适用于相机图像。

如果您想在动态时间从相机中获取图像而不是首先阅读How to take picture from camera.,但我建议您查看官方 OpenCV Android 示例并使用它们。

更新:

Mad Hatter Example 使用 Camera 和 SurfaceView 的方法。它的速度非常快。看看Mad Hatter。

如果链接断开,相关代码是这样的:

public class FaceDetectionListener implements Camera.FaceDetectionListener 
    @Override
    public final void onFaceDetection(Face[] faces, Camera camera) 
        if (faces.length > 0) 
            for (Face face : faces) 
                if (face != null) 
                    // do something
                
            
        
    

【讨论】:

感谢您的快速回复。其实我不需要人脸检测。我将处理的图像仅包含人脸。最重要的部分是,找到特征。眼睛、鼻子、嘴巴在哪里,脸的边缘在哪里(背景从哪里开始,头发从哪里开始)。我只需要将其应用于存储的图像,而不是在相机上实时。你知道一个很好的介绍吗?也许是 OpenCV 或替代算法? FaceDetection API 根据距离 bw 眼睛和其他特征检测人脸。所以尝试探索。如果没有找到任何运气,那就去 OpenCV 我在文档中看到了这一点。但我在想,如果我知道眼睛的位置,是否真的更容易提取其他特征。 Android 4 还为您提供了飞蛾的坐标。所以我一直在寻找类似的东西 抱歉拆分为 2 个 cmets,但我无法用我的“智能”手机按下编辑按钮 :-D 因为我认为检测图像中的特征并非易事。我在研究这个主题的过程中听到了一些理论性的东西,但我从来没有在现实世界的场景中应用它。如果我自己实现所有东西,恐怕我会试图重新发明***。而且我确信我自己的版本由于时间限制和缺乏知识,这并不完美 是的,自己工作将是一项耗时的任务。尝试使用一些 API【参考方案2】:

我正在做一个类似的项目。我用 FaceDetection API 做了一些测试,可以告诉你,如果你想检测眼睛、鼻子、嘴巴和边缘,它不会帮助你。此 API 仅允许您检测眼睛。如果你想实现人脸识别是没用的,因为在人脸检测部分你需要更多的特征,而不仅仅是眼睛。

对您的第一个回复的评论:您确实需要面部检测。寻找特征是人脸检测的一部分,而获得这些特征是人脸识别应用程序的第一步。使用 OpenCV,您可以使用 Haar 类特征 来获取这些特征(眼睛、鼻子、嘴巴等)。

但是,我发现将 openCV 函数与单独的 .cpp 文件一起使用有点复杂。有一个叫做 JNIEXPORT 的东西,它允许您在 .cpp 文件中使用 OpenCV 函数编辑 Android 图库图像。 OpenCV 有一个样例 Haar 特征检测 .cpp 文件,可用于人脸检测(以及使用其他算法作为第二步的识别)。

你是在 windows 还是 linux 上开发?我正在使用 Windows,并且没有设法使用您链接的教程来设置 OpenCV。但是,我在 Eclipse 中确实有一个可以工作的 windows OpenCV 环境,并且从 OpenCV 2.3.1 中获得了所有示例。也许我们可以互相帮助并分享一些信息/结果?请告诉我。

【讨论】:

对于FaceDetection API,它似乎只检测眼睛的中间和它们之间的距离,但是否可以到达单个眼睛?还是有可能知道脸是斜的?【参考方案3】:

这是一个很好的查询。我想如果你得到眼睛的特征点,那么我们也可以通过知道其他点与眼睛的估计距离来计算其他点。

请参阅本文以了解更多关于我想说的内容:http://klucv2.googlecode.com/svn/trunk/docs/detection%20of%20facial%20feature%20points%20using%20anthropometric%20face%20model.pdf

我希望这会有所帮助。

【讨论】:

【参考方案4】:

看看新的 Android 人脸 API,其中包括面部标志检测。这里有教程:

https://developers.google.com/vision/detect-faces-tutorial

【讨论】:

【参考方案5】:

我找到了这个 Microsoft API 提供的面部情绪检测的一个很好的解决方案。此 API 返回 JSON 响应和情绪图。你可以试试这个 API 以获得好的结果。

情感 API

情绪识别 识别图像中一个或多个人表达的情绪,并返回一个边界框 脸。检测到的情绪是快乐、悲伤、惊讶、愤怒、 恐惧、蔑视、厌恶或中立。

支持的输入图像格式包括JPEG、PNG、GIF(第一帧)、BMP。图片文件大小不得超过 4MB。 如果用户已经调用了人脸 API,他们可以提交人脸矩形作为可选输入。否则,Emotion API 将首先 计算矩形。 可检测的人脸尺寸范围是 36x36 到 4096x4096 像素。超出此范围的人脸将不会被检测到。 对于每张图像,检测到的最大人脸数为 64,人脸按人脸矩形大小降序排列。如果不 检测到人脸,将返回一个空数组。 由于技术挑战,某些人脸可能无法检测到,例如非常大的面部角度(头部姿势),大的遮挡。正面和 近正面的人脸效果最好。 -情绪轻蔑和 厌恶是实验性的。

https://www.microsoft.com/cognitive-services/en-us/emotion-api

【讨论】:

以上是关于Android - 人脸特征检测的主要内容,如果未能解决你的问题,请参考以下文章

人脸识别系列之人脸检测--训练基于肤色特征的检测

人脸识别系列之人脸检测--训练基于肤色特征的检测

人脸人脸特征点检测

AdaBoost 人脸检测介绍 : 矩形特征和积分图

基于特征点检测的人脸融合技术

Android 人脸地标裁剪