使用iPhone TrueDepth传感器来检测真实面孔和照片的区别?

16

如何使用iPhone的 true-depth 相机捕获的深度数据来区分真实的3D人脸和同一张照片? 要求将其用于身份验证。

我的做法是:创建一个示例应用程序,获取相机前面连续的 AVDepthData 流。

2个回答

10

理论

TrueDepth传感器可以让iPhone X ... iPhone 14在常规自拍相机捕捉RGB通道的同时生成高质量的Z深度通道。Z深度通道使我们能够在视觉上区分真实的人脸和照片。在Z深度通道中,人脸被表示为一个渐变,而照片几乎是固体颜色,因为照片平面上的所有像素都与相机等距。

enter image description here

AVFoundation

目前,AVFoundation API没有布尔类型的实例属性来判断是真实的人脸还是照片,但AVFoundation的捕获子系统提供了AVDepthData类——一个包含由相机设备捕获的每个像素距离数据(深度图)的容器。深度图描述了每个像素到物体的距离,单位为米。

@available(iOS 11.0, *)
open class AVDepthData: NSObject {

    open var depthDataType: OSType { get }
    open var depthDataMap: CVPixelBuffer { get }
    open var isDepthDataFiltered: Bool { get }
    open var depthDataAccuracy: AVDepthDataAccuracy { get }
}

像素缓冲区能够包含深度数据的每个像素深度或视差图

var depthDataMap: CVPixelBuffer { get }

ARKit

ARKit的核心是由AVFoundation和CoreMotion会话驱动的(在某种程度上,它也使用了Vision)。当然,您可以使用此框架进行人脸检测,但请记住,由于其“重型金属”跟踪子系统,ARKit是一个计算密集型模块。要成功地检测到真实的面孔(而不是照片),请使用ARFaceAnchor,允许您以60 fps注册头部的运动和方向,以及facial blendshapes,允许您实时注册用户的面部表情。为了使使用视频而不是真人模拟面部表情变得不可能,使用AR应用程序的随机文本命令强制您展示特定的面部表情。

enter image description here

愿景

使用Apple VisionCoreML技术来识别和分类包含在CVPixelBuffer中的人脸。但请记住,您需要进行ZDepth-to-RGB转换才能使用Apple Vision - AI / ML移动框架不直接处理深度图数据,目前还不支持。当您想要使用RGBD数据进行身份验证,并且只有一个或两个用户的面孔需要识别时,这将大大简化模型学习过程。您所需要做的就是创建一个包含许多变化的ZDepth面部图像的Vision mlmodel

您可以使用Apple Create ML应用程序生成轻量级且有效的mlmodel文件。

有用的链接

要可视化从TrueDepth相机传输的深度数据,请使用以下示例代码。您可以在此处此处找到使用Vision检测和分类图像的示例代码。此外,请查看此篇文章以了解如何将AVDepthData转换为常规RGB模式。


我已经知道这一点,我确实有深度数据。不过,我也会为二维照片获取深度数据。那么,你能否提供代码,说明如何处理接收到的深度数据,以区分三维物体和二维物体? - malhobayyeb
我已经使用ARKit实现了人脸检测。但是我无法区分3D人脸和2D人脸。 - malhobayyeb
ARKit没有与AVFoundation和Vision框架拥有的所有必要工具一起使用。 - Andy Jazz
此外,ARKit 使用了占用 CPU 较高的跟踪技术,同时会很快地耗尽您的电池。如果需要 TrueDepth 摄像头认证,则最可靠的想法是不使用 AR 框架。 - Andy Jazz

-2
你可以利用AVCaptureMetadataOutput和AVCaptureDepthDataOutput来检测脸部,然后执行所需的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接