我正在尽我所能专门在 iOS 上学习机器学习。我发现 OpenFace 模型转换为 a.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)这是该模型的预期行为吗?
感谢您的帮助!