如果您使用几个快捷方式,则可以使Dlib在Android(20-30 fps)上实时检测人脸地标。这是一个很棒的图书馆。
初始化
首先,你应该遵循叶夫根的答案的所有建议,特别是确保你只初始化frontal_face_detector
和shape_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时确实会面对+特征检测,即使没有这些额外的复杂性,这也可能足以满足您的需求。
你需要什么地标?我的项目使用Android Vision获得了相当大的成功(还没有看iOS!)。我之前看过OpenCV,它比Android Vision慢很多 - 但值得一试。 – Ewald