OpenFace CoreML 模型。没有人脸检测

Posted

技术标签:

【中文标题】OpenFace CoreML 模型。没有人脸检测【英文标题】:OpenFace CoreML model. No face detection 【发布时间】:2019-06-02 11:27:21 【问题描述】:

我正在尽我所能地学习专门针对 ios 的机器学习。我发现 OpenFace 模型转换为.mlmodel,我可以成功地通过视觉运行它并获得每个人脸的 128 个向量空间表示。

首先,我从项目文件系统中的核心 ML 模型创建 Vision 模型对象。我还从该模型构造了VNCoreMLRequest,并为完成分配了一个函数。

let openFaceModel = try! VNCoreMLModel(for: OpenFace().model)
var request: VNCoreMLRequest = VNCoreMLRequest(model: self.openFaceModel, completionHandler: self.visionResults) 

其次,我从相机中获得了 CMSampleBuffer。我用它来执行请求。

func stream(_ pixelBuffer: CMSampleBuffer) 
    guard let cvBuffer = CMSampleBufferGetImageBuffer(buffer) else 
        throw CMBufferProcessorError.cvPixelBufferConversionFailed
    

    let handler = VNImageRequestHandler(cvPixelBuffer: cvBuffer, options: [:])

    do 
        try handler.perform([self.request])
    catch
        print(error)
    


最后,我的函数被分配为VNCoreMLRequest 的完成句柄,结果被调用。

func visionResults(request: VNRequest, error: Error?) 
    guard let features = request.results as? [VNCoreMLFeatureValueObservation] else 
        print("No Results")
        return
    

    print("Feature Count: \(features.count)")

    for feature in features 
        quickLog(title: "Feature Type", message: "\(feature.featureValue.type.rawValue)")
        quickLog(title: "Feature Value", message: "\(feature.featureValue.multiArrayValue)")
    

我正在成功检索 128 维多数组。现在我根据两个观察提出三个问题。

我观察到即使帧中没有人脸,我也会得到一个唯一的向量。

1) 这是期望的行为吗?如果是这样,我如何过滤表示没有人脸的多数组结果?

我观察到即使帧中有多个面孔,我也只能返回一个结果。

2) 这是该模型的预期行为吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

不确定您使用的是哪个模型(链接?),但如果它仅在单个面孔(而不是多个面孔或没有面孔)上进行过训练,那么一次在多个面孔上使用该模型,或者在任何面孔上都不会给出无用的预测。在这种情况下,您将模型用于所谓的分布外数据,即未经过训练检测的事物。大多数深度学习模型在用于此类 OoD 数据时并不值得信赖。

您可以将其与 Vision 的人脸检测功能结合使用:首先对图像运行人脸检测请求,然后裁剪图像的该区域,然后对每个裁剪运行 OpenFace 模型(对每个单独的图像执行一次)。如果没有检测到人脸,则无需运行 OpenFace。

【讨论】:

谢谢,这真的很有帮助。【参考方案2】:

OpenFace 适用于单张人脸图像,这就是它经过训练的目的。它不检查输入图像中是否有人脸。它还需要根据眼睛和鼻子对齐裁剪的人脸图像,以便在每个图像中眼睛和鼻子在同一位置。

OpenFace 在训练之前对每个人脸进行归一化处理,因此进入模型的每个人脸图像的眼睛和鼻子都位于同一位置。这使得它可以用更少的图像进行训练。它的参数比 FaceNet 少,这意味着它运行得更快并且需要的磁盘空间更少。

OpenFace 模型以这种方式工作:它将人脸图像作为输入并创建 128 值向量作为输出。这些向量可用于比较和识别人脸,并且每个人脸都是独一无二的。想象一下,将每张脸放在一个 128 维的立方体(3d)中的一个唯一位置。通过这种方式,您可以检查人脸之间的距离,如果距离非常近(阈值 0.99),则可以说两张图片属于同一个人,如果高于阈值,则可以说图片属于两个不同的人。距离度量不过是点的平方差之和(欧几里得距离)。

【讨论】:

以上是关于OpenFace CoreML 模型。没有人脸检测的主要内容,如果未能解决你的问题,请参考以下文章

使用OpenFace进行人脸识别

即使没有人脸,expo FaceDetector 也会在“准确”模式下继续触发“onFacesDetected”事件

CoreML:iOS:如何获取检测模型中心的 2D 坐标

如何使用对象检测模型改进 CoreML 图像分类器模型?

是否可以使用 CoreML 模型检测对象并找到该对象的测量值?

使用 ARKit 和 CoreML 从远距离检测物体