Compartir a través de


Introducción a CoreML en Xamarin.iOS

CoreML lleva el aprendizaje automático a iOS: las aplicaciones pueden aprovechar los modelos de aprendizaje automático entrenados para realizar todo tipo de tareas, desde la resolución de problemas hasta el reconocimiento de imágenes.

En esta introducción se describe lo siguiente:

Introducción a CoreML

En estos pasos se describe cómo agregar CoreML a un proyecto de iOS.

Captura de pantalla de ejemplo del indicador de precios de un hábitat de Marte

1. Agregar del modelo CoreML al proyecto

Agregue un modelo CoreML (un archivo con la extensión .mlmodel ) al directorio recursos del proyecto.

En las propiedades del fichero modelo, su acción de compilación se establece en CoreMLModel. Esto significa que se compilará en un archivo.mlmodelc cuando se compile la aplicación.

2. Cargue el modelo

Cargue el modelo mediante el método estático MLModel.Create:

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

3. Establecimiento de los parámetros

Los parámetros de modelo se pasan y salen mediante una clase de contenedor que implementa IMLFeatureProvider.

Las clases de proveedor de características se comportan como un diccionario de cadenas y MLFeatureValues, donde cada valor de característica podría ser una cadena simple o un número, una matriz o datos, o un búfer de píxeles que contiene una imagen.

A continuación se muestra el código de un proveedor de características de valor único:

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
  }

Con clases como esta, CoreML puede proporcionar parámetros de entrada de una manera que CoreML entiende. Los nombres de las características (como myParam en el ejemplo de código) deben coincidir con lo que espera el modelo.

4. Ejecución del modelo

El uso del modelo requiere que se cree una instancia del proveedor de características y que se establezcan parámetros y, a continuación, que se llame al GetPrediction método:

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

5. Extracción de los resultados

El resultado outFeatures de la predicción también es una instancia de IMLFeatureProvider; se puede tener acceso a los valores de salida mediante GetFeatureValue con el nombre de cada parámetro de salida (como theResult), como en este ejemplo:

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

Uso de CoreML con Vision Framework

CoreML también se puede usar junto con el marco Vision para realizar operaciones en la imagen, como el reconocimiento de formas, la identificación de objetos y otras tareas.

Los pasos siguientes describen cómo se puede usar CoreML y Vision juntos. El ejemplo combina el reconocimiento de rectángulos del marco de visión con el modelo MNINSTClassifier CoreML para identificar un dígito manuscrito en una fotografía.

Reconocimiento de imágenes del número 3Reconocimiento de imágenes del número 5

1. Creación de un modelo de Vision CoreML

El modelo de CoreML MNISTClassifier se carga y, a continuación, se ajusta en un VNCoreMLModel que hace que el modelo esté disponible para las tareas de Visión. Este código también crea dos solicitudes de Vision: primero para buscar rectángulos en una imagen y, a continuación, para procesar un rectángulo con el modelo 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);

La clase todavía necesita implementar los métodos HandleRectangles y HandleClassification para las solicitudes de Vision, que se muestran en los pasos 3 y 4 siguientes.

2. Inicio del procesamiento de visión

El código siguiente comienza a procesar la solicitud. En el ejemplo de CoreMLVision, este código se ejecuta después de que el usuario haya seleccionado una imagen:

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

Este controlador pasa el ciImage al marco de Visión VNDetectRectanglesRequest que se creó en el paso 1.

3. Control de los resultados del procesamiento de visión

Una vez completada la detección del rectángulo, ejecuta el método HandleRectangles, que recorta la imagen para extraer el primer rectángulo, convierte la imagen de rectángulo en escala de grises y la pasa al modelo CoreML para su clasificación.

El parámetro request pasado a este método contiene los detalles de la solicitud Vision y, mediante el método GetResults<VNRectangleObservation>(), devuelve una lista de rectángulos encontrados en la imagen. El primer rectángulo observations[0] se extrae y se pasa al modelo 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 Se inicializó en el paso 1 para usar el HandleClassification método definido en el paso siguiente.

4. Controlar CoreML

El parámetro request pasado a este método contiene los detalles de la solicitud CoreML y, mediante el método GetResults<VNClassificationObservation>(), devuelve una lista de posibles resultados ordenados por confianza (primero la mayor confianza):

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