So erstellen Sie eine mobile Computer-Vision-App in Flutter

Veröffentlicht: 2020-04-22

Machine Learning-Funktionen sind in heutigen Anwendungen zu einem Muss geworden. Sie können die Zufriedenheit verbessern und Ihrem Publikum das außergewöhnliche App-Erlebnis bieten, das es sich wünscht. Dank jüngster Hardware- und Softwareoptimierungen verlagert sich die Ausführung von Modellen des maschinellen Lernens von der Cloud auf die mobilen Geräte selbst.

Dies hat einen enormen Einfluss auf die Benutzererfahrung, indem die Antwortlatenz beseitigt und Datenschutzprobleme angegangen werden. Als wir uns entschieden, Planter zu entwickeln, eine App, die Benutzern hilft, sich um ihre Zimmerpflanzen zu kümmern, wussten wir, dass das, was sie auf dem App-Markt hervorheben könnte, KI ist.

Unsere Idee war es, mithilfe von Computer-Vision-Techniken eine Funktion hinzuzufügen, mit der die Art der Zimmerpflanze anhand eines Bildes erkannt werden kann. Dank TensorFlow Lite-Optimierungen der Leistung auf dem Gerät kann die App unser Klassifizierungsmodell ausschließlich auf dem Gerät des Benutzers ausführen. In diesem Artikel werde ich erklären, wie man schnell ein Bildklassifizierungsmodell vorbereitet und es in einer mit Flutter entwickelten App bereitstellt.

Machine-Learning-Modul in Flutter aufbauen – Schritt für Schritt

Umgang mit einem Small-Data-Problem

Der erste Schritt beim Erstellen eines Modells für maschinelles Lernen ist die Datenerfassung. Um einen Trainingsdatensatz zu erstellen, haben wir Google Images Downloader verwendet, der es uns ermöglichte, Pflanzenbilder aus einer Google-Suche herunterzuladen, mit Rechten, die für die kommerzielle Wiederverwendung gekennzeichnet sind, mit dem folgenden kurzen Skript:

 $ googleimagesdownload --keywords "Zamioculcas zamiifolia" --usage_rights labeled-for-reuse

Unser endgültiger Datensatz bestand aus etwa 70-170 Bildern pro Art. Es wäre sehr schwierig gewesen, mit so wenigen Daten ein gut funktionierendes Bildklassifizierungsmodell von Grund auf neu zu erstellen.

Glücklicherweise sind einige leistungsstarke vortrainierte künstliche neuronale Netze öffentlich verfügbar, die zum Erstellen eines hochpräzisen Bildklassifizierers verwendet werden können, selbst wenn Ihr Datensatz nur aus etwa hundert Beispielen für jede Klasse besteht. Diese Technik der Verwendung und Modifikation eines vortrainierten Modells für einen bestimmten Anwendungsfall wird als Transfer Learning bezeichnet.

Datenerweiterung

Um unseren Datensatz optimal zu nutzen, haben wir das Vorverarbeitungspaket ImageDataGenerator von keras verwendet, das Stapel von Tensorbildern generiert und sie im Handumdrehen erweitert. Wir haben die folgenden Transformationen verwendet:

  • Eingänge horizontal spiegeln: horizontal_flip = True
  • Einstellen eines Helligkeitsverschiebungswerts aus Bereich: Helligkeit_Bereich = (0,75, 1,25)
  • Scheren mit der bereitgestellten Intensität: sheer_range = 15
  • Neuskalierung durch Multiplikation mit einem bestimmten Wert: Neuskalierung=1./255
  • Ein- und Auszoomen: zoom_range=0.4
  • Verschiebung in jede Richtung: width_shift_range = 0,1, height_shift_range = 0,15
 train_datagen_augment =

           ImageDataGenerator (rotation_range = 30,

           horizontal_flip = wahr,

           Helligkeitsbereich = (0,75, 1,25),

           Scherbereich = 15,

           Neuskalierung=1./255,

           zoom_range=0.4,

           width_shift_range = 0,1,

           height_shift_range = 0,15)

Ausbildung

Wir verwendeten NASNet-Mobile, ein konvolutionelles neuronales Netzwerk, das mit mehr als einer Million Bildern aus dem ImageNet-Datensatz trainiert wurde. Die NasNetMobile-Architektur besteht aus einer Reihe von Blöcken, die mit neuronalen Netzwerkzellen aufgebaut sind.

Block ist ein Betriebsmodul, das Transformationen enthält, die aus neuronalen Netzwerken zur Bildklassifizierung bekannt sind, darunter: normale Faltungen, trennbare Faltungen, Max-Pooling, Average-Pooling, Identitätszuordnung usw. Das Netzwerk wurde darauf trainiert, einem Bild 1 aus zuzuweisen 1000 Kategorien, darunter Tiere, Blumen und Möbel. Als Ergebnis hat das Netzwerk reichhaltige Merkmalsdarstellungen für eine breite Palette von Bildern „gelernt“.

Wir haben unser Modell erstellt, indem wir die folgenden Schritte ausgeführt haben:

  • Entfernen Sie die letzte Ebene des vortrainierten Netzwerks
  • Fügen Sie am Ende des Netzwerks ein Faltungsmodell hinzu
  • Frieren Sie alle Layer im kombinierten Netzwerk ein, außer denen, die aus dem hinzugefügten Modell stammen
  • Trainieren Sie das Modell, bis sich die Genauigkeit nicht mehr verbessert
  • Entfrieren Sie alle Schichten im letzten eingefrorenen Faltungsblock des vortrainierten Modells
  • Trainieren Sie das Modell, bis sich die Genauigkeit nicht mehr verbessert
  • Wiederholen Sie die Punkte 5 und 6 fünfmal
  • Entfrieren Sie das gesamte Modell und trainieren Sie es, bis sich die Genauigkeit nicht mehr verbessert

Modellbewertung

Das Klassifikationsmodell des Planters versucht, einer Zimmerpflanze anhand ihres Fotos eine Pflanzenart zuzuordnen. Das Modell gibt drei Typen zurück, denen es die höchsten Wahrscheinlichkeiten zugewiesen hat, aus denen der Benutzer einen auswählen kann. Bei der Bewertung des Modells haben wir die folgenden zwei Metriken verwendet:

  • Kategorische_Genauigkeit,
  • top_k_categorical_accuracy (mit k=3).

Die folgende Grafik zeigt die kategoriale Genauigkeit für jede Trainingsepoche unseres Modells.

Kategorische Genauigkeit für jede Trainingsepoche

Die endgültige kategoriale Genauigkeit für das Bewertungsset beträgt 0,870, und die kategoriale Genauigkeit der Top 3 beträgt 0,916. Diese Ergebnisse waren angesichts der geringen Größe des verwendeten Trainingsdatensatzes sehr zufriedenstellend.

Modellkonvertierung

Wenn ein Keras-Modell in einer mobilen App verwendet werden soll, muss es in ein TensorFlow Lite FlatBuffer-Objekt konvertiert werden. Dies kann mit dem im folgenden Beispiel gezeigten Code erfolgen.

 importiere tensorflow.lite als lite

keras_model_path = "model/keras_model"

tflite_model_path = "model/model.tflite"

model.save(keras_model_path)

converter = lite.TFLiteConverter.from_keras_model_file(keras_model_path)

tflite_model = converter.convert()

open(tflite_model_path, "wb").write(tflite_model)

Jetzt, da wir das optimierte Modell im Pfad model/model.tflite gespeichert hatten, konnten wir es problemlos in den nativen mobilen Apps verwenden, indem wir Folgendes verwendeten:

  • Core ML – für iOS-Apps
  • TensorFlow Lite Android Support Library – für Android-Apps

Basierend auf unseren Erfahrungen mit Planter zeige ich Ihnen nun, wie Sie dieses Modell mit Flutter verwenden.

Warum Flattern?

Flutter ist ein UI-Toolkit von Google. Es wurde entwickelt, um nativ kompilierte Anwendungen für Mobilgeräte, Web und Desktop aus einer einzigen Codebasis zu erstellen. Wenn Sie sich fragen, ob Sie Flutter verwenden sollten, empfehle ich Ihnen, diesen Artikel zu lesen, der eine Fallstudie zu Topline von Abbey Road Studios ist, die in Flutter von Miquido entwickelt wurde.

