La classification des images permet à nos applications Xamarin de reconnaßtre les objets sur les photographies.La possibilité de prendre une photo et de reconnaßtre son contenu est de plus en plus courante. Nous pouvons l'observer dans nos applications bancaires lors d'un dépÎt mobile, dans les applications photo lors de l'ajout de filtres et dans les applications HotDog pour déterminer si notre nourriture est un hot dog.Grùce au service Azure Custom Vision, nous n'avons pas besoin d'apprendre des algorithmes d'apprentissage machine complexes pour implémenter la classification d'images.Dans cet article, nous verrons comment implémenter la classification d'images à l'aide du service Azure Custom Vision , TensorFlow Lite (plateforme d'apprentissage machine open source) etXamarin.Android .Remarque: Pour Xamarin.iOS, nous pouvons également utiliser le service Azure Custom Vision avec CoreML , mais nous ferions mieux de l'enregistrer pour un autre article.BibliothÚques de classification d'images
Nous utiliserons le service Azure Custom Vision et TensorFlow Lite pour implémenter notre classification d'images.1. Service de vision personnalisée Azure
Le service Azure Custom Vision simplifie la création et la formation d'un modÚle d'apprentissage automatique - aucune expérience avec Artificail Intelligence (AI) ou Machine Learning (ML) n'est requise.En utilisant le portail Web du service Custom Vision , nous pouvons effectuer les opérations suivantes sans écrire de code AI / ML:- Télécharger l'image d'entraßnement
- Marquer les balises / balises des objets dans l'image
- Répéter (le modÚle s'améliore avec plus de données d'entraßnement)
- C'est tout - Custom Vision s'occupe du reste!
2. TensorFlow Lite
TensorFlow Lite est une plate-forme d'apprentissage automatique open source qui nous permet d'utiliser TensorFlow dans l'IoT et les appareils mobiles.TensorFlow Lite et TensorFlow sont disponibles en open source sur GitHub .Implémentation d'une classification d'images à l'aide d'Azure + Xamarin.Android
Un exemple complet d'application de classification d'images est disponible sur GitHub .1. Formation modĂšle
Ă l'aide du portail Web du service Custom Vision , nous formons d'abord des modĂšles de classification d'images.1. Sur le portail Web du service Custom Vision, cliquez sur Nouveau projet2. Dans la fenĂȘtre CrĂ©er un nouveau projet , dĂ©finissez les paramĂštres suivants:- Nom: XamarinImageClassification
- Description: identifier les objets dans les images
- Ressource: [Créer une nouvelle ressource]
- Type de projet: Classification
- Types de classification: Multilabel (plusieurs balises par image)
- Domaines: Général (compact)
- Capacités d'exportation: plates-formes de base
3. Dans la fenĂȘtre CrĂ©er un nouveau projet , cliquez sur CrĂ©er un projet4. Dans la fenĂȘtre XamarinImageClassification, cliquez sur Ajouter des images5. SĂ©lectionnez les images contenant l'objet pour identification6. Dans la fenĂȘtre TĂ©lĂ©chargement d'image , ajoutez une baliseRemarque: dans cet exemple, nous travaillons avec des images de champignons7. Dans la fenĂȘtre Image tĂ©lĂ©charger cliquez sur TĂ©lĂ©chargerRemarque: continuez Ă tĂ©lĂ©charger des images jusqu'Ă ce que vous ayez au moins 5 images pour chaque balise8. Dans la fenĂȘtre XamarinImageClassification dans le coin supĂ©rieur droit de la fenĂȘtre, cliquez sur le bouton Train Model (image verte des engrenages)9. Dans la fenĂȘtre Choose Training Type , sĂ©lectionnez Quick Training10. Dans la fenĂȘtre Choose Training Type , sĂ©lectionnez Train2. Exportation d'un modĂšle formĂ© Ă partir du service Azure Custom Vision
Maintenant que nous avons formĂ© notre modĂšle, exportons-le pour l'utiliser dans notre application mobile .Cela nous permettra d'utiliser le modĂšle sans connexion Internet, ce qui garantira la meilleure confidentialitĂ© pour l'utilisateur, car ses photos ne quitteront jamais l'appareil mobile.Pour exporter notre modĂšle, procĂ©dons comme suit:1. Dans la fenĂȘtre XamarinImageClassifcation en haut de la page, sĂ©lectionnez l'onglet Performances2. Dans l' onglet Performace , cliquez sur le bouton Exporter (flĂšche vers le bas)3. Dans la fenĂȘtre Choisissez votre plateforme , sĂ©lectionnez TensorFlow4. Dans la liste dĂ©roulante Choisissez votre plateforme , sĂ©lectionnez TensorFlow Lite5. Dans la fenĂȘtre Choisissez votre plateforme , sĂ©lectionnez TĂ©lĂ©charger3. Importez TensorFlow Lite dans notre application Xamarin.Android
1. Installez le package NuGet appropriĂ© dans notre projet Xamarin.AndroidRemarque: Ce package NuGet est un projet open source créé par l'Ă©quipe Xamarin de Microsoft. Il contient des liaisons C # pour la bibliothĂšque TensorFlow Lite d'origine , qui peut ĂȘtre utilisĂ©e dans notre application Xamarin.Android2. DĂ©compressez le modĂšle exportĂ© que nous avons tĂ©lĂ©chargĂ© Ă partir du portail Web du service Custom VisionRemarque: Ă l'intĂ©rieur du fichier zip se trouvent labels.txt et model.tflite :- labels.txt contient des balises d'image créées lors de la prĂ©paration de la formation sur le site Web de Custom Vision
- models.tflite est le modÚle d'apprentissage automatique que nous utilisons pour nos prévisions.
3. Dans Visual Studio, dans le projet Xamarin.Android, cliquez avec le bouton droit sur le dossier Assets4. Dans le menu contextuel, sĂ©lectionnez Ajouter â ĂlĂ©ment existant ...5. Dans le menu Ajouter un Ă©lĂ©ment existant , sĂ©lectionnez les deux fichiers rĂ©cemment dĂ©compressĂ©s:6. Dans Visual Studio, dans Xamarin.Android â Actifs , cliquez avec le bouton droit sur labels.txt7. Dans le menu contextuel, sĂ©lectionnez PropriĂ©tĂ©s8. Dans la fenĂȘtre PropriĂ©tĂ©s , sĂ©lectionnez Build Action â Android Asset9. Dans Visual Studio, dans Xamarin.Android â Actifs , cliquez avec le bouton droit sur models.tflite10. Dans le menu contextuel, sĂ©lectionnez PropriĂ©tĂ©s11. Dans la fenĂȘtre PropriĂ©tĂ©s , sĂ©lectionnez Build Action â Android Asset4. ImplĂ©mentation du code de classification d'image pour Xamarin.Android
Maintenant que nous avons importé le modÚle, il est temps de faire de l'écriture de code.Pour rappel, une application de classification d'images échantillon entiÚrement finie est disponible sur GitHub .Dans le Xamarin.Android projet , ajouter ImageClassifcationModel.cs et TensorflowClassifier.cs :ImageClassificationModel.cs
public class ImageClassificationModel
{
public ImageClassificationModel(string tagName, float probability)
{
TagName = tagName;
Probability = probability;
}
public float Probability { get; }
public string TagName { get; }
}
TensorflowClassifier.cs
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Android.App;
using Android.Graphics;
using Java.IO;
using Java.Nio;
using Java.Nio.Channels;
public class TensorflowClassifier
{
const int FloatSize = 4;
const int PixelSize = 3;
public List<ImageClassificationModel> Classify(byte[] image)
{
var mappedByteBuffer = GetModelAsMappedByteBuffer();
var interpreter = new Xamarin.TensorFlow.Lite.Interpreter(mappedByteBuffer);
var tensor = interpreter.GetInputTensor(0);
var shape = tensor.Shape();
var width = shape[1];
var height = shape[2];
var byteBuffer = GetPhotoAsByteBuffer(image, width, height);
var streamReader = new StreamReader(Application.Context.Assets.Open("labels.txt"));
var labels = streamReader.ReadToEnd().Split('\n').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList();
var outputLocations = new float[1][] { new float[labels.Count] };
var outputs = Java.Lang.Object.FromArray(outputLocations);
interpreter.Run(byteBuffer, outputs);
var classificationResult = outputs.ToArray<float[]>();
var classificationModelList = new List<ImageClassificationModel>();
for (var i = 0; i < labels.Count; i++)
{
var label = labels[i]; classificationModelList.Add(new ImageClassificationModel(label, classificationResult[0][i]));
}
return classificationModelList;
}
private MappedByteBuffer GetModelAsMappedByteBuffer()
{
var assetDescriptor = Application.Context.Assets.OpenFd("model.tflite");
var inputStream = new FileInputStream(assetDescriptor.FileDescriptor);
var mappedByteBuffer = inputStream.Channel.Map(FileChannel.MapMode.ReadOnly, assetDescriptor.StartOffset, assetDescriptor.DeclaredLength);
return mappedByteBuffer;
}
private ByteBuffer GetPhotoAsByteBuffer(byte[] image, int width, int height)
{
var bitmap = BitmapFactory.DecodeByteArray(image, 0, image.Length);
var resizedBitmap = Bitmap.CreateScaledBitmap(bitmap, width, height, true);
var modelInputSize = FloatSize * height * width * PixelSize;
var byteBuffer = ByteBuffer.AllocateDirect(modelInputSize);
byteBuffer.Order(ByteOrder.NativeOrder());
var pixels = new int[width * height];
resizedBitmap.GetPixels(pixels, 0, resizedBitmap.Width, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
var pixel = 0;
for (var i = 0; i < width; i++)
{
for (var j = 0; j < height; j++)
{
var pixelVal = pixels[pixel++];
byteBuffer.PutFloat(pixelVal >> 16 & 0xFF);
byteBuffer.PutFloat(pixelVal >> 8 & 0xFF);
byteBuffer.PutFloat(pixelVal & 0xFF);
}
}
bitmap.Recycle();
return byteBuffer;
}
}
C'est tout! Maintenant, nous pouvons transmettre l'image à TensorflowClassifier.Classify pour obtenir ImageClassificationModel .Matériaux pour étude ultérieure
Consultez les liens ci-dessous: