Partager via


Présentation de CoreML dans Xamarin.iOS

CoreML apporte le Machine Learning à iOS : les applications peuvent tirer parti des modèles Machine Learning entraînés pour effectuer toutes sortes de tâches, de la résolution de problèmes à la reconnaissance d’images.

Cette introduction couvre les éléments suivants :

Prise en main de CoreML

Ces étapes décrivent comment ajouter CoreML à un projet iOS.

Capture d’écran de l’exemple Mars Habitat Price Predictor

1. Ajouter le modèle CoreML au projet

Ajoutez un modèle CoreML (un fichier avec l’extension .mlmodel ) au répertoire Ressources du projet.

Dans les propriétés du fichier de modèle, son action Build est définie sur CoreMLModel. Cela signifie qu’elle sera compilée dans un fichier .mlmodelc lorsque l’application est générée.

2. Charger le modèle

Chargez le modèle à l’aide de la MLModel.Create méthode statique :

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

3. Définir les paramètres

Les paramètres de modèle sont transmis et sortants IMLFeatureProviderà l’aide d’une classe de conteneur qui implémente .

Les classes de fournisseur de fonctionnalités se comportent comme un dictionnaire de chaînes et MLFeatureValuede s, où chaque valeur de fonctionnalité peut être une chaîne ou un nombre simple, un tableau ou des données, ou une mémoire tampon de pixels contenant une image.

Le code d’un fournisseur de fonctionnalités à valeur unique est illustré ci-dessous :

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
  }

À l’aide de classes comme celle-ci, les paramètres d’entrée peuvent être fournis d’une manière comprise par CoreML. Les noms des fonctionnalités (comme myParam dans l’exemple de code) doivent correspondre à ce que le modèle attend.

4. Exécuter le modèle

L’utilisation du modèle nécessite que le fournisseur de fonctionnalités soit instancié et défini des paramètres, puis que la GetPrediction méthode soit appelée :

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

5. Extraire les résultats

Le résultat outFeatures de prédiction est également une instance de ; les valeurs de IMLFeatureProvidersortie sont accessibles à l’aide GetFeatureValue du nom de chaque paramètre de sortie (par exemple theResult), comme dans cet exemple :

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

Utilisation de CoreML avec Vision Framework

CoreML peut également être utilisé conjointement avec l’infrastructure Vision pour effectuer des opérations sur l’image, telles que la reconnaissance de forme, l’identification d’objet et d’autres tâches.

Les étapes ci-dessous décrivent comment CoreML et Vision peuvent être utilisés ensemble. L’exemple combine la reconnaissance des rectangles de l’infrastructure Vision avec le modèle CoreML MNINSTClassifier pour identifier un chiffre manuscrit dans une photographie.

Reconnaissance d’image du numéro 3 Reconnaissance d’image du numéro 5

1. Créer un modèle Vision CoreML

Le modèle COREML MNISTClassifier est chargé, puis encapsulé dans un VNCoreMLModel modèle qui rend le modèle disponible pour les tâches Vision. Ce code crée également deux requêtes Vision : d’abord pour rechercher des rectangles dans une image, puis pour traiter un rectangle avec le modèle 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 doit toujours implémenter les méthodes et HandleClassification les HandleRectangles méthodes des requêtes Vision, indiquées aux étapes 3 et 4 ci-dessous.

2. Démarrer le traitement vision

Le code suivant commence à traiter la requête. Dans l’exemple CoreMLVision , ce code s’exécute une fois que l’utilisateur a sélectionné une image :

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

Ce gestionnaire transmet l’infrastructure ciImage VNDetectRectanglesRequest Vision créée à l’étape 1.

3. Gérer les résultats du traitement vision

Une fois la détection de rectangle terminée, elle exécute la HandleRectangles méthode, qui rogne l’image pour extraire le premier rectangle, convertit l’image rectangle en nuances de gris et la transmet au modèle CoreML pour la classification.

Le request paramètre passé à cette méthode contient les détails de la requête Vision et à l’aide de la GetResults<VNRectangleObservation>() méthode, il retourne une liste de rectangles trouvés dans l’image. Le premier rectangle observations[0] est extrait et passé au modèle 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’étape ClassificationRequest 1 a été initialisée pour utiliser la HandleClassification méthode définie à l’étape suivante.

4. Gérer CoreML

Le request paramètre passé à cette méthode contient les détails de la requête CoreML et l’utilisation de la GetResults<VNClassificationObservation>() méthode, il retourne une liste des résultats possibles classés par confiance (confiance la plus élevée en premier) :

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