Не удается получить BoundingBox из результата для запроса VNCoreMLRequest

#ios #swift #coreml #vision

#iOS #swift #coreml #apple-видение

Вопрос:

Я пытаюсь использовать Vision с пользовательской моделью, которую я обучил, но я не вижу способа получить ограничивающую рамку, в которой Vision обнаружил ее в кадре.

Модель: я обучил модель с использованием CreateML, и она может обнаруживать 2 конкретных элемента. Я протестировал модель в CreateML с различными изображениями, и она правильно определяет 2 элемента и помещает вокруг них рамку. Итак, не должен ли Vision также предоставлять мне ограничивающую рамку?

 func prepare() {
    do {
        let vnModel = try VNCoreMLModel(for: modelFile.model)
        let coreMlRequest = VNCoreMLRequest(model: vnModel,
                                            completionHandler: { (request, error) in
            guard
                let results = request.results
                    as? [VNClassificationObservation]  // is this the right cast?
            else { return }

            // how do I get the bounding box from the results?
        })
        vnRequests = [coreMlRequest]
    }
    catch {
        print(error)
    }
}

func run(arFrame: ARFrame) {
    do {
        let requestHandler = VNImageRequestHandler(cvPixelBuffer: arFrame.capturedImage,
                                                   options: [:])
        try requestHandler.perform(self.vnRequests)
    }
    catch {
        print(error)
    }
}
  

Ответ №1:

Вы действительно обучали модель обнаружения объекта? Или модель классификации?

Вы получаете ограничивающие рамки только для модели обнаружения объекта, а не для классификатора.

Предполагая, что вы обучили детектор объектов, правильным классом является VNRecognizedObjectObservation , а не VNClassificationObservation .

Комментарии:

1. Я очень новичок в CoreML, это моя первая модель. Возможно, я сделал это неправильно. Я пометил 50 изображений, поместив прямоугольник вокруг элементов, которые я хотел бы обучить. Когда я пробую модель внутри CreateML, она находит элементы и размещает вокруг них точную прямоугольную форму, поэтому я предполагаю, что она была обучена обнаружению объектов.

2. Это звучит правильно. 🙂 Тогда вы должны получать VNRecognizedObjectObservation результаты.

3. ‘VNRecognizedObjectObservation’ сделал свое дело. Спасибо.