首页 文章

初始化CoreML模型时崩溃:Error Domain = com.apple.CoreML Code = 0“声明网络时出错 . ”

提问于
浏览
9

我在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 文件不会以某种方式复制到包中,并且当尝试使用 URL 初始化 MobileNet 对象时,我们会收到未被捕获的错误 . 这有可能吗?

非常感谢关于这个问题的任何想法或指示 .

1 回答

  • 1

    很明显,调用init(contentsOf url:URL)方法会抛出错误 . 但是,由于这是一个生成的文件,我相信我无法解决这个错误 .

    仅供参考,您可以将此生成的文件复制到新文件中,然后使用它来初始化模型(只需重命名新文件中的类) . 然后,尝试在新文件中更改此行:

    let bundle = Bundle(for: MobileNet.self)
    

    至:

    let bundle = Bundle.main
    

    我不确定这是否能解决您的特定问题,但是当我将生成的文件移动到Cocoapod时,它确实适用于我

相关问题