Я использую 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
}
Я не уверен, почему этопроисходит.Есть предложения?