Klassifizieren Sie Bilder auf Android mit TensorFlow Lite und Azure Custom Vision

Durch die Bildklassifizierung können unsere Xamarin-Anwendungen Objekte auf Fotos erkennen.

Immer häufiger wird ein Foto aufgenommen und dessen Inhalt erkannt. Wir können dies in unseren Bankanwendungen beobachten, wenn wir eine mobile Einzahlung vornehmen, in Fotoanwendungen, wenn Filter hinzugefügt werden, und in HotDog-Anwendungen, um festzustellen, ob unser Essen ein Hot Dog ist.

Dank des Azure Custom Vision-Dienstes müssen wir keine komplexen Algorithmen für maschinelles Lernen erlernen, um die Bildklassifizierung zu implementieren.

In diesem Artikel erfahren Sie , wie Sie die Bildklassifizierung mithilfe des Azure Custom Vision-Dienstes TensorFlow Lite (Open Source-Plattform für maschinelles Lernen) und implementierenXamarin.Android .


Hinweis: Für Xamarin.iOS können wir den Azure Custom Vision-Dienst auch mit CoreML verwenden . Wir sollten ihn jedoch besser für einen anderen Artikel speichern.

Bild

Bildklassifizierungsbibliotheken


Wir werden den Azure Custom Vision-Dienst und TensorFlow Lite verwenden, um unsere Bildklassifizierung zu implementieren.

1. Azure Custom Vision Service


Der Azure Custom Vision-Dienst vereinfacht die Erstellung und Schulung eines Modells für maschinelles Lernen. Es sind keine Vorkenntnisse in Artificail Intelligence (AI) oder Machine Learning (ML) erforderlich.

Über das Webportal des Custom Vision-Dienstes können wir Folgendes tun, ohne einen AI / ML-Code zu schreiben:

  1. Trainingsbild herunterladen
  2. Markieren Sie Tags / Tags von Objekten im Bild
  3. Wiederholen (das Modell wird mit mehr Trainingsdaten besser)
  4. Das war's - Custom Vision kümmert sich um den Rest!

2. TensorFlow Lite


TensorFlow Lite ist eine Open-Source-Plattform für maschinelles Lernen, mit der wir TensorFlow in IoT- und Mobilgeräten verwenden können.

TensorFlow Lite und TensorFlow sind auf GitHub als Open Source verfügbar .

Implementieren der Bildklassifizierung mit Azure + Xamarin.Android


Eine vollständige Anwendung zur Klassifizierung von Beispielbildern ist auf GitHub verfügbar .

1. Modelltraining


Über das Webportal des Custom Vision-Dienstes trainieren wir zunächst Bildklassifizierungsmodelle.

1. Klicken Sie im Webportal des Custom Vision-Dienstes auf Neues Projekt

Bild

2. Legen Sie im Fenster Neues Projekt erstellen folgende Parameter fest:

  • Name: XamarinImageClassification
  • Beschreibung: Identifizieren Sie Objekte in Bildern
  • Ressource: [Neue Ressource erstellen]
  • Projekttyp: Klassifizierung
  • Klassifizierungstypen: Multilabel (Mehrere Tags pro Bild)
  • Domänen: Allgemein (kompakt)
  • Exportfunktionen: Basisplattformen

3. Im neuen Projekt erstellen Fenster, klicken Sie auf Projekt erstellen

4. Im XamarinImageClassification Fenster , klicken Sie auf Bilder hinzufügen

5. die Bilder Wählen Sie das Objekt zur Identifizierung enthalten

6. Im Bild hochladen Fenstern, um einen Tag hinzuzufügen
Hinweis: in diesem Beispiel arbeiten wir mit Pilze Bildern

7. Im Bild Fenster Hochladen Klicken Sie auf Hochladen
Hinweis: Laden Sie so lange Bilder hoch, bis Sie mindestens 5 Bilder für jedes Tag haben

