Xamarin.iOS での CoreML の概要

CoreML は機械学習を iOS に提供します。アプリでは、トレーニング済みの機械学習モデルを利用して、問題解決から画像認識まで、あらゆる種類のタスクを実行できます。

この概要では、次の内容について説明します。

CoreML を使用したはじめに

これらの手順では、iOS プロジェクトに CoreML を追加する方法について説明します。 実際の例については 、Mars Habitat Pricer サンプル を参照してください。

Mars Habitat Price Predictor sample screenshot

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するコンテナー クラスを使用して送受信されます。

フィーチャ プロバイダー クラスは文字列と MLFeatureValues のディクショナリのように動作します。各特徴値には、単純な文字列または数値、配列またはデータ、画像を含むピクセル バッファーを指定できます。

単一値機能プロバイダーのコードを次に示します。

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

Vision Framework での CoreML の使用

CoreML は、Vision フレームワークと組み合わせて使用して、図形認識、オブジェクト識別、その他のタスクなどの画像に対する操作を実行することもできます。

次の手順では、 CoreMLVision サンプルで CoreML と Vision を組み合わせて使用する方法について説明します。 このサンプルでは、Vision フレームワークからの 四角形認識MNINSTClassifier CoreML モデルを組み合わせて、写真の手書きの数字を識別します。

Image recognition of number 3Image recognition of number 5

1. Vision CoreML モデルを作成する

CoreML モデル MNISTClassifier が読み込まれ、その後でラップされ、 VNCoreMLModel モデルが Vision タスクで使用できるようになります。 このコードでは、2 つの Vision 要求も作成されます。最初に画像内の四角形を検索し、次に 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 手順 3 と 4 で示す Vision 要求のメソッド HandleClassification を実装する必要があります。

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 で作成した Vision フレームワーク VNDetectRectanglesRequest に渡します。

3. ビジョン処理の結果を処理する

四角形の検出が完了すると、メソッドが実行 HandleRectangles され、画像がトリミングされて最初の四角形が抽出され、四角形イメージがグレースケールに変換され、分類のために CoreML モデルに渡されます。

このメソッドに渡されるパラメーターには request Vision 要求の詳細が含まれており、このメソッドを 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 手順で定義したメソッドを HandleClassification 使用するために、手順 1 で初期化しました。

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}%";
  });
}

サンプル

試す CoreML サンプルは 3 つあります。

  • Mars Habitat Price Predictor サンプルには、単純な数値入力と出力があります。

  • Vision & CoreML サンプルでは、画像パラメーターを受け取り、Vision フレームワークを使用して画像内の正方形の領域を識別します。この領域は、1 桁の数字を認識する CoreML モデルに渡されます。

  • 最後に、 CoreML 画像認識サンプル では、CoreML を使用して写真の特徴を識別します。 既定では、より小さい SqueezeNet モデル (5 MB) を使用しますが、より大きな VGG16 モデル (553 MB) をダウンロードして組み込むことができるように記述されています。 詳細については、 サンプルの readme を参照してください。