共用方式為


Xamarin.iOS 中的 CoreML 簡介

CoreML 將機器學習帶入 iOS – 應用程式可以利用定型的機器學習模型來執行各種工作,從解決問題到影像辨識。

本簡介涵蓋下列各項:

CoreML 用戶入門

這些步驟說明如何將 CoreML 新增至 iOS 專案。

火星棲息地價格預測器範例螢幕快照

1.將 CoreML 模型新增至專案

將 CoreML 模型(擴展名為 .mlmodel 的檔案)新增至 專案的 Resources 目錄。

在模型檔案的屬性中,其 [建置] 動作 會設定為 CoreMLModel。 這表示它會在建置應用程式時編譯成 .mlmodelc 檔案。

2.載入模型

使用 MLModel.Create 靜態方法載入模型:

var assetPath = NSBundle.MainBundle.GetUrlForResource("NameOfModel", "mlmodelc");
model = MLModel.Create(assetPath, out NSError error1);

3.設定參數

模型參數會使用實作 的 IMLFeatureProvider容器類別來傳入和傳出。

特徵提供者類別的行為就像字串和 MLFeatureValue的字典,其中每個特徵值可以是簡單的字串或數位、陣列或數據,或是包含影像的圖元緩衝區。

單一值功能提供者的程式代碼如下所示:

public class MyInput : NSObject, IMLFeatureProvider
{
  public double MyParam { get; set; }
  public NSSet<NSString> FeatureNames => new NSSet<NSString>(new NSString("myParam"));
  public MLFeatureValue GetFeatureValue(string featureName)
  {
    if (featureName == "myParam")
      return MLFeatureValue.FromDouble(MyParam);
    return MLFeatureValue.FromDouble(0); // default value
  }

使用這類類別時,可以使用 CoreML 所瞭解的方式提供輸入參數。 特徵的名稱(例如 myParam 在程式碼範例中),必須符合模型預期的名稱。

4.執行模型

使用模型需要具現化功能提供者並設定參數,然後 GetPrediction 呼叫 方法:

var input = new MyInput {MyParam = 13};
var outFeatures = model.GetPrediction(inputFeatures, out NSError error2);

5.擷取結果

預測結果 outFeatures 也是 的 IMLFeatureProvider實例;輸出值可以使用 搭配每個輸出參數的名稱來存取 GetFeatureValue ,如 theResult下列範例所示:

var result = outFeatures.GetFeatureValue("theResult").DoubleValue; // eg. 6227020800

搭配視覺架構使用 CoreML

CoreML 也可以與視覺架構搭配使用,以在影像上執行作業,例如圖形辨識、對象識別和其他工作。

下列步驟說明 CoreML 和 Vision 如何搭配使用。 此範例結合 視覺架構中的矩形辨識MNINSTClassifier CoreML 模型,以識別相片中的手寫數位。

數位3的影像辨識 數位 5 的影像辨識

1.建立 Vision CoreML 模型

CoreML 模型 MNISTClassifier 會載入,然後包裝在 中 VNCoreMLModel ,讓模型可供視覺工作使用。 此程式代碼也會建立兩個視覺要求:先尋找影像中的矩形,然後使用 CoreML 模型處理矩形:

// Load the ML model
var bundle = NSBundle.MainBundle;
var assetPath = bundle.GetUrlForResource("MNISTClassifier", "mlmodelc");
NSError mlErr, vnErr;
var mlModel = MLModel.Create(assetPath, out mlErr);
var model = VNCoreMLModel.FromMLModel(mlModel, out vnErr);

// Initialize Vision requests
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
ClassificationRequest = new VNCoreMLRequest(model, HandleClassification);

類別仍然需要針對視覺要求實 HandleRectangles 作 和 HandleClassification 方法,如下面的步驟 3 和 4 所示。

2.啟動視覺處理

下列程式代碼會開始處理要求。 在 CoreMLVision 範例中,此程式代碼會在使用者選取映射之後執行:

// Run the rectangle detector, which upon completion runs the ML classifier.
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
  handler.Perform(new VNRequest[] {RectangleRequest}, out NSError error);
});

此處理程式會將 傳遞 ciImage 至步驟 1 中建立的視覺架構 VNDetectRectanglesRequest

3.處理視覺處理的結果

矩形偵測完成後,它會執行 HandleRectangles 方法,以裁剪影像以擷取第一個矩形、將矩形影像轉換成灰階,並將它傳遞給 CoreML 模型以進行分類。

request傳遞給這個方法的參數包含視覺要求的詳細數據,並使用 GetResults<VNRectangleObservation>() 方法,它會傳回影像中找到的矩形清單。 第一個矩形 observations[0] 會擷取並傳遞至 CoreML 模型:

void HandleRectangles(VNRequest request, NSError error) {
  var observations = request.GetResults<VNRectangleObservation>();
  // ... omitted error handling ...
  var detectedRectangle = observations[0]; // first rectangle
  // ... omitted cropping and greyscale conversion ...
  // Run the Core ML MNIST classifier -- results in handleClassification method
  var handler = new VNImageRequestHandler(correctedImage, new VNImageOptions());
  DispatchQueue.DefaultGlobalQueue.DispatchAsync(() => {
    handler.Perform(new VNRequest[] {ClassificationRequest}, out NSError err);
  });
}

ClassificationRequest已在步驟 1 中初始化,HandleClassification以使用下一個步驟中定義的方法。

4.處理 CoreML

request傳遞至此方法的參數包含 CoreML 要求的詳細數據,並使用 GetResults<VNClassificationObservation>() 方法,它會傳回依信賴順序排序的可能結果清單(最信賴度優先):

void HandleClassification(VNRequest request, NSError error){
  var observations = request.GetResults<VNClassificationObservation>();
  // ... omitted error handling ...
  var best = observations[0]; // first/best classification result
  // render in UI
  DispatchQueue.MainQueue.DispatchAsync(()=>{
    ClassificationLabel.Text = $"Classification: {best.Identifier} Confidence: {best.Confidence * 100f:#.00}%";
  });
}