OpenFace CoreML模型。没有人脸检测

时间:2019-01-07 19:18:11

标签: ios swift computer-vision coreml facial-identification

我正在学习有关机器学习的所有知识,尤其是在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)此模型的预期行为是吗?

谢谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

OpenFace可处理单幅人脸图像,这是针对它进行训练的。它不会检查输入图像中是否有人脸。它还需要裁剪的面部图像根据眼睛和鼻子对齐,以便在每个图像中,眼睛和鼻子都在同一位置。 enter image description here

OpenFace在训练之前会标准化每个脸部,因此进入模型的每个脸部图像的眼睛和鼻子都在同一位置。这使得它可以用更少的图像进行训练。与FaceNet相比,它具有更少的参数,这意味着它运行速度更快,并且在磁盘上所需的空间更少。

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