Xamarin.iOS の Vision Framework

Vision フレームワークは、次のような多数の新しいイメージ処理機能を iOS 11 に追加します。

  • 四角形の検出
  • 顔検出
  • 機械学習イメージ分析 (CoreML で説明)
  • バーコードの検出
  • イメージの配置の分析
  • テキストの検出
  • Horizon の検出
  • 物体の検出と追跡

Photograph with three rectangles detected.Photograph with two faces detected.

四角形の検出と顔検出については、以下で詳しく説明します。

四角形の検出

VisionRects サンプルは、イメージを処理し、検出された四角形をその上に描画する方法を示しています。

1.Vision 要求を初期化する

ViewDidLoad で、各要求の最後に呼び出される HandleRectangles メソッドを参照する VNDetectRectanglesRequest を作成します。

MaximumObservations プロパティも設定する必要があります。そうしない場合、既定値の 1 になり、1 つの結果のみが返されます。

RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
RectangleRequest.MaximumObservations = 10;

2.ビジョン処理を開始する

次のコードは、要求の処理を開始します。 VisionRects サンプルでは、このコードは、ユーザーがイメージを選択した後に実行されます。

// Run the rectangle detector
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 メソッドを実行します。その概要を次に示します。

private void HandleRectangles(VNRequest request, NSError error){
  var observations = request.GetResults<VNRectangleObservation>();
  // ... omitted error handling ...
  bool atLeastOneValid = false;
  foreach (var o in observations){
    if (InputImage.Extent.Contains(boundingBox)) {
      atLeastOneValid |= true;
    }
  }
  if (!atLeastOneValid) return;
  // Show the pre-processed image
  DispatchQueue.MainQueue.DispatchAsync(() =>
  {
    ClassificationLabel.Text = summary;
    ImageView.Image = OverlayRectangles(RawImage, imageSize, observations);
  });
}

4.結果を表示する

VisionRectangles サンプルの OverlayRectangles メソッドには、次の 3 つの機能があります。

  • ソース イメージをレンダリングする
  • それぞれが検出された場所を示す四角形を描画する
  • CoreGraphics を使用して四角形ごとにテキスト ラベルを追加する。

正確な CoreGraphics メソッドのサンプルのソースを表示します。

Photograph with three rectangles detected on a mobile device.

5.追加の処理

四角形の検出は、多くの場合、この CoreMLVision の例のように、一連の操作の最初の手順にすぎません。ここでは、手書きの数字を解析するために四角形が CoreML モデルに渡されます。

顔検出

VisionFaces サンプルは、別の Vision 要求クラスを使用して、VisionRectangles サンプルと同様に動作します。

1.Vision 要求を初期化する

ViewDidLoad で、各要求の最後に呼び出される HandleRectangles メソッドを参照する VNDetectFaceRectanglesRequest を作成します。

FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);

2.ビジョン処理を開始する

次のコードは、要求の処理を開始します。 VisionFaces サンプルでは、このコードは、ユーザーがイメージを選択した後に実行されます。

// Run the face detector
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
  handler.Perform(new VNRequest[] {FaceRectangleRequest}, out NSError error);
});

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

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

顔の検出が完了すると、ハンドラーは、エラー処理を実行する HandleRectangles メソッドを実行し、検出された顔の境界を表示し、OverlayRectangles を呼び出して元の画像に外接する四角形を描画します。

private void HandleRectangles(VNRequest request, NSError error){
  var observations = request.GetResults<VNFaceObservation>();
  // ... omitted error handling...
  var summary = "";
  var imageSize = InputImage.Extent.Size;
  bool atLeastOneValid = false;
  Console.WriteLine("Faces:");
  summary += "Faces:";
  foreach (var o in observations) {
    // Verify detected rectangle is valid. omitted
    var boundingBox = o.BoundingBox.Scaled(imageSize);
    if (InputImage.Extent.Contains(boundingBox)) {
      atLeastOneValid |= true;
    }
  }
  // Show the pre-processed image (on UI thread)
  DispatchQueue.MainQueue.DispatchAsync(() =>
  {
    ClassificationLabel.Text = summary;
    ImageView.Image = OverlayRectangles(RawImage, imageSize, observations);
  });
}

4.結果を表示する

VisionFaces サンプルの OverlayRectangles メソッドには、次の 3 つの機能があります。

  • ソース イメージをレンダリングする
  • 検出された顔ごとに四角形を描画する
  • CoreGraphics を使用して顔ごとにテキスト ラベルを追加する。

正確な CoreGraphics メソッドのサンプルのソースを表示します。

Photograph with two faces detected on a mobile device.

5.追加の処理

Vision フレームワークには、目や口などの顔の特徴を検出するための追加の機能が含まれています。 VNDetectFaceLandmarksRequest 型を使用すると、上記の手順 3 のように VNFaceObservation 結果が返されますが、VNFaceLandmark データが追加されます。