我正在创建一个基于神经网络的应用程序,CoreML
模型大小约为 150MB。所以,很明显我无法在应用程序中发货。
为了克服这个问题,我了解了这篇文章,提到您可以在设备上下载和编译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)")
}
当您将 mlmodel 文件添加到项目中时,Xcode 会自动为您生成一个源文件。这就是为什么你以前能够写model.prediction(image: ...)
。
如果在运行时编译 mlmodel,则没有该特殊的源文件,需要自己调用MLModel
API。
最简单的解决方案是将 mlmodel 文件添加到项目中,将自动生成的源文件复制粘贴到新的源文件中,然后将其与在运行时编译的 mlmodel 一起使用。(复制生成的源后,您可以从 Xcode 项目中再次删除 mlmodel。
此外,如果您的型号为 150MB,您可能需要考虑通过选择更适合移动设备的架构来制作它的小型版本。(不是VGG16,您目前正在使用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
let url = try! MLModel.compileModel(at: URL(fileURLWithPath: model))
visionModel = try! VNCoreMLModel(for: MLModel(contentsOf: url))