次の方法で共有


Xamarin.iOS での CoreML の概要

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

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

CoreML の概要

これらの手順では、iOS プロジェクトに CoreML を追加する方法について説明します。

Mars Habitat Price Predictor のサンプル スクリーンショット

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.結果を抽出する

予測結果 outFeaturesIMLFeatureProvider のインスタンスです。出力値には、次の例のように、各出力パラメーターの名前 (theResult など) を指定して GetFeatureValue を使用してアクセスできます。

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

Vision フレームワークでの CoreML の使用

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

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

数値 3 の画像認識 数値 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);

クラスは、以下の手順 3 と 手順 4 で示す Vision 要求の HandleRectangles メソッドと 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);
});

このハンドラーは、手順 1 で作成した Vision フレームワーク VNDetectRectanglesRequestciImage を渡します。

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