Загрузить пользовательскую модель CoreML и загрузить для использования [Swift]

Я создаю приложение на основе нейронной сети и CoreML размер модели составляет около 150 МБ. Итак, очевидно, что я не могу отправить его в приложение.

Чтобы преодолеть эту проблему, я узнал об этой статье, отметив, что вы можете скачать и скомпилировать CoreML модель на устройстве.

Я сделал и я загружаю на свое устройство, но проблема в том, что я не могу делать прогнозы, как в исходной модели. Мол, оригинальная модель берет UIImage в качестве входа, кроме MLModel является MLFeatureProviderКто-нибудь может обратиться, как я могу сделать приведение типа к моей модели и использовать его как оригинал?

do {
    let compiledUrl = try MLModel.compileModel(at: modelUrl)
    let model = try MLModel(contentsOf: compiledUrl)
    debugPrint("Model compiled \(model.modelDescription)")
    //model.prediction(from: MLFeatureProvider) //Problem
    //It should be like this
    //guard let prediction = try? model.prediction(image: pixelBuffer!) else {
    //    return
    //}
} catch {
    debugPrint("Error while compiling \(error.localizedDescription)")
}

1 ответ

Когда вы добавляете файл mlmodel в ваш проект, Xcode автоматически генерирует для вас исходный файл. Вот почему вы смогли написать model.prediction(image: ...) до.

Если вы компилируете mlmodel во время выполнения, у вас нет этого специального исходного файла, и вам нужно вызвать MLModel API сам.

Самым простым решением здесь является добавление файла mlmodel в проект, копирование-вставка автоматически сгенерированного исходного файла в новый исходный файл и использование его с mlmodel, который вы компилируете во время выполнения. (После того, как вы скопировали сгенерированный источник, вы можете снова удалить mlmodel из вашего проекта Xcode.)

Кроме того, если ваша модель имеет размер 150 МБ, вы можете подумать о создании ее небольшой версии, выбрав архитектуру, которая больше подходит для мобильных устройств. (Не VGG16, который, кажется, вы используете в настоящее время.)

    guard let raterOutput = try? regressionModel.prediction(from: RegressorFeatureProviderInput(
        feature1: 3.4,
        feature2: 4.5))
        else {return 0}
    return Double(truncating: NSNumber(value:RegressorFeatureProviderOutput.init(features: raterOutput).isSaved))

Добавление к тому, что сказал @Matthjis Hollemans

    let url = try! MLModel.compileModel(at: URL(fileURLWithPath: model))
    visionModel = try! VNCoreMLModel(for: MLModel(contentsOf: url))

Я столкнулся с подобной проблемой некоторое время назад, и вот как я решил ее. Я создал собственный класс Input для пользовательской модели, похожий на тот, который генерируется Xcode, используя имя моей входной переменной. А затем использовал его, чтобы получить результаты в качестве словаря. Подробности здесь.

Другие вопросы по тегам