Xamarin.iOS で CoreML の概要Introduction to CoreML in Xamarin.iOS

CoreML は machine learning を iOS – アプリは画像認識に問題が解決からあらゆる種類のタスクを実行するトレーニングされた機械学習モデルの活用できます。CoreML brings machine learning to iOS – apps can take advantage of trained machine learning models to perform all sorts of tasks, from problem solving to image recognition.

この概要では、次の項目について説明します。This introduction covers the following:

CoreML の概要Getting Started with CoreML

次の手順では、CoreML を iOS プロジェクトに追加する方法について説明します。These steps describe how to add CoreML to an iOS project. 参照してください、 Mars Habitat Pricer サンプル実用的な例です。Refer to the Mars Habitat Pricer sample for a practical example.

Mars Habitat 価格を予測のサンプルのスクリーン ショット

1.CoreML モデルをプロジェクトに追加します。1. Add the CoreML model to the project

CoreML モデルの追加 (ファイル、 .mlmodel拡張機能) をリソースプロジェクトのディレクトリ。Add a CoreML model (a file with the .mlmodel extension) to the Resources directory of the project.

モデル ファイルのプロパティでは、そのビルド アクションに設定されているCoreMLModelします。In the model file's properties, its Build action is set to CoreMLModel. つまり、コンパイルには、 .mlmodelcファイル、アプリケーションのビルド時にします。This means that it will be compiled into an .mlmodelc file when the application is built.

2.モデルを読み込みます2. Load the model

使用して、モデルを読み込み、MLModel.Create静的メソッド。Load the model using the MLModel.Create static method:

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

3.パラメーターを設定します3. Set the parameters

アウトを実装するコンテナー クラスを使用してモデル パラメーターが渡されるIMLFeatureProviderします。Model parameters are passed in and out using a container class that implements IMLFeatureProvider.

機能のプロバイダー クラスは、文字列の辞書のように動作し、 MLFeatureValues、各機能の値が単純な文字列または数値、配列またはデータ、またはイメージを格納しているピクセル バッファーをする可能性があります。Feature provider classes behave like a dictionary of string and MLFeatureValues, where each feature value could be a simple string or number, an array or data, or a pixel buffer containing an image.

単一値機能プロバイダーのコードは、以下に示します。Code for a single-value feature provider is shown below:

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 で認識される方法で指定できます。Using classes like this, input parameters can be provided in a way that is understood by CoreML. 機能の名前 (などmyParamコード例では)、モデルで必要なものと一致する必要があります。The names of the features (such as myParam in the code example) must match what the model expects.

4.モデルを実行します。4. Run the model

モデルを使用して設定する必要がインスタンス化する機能のプロバイダーとパラメーター、しをGetPredictionメソッドが呼び出されます。Using the model requires that the feature provider to be instantiated and parameters set, then that the GetPrediction method be called:

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

5.結果を抽出します。5. Extract the results

予測結果outFeaturesのインスタンスもIMLFeatureProviderは出力値を使用してアクセスできますGetFeatureValueを各出力パラメーターの名前 (などtheResult)、この例のように。The prediction result outFeatures is also an instance of IMLFeatureProvider; output values can be accessed using GetFeatureValue with the name of each output parameter (such as theResult), as in this example:

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

ビジョン フレームワークで CoreML の使用Using CoreML with the Vision Framework

CoreML は、形状認識、オブジェクトの識別、およびその他のタスクなど、イメージ上の操作を実行するビジョン フレームワークと組み合わせても使用できます。CoreML can also be used in conjunction with the Vision framework to perform operations on image, such as shape recognition, object identification, and other tasks.

次の手順では、どの CoreML とビジョンが一緒に使用でについて説明します、 CoreMLVision サンプルします。The steps below describe how CoreML and Vision are used together in the CoreMLVision sample. サンプルを組み合わせて、四角形認識ビジョン フレームワークから、 _MNINSTClassifier_写真で手書き数字を識別するために、CoreML モデル。The sample combines the rectangles recognition from the Vision framework with the MNINSTClassifier CoreML model to identify a handwritten digit in a photograph.

番号 3 の画像認識 数字の 5 の画像認識

1.ビジョン CoreML モデルを作成します。1. Create a Vision CoreML model

CoreML モデル_MNISTClassifier_が読み込まれでラップし、VNCoreMLModelモデルをビジョン タスクで使用できるようにします。The CoreML model MNISTClassifier is loaded and then wrapped in a VNCoreMLModel which makes the model available for Vision tasks. このコードでは、2 つのビジョン要求も作成します。 最初に、イメージ内の四角形の検索し、CoreML モデルを使用して四角形を処理するため。This code also creates two Vision requests: first for finding rectangles in an image, and then for processing a rectangle with the CoreML model:

// 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);

クラスが実装する必要がある、HandleRectanglesHandleClassification手順 3. および 4. を以下に示すように、Vision 要求メソッド。The class still needs to implement the HandleRectangles and HandleClassification methods for the Vision requests, shown in steps 3 and 4 below.

2.ビジョンの処理を開始します。2. Start the Vision processing

次のコードでは、要求の処理を開始します。The following code starts processing the request. CoreMLVisionサンプルでは、ユーザーがイメージを選択した後、このコードが実行されます。In the CoreMLVision sample, this code runs after the user has selected an image:

// 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ビジョン frameworkVNDetectRectanglesRequest手順 1. で作成されました。This handler passes the ciImage to the Vision framework VNDetectRectanglesRequest that was created in step 1.

3.ビジョンの処理の結果を処理します。3. Handle the results of Vision processing

四角形の検出が完了すると実行、HandleRectanglesメソッドは、最初の四角形を抽出する画像をトリミングするには、四角形のイメージをグレースケールに変換および分類 CoreML モデルに渡します。Once the rectangle detection is complete, it executes the HandleRectangles method, which crops the image to extract the first rectangle, converts the rectangle image to greyscale, and passes it to the CoreML model for classification.

requestこのメソッドに渡されるパラメーターには、ビジョンの要求の詳細が含まれています。 使用すると、 GetResults<VNRectangleObservation>() 、イメージ内の四角形の一覧を返します。The request parameter passed to this method contains the details of the Vision request, and using the GetResults<VNRectangleObservation>() method, it returns a list of rectangles found in the image. 最初の四角形observations[0]抽出され、CoreML モデルに渡されます。The first rectangle observations[0] is extracted and passed to the CoreML model:

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メソッドは、次の手順で定義されています。The ClassificationRequest was initialized in step 1 to use the HandleClassification method defined in the next step.

4.ハンドル、CoreML4. Handle the CoreML

requestこのメソッドに渡されるパラメーターには、CoreML 要求の詳細が含まれていてを使用して、GetResults<VNClassificationObservation>()信頼度で順序付け可能な結果の一覧を返します (最も高い信頼度最初)。The request parameter passed to this method contains the details of the CoreML request, and using the GetResults<VNClassificationObservation>() method, it returns a list of possible results ordered by confidence (highest confidence first):

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

サンプルSamples

次の 3 つの CoreML サンプルを試すにがあります。There are three CoreML samples to try:

  • Mars Habitat 価格を予測サンプルが単純な数値の入力と出力します。The Mars Habitat Price Predictor sample has simple numeric inputs and outputs.

  • Vision & CoreML サンプルイメージ パラメーターを受け取り、1 桁の数字を認識する CoreML モデルに渡される画像の正方形の領域を識別するビジョン フレームワークを使用します。The Vision & CoreML sample accepts an image parameter, and uses the Vision framework to identify square regions in the image, which are passed to a CoreML model that recognizes single digits.

  • 最後に、 CoreML 画像認識のサンプルCoreML を写真で機能を識別するために使用します。Finally, the CoreML Image Recognition sample uses CoreML to identify features in a photo. 既定では、小さいSqueezeNetモデル (5 MB) が、書き込まれたダウンロードされ、大きい方を組み込むようにVGG16モデル (553 MB)。By default it uses the smaller SqueezeNet model (5MB), but it's been written so that you can download and incorporate the larger VGG16 model (553MB). 詳細については、次を参照してください。、サンプルの readmeします。For more information, see the sample's readme.