Classer des images sur Android Ă  l'aide de TensorFlow Lite et Azure Custom Vision

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.

image

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:

  1. Télécharger l'image d'entraßnement
  2. Marquer les balises / balises des objets dans l'image
  3. Répéter (le modÚle s'améliore avec plus de données d'entraßnement)
  4. 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 projet

image

2. 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 projet

4. Dans la fenĂȘtre XamarinImageClassification, cliquez sur Ajouter des images

5. SĂ©lectionnez les images contenant l'objet pour identification

6. Dans la fenĂȘtre TĂ©lĂ©chargement d'image , ajoutez une balise
Remarque: dans cet exemple, nous travaillons avec des images de champignons

7. Dans la fenĂȘtre Image tĂ©lĂ©charger cliquez sur TĂ©lĂ©charger
Remarque: continuez à télécharger des images jusqu'à ce que vous ayez au moins 5 images pour chaque balise

image

8. 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 Training

10. Dans la fenĂȘtre Choose Training Type , sĂ©lectionnez Train

image

2. 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 Performances

2. Dans l' onglet Performace , cliquez sur le bouton Exporter (flĂšche vers le bas)

3. Dans la fenĂȘtre Choisissez votre plateforme , sĂ©lectionnez TensorFlow

image

4. Dans la liste déroulante Choisissez votre plateforme , sélectionnez TensorFlow Lite

5. Dans la fenĂȘtre Choisissez votre plateforme , sĂ©lectionnez TĂ©lĂ©charger

image

3. Importez TensorFlow Lite dans notre application Xamarin.Android


1. Installez le package NuGet approprié dans notre projet Xamarin.Android
Remarque: 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.Android

2. Décompressez le modÚle exporté que nous avons téléchargé à partir du portail Web du service Custom Vision
Remarque: à 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 Assets

4. 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:

  • models.tflite
  • labels.txt

6. Dans Visual Studio, dans Xamarin.Android → Actifs , cliquez avec le bouton droit sur labels.txt

7. Dans le menu contextuel, sélectionnez Propriétés

8. Dans la fenĂȘtre PropriĂ©tĂ©s , sĂ©lectionnez Build Action → Android Asset

9. Dans Visual Studio, dans Xamarin.Android → Actifs , cliquez avec le bouton droit sur models.tflite

10. Dans le menu contextuel, sélectionnez Propriétés

11. Dans la fenĂȘtre PropriĂ©tĂ©s , sĂ©lectionnez Build Action → Android Asset

image

4. 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
{
    //FloatSize     4,        4 
    const int FloatSize = 4;
    //PixelSize -     3,        : ,   .
    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);

        // StreamReader    labels.txt
        var streamReader = new StreamReader(Application.Context.Assets.Open("labels.txt"));

        // labels.txt  List<string>
        var labels = streamReader.ReadToEnd().Split('\n').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList();

        //     Java.Lang.Object,    Xamarin.TensorFlow.List.Interpreter.
        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[]>();

        // classificationResult     ,  ,     
        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;
    }

    // model.tflite  Java.Nio.MappedByteBuffer,    Xamarin.TensorFlow.Lite.Interpreter.
    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;
    }

    //     TensorFlow
    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;

        //     Java.Nio.ByteBuffer
        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:


All Articles