簡體   English   中英

有沒有辦法在源代碼級別為iOS11 +提供CoreML模型

[英]Is there a way to make CoreML model available for iOS11+ at source level

我的應用程序中有一個CoreML模型。

在運行時,應在iOS8-10上禁用預測功能,在iOS11上激活預測功能。

為了能夠編譯,在所有使用CoreML的類上,我添加了:

@available(iOS 11.0,*)

但是.mlmodel會在每次重建時生成Swift代碼,丟棄所有注釋。 因此創建編譯錯誤,如:

'MLModel'僅適用於iOS 11.0或更高版本

在Xcode9中是否有辦法只制作mlmodel iOS11?

編輯 :此錯誤已在XCode 9 beta 4中修復。不再需要解決方法。

UPD。 07/25/17: Apple剛推出了用於在設備上編譯模型的新API 這意味着,您現在可以避免步驟1-4。

  1. (可選)切換到Xcode beta sudo xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer
  2. 編譯模型: xcrun coremlcompiler compile /path/to/MyModel.mlmodel /path/to/output/folder
  3. 將已編譯的模型文件夾MyModel.mlmodelc放入您的應用程序包中。
  4. 手動將自動生成的swift模型類( MyModel.swift )添加到項目中,並使用@available(iOS 11.0, *)注釋。 如何找到模型類
  5. 加載並初始化您的模型:

    let path = Bundle.main.path(forResource:“MyModel”,ofType:“mlmodelc”)

    let url = URL(fileURLWithPath:path!)

    讓模特=試試! MyModel(contentsOf:url)

警告:我沒有嘗試將此類應用程序上傳到AppStore。 我已經在我的測試設備上嘗試了它,它可以工作,我只是不確定它是否在發布到Appstore后繼續工作。

這聽起來像一個錯誤 - 生成的Swift代碼應該包含與您@available注釋,以便您的應用程序編譯,可以在iOS 11中運行時調用它,並且在舊iOS版本中運行時需要不調用它。

我強烈建議向Apple提交該bug,以便他們可以在Xcode 9 GM之前修復它。

在此期間,您可以禁用模型的代碼生成。 在代碼項目設置中,在目標的“構建設置”下,查找“CoreML代碼生成語言”並將其更改為“無”。

當然,這將阻止您在項目中使用生成的Swift類。 這有兩個選擇:

  1. 直接使用Core Ml API評估您的模型。 (也就是說, MLModel(contentsOf: url)而不是MyModelClass()等)。方便的是,您已經看到但未使用的生成的Swift類顯示了您需要的所有API調用。

  2. 生成一次Swift類(僅針對iOS 11進行編譯),然后將代碼復制出來並將其粘貼到常規源文件中。 粘貼后,您可以添加所需的@available聲明,以便將最低部署目標更改為iOS 10或更早版本。

在這兩種情況下,如果您更改模型,可能需要重做的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM