swift - 使用 iPhone TrueDepth 传感器来检测真人脸与照片?

标签 swift avfoundation arkit coreml apple-vision

如何使用 iPhone 真实深度相机捕获的深度数据来区分真实的人类 3D 脸部和相同的照片? 要求是使用它进行身份验证。

我做了什么:创建了一个示例应用程序来获取相机前面的连续 AVDepthData 流。

最佳答案

理论

TrueDepth 传感器可以让 iPhone X ... iPhone 14 除了通过常规自拍相机捕获的 RGB channel 之外,还可以生成高质量的 ZDepth channel 。 ZDepth channel 使我们能够在视觉上做出区分,无论是真实的人脸还是照片。在 ZDepth channel 中,人脸表示为渐变,但照片几乎具有纯色,因为照片平面上的所有像素与相机等距。

enter image description here

AVFoundation

目前 AVFoundation API 没有 Bool 类型的实例属性可以让你判断它是真人脸还是照片,但 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 }
}

像素缓冲区能够包含深度数据的每像素深度或 disparity map .

var depthDataMap: CVPixelBuffer { get }

ARKit

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

enter image description here

愿景

实现Apple VisionCoreML识别和分类CVPixelBuffer中包含的人脸的技术。但请记住,您需要 ZDepth 到 RGB 的转换才能与 Apple Vision 配合使用 - AI/ML 移动框架目前无法直接使用深度图数据。当您想要使用 RGBD 数据进行身份验证,并且只需要识别一两个用户的面部时,它会大大简化模型学习过程的任务。您所要做的就是为 Vision 创建一个 mlmodel,其中包含 ZDepth 面部图像的许多变体。

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

有用的链接

要可视化来自 TrueDepth 相机的深度数据,请使用以下 sample code 。您可以找到使用 Vision 检测和分类图像的示例代码 herehere 。另外,看看this发帖了解如何将 AVDepthData 转换为常规 RGB 模式。

关于swift - 使用 iPhone TrueDepth 传感器来检测真人脸与照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55846523/

相关文章:

ios - 为 ARKit 请求 3D 模型的指南

ios - 简化的屏幕截图 : record video of only what appears within the layers of a UIView?

ios - 如何使用swift获取appdelegate中的当前位置

swift - 如何使用 Swift 协议(protocol)设置 iTunes ScriptingBridge 的属性

swift - 将字符串分配给字典

ios - AVAssetTrack 的 preferredTransform 有时似乎是错误的。如何解决这个问题?

ios - 如何使用 AVAssetResourceLoader?

scenekit - 如何使用 Scenekit(ARKit) iOS 11 以编程方式在相机上创建具有给定宽度和高度的正方形或矩形覆盖层(平面)?

augmented-reality - 水上增强现实

ios - 在 swift 中使用 bridgeToObjectiveC()