我正在尽我所能学习机器学习,特别是在iOS上。我发现OpenFace模型被转换成一个.mlmodel模型,我可以成功地在vision中运行它,得到每个人脸的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)这种行为是否是该模型的预期行为?
谢谢你的帮助!

最佳答案

不确定你到底用的是哪种型号(link?)但是,如果只在单个面(而不是多个面或没有面)上进行了训练,那么一次在多个面或根本没有面上使用该模型将给出无用的预测。在这种情况下,您使用的模型是所谓的分布外数据,即它没有经过训练来检测的东西。大多数深度学习模型在用于此类OoD数据时都是不可信的。
您可以将其与Vision的人脸检测功能结合起来:首先对图像运行一个人脸检测请求,然后裁剪出图像的该区域,并在每个裁剪上运行OpenFace模型(每个单独的图像一次)。如果没有检测到人脸,则不需要运行OpenFace。

09-18 03:52