Общие сведения о CoreML в Xamarin.iOS

CoreML обеспечивает машинное обучение в iOS. Приложения могут воспользоваться обученными моделями машинного обучения для выполнения любых задач, от решения проблем до распознавания изображений.

В этом руководстве рассматриваются следующие сведения:

Начало работы с CoreML

В этих шагах описывается, как добавить CoreML в проект iOS.

Снимок экрана с примером прогнозирования цен На Марса Среды обитания

1. Добавление модели CoreML в проект

Добавьте модель CoreML (файл с расширением MLModel ) в каталог ресурсов проекта.

В свойствах файла модели его действие сборки имеет значение CoreMLModel. Это означает, что он будет скомпилирован в mlmodelc-файл при создании приложения.

2. Загрузка модели

Загрузите модель с помощью MLModel.Create статического метода:

var assetPath = NSBundle.MainBundle.GetUrlForResource("NameOfModel", "mlmodelc");
model = MLModel.Create(assetPath, out NSError error1);

3. Установка параметров

Параметры модели передаются и выходят с помощью класса контейнера, реализующего IMLFeatureProvider.

Классы поставщика функций ведут себя как словарь строк и MLFeatureValues, где каждое значение функции может быть простой строкой или числом, массивом или данными, или буфером пикселей, содержащим изображение.

Ниже показан код поставщика функций с одним значением:

public class MyInput : NSObject, IMLFeatureProvider
{
  public double MyParam { get; set; }
  public NSSet<NSString> FeatureNames => new NSSet<NSString>(new NSString("myParam"));
  public MLFeatureValue GetFeatureValue(string featureName)
  {
    if (featureName == "myParam")
      return MLFeatureValue.FromDouble(MyParam);
    return MLFeatureValue.FromDouble(0); // default value
  }

Используя такие классы, входные параметры можно предоставить таким образом, как понять CoreML. Имена функций (например myParam , в примере кода) должны соответствовать ожидаемому модели.

4. Запуск модели

Для использования модели требуется, чтобы поставщик компонентов был создан и заданы параметры, а затем вызывается GetPrediction метод:

var input = new MyInput {MyParam = 13};
var outFeatures = model.GetPrediction(inputFeatures, out NSError error2);

5. Извлечение результатов

Результат outFeatures прогнозирования также является экземпляром выходных IMLFeatureProviderзначений, к которым можно получить доступ с GetFeatureValue именем каждого выходного параметра (например theResult, в следующем примере:

var result = outFeatures.GetFeatureValue("theResult").DoubleValue; // eg. 6227020800

Использование CoreML с платформой визуального зрения

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

В приведенных ниже шагах описано, как CoreML и Vision можно использовать вместе. Пример объединяет распознавание прямоугольников из платформы Визуального распознавания с моделью MNINSTClassifier CoreML для идентификации рукописной цифры на фотографии.

Распознавание изображений числа 3 Распознавание изображений числа 5

1. Создание модели CoreML для визуального зрения

Модель CoreML MNISTClassifier загружается, а затем упаковывается в нее VNCoreMLModel , что делает модель доступной для задач визуального зрения. Этот код также создает два запроса визуального зрения: сначала для поиска прямоугольников на изображении, а затем для обработки прямоугольника с помощью модели CoreML:

// Load the ML model
var bundle = NSBundle.MainBundle;
var assetPath = bundle.GetUrlForResource("MNISTClassifier", "mlmodelc");
NSError mlErr, vnErr;
var mlModel = MLModel.Create(assetPath, out mlErr);
var model = VNCoreMLModel.FromMLModel(mlModel, out vnErr);

// Initialize Vision requests
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
ClassificationRequest = new VNCoreMLRequest(model, HandleClassification);

Класс по-прежнему должен реализовать HandleRectangles методы и HandleClassification методы для запросов визуального зрения, показанные на шагах 3 и 4 ниже.

2. Запуск обработки визуального зрения

Следующий код начинает обработку запроса. В примере CoreMLVision этот код запускается после того, как пользователь выбрал изображение:

// Run the rectangle detector, which upon completion runs the ML classifier.
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 изображение для извлечения первого прямоугольника, преобразует изображение прямоугольника в серый масштаб и передает его в модель CoreML для классификации.

Параметр request , переданный этому методу, содержит сведения о запросе визуального зрения и использовании GetResults<VNRectangleObservation>() метода, он возвращает список прямоугольников, найденных на изображении. Первый прямоугольник observations[0] извлекается и передается в модель CoreML:

void HandleRectangles(VNRequest request, NSError error) {
  var observations = request.GetResults<VNRectangleObservation>();
  // ... omitted error handling ...
  var detectedRectangle = observations[0]; // first rectangle
  // ... omitted cropping and greyscale conversion ...
  // Run the Core ML MNIST classifier -- results in handleClassification method
  var handler = new VNImageRequestHandler(correctedImage, new VNImageOptions());
  DispatchQueue.DefaultGlobalQueue.DispatchAsync(() => {
    handler.Perform(new VNRequest[] {ClassificationRequest}, out NSError err);
  });
}

Он ClassificationRequest был инициализирован на шаге 1, чтобы использовать метод, определенный HandleClassification на следующем шаге.

4. Обработка CoreML

Параметр request , переданный этому методу, содержит сведения о запросе CoreML и использование GetResults<VNClassificationObservation>() метода, он возвращает список возможных результатов, упорядоченных по достоверности (сначала наивысшая достоверность):

void HandleClassification(VNRequest request, NSError error){
  var observations = request.GetResults<VNClassificationObservation>();
  // ... omitted error handling ...
  var best = observations[0]; // first/best classification result
  // render in UI
  DispatchQueue.MainQueue.DispatchAsync(()=>{
    ClassificationLabel.Text = $"Classification: {best.Identifier} Confidence: {best.Confidence * 100f:#.00}%";
  });
}