Я изучаю все, что могу, о машинном обучении, особенно на iOS. Я обнаружил, что модель OpenFace преобразована в .mlmodel
, и я могу успешно запустить ее через зрение и получить 128 векторное пространство представления каждого лица.
Сначала я создаю объект модели Vision из базовой модели ML, которая находится в файловой системе моего проекта. Я также создаю 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) Это ожидаемое поведение для этой модели?
Спасибо за помощь!