CoreML2 постоянно говорит мне, что все одно и то же - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь начать с малого и обучил мою модель 2 предметам. Он отлично распознает оба, но когда я показываю ему что-то отличное от двух известных ему предметов, он постоянно говорит мне, что это всегда один и тот же предмет. Например, у меня есть яблоко и банан. Если я показываю ему яблоко, оно правильно дает мне яблоко, если я показываю ему банан, оно правильно возвращает банан. Но если я покажу ему собаку, она скажет, что это яблоко. Если я покажу ему вертолет, он скажет, что это яблоко. Я даже пытался сказать, что если это не яблоко или банан, просто верните, что его нельзя распознать, но это никогда не произойдет, потому что все, кроме банана, всегда является яблоком?!

EDIT Мой вопрос был отклонен, возможно, из-за недопонимания. Я не спрашиваю, почему он не распознает собаку, когда я только дрессировал яблоко и банан, я спрашиваю, почему она не говорит мне, что изображение не распознается, когда я показываю ему собаку вместо того, чтобы сказать, что это яблоко , Очевидно, что если я обучил его только 2 предметам, он узнает только 2 предмета.

Вот код, который возвращает классификации

func processClassifications(for request: VNRequest, error: Error?) {
    DispatchQueue.main.async {
        guard let results = request.results else {
            self.classificationLabel.text = "Unable to classify image"
            return
        }

        let classifications = results as! [VNClassificationObservation]

        if classifications.isEmpty {
            self.classificationLabel.text = "Nothing recognized"
        } else {
            //Display top classifications ranked by confidence in the UI
            let topClassifications = classifications.prefix(1)
            let descriptions = topClassifications.map { classification in
                return String(format: " (%.2f) %@", classification.confidence, classification.identifier)

            }


            self.classificationLabel.text = descriptions.joined(separator: "\n")

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

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

0 голосов
/ 12 ноября 2018

Если у вас есть модель, обученная только 2 предметам (в вашем случае Apple и Banana), вы не можете ожидать, что ваша модель ML распознает что-то еще, кроме этих 2 предметов. Код, который вы написали, всегда возвращает элемент, который будет иметь наибольшее доверие.


В любом случае, если у вас есть больше предметов, вы можете сделать что-то вроде: если ни один предмет не соответствует тестируемому изображению хотя бы на x%, сделайте это

guard let topResult = classifications.first else { return }

if topResult.confidence > 0.75 {
    print(topResult.identifier)
} else {
    print("Match is less than 75%")
}
...