Vision Framework в Xamarin.iOS
Платформа Визуального зрения добавляет ряд новых функций обработки изображений в iOS 11, в том числе:
- Обнаружение прямоугольника
- Обнаружение лиц
- анализ изображений Машинное обучение (обсуждается в CoreML)
- Обнаружение штрихкодов
- Анализ выравнивания изображений
- Распознавание текста
- Обнаружение горизонта
- Обнаружение объектов и отслеживание
Обнаружение прямоугольников и обнаружение лиц рассматриваются более подробно ниже.
Обнаружение прямоугольника
В примере показано, как обработать изображение и нарисовать обнаруженные прямоугольники на нем.
1. Инициализация запроса визуального зрения
Создайте ViewDidLoad
VNDetectRectanglesRequest
HandleRectangles
метод, который будет вызываться в конце каждого запроса:
Свойство 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);
});
Этот обработчик передает платформу ciImage
VNDetectRectanglesRequest
Визуального зрения, созданную на шаге 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.
5. Дальнейшая обработка
Обнаружение прямоугольника часто является первым шагом в цепочке операций, например с этим примером CoreMLVision, где прямоугольники передаются в модель CoreML для анализа рукописных цифр.
Обнаружение лиц
Этот пример работает аналогично примеру VisionRectangles , используя другой класс запроса визуального зрения.
1. Инициализация запроса визуального зрения
Создайте ViewDidLoad
VNDetectFaceRectanglesRequest
HandleRectangles
метод, который будет вызываться в конце каждого запроса.
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
VNDetectFaceRectanglesRequest
Визуального зрения, созданную на шаге 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.
5. Дальнейшая обработка
Платформа визуального распознавания включает дополнительные возможности для обнаружения признаков лица, таких как глаза и рот. Используйте тип, который вернет VNFaceObservation
результаты, как показано на шаге VNDetectFaceLandmarksRequest
3 выше, но с дополнительными VNFaceLandmark
данными.