Метки вывода CoreML NSCFString — метки отображаются неправильно

#ios #swift #machine-learning #computer-vision #coreml

#iOS #swift #машинное обучение #компьютерное зрение #coreml

Вопрос:

Я работаю над приложением для iOS, где мне нужно использовать модель CoreML для выполнения классификации изображений.

Я использовал Google Cloud Platform AutoML Vision для обучения модели. Google предоставляет версию модели CoreML, и я скачал ее для использования в своем приложении.

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

 <VNClassificationObservation: 0x600002091d40> A7DBD70C-541C-4112-84A4-C6B4ED2EB7E2 requestRevision=1 confidence=0.332127 "CICAgICAwPmveRIJQWdsYWlzX2lv"
  

Строка, на которую я ссылаюсь, это CICAgICAwPmveRIJQWdsYWlzX2lv .

После некоторых исследований и отладки я обнаружил, что это строка NSCF.

https://developer.apple.com/documentation/foundation/1395135-nsclassfromstring

По-видимому, это часть API foundation. У кого-нибудь есть опыт работы с этим?

С файлом CoreML также поставляется dict.txt файл с правильными метками. Должен ли я преобразовать эту строку в метки? Как мне это сделать.

Это код, который у меня есть до сих пор.

 //
//  Classification.swift
//  Lepidoptera
//
//  Created by Tomás Mamede on 15/09/2020.
//  Copyright © 2020 Tomás Santiago. All rights reserved.
//

import Foundation
import SwiftUI
import Vision
import CoreML
import ImageIO

class Classification {
    
    private lazy var classificationRequest: VNCoreMLRequest = {
        do {
            let model = try VNCoreMLModel(for: AutoML().model)
            let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
                if let classifications = request.results as? [VNClassificationObservation] {
                    print(classifications.first ?? "No classification!")
                }
            
            })
            
            request.imageCropAndScaleOption = .scaleFit
            return request
        }
        catch {
            fatalError("Error! Can't use Model.")
        }
    }()
    
    func classifyImage(receivedImage: UIImage) {
        
        let orientation = CGImagePropertyOrientation(rawValue: UInt32(receivedImage.imageOrientation.rawValue))
        
        if let image = CIImage(image: receivedImage) {
            DispatchQueue.global(qos: .userInitiated).async {
                
                let handler = VNImageRequestHandler(ciImage: image, orientation: orientation!)
                do {
                    try handler.perform([self.classificationRequest])
                }
                catch {
                    fatalError("Error classifying image!")
                }
            }
        }
    }
}

  

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

1. NSCFString Считайте NSString , что это просто внутренний класс для него. Поскольку это NSString, она должна быть подключаемой без проблем String .

2. Спасибо за ответ. Проблема в том, что мне не нужна эта строка. Мне нужна правильная метка, и это не та метка, которую должна возвращать модель… :/

Ответ №1:

Метки хранятся в вашем файле mlmodel. Если вы откроете mlmodel в средстве просмотра моделей Xcode 12, он отобразит, что это за метки.

Я предполагаю, что вместо реальных меток ваш файл mlmodel содержит «CICAgICAwPmveRIJQWdsYWlzX2lv» и так далее.

Похоже, что AutoML от Google не помещает правильные метки классов в модель Core ML.

Вы можете создать словарь в приложении, который сопоставляет «CICAgICAwPmveRIJQWdsYWlzX2lv» и так далее с реальными метками.

Или вы можете заменить эти метки внутри файла mlmodel, отредактировав его с помощью coremltools. (В моей электронной книге Core ML Survival Guide есть глава о том, как заменить метки в модели.)

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

1. Привет! Спасибо за ваш ответ. Доступен ли просмотрщик моделей только в Xcode 12?

2. Он также существует в предыдущих версиях Xcode, но они не отображают метки. Эта новая функция была добавлена в Xcode 12. Вы также можете просмотреть метки классов с помощью бесплатного инструмента Netron. Или вы можете загрузить модель в скрипт Python, используя библиотеку coremltools, и изучить ее таким образом.

3. На данный момент моя модель CoreML получает UIImage, но на выходе получается многомассивный многомассивный массив (Float32). Я обучил его в Google AutoML Vision Tool классифицировать изображения, поэтому я ожидал, что он вернет мне метку. Но это не так… Я много искал и могу понять, как это сделать. Изначально у меня была модель CoreML, которая получала значение с плавающей точкой с несколькими массивами (1 * 224 * 224 ) и это вернуло еще один многомассивный поплавок. Я преобразовал его с помощью инструментов CoreML, и теперь он получает изображение. Но я не могу изменить вывод. Я действительно борюсь, и мне нужна помощь. Не могли бы вы помочь мне дальше?

4. Когда я печатаю спецификацию модели, я получаю это в качестве вывода: output { name: «scores» type { multiArrayType { DataType: FLOAT32 } } } Я хочу изменить этот объект, чтобы дать мне уверенность, а также классификационную метку. Я хочу изменить тип вывода.

5. То, что вы мне говорите, не складывается. Вы не получили бы результат VNClassificationObservation, если бы ваша модель не была классификатором. Основные модели ML могут быть разных типов: классификатор, регрессор или общая нейронная сеть. Вы получаете VNClassificationObservation только в том случае, если модель является классификатором. Но если ваш вывод представляет собой многомассивный массив, модель не является классификатором. Таким образом, информация, которую вы предоставляете сейчас, не имеет отношения к вопросу, который вы задавали.