Xamarin.iOS での CoreML の概要
CoreML は機械学習を iOS に提供します。アプリでは、トレーニング済みの機械学習モデルを利用して、問題解決から画像認識まで、あらゆる種類のタスクを実行できます。
この概要では、次の内容について説明します。
CoreML の概要
これらの手順では、iOS プロジェクトに CoreML を追加する方法について説明します。
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
のインスタンスです。出力値には、次の例のように、各出力パラメーターの名前 (theResult
など) を指定して GetFeatureValue
を使用してアクセスできます。
var result = outFeatures.GetFeatureValue("theResult").DoubleValue; // eg. 6227020800
Vision フレームワークでの CoreML の使用
CoreML を Vision フレームワークと組み合わせて使用して、図形認識、オブジェクト識別、その他のタスクなどの操作を画像に対して実行することもできます。
以下の手順では、CoreML と Vision を組み合わせて使用する方法について説明します。 このサンプルでは、Vision フレームワークからの四角形認識と MNINSTClassifier CoreML モデルを組み合わせて、写真内の手書きの数字を識別します。
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 フレームワーク VNDetectRectanglesRequest
に ciImage
を渡します。
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}%";
});
}