Xamarin.iOS の Vision Framework
Vision フレームワークは、次のような多数の新しいイメージ処理機能を iOS 11 に追加します。
四角形の検出と顔検出については、以下で詳しく説明します。
四角形の検出
サンプルは、画像を処理し、検出された四角形をその上に描画する方法を示しています。
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 フレームワーク VNDetectRectanglesRequest
に ciImage
を渡します。
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 を使用して四角形ごとにテキスト ラベルを追加する。
5.追加の処理
四角形の検出は、多くの場合、この CoreMLVision の例のように、一連の操作の最初の手順にすぎません。ここでは、手書きの数字を解析するために四角形が CoreML モデルに渡されます。
顔検出
このサンプルは、別の 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 フレームワーク VNDetectFaceRectanglesRequest
に ciImage
を渡します。
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 を使用して顔ごとにテキスト ラベルを追加する。
5.追加の処理
Vision フレームワークには、目や口などの顔の特徴を検出するための追加の機能が含まれています。 VNDetectFaceLandmarksRequest
型を使用すると、上記の手順 3 のように VNFaceObservation
結果が返されますが、VNFaceLandmark
データが追加されます。