如何使用iPhone的 true-depth
相机捕获的深度数据来区分真实的3D人脸和同一张照片?
要求将其用于身份验证。
我的做法是:创建一个示例应用程序,获取相机前面连续的 AVDepthData
流。
如何使用iPhone的 true-depth
相机捕获的深度数据来区分真实的3D人脸和同一张照片?
要求将其用于身份验证。
我的做法是:创建一个示例应用程序,获取相机前面连续的 AVDepthData
流。
TrueDepth传感器可以让iPhone X ... iPhone 14在常规自拍相机捕捉RGB通道的同时生成高质量的Z深度通道。Z深度通道使我们能够在视觉上区分真实的人脸和照片。在Z深度通道中,人脸被表示为一个渐变,而照片几乎是固体颜色,因为照片平面上的所有像素都与相机等距。
目前,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的核心是由AVFoundation和CoreMotion会话驱动的(在某种程度上,它也使用了Vision)。当然,您可以使用此框架进行人脸检测,但请记住,由于其“重型金属”跟踪子系统,ARKit是一个计算密集型模块。要成功地检测到真实的面孔(而不是照片),请使用ARFaceAnchor,允许您以60 fps注册头部的运动和方向,以及facial blendshapes,允许您实时注册用户的面部表情。为了使使用视频而不是真人模拟面部表情变得不可能,使用AR应用程序的随机文本命令强制您展示特定的面部表情。
使用Apple Vision和CoreML技术来识别和分类包含在CVPixelBuffer中的人脸。但请记住,您需要进行ZDepth-to-RGB转换才能使用Apple Vision - AI / ML移动框架不直接处理深度图数据,目前还不支持。当您想要使用RGBD数据进行身份验证,并且只有一个或两个用户的面孔需要识别时,这将大大简化模型学习过程。您所需要做的就是创建一个包含许多变化的ZDepth面部图像的Vision mlmodel
。
您可以使用Apple Create ML应用程序生成轻量级且有效的mlmodel
文件。
要可视化从TrueDepth相机传输的深度数据,请使用以下示例代码。您可以在此处和此处找到使用Vision检测和分类图像的示例代码。此外,请查看此篇文章以了解如何将AVDepthData转换为常规RGB模式。