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.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:- Trainingsbild herunterladen
- Markieren Sie Tags / Tags von Objekten im Bild
- Wiederholen (das Modell wird mit mehr Trainingsdaten besser)
- 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 Projekt2. 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 erstellen4. Im XamarinImageClassification Fenster , klicken Sie auf Bilder hinzufügen5. die Bilder Wählen Sie das Objekt zur Identifizierung enthalten6. Im Bild hochladen Fenstern, um einen Tag hinzuzufügenHinweis: in diesem Beispiel arbeiten wir mit Pilze Bildern7. Im Bild Fenster Hochladen Klicken Sie auf HochladenHinweis: Laden Sie so lange Bilder hoch, bis Sie mindestens 5 Bilder für jedes Tag haben8. 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 Schnellausbildung10. Im Trainingstyp Wählen Sie Fenster, wählt Zug2. 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 - Registerkarte2. Auf der Performace Registerkarte klicken Sie auf die Export - Taste (Pfeil nach unten)3. In der Plattform Wählen Sie Fenster, wählen Sie TensorFlow4. In der Wählen Sie Ihre Plattform Dropdown-Liste, wählen Sie TensorFlow Lite5. In der Plattform Wählen Sie Fenster, wählen Sie herunterladen3. 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 wird2 Anwendung . Entpacken Sie das exportierte Modell , dass wir aus dem heruntergeladenen Kundenspezifische Vision - Service - Web - PortalHinweis: 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 Ordner4. In dem Popup-Menü wählen Sie Hinzufügen → Vorhandenes Element ...5. Im Vorhandenes Element hinzufügen Menü wählen Sie beide vor kurzem entpackten Dateien:6. In Visual Studio, in Xamarin.Android → Assets der rechten Maustaste auf labels.txt7. In dem Pop-up - Menü wählen Sie Eigenschaften8. Im Eigenschaften - Fenster, wählen Sie Build Action → Android Nutzungsart9. In Visual Studio, in Xamarin.Android → Assets der rechten Maustaste auf models.tflite10. im Pop-up - Menü wählen Sie Eigenschaften11. im Eigenschaften - Fenster wählen Sie Build Action → Android Nutzungsart4. 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
{
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;
}
}
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: