Xamarin.iOS の Vision Framework

Vision フレームワークでは、次のような多数の新しい画像処理機能が iOS 11 に追加されます。

  • 四角形の検出
  • 顔検出
  • マシンラーニングイメージ分析 (CoreML説明)
  • バーコード検出
  • 画像配置の分析
  • テキストの検出
  • Horizon Detection
  • 物体検出と追跡

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

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

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. 結果を表示する

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

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

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

Photograph with three rectangles detected on a mobile device.

5. その他の処理

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

顔検出

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

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

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

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. 結果を表示する

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

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

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

Photograph with two faces detected on a mobile device.

5. その他の処理

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