【问题标题】:ARFaceTrackingConfiguration: How to distinguish pictures from real faces?ARFaceTrackingConfiguration:如何区分图片和真人脸?
【发布时间】:2020-04-22 04:22:29
【问题描述】:

我们在应用商店中有几个应用程序使用ARFaceTrackingConfiguration 来检测带有 FaceID 摄像头的 iOS 设备中的用户面部。

您可能已经看到,ARKit 还会跟踪您放在 iPad Pro/iPhoneX 前的人脸图片,就好像它们是人脸一样。例如。从our apps 之一拍照(复制一个可以下载和运行苹果example app for ARFaceTrackingConfiguration):

现在我注意到 ARKit 在内部处理真实面孔的方式与处理面孔图片的方式不同。因为通常(ARWorldTrackingConfigurationARFaceTrackingConfigurationARKit 会尝试匹配真实世界的大小和虚拟对象的大小,即 3D 编辑软件中 10x10cm 的对象将匹配相同 10x10cm 的真实世界对象. 但是当使用面部跟踪时,手机检测到异常大小的脸(如上图所示的 4 厘米宽的小脸或脸大得多的人的海报),它会缩放 FaceGeometry,就好像检测到的脸是一个正常大小的头部,即头部宽度的测量值约为 14 厘米。然后,所有虚拟对象都将被相应地缩放,这将在现实世界中产生错误的大小。参考文献下一张图片:

眼镜 3D 模型大约 14 厘米宽,但它们仅呈现为 4 厘米物体。

相比之下,如果您将眼镜戴在真正的 3D 脸上,它们的尺寸会正确,戴在小人头上(如 12 厘米)会稍大,戴在大人头上(如 16 厘米)会稍微太小(因为在这两种情况下它们都是真正的 14 厘米)。

我什至可以看到 ARKit 在以下之间切换:

  1. 仅使用相机图像进行平面人脸检测
  2. 使用 FaceID TrueDepth 摄像头进行人脸检测。

当您将婴儿抱在应用程序前时,这一点尤其突出。 对于婴儿头,ARKit 将首先尝试放大所有东西,使虚拟场景中婴儿头宽 14 厘米,并且眼镜适合成人。 然后,通常头部出现在相机中的 1-2s ARFaceTrackingConfiguration 会从模式 (1) 切换到模式 (2) 并显示 3D 的真实大小对象,这会导致带有成人眼镜的小婴儿头部的超可爱照片(此处未显示,因为 SO 不用于分享婴儿照片)。

所以,现在问题来了:

有没有办法确定 ARKit 是处于 1 模式还是 2 模式?

【问题讨论】:

  • 您好,您对此有什么发现吗?我也有同样的问题。除了这个问题,我什么也找不到。
  • 遗憾的是,仍然没有官方 API,@Andy 下面的回答仍然是你最好的选择。

标签: ios swift scenekit augmented-reality arkit


【解决方案1】:

目前在 ARKit 3.0 API 中无法做到这一点。

ARKit 会话的ARFaceTrackingConfiguration 不断从1000 Hz 的运动传感器、60 Hz 的前置RGB 摄像头和15 Hz 的红外摄像头获取数据。并且 TrueDepth 传感器在会话运行时工作。您无法在 ARKit 中手动停止原深感传感器。

ARFaceTrackingConfiguration 中的工作距离大约为 15...100 cm,因此您可以在该距离内有效检测 ARKit 3.0 中的最多 3 个人脸。但是 ARKit 人脸检测存在一些逻辑错误——你可以在跟踪你身后海报上的一张大脸的同时跟踪你的脸(但海报上的脸是平的,因为它具有等距的深度)。因此,规范蒙版的比例取决于检测到的人脸的大小(如您之前所说),但 ARKit 无法暂时为该规范蒙版 (ARFaceGeometry) 调整比例,因为人脸跟踪占用大量 CPU 资源。

Apple 的 TrueDepth 模块的工作距离范围非常窄,因为来自 IR 投影仪的 30K 点必须具有明确的亮度、模糊度、覆盖范围和点大小才能被 ARKit 有效使用。

使用此代码,您可以测试 TrueDepth 模块是否参与进程:

@available(iOS 13.0, *)
class ViewController: UIViewController {

    @IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()

        sceneView.session.delegate = self
    }
}

extension ViewController: ARSessionDelegate {

    func session(_ session: ARSession, didUpdate frame: ARFrame) {

        print(sceneView.session.currentFrame?.capturedDepthData?.depthDataQuality as Any)
    }
}

通常每四帧打印一次深度数据(但有时间隙大于 4 帧):

只有一种情况TrueDepth 传感器对 RGB 数据没有贡献:当您将智能手机移动得太靠近海报或太靠近您的脸时,您只会看到 @987654332 @正在打印。

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 2020-05-29
    • 2012-12-13
    • 2019-01-31
    • 2013-02-10
    • 2011-09-14
    • 2016-09-18
    • 2016-05-25
    相关资源
    最近更新 更多