gpt4 book ai didi

ios - ARFaceTracking配置: How to distinguish pictures from real faces?

转载 作者:行者123 更新时间:2023-12-02 07:15:15 26 4
gpt4 key购买 nike

我们商店中有几款应用使用 ARFaceTrackingConfiguration 在配备 FaceID 摄像头的 iOS 设备中检测用户的脸部。

正如您可能已经看到的,ARKit 还会跟踪您放在 iPad Pro/iPhoneX 前的面孔图片,就像它们是面孔一样。例如。从 our apps 之一拍摄一张照片(要复制可以下载并运行 Apples example app for ARFaceTrackingConfiguration ):

FaceMask on Musical Angel

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

Aviator glasses on musical angel

眼镜 3D 模型宽约 14 厘米,但仅以 4 厘米的物体形式呈现。

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

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

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

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

那么,现在回答问题:

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

最佳答案

目前 ARKit 3.0 API 中还没有办法做到这一点。

ARKit session's ARFaceTrackingConfiguration is constantly getting data from motion sensors at 1000 Hz, from front RGB camera at 60 Hz, and from IR camera at 15 Hz. And TrueDepth sensor is working while the session is running. You can't manually stop TrueDepth sensor in ARKit.

enter image description here

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

Apple 的 TrueDepth 模块的工作距离范围非常窄,因为来自红外投影仪的 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 帧):

enter image description here

只有一种情况 TrueDepth 传感器不会贡献 RGB 数据:当您将智能手机移得太靠近海报或太靠近您的脸时 – 因此您只会看到 nils 正在打印。

关于ios - ARFaceTracking配置: How to distinguish pictures from real faces?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com