2016-07-18 45 views
3

我正在开发应用程序,我需要在镜像凸轮或化妆凸轮等凸轮上获取脸部地标点。我希望它也适用于iOS。请为我提供一个可靠的解决方案。 我已经使用Dlib和Luxand。在android中检测脸部地标点

DLIB:https://github.com/tzutalin/dlib-android-app

Luxand:http://www.luxand.com/facesdk/download/

DLIB是缓慢的,有2秒左右的延迟(请看git的页面上的演示视频)和luxand是确定的,但它支付。我的首要任务是使用开源解决方案。 我也使用Google的愿景,但他们没有提供很多面部标志点。 所以,请给我一个解决方案,使dlib快速工作或任何其他选项保持优先跨平台。 在此先感谢。

+0

你需要什么地标?我的项目使用Android Vision获得了相当大的成功(还没有看iOS!)。我之前看过OpenCV,它比Android Vision慢很多 - 但值得一试。 – Ewald

回答

0

除了OpenCV和Google Vision之外,还有广泛可用的Web服务,例如Microsoft Cognitive Services。优点是它将完全独立于平台,您已将其列为主要设计目标。我还没有亲自将它们用于实现,但基于一段时间玩他们的演示他们似乎很强大;他们非常准确,可以根据你想知道的内容提供不少细节。 (其他供应商也有类似的解决方案)。

这样的两大潜在缺点是可能会增加网络流量和API定价(取决于您将使用它们的程度)。价格方面,微软目前每月可免费提供多达5,000笔交易,并且交易额外的交易超过了一分钱(取决于交通量,实际上您可以获得大批量的折扣),但如果您的交易量较高,举例来说,例如,每月数百万笔交易的费用可以快速增加。这实际上是一个相当典型的定价模式;在您选择供应商或实施此类解决方案之前,请确保您了解他们将如何向您收费,以及您可能最终付费多少,以及如果扩大用户群,您可以支付多少费用。根据您的流量和商业模式,它可能非常合理或成本过高。

添加的网络流量可能会也可能不会成为问题,具体取决于您的应用程序的写入方式以及您要发送的数据量。如果你可以异步进行处理,并保证合理快速的Wi-Fi访问,这显然不会是一个问题,但不幸的是,你可能有或没有这种奢侈。

+1

谢谢@EJoshuaS 但我希望它是在设备中,所以请给我任何选项,将检查设备不在network.Thanks再次为您的有用信息。 – DCS

0

我目前正在使用Google Vision API,它似乎能够检测开箱即用的地标。这里退房FaceTracker:

google face tracker

这个解决方案应该能够检测到的脸,幸福,和左,右眼为是。对于其他地标,您可以调用Face上的getLandmarks,它应该根据他们的文档返回所需的一切(以为我没有尝试过):Face reference

+0

我已经尝试过演示,但无法精确地在相机预览上绘制人脸地标点。 让我知道,如果你已经成功地绘制了精确的脸点,并分享代码块PLZ。 非常感谢。 – DCS

5

Dlib对于大多数情况下足够快。大部分处理时间用于检测图像上的人脸区域,因为现代智能手机正在生成高分辨率图像(10MP +),所以处理时间较慢

是的,人脸检测可以在3-5MP图像上花费2秒钟,但它会尝试找到80x80像素大小的非常小的面孔。我确信,你不需要在高分辨率图像上使用这样的小脸部,这里的主要优化是在找到脸部之前减小图像的大小。

找到人脸区域后,下一步 - 人脸标志检测速度非常快,对于一个人脸需要3ms,这个时间不取决于分辨率。

dlib-android port目前没有正确使用dlib的检测器。下面是如何使dlib-android端口工作更快的建议列表: https://github.com/tzutalin/dlib-android/issues/15

它非常简单,您可以自己实施。我预计性能提升约为2x-20x

+0

该链接似乎很有帮助。让我试试这些并回复你。 感谢您的帮助。 – DCS

13

如果您使用几个快捷方式,则可以使Dlib在Android(20-30 fps)上实时检测人脸地标。这是一个很棒的图书馆。

初始化

首先,你应该遵循叶夫根的答案的所有建议,特别是确保你只初始化frontal_face_detectorshape_predictor对象,而不是一次的每一帧。如果您从文件反序列化它,而不是使用get_serialized_frontal_faces()函数,则frontal_face_detector将初始化得更快。 shape_predictor需要从100Mb文件初始化,并需要几秒钟。序列化和反序列化函数被编写为跨平台并对数据进行验证,这是健壮的,但使其非常缓慢。如果您准备对字节序列做出假设,您可以编写自己的反序列化函数,该函数的速度会更快。该文件主要由136个浮点值的矩阵组成(约120000个,共16320000个浮点数)。如果将这些浮点数量化为8或16位,则可以节省大量空间(例如,可以将最小值和(max-min)/ 255存储为每个矩阵的浮点数并分别量化)。这将文件大小减小到大约18Mb,并且它在几百毫秒而不是几秒钟内加载。使用量化值的质量下降似乎可以忽略不计,但YMMV。

人脸检测

您可以缩放摄像机架到一些小的,如240x160(或什么的,保持宽高比是否正确),更快的人脸检测。这意味着您无法检测到较小的脸部,但根据您的应用,这可能不成问题。另一个更复杂的方法是自适应地裁剪和调整用于脸部检测的区域:首先检查较高分辨率图像中的所有脸部(例如480x320),然后裁剪区域+/-先前位置周围的一个脸部宽度,如果需要的话。如果您未能检测到一张脸部的脸部,则会恢复为检测下一张脸部的整个区域。

脸部追踪

为了更快脸跟踪,则可以在一个线程中连续运行脸部检测,然后在另一个线程,跟踪检测到的面部(多个),并执行使用所跟踪的矩形面部特征检测。在我的测试中,我发现根据我使用的手机(大约240x160),脸部检测花费了100 - 400毫秒,在那段时间我可以对中间帧进行7或8个脸部特征检测。如果脸部移动很多,这会变得有点棘手,因为当你得到新的脸部检测(将从400ms前)时,你必须决定是否继续跟踪新的检测位置或跟踪的位置先前的检测。 Dlib包含了一个correlation_tracker,但不幸的是我无法让这个运行速度超过每帧250ms左右,并且缩小分辨率(甚至是大幅度缩减)并没有多大区别。修补内部参数会增加速度,但跟踪效果较差。我最终使用基于预览帧的色度UV平面的CAMShift跟踪器,根据检测到的脸部矩形生成颜色直方图。在OpenCV中有一个CAMShift的实现,但它也很容易推出自己的。

希望这会有所帮助,它主要是先挑选优先级最低的水果,然后继续前进直到你快乐足够快。 Galaxy Note 5 Dlib在大约100ms时确实会面对+特征检测,即使没有这些额外的复杂性,这也可能足以满足您的需求。

+0

我对通过量化浮点数来重新使用.dat文件大小非常感兴趣。你可以请我引导一些示例代码或类似的东西?我真的很感激 – s1ddok

+1

@ s1ddok当然,下面是一些代码,用于打包格式序列化shape_predictor:http://pastebin.com/UqNq5qDV,以下代码以相同的格式反序列化:http://pastebin.com/ UT3w8CmS我将序列化代码添加到face_landmark_detection_ex.cpp以生成打包文件。这不是测试与最新版本的dlib btw – samgak

+0

非常感谢,我试图编译,但我得到一堆'是'dlib :: shape_predictor''的私人成员错误:(你认为这是可能的解决这个问题, – s1ddok