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

hal*_*lei 10 ios swift coreml

我在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.")
    }

    ...
  }

...
}
Run Code Online (Sandbox Code Playgroud)

如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!)
}
Run Code Online (Sandbox Code Playgroud)

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

一种可能性是编译后的.mlmodelc文件不会以某种方式复制到包中,并且当尝试MobileNet使用该文件初始化对象时URL,我们会收到未被捕获的错误.这甚至可能吗?

非常感谢有关此问题的任何想法或指示.

har*_*rtw 2

显然,调用 init(contentsOf url: URL) 方法会引发错误。然而,由于这是一个生成的文件,我相信我无能为力来解决这个错误。

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

let bundle = Bundle(for: MobileNet.self)
Run Code Online (Sandbox Code Playgroud)

到:

let bundle = Bundle.main
Run Code Online (Sandbox Code Playgroud)

我不确定这是否能解决您的特定问题,但当我将生成的文件移至 Cocoapod 中时,它对我有用