Модель OpenFace CoreML. Не обнаружение лица - PullRequest
0 голосов
/ 07 января 2019

Я изучаю все, что могу, о машинном обучении, особенно на 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) Это ожидаемое поведение для этой модели?

Спасибо за помощь!

1 Ответ

0 голосов
/ 07 января 2019

Не уверен, какую именно модель вы используете (ссылка?), Но если она была обучена только на отдельных лицах (а не на нескольких лицах или отсутствии граней), то используйте модель на более чем одном лице одновременно или ни на каких лицах вообще не даст бесполезных предсказаний. В этом случае вы используете модель для так называемых данных вне распределения, то есть для вещей, которые не были обучены обнаруживать. Большинство моделей глубокого обучения не заслуживают доверия при использовании таких данных OoD.

Вы можете объединить это с функциями распознавания лиц Vision: сначала запустите запрос обнаружения лица на изображении, затем обрежьте эту область изображения и запустите модель OpenFace для каждого из этих участков (один раз для каждого отдельного изображения). Если лица не обнаружены, вам не нужно запускать OpenFace.

...