增强面部API –面部标志如何生成?

时间:2019-02-25 15:51:07

标签: java kotlin augmented-reality face-detection arcore

我是一名IT专业学生,并且想进一步了解(了解)ARCore中的Augmented Faces API

我刚刚看到了ARCore V1.7 release和新的Augmented Faces API。我得到了这个API的巨大潜力。但是我没有看到关于此主题的任何问题或文章。所以我在问自己,这里有一些关于此版本的假设/问题。

假设

  • ARCore团队正在使用(如Instagram和Snapchat)机器学习来在整个面部生成界标。大概是HOG Face Detection ..

问题

  • ARCore如何在智能手机的整个用户面部上生成468点?甚至在源代码中也无法找到对此的任何响应。
  • 如何从简单的智能手机相机获得深度信息?
  • 如何拒绝人脸检测/跟踪到自定义对象或手的另一部分身体?

因此,如果您对此主题有任何建议或意见,请与我们分享!

1 个答案:

答案 0 :(得分:5)

  
      
  1. ARCore的新 Augmented Faces API (可在不带深度传感器的前置摄像头上运行)提供高质量的468-point 3D网格,允许用户将此类效果附加到其面部例如动画蒙版,眼镜,皮肤修饰等。网格提供了坐标和区域特定的锚点,从而可以添加这些效果。
  2.   
     

我坚信,在ARCore 1.7的支持下,借助计算机视觉算法可以生成面部标志。同样重要的是,您可以通过在启用了“前置摄像头”和“增强人脸”“网格”模式的情况下创建ARCore会话来开始使用Unity或Sceneform。请注意,使用前置摄像头时,其他AR功能(例如平面检测)目前不可用。 AugmentedFace扩展了Trackable,因此可以像检测平面,增强图像和其他可跟踪对象一样检测和更新人脸

enter image description here

  

您知道,两年多前Google发布了Face API来执行面部检测,该功能可以定位图片中的面部及其位置(在图片中的位置)和方向(朝向的方式) ,相对于相机而言)。使用Face API,您可以检测地标(面部的兴趣点)并执行分类,以确定眼睛是睁开还是闭着,以及面部是否在微笑。 Face API还可以检测并跟踪运动图像中的面部,这称为面部跟踪。

因此,ARCore 1.7刚刚从Face API借用了一些建筑元素,现在它不仅可以检测面部标志,并为其生成468点,还可以60 fps的速度实时跟踪它们。保持3D面部几何形状不变

请参阅Google的Face Detection Concepts Overview

enter image description here

  1. 要计算通过移动RGB相机拍摄的视频中的深度通道不是火箭科学。您只需将视差公式应用于跟踪的要素。因此,如果静态对象上的特征的平移幅度很高-跟踪的对象离摄像机更近,并且静态对象上的特征的幅度很低-跟踪的对象离摄像机更远。对于诸如The Foundry NUKEBlackmagic Fusion之类的合成应用程序来说,这些计算深度通道的方法已经使用了10多年。现在,可以在ARCore中访问相同的原理。

  2. 您不能将人脸检测/跟踪算法拒绝到自定义对象或手之类的身体其他部位。 Augmented Faces API (增强的Faces API),仅用于面孔。

以下是用于激活增强面部功能的Java代码的样子:

// Create ARCore session that supports Augmented Faces
public Session createAugmentedFacesSession(Activity activity) throws 
                                                      UnavailableException {

    // Use selfie camera
    Session session = new Session(activity, 
                                  EnumSet.of(Session.Feature.FRONT_CAMERA));

    // Enabling Augmented Faces
    Config config = session.getConfig();
    config.setAugmentedFaceMode(Config.AugmentedFaceMode.MESH3D);
    session.configure(config);
    return session;
}

然后获取检测到的面部列表:

Collection<AugmentedFace> faceList = session.getAllTrackables(AugmentedFace.class);

最后渲染效果:

for (AugmentedFace face : faceList) {

    // Create a face node and add it to the scene.
    AugmentedFaceNode faceNode = new AugmentedFaceNode(face);
    faceNode.setParent(scene);

    // Overlay the 3D assets on the face
    faceNode.setFaceRegionsRenderable(faceRegionsRenderable);

    // Overlay a texture on the face
    faceNode.setFaceMeshTexture(faceMeshTexture);

    // .......
}

希望这会有所帮助。