2

我正在创建一个基于神经网络的应用程序,CoreML模型大小约为 150MB。所以,很明显我不能在应用程序中发布它。

为了克服这个问题,我了解到这篇文章,提到您可以CoreML在设备上下载和编译模型。

我做了并且我在我的设备上下载了,但问题是我不能像原始模型那样做预测。就像,原始模型UIImage作为输入但是MLModelMLFeatureProvider,任何人都可以解决我如何对我的模型进行类型转换并将其用作原始模型?

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)")
}
4

3 回答 3

1

当您将 mlmodel 文件添加到项目中时,Xcode 会自动为您生成一个源文件。这就是你以前能写的原因model.prediction(image: ...)

如果您在运行时编译您的 mlmodel,那么您没有那个特殊的源文件,您需要自己调用MLModelAPI。

这里最简单的解决方案是将 mlmodel 文件添加到您的项目中,将自动生成的源文件复制粘贴到一个新的源文件中,然后将其与您在运行时编译的 mlmodel 一起使用。(复制生成的源代码后,您可以再次从 Xcode 项目中删除 mlmodel。)

此外,如果您的模型是 150MB,您可能需要考虑通过选择更适合移动设备的架构来制作它的小版本。(不是 VGG16,您似乎正在使用它。)

于 2018-09-16T09:51:36.743 回答
0
    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 所说的

于 2020-08-08T21:20:10.863 回答
0
    let url = try! MLModel.compileModel(at: URL(fileURLWithPath: model))
    visionModel = try! VNCoreMLModel(for: MLModel(contentsOf: url))
于 2020-09-26T21:28:18.760 回答