Wir können unser Modell mit der tflite-Bibliothek verwenden. Es ist ein Flutter-Plugin für den Zugriff auf die TensorFlow Lite-API. Es unterstützt Bildklassifizierung, Objekterkennung, Pix2Pix, Deeplab und PoseNet sowohl auf iOS- als auch auf Android-Plattformen.

Symbol für plattformübergreifende Entwicklungsdienste

Neugierig auf die Flutter-Entwicklung?

Mehr erfahren

In unserem Anwendungsentwicklungsprozess mussten wir die folgenden Schritte ausführen:

  • Fügen Sie tflite als Abhängigkeit in unserer Datei pubspec.yaml hinzu
  • Erstellen Sie einen Assets-Ordner und legen Sie eine Etikettendatei und eine Modelldatei darin ab.
  • Fügen Sie in pubspec.yaml Folgendes hinzu:
 Vermögenswerte:

   - Assets/Etiketten.txt

   - assets/mobilenet_v1_1.0_224.tflite
  • Importieren Sie die Bibliothek tflite:
 import 'Paket: tflite/tflite.dart';
  • Laden Sie das Modell und die Etiketten:
 String res = warte auf Tflite.loadModel(

  Modell: "assets/model.tflite",

  Etiketten: "assets/labels.txt",

  numThreads: 1 // standardmäßig 1

);
  • Führen Sie das Modell auf einem Bild aus (machen Sie eine Vorhersage):
 var erkennt = warte auf Tflite.runModelOnImage(

        Pfad: tfResizedImage.path, 

        imageStd: 255,0, 

        numErgebnisse: 3, 

        Schwelle: 0,00001, 

        asynchron: wahr    

 );

Die Vorhersageausgabe hat das im folgenden Beispiel gezeigte Format:

 [{confidence: 0.03441339731216431, index: 46, label: Vriesea splendens}, {confidence: 2.086162567138672e-7, index: 7, label: Aphelandra squarrosa}, {confidence: 1.4901161193847656e-7, index: 19 }]
  • Ressourcen freigeben:
 warte auf Tflite.close();

Endergebnisse

Mit Planter können Sie Ihrer Bibliothek eine Pflanze mit einem Bild hinzufügen. Sie können das Bild erhalten, indem Sie ein Foto Ihrer Pflanze machen oder eines aus der Galerie des Telefons auswählen. Das enthaltene Klassifikationsmodell für Zimmerpflanzen gibt drei Arten zurück, die mit der höchsten Wahrscheinlichkeit erkannt werden, und präsentiert sie auf einer Liste.

Wenn Sie auf eine Art klicken, gelangen Sie zur Übersichtsansicht der Pflanze, die ein vorausgefülltes Formular mit vorgeschlagenen Bewässerungs- und Düngeplänen und einigen zusätzlichen Informationen über die Pflanze enthält. Im folgenden Ablauf sehen Sie ein Beispiel, in dem eine Zamioculcas zamiifolia in einem Bild erkannt wird, das mit einem Kamerahandy aufgenommen wurde.

So funktioniert Planter
Pflanzer - Erkennungssystem
So fügen Sie Pflanzen in Planter hinzu

Verlagern Sie Ihr maschinelles Lernen auf Mobilgeräte!

In diesem Artikel wollte ich Sie davon überzeugen, dass das Hinzufügen von benutzerfreundlichen KI-Funktionen in Ihre mobile App einfach und schnell sein kann. Darüber hinaus bietet die Verlagerung der Modellausführung auf Mobilgeräte Ihren Benutzern ein angenehmes Benutzererlebnis, indem Latenzen bei API-Antworten beseitigt werden. Es trägt auch zur Datensicherheit bei, da das Senden von Daten in die Cloud nicht erforderlich ist.

Sie können stark von der Verwendung von Flutter und seiner Fähigkeit profitieren, Code für native iOS- und Android-Apps gleichzeitig zu kompilieren. Mit wenig Aufwand können Sie Ihre App auf dem Markt hervorheben und die Zuschauerbindung Ihrer App maximieren.

Bereit für Ihr nächstes Projekt? Zögern Sie nicht und nehmen Sie Kontakt mit uns auf!