我在App Store上有一个应用程序,我从Crashlytics获取错误日志。在我的项目中初始化CoreML模型时,会出现用户获得的最常见错误之一(以及难以重现的错误)。以下是我初始化模型的方法:
class VisionManager: NSObject {
/// Prediction model
private static let model = MobileNet()
...
override init() {
super.init()
guard let visionModel = try? VNCoreMLModel(for: VisionManager.model.model) else {
// this case should never happen as we know for sure that the model we are using is an image classification model
fatalError("The CoreML model being used is not compatible with the Vision framework.")
}
...
}
...
}
错误,如Crashlytics所示,内容如下:
致命错误:'尝试!'表达式意外地引发了错误:错误Domain = com.apple.CoreML Code = 0"声明网络时出错。" UserInfo = {NSLocalizedDescription =声明网络时出错。}:file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.65.2/src/swift/stdlib/public/core/ErrorType.swift,第181行
堆栈跟踪显示执行guard
块时抛出错误。实际上,它更深入并且表明在调用初始化程序时错误被抛入顶部的静态初始化中。初始化程序与整个MobileNet.swift类一起自动生成,如下所示:
init(contentsOf url: URL) throws {
self.model = try MLModel(contentsOf: url)
}
/// Construct a model that automatically loads the model from the app's bundle
convenience init() {
let bundle = Bundle(for: MobileNet.self)
let assetPath = bundle.url(forResource: "MobileNet", withExtension:"mlmodelc")
try! self.init(contentsOf: assetPath!)
}
很明显,调用init(contentsOf url: URL)
方法会抛出错误。但是,由于这是一个生成的文件,我相信我无法解决这个错误。
一种可能性是编译的.mlmodelc
文件不会以某种方式复制到包中,并且当尝试使用MobileNet
初始化URL
对象时,我们会收到未被捕获的错误。这甚至可能吗?
非常感谢有关此问题的任何想法或指示。
答案 0 :(得分:1)
很明显,调用init(contentsOf url:URL)方法会抛出错误。但是,由于这是一个生成的文件,我相信我无法解决这个错误。
仅供参考,您可以将此生成的文件复制到新文件中,然后使用它来初始化模型(只需重命名新文件中的类)。然后,尝试在新文件中更改此行:
<li><input type = 'radio' name= 'categories' value ="{{cat}}">{{cat}}</li>
为:
let bundle = Bundle(for: MobileNet.self)
我不确定这是否能解决您的特定问题,但是当我将生成的文件移动到Cocoapod中时,它确实适合我
答案 1 :(得分:0)
更好地读取Xcode输出面板顶部的错误。应该出现类似这样的错误,它显示了实际的错误:“ Core ML定制神经网络层需要一个名为'scaling'的实现,而该实现在全局名称空间中找不到。
就我而言,我使用的模型中有一个不受支持的图层,因此我需要编写MLCustomLayer。 https://developer.apple.com/documentation/coreml/core_ml_api/creating_a_custom_layer