Share via


Introduzione a CoreML in Xamarin.iOS

CoreML introduce l'apprendimento automatico in iOS: le app possono sfruttare i modelli di Machine Learning sottoposti a training per eseguire tutti i tipi di attività, dalla risoluzione dei problemi al riconoscimento delle immagini.

Questa introduzione illustra quanto segue:

Introduzione a CoreML

Questi passaggi descrivono come aggiungere CoreML a un progetto iOS.

Screenshot di esempio di Mars Habitat Price Predictor

1. Aggiungere il modello CoreML al progetto

Aggiungere un modello CoreML (un file con estensione mlmodel ) alla directory Resources del progetto.

Nelle proprietà del file di modello, l'azione Di compilazione è impostata su CoreMLModel. Ciò significa che verrà compilato in un file con estensione mlmodelc al momento della compilazione dell'applicazione.

2. Caricare il modello

Caricare il modello usando il MLModel.Create metodo statico:

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

3. Impostare i parametri

I parametri del modello vengono passati e disattivati usando una classe contenitore che implementa IMLFeatureProvider.

Le classi del provider di funzionalità si comportano come un dizionario di stringhe e MLFeatureValues, in cui ogni valore di funzionalità può essere una stringa o un numero semplice, una matrice o dati o un buffer di pixel contenente un'immagine.

Di seguito è riportato il codice per un provider di funzionalità a valore singolo:

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
  }

Usando classi come questa, i parametri di input possono essere forniti in modo comprensibile da CoreML. I nomi delle funzionalità, ad esempio myParam nell'esempio di codice, devono corrispondere a quanto previsto dal modello.

4. Eseguire il modello

L'uso del modello richiede che il provider di funzionalità venga creata un'istanza e che i parametri siano impostati, quindi che il GetPrediction metodo venga chiamato:

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

5. Estrarre i risultati

Il risultato outFeatures della stima è anche un'istanza di . È possibile accedere ai valori di IMLFeatureProvideroutput usando GetFeatureValue con il nome di ogni parametro di output (ad esempio theResult), come in questo esempio:

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

Uso di CoreML con vision framework

CoreML può essere usato anche insieme al framework vision per eseguire operazioni sull'immagine, ad esempio il riconoscimento delle forme, l'identificazione degli oggetti e altre attività.

I passaggi seguenti descrivono in che modo CoreML e Visione possono essere usati insieme. L'esempio combina il riconoscimento dei rettangoli dal framework vision con il modello MNINSTClassifier CoreML per identificare una cifra scritta a mano in una fotografia.

Riconoscimento delle immagini del numero 3Riconoscimento delle immagini del numero 5

1. Creare un modello Vision CoreML

Il modello CoreML MNISTClassifier viene caricato e quindi sottoposto a wrapping in un oggetto VNCoreMLModel che rende disponibile il modello per le attività di Visione artificiale. Questo codice crea anche due richieste di Visione artificiale: prima per trovare rettangoli in un'immagine e quindi per l'elaborazione di un rettangolo con il modello 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 classe deve comunque implementare i metodi e HandleClassification per le HandleRectangles richieste di Visione, illustrati nei passaggi 3 e 4 seguenti.

2. Avviare l'elaborazione della visione

Il codice seguente avvia l'elaborazione della richiesta. Nell'esempio CoreMLVision questo codice viene eseguito dopo che l'utente ha selezionato un'immagine:

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

Questo gestore passa l'oggetto ciImage al framework VNDetectRectanglesRequest vision creato nel passaggio 1.

3. Gestire i risultati dell'elaborazione della visione

Al termine del rilevamento del rettangolo, esegue il HandleRectangles metodo che ritaglia l'immagine per estrarre il primo rettangolo, converte l'immagine del rettangolo in scala di grigi e la passa al modello CoreML per la classificazione.

Il request parametro passato a questo metodo contiene i dettagli della richiesta visione e, usando il GetResults<VNRectangleObservation>() metodo , restituisce un elenco di rettangoli trovati nell'immagine. Il primo rettangolo observations[0] viene estratto e passato al modello 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);
  });
}

L'oggetto ClassificationRequest è stato inizializzato nel passaggio 1 per usare il HandleClassification metodo definito nel passaggio successivo.

4. Gestire CoreML

Il request parametro passato a questo metodo contiene i dettagli della richiesta CoreML e, usando il GetResults<VNClassificationObservation>() metodo , restituisce un elenco di possibili risultati ordinati in base alla confidenza (maggiore attendibilità):

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