Vision Framework в Xamarin.iOS

Платформа Визуального зрения добавляет ряд новых функций обработки изображений в iOS 11, в том числе:

  • Обнаружение прямоугольника
  • Обнаружение лиц
  • анализ изображений Машинное обучение (обсуждается в CoreML)
  • Обнаружение штрихкодов
  • Анализ выравнивания изображений
  • Распознавание текста
  • Обнаружение горизонта
  • Обнаружение объектов и отслеживание

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

Обнаружение прямоугольников и обнаружение лиц рассматриваются более подробно ниже.

Обнаружение прямоугольника

В примере VisionRects показано, как обработать изображение и нарисовать обнаруженные прямоугольники на нем.

1. Инициализация запроса визуального зрения

Создайте ViewDidLoadVNDetectRectanglesRequestHandleRectangles метод, который будет вызываться в конце каждого запроса:

Свойство MaximumObservations также должно быть задано, в противном случае оно по умолчанию будет иметь значение 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);
});

Этот обработчик передает платформу ciImageVNDetectRectanglesRequest Визуального зрения, созданную на шаге 1.

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 имеет три функции:

  • Отрисовка исходного изображения,
  • Рисование прямоугольника, указывающее, где обнаружен каждый из них, и
  • Добавление текстовой метки для каждого прямоугольника с помощью CoreGraphics.

Просмотрите источник примера для точного метода CoreGraphics.

Photograph with three rectangles detected on a mobile device.

5. Дальнейшая обработка

Обнаружение прямоугольника часто является первым шагом в цепочке операций, например с этим примером CoreMLVision, где прямоугольники передаются в модель CoreML для анализа рукописных цифр.

Обнаружение лиц

Пример VisionFaces работает аналогично образцу VisionRectangles, используя другой класс запроса визуального зрения.

1. Инициализация запроса визуального зрения

Создайте ViewDidLoadVNDetectFaceRectanglesRequestHandleRectangles метод, который будет вызываться в конце каждого запроса.

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

Этот обработчик передает платформу ciImageVNDetectFaceRectanglesRequest Визуального зрения, созданную на шаге 1.

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 имеет три функции:

  • Отрисовка исходного изображения,
  • Рисование прямоугольника для каждого обнаруженного лица и
  • Добавление текстовой метки для каждого лица с помощью CoreGraphics.

Просмотрите источник примера для точного метода CoreGraphics.

Photograph with two faces detected on a mobile device.

5. Дальнейшая обработка

Платформа визуального распознавания включает дополнительные возможности для обнаружения признаков лица, таких как глаза и рот. Используйте тип, который вернет VNFaceObservation результаты, как показано на шаге VNDetectFaceLandmarksRequest 3 выше, но с дополнительными VNFaceLandmark данными.