Bild

8. Im XamarinImageClassification Fenster in der oberen rechten Ecke des Fensters, das Klicken Train Modell Taste (grün Bild Gänge)

9. Im Typ Wählen Sie Training Fenster wählen Schnellausbildung

10. Im Trainingstyp Wählen Sie Fenster, wählt Zug

Bild

2. Exportieren eines trainierten Modells aus dem Azure Custom Vision-Dienst


Nachdem wir unser Modell trainiert haben, exportieren wir es zur Verwendung in unserer mobilen Anwendung .

Auf diese Weise können wir das Modell ohne Internetverbindung verwenden, wodurch die beste Privatsphäre für den Benutzer gewährleistet wird, da seine Fotos das mobile Gerät niemals verlassen.

Um unser Modell zu exportieren, lassen Sie uns wie folgt vor :

1. Im XamarinImageClassifcation Fenster am oberen Rand der Seite, wählen Sie die Performance - Registerkarte

2. Auf der Performace Registerkarte klicken Sie auf die Export - Taste (Pfeil nach unten)

3. In der Plattform Wählen Sie Fenster, wählen Sie TensorFlow

Bild

4. In der Wählen Sie Ihre Plattform Dropdown-Liste, wählen Sie TensorFlow Lite

5. In der Plattform Wählen Sie Fenster, wählen Sie herunterladen

Bild

3. Importieren Sie TensorFlow Lite in unsere Xamarin.Android-App


1. Installieren Sie das entsprechende NuGet-Paket in unserem Xamarin.Android-Projekt.
Hinweis: Dieses NuGet-Paket ist ein Open Source-Projekt, das vom Xamarin-Team bei Microsoft erstellt wurde. Es enthält C # Anbindung für die ursprüngliche TensorFlow Lite - Bibliothek , so dass es in unserer Xamarin.Android verwendet wird

2 Anwendung . Entpacken Sie das exportierte Modell , dass wir aus dem heruntergeladenen Kundenspezifische Vision - Service - Web - Portal
Hinweis: in der ZIP - Datei ist labels.txt und model.tflite :

  • label.txt enthält Bild-Tags, die während der Vorbereitung des Trainings auf der Custom Vision-Website erstellt wurden
  • models.tflite ist das Modell für maschinelles Lernen, das wir für unsere Prognosen verwenden.

3. In Visual Studio, in dem Xamarin.Android Projekt, die Rechtsklick - Assets Ordner

4. In dem Popup-Menü wählen Sie HinzufügenVorhandenes Element ...

5. Im Vorhandenes Element hinzufügen Menü wählen Sie beide vor kurzem entpackten Dateien:

  • models.tflite
  • label.txt

6. In Visual Studio, in Xamarin.AndroidAssets der rechten Maustaste auf labels.txt

7. In dem Pop-up - Menü wählen Sie Eigenschaften

8. Im Eigenschaften - Fenster, wählen Sie Build ActionAndroid Nutzungsart

9. In Visual Studio, in Xamarin.AndroidAssets der rechten Maustaste auf models.tflite

10. im Pop-up - Menü wählen Sie Eigenschaften

11. im Eigenschaften - Fenster wählen Sie Build ActionAndroid Nutzungsart

Bild

4. Implementierung des Bildklassifizierungscodes für Xamarin.Android


Nachdem wir das Modell importiert haben, ist es Zeit, Code zu schreiben.

Zur Erinnerung: Auf GitHub steht eine vollständig fertige Anwendung zur Klassifizierung von Beispielbildern zur Verfügung .

Im Xamarin.Android Projekt , fügen ImageClassifcationModel.cs und 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;
    }
}

Das ist alles! Jetzt können wir das Bild an TensorflowClassifier.Classify übergeben , um das ImageClassificationModel zu erhalten .

Materialien für weitere Studien


Schauen Sie sich die folgenden Links an:


All Articles