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.
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 MLFeatureValue
de 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 IMLFeatureProvider
sortie 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.
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}%";
});
}