Xamarin.iOS의 Vision Framework

Vision 프레임워크는 다음을 포함하여 iOS 11에 다양한 새로운 이미지 처리 기능을 추가합니다.

  • 사각형 검색
  • 얼굴 감지
  • Machine Learning 이미지 분석(CoreML에서 설명)
  • 바코드 검색
  • 이미지 맞춤 분석
  • 텍스트 감지
  • 수평선 검색
  • 개체 검색 및 추적

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

사각형 감지 및 얼굴 감지는 아래에서 자세히 설명합니다.

사각형 검색

VisionRects 샘플이미지를 처리하고 감지된 사각형을 그리는 방법을 보여 줍니다.

1. Vision 요청 초기화

에서 ViewDidLoad각 요청의 끝에 호출될 메서드를 참조 HandleRectangles 하는 메서드를 만듭니 VNDetectRectanglesRequest 다.

MaximumObservations 속성도 설정해야 합니다. 그렇지 않으면 기본값은 1이고 단일 결과만 반환됩니다.

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

2. Vision 처리 시작

다음 코드는 요청 처리를 시작합니다. 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. Vision 처리 결과 처리

사각형 검색이 완료되면 프레임워크는 메서드를 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 샘플의 메서드에는 다음 세 가지 함수가 있습니다.

  • 원본 이미지 렌더링
  • 각 사각형이 검색된 위치를 나타내는 사각형 그리기 및
  • 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. Vision 처리 시작

다음 코드는 요청 처리를 시작합니다. 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. Vision 처리 결과 처리

얼굴 감지가 완료되면 처리기는 오류 처리를 수행하고 감지된 얼굴의 범위를 표시하는 메서드를 실행하고 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 샘플의 메서드에는 다음 세 가지 함수가 있습니다.

  • 원본 이미지 렌더링
  • 감지된 각 얼굴에 대한 사각형 그리기 및
  • CoreGraphics를 사용하여 각 얼굴에 대한 텍스트 레이블을 추가합니다.

정확한 CoreGraphics 메서드에 대한 샘플의 원본을 봅니다.

Photograph with two faces detected on a mobile device.

5. 추가 처리

Vision 프레임워크에는 눈과 입과 같은 얼굴 특징을 감지하는 추가 기능이 포함되어 있습니다. VNDetectFaceLandmarksRequest 위의 3단계에서와 같이 결과를 반환하지만 추가 VNFaceLandmark 데이터와 함께 반환 VNFaceObservation 하는 형식을 사용합니다.