Отслеживание объектов из VNCoreMLFeatureValueObservation - PullRequest
0 голосов
/ 27 июня 2019

Я использую Vision и модель CoreML, роль которой - прогнозирование, а не классификация или обработка изображений.Я ввожу pixelBuffer и получаю обратно [VNCoreMLFeatureValueObservation] 1 .

func createCoreMLRequest() -> VNCoreMLRequest? {
    guard let model = try? VNCoreMLModel(for: yolo.model.model) else { return nil }
    let request = VNCoreMLRequest(model: model) { (finReq, err) in
        if let results = finReq.results as? [VNCoreMLFeatureValueObservation] {
            let features = results.compactMap({ (obs) -> MLMultiArray? in
                obs.featureValue.multiArrayValue
            })
            let boundingBoxes = self.yolo.computeBoundingBoxes(features: features)
            guard let prediction = boundingBoxes.first else { return }
            self.observation = VNDetectedObjectObservation(boundingBox: prediction.rect)
            DispatchQueue.main.async {
                self.highlightView.frame = prediction.rect
            }
        }
    }
    return request
}

Затем я извлекаю [MLMultiArray] 2 из Наблюдения и передаю его в YOLO.swift для вычисления ограничивающих рамок.Ограничительные рамки представляют собой массив предсказаний.Предсказания - это структура, содержащая прямоугольник (boundingBox), className и достоверность.

Используя предсказания, я хочу отслеживать объекты.Поэтому я использую Vision и создаю [VNDetectedObjectObservation] 3 с ограничивающим прямоугольником предсказания.Затем я создаю [VNTrackObjectRequest] 4 и передаю обнаруженное наблюдение, но результирующее наблюдение всегда возвращает тот же boundingBox, что и первоначальный прогноз.

func createTrackRequest() -> VNTrackObjectRequest {
    let trackRequest = VNTrackObjectRequest(detectedObjectObservation: self.observation) { (finReq, err) in
         if let results = finReq.results as? [VNDetectedObjectObservation] {
            if let observation = results.first {
                self.observation = observation
                DispatchQueue.main.async {
                    self.highlightView.frame = observation.boundingBox
                }
            }
        }
    }
    return trackRequest
}

Я не уверен, почему этопроисходит.Есть предложения?

...