Mit TensorFlow Lite unter iOS Blumen erkennen

1. Einführung

657431be3173fa86.png

TensorFlow ist ein Multifunktions-Framework für maschinelles Lernen. TensorFlow kann überall verwendet werden – vom Trainieren riesiger Modelle über mehrere Cluster in der Cloud bis hin zum lokalen Ausführen von Modellen auf einem eingebetteten System wie einem Smartphone.

In diesem Codelab wird TensorFlow Lite verwendet, um ein Bilderkennungsmodell auf einem iOS-Gerät auszuführen.

Lerninhalte

  • Hier erfahren Sie, wie Sie Ihr Modell mit dem TFLite-Konverter optimieren.
  • Ausführung in einer vorkonfigurierten iOS-App mit dem TFLite-Interpreter

Überblick

Eine einfache Kamera-App, die ein TensorFlow-Bilderkennungsprogramm zur Identifizierung von Blumen ausführt.

Voraussetzungen

Wenn Sie dieses Codelab auf Ihrer eigenen Hardware ausführen, muss Folgendes installiert sein:

  • Xcode 10 oder höher
  • CocoaPods 1.8.0 oder höher

c45ecd122998622e.png

Lizenz: Kostenlos nutzbar

2. Blumenerkennung mit Colab trainieren

In diesem Codelab werden Colaboratory und Xcode verwendet.

Öffnen Sie Colab, in dem mit TensorFlow Lite Model Maker ein Klassifikator trainiert wird, um Blumen mithilfe von Lerntransfers zu erkennen, und exportieren Sie ein TFLite-Modell zur Verwendung in der mobilen App.

3. Arbeitsverzeichnis einrichten

Git-Repository klonen

Mit dem folgenden Befehl wird das Git-Repository geklont, das die für dieses Codelab erforderlichen Dateien enthält:

git clone https://github.com/tensorflow/examples.git

Fügen Sie nun cd in den Xcode-Projektstamm des gerade erstellten Klons ein. An dieser Stelle arbeiten Sie für den Rest dieses Codelabs:

cd examples/lite/examples/image_classification/ios

4. iOS-App einrichten

Abhängigkeiten installieren

Installieren Sie mithilfe von CocoaPods die Abhängigkeiten der iOS-App (einschließlich TensorFlow Lite). Öffnen Sie nach Abschluss des Installationsbefehls ImageClassification.xcworkspace, um das Projekt in Xcode zu öffnen.

pod install --repo-update
open ImageClassification.xcworkspace

5. Test für die App ausführen

Zur Verwendung der Kamera muss die App auf einem echten Gerät ausgeführt werden, da der iOS-Simulator keinen Zugriff auf die Kamera Ihres Mac hat. Um Apps für iOS-Geräte zu entwickeln, müssen Sie beim Apple Developer Program angemeldet sein oder Zugriff auf ein Gerät haben, das Ihnen jemand anderes bereitgestellt hat.

Wenn Sie dieses Codelab im Simulator ausführen möchten, müssen Sie Bilder aus Safari in den Simulator kopieren, um sie einzufügen. So verarbeiten Sie ein Bild im Simulator:

  1. Erstellen Sie die App für ein Simulatorziel Ihrer Wahl.
  2. Drücken Sie im iOS-Simulator die Tastenkombination Cmd + Umschalt + H, um die App zu minimieren.
  3. Tippe unten auf dem Startbildschirm auf Safari und suche nach einem Bild.
  4. Tippen Sie in den Ergebnissen der Google Bildersuche auf ein Ergebnis und drücken Sie lange auf das Bild. Wählen Sie im daraufhin angezeigten Dialogfeld die Option „Kopieren“ aus.
  5. Kehren Sie zur TFL Classify App zurück. Das kopierte Bild sollte automatisch zusammen mit den Inferenzergebnissen angezeigt werden. Ist dies nicht der Fall, kopieren Sie die Bilddaten selbst und nicht die URL des Bildes.

Build testen und App installieren

Bevor Sie Änderungen an der App vornehmen, führen Sie die mit dem Repository gelieferte Version aus. Wählen Sie im Drop-down-Menü oben links Ihr iOS-Gerät aus:

275753d3a77a0df3.png

Drücken Sie dann Cmd + R oder drücken Sie in Xcode die Schaltfläche „Play f96cf117245c0fa6.png“ (Abspielen), um die App für Ihr Gerät zu erstellen. Die App sollte nach der Installation auf Ihrem Gerät automatisch gestartet werden.

Diese Version der App verwendet das MobileNet-Standardmodell, das mit den 1.000 ImageNet-Kategorien vortrainiert wurde. Die Ausgabe sollte ungefähr so aussehen:

d11436f0bb5a75db.jpeg

6. Angepasste App ausführen

Bei der standardmäßigen App-Einrichtung werden Bilder mithilfe des MobileNet-Standardmodells in eine der 1.000 ImageNet-Klassen eingeteilt.

Ändern wir nun die App so, dass sie unser neu trainiertes Modell für unsere benutzerdefinierten Bildkategorien verwendet, die in Colab trainiert wurden.

7. App konvertieren, um Ihr Modell auszuführen

Modelldateien zum Projekt hinzufügen

Die Modellressourcen des Projekts befinden sich im Xcode-Projektnavigator unter ImageClassification > Model. Wenn du sie ersetzen möchtest, lösche zuerst die beiden vorhandenen Dateien in der Gruppe „Model“. Wählen Sie „In Papierkorb verschieben“ aus, wenn Sie dazu aufgefordert werden:

cf2f7fefb2e5075f.png

Ziehen Sie dann die Dateien model.tflite und labels.txt, die Sie aus Colab heruntergeladen haben, in die Gruppe „Modell“. Wenn Sie dazu aufgefordert werden, prüfen Sie, ob sowohl Copy items if needed als auch Add to targets ausgewählt sind.

281d7eb72635bb5f.png

App-Code ändern

Damit unsere App funktioniert, müssen wir den Pfad der Logik zum Laden des Modells aktualisieren, sodass er auf das neu hinzugefügte Modell verweist.

Öffnen Sie ModelDataHandler.swift (Xcode-Navigator-Pfad: ImageClassification -> ModelDataHandler -> ModelDataHandler.swift) und ändern Sie Zeile 36 in

// before
static let modelInfo: FileInfo = (name: "mobilenet_quant_v1_224", extension: "tflite")

// after
static let modelInfo: FileInfo = (name: "model", extension: "tflite")

Speichern Sie alle Änderungen.

8. Angepasste App ausführen

Drücken Sie die Befehlstaste + B oder die Schaltfläche „Play“ f96cf117245c0fa6.png in Xcode, um die App für Ihr Gerät zu erstellen. Nach dem Starten der App sollte dies in etwa so aussehen:

c45ecd122998622e.png

Sie können die Ein/Aus-Taste und die Lautertaste gleichzeitig gedrückt halten, um einen Screenshot zu erstellen.

Führen Sie nun eine Websuche nach Blumen durch, richten Sie die Kamera auf den Computerbildschirm und überprüfen Sie, ob diese Bilder richtig klassifiziert wurden.

Oder bitten Sie einen Freund, ein Foto von Ihnen zu machen, um herauszufinden, was für ein TensorFlow Sie sind \\uf339 \\uf33b \\uf337!

9. Wie funktioniert das?

Nachdem die App nun ausgeführt wird, sehen wir uns den TensorFlow Lite-spezifischen Code an.

TensorFlowLiteSwift

Diese App verwendet die TensorFlowLite Swift-Bibliothek über CocoaPods. Die Swift-Bibliothek ist ein Thin Wrapper über der TFLite C API, die selbst ein Wrapper der TFLite C++-Bibliothek ist.

Mit den folgenden Zeilen in der Datei Podfile des Moduls wird die neueste Version des globalen Pod-Repositorys für CocoaPods-Spezifikationen in das Projekt abgerufen.

Podfile

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

TensorFlow Lite Swift API verwenden

Der Code, der mit TensorFlow Lite interagiert, ist in ModelDataHandler.swift enthalten.

Einrichtung

Der erste relevante Block ist der Initialisierer für ModelDataHandler:

ModelDataHandler.swift

/// A failable initializer for `ModelDataHandler`. A new instance is created if the model and
/// labels files are successfully loaded from the app's main bundle. Default `threadCount` is 1.
init?(modelFileInfo: FileInfo, labelsFileInfo: FileInfo, threadCount: Int = 1) {
  let modelFilename = modelFileInfo.name

  // Construct the path to the model file.
  guard let modelPath = Bundle.main.path(
    forResource: modelFilename,
    ofType: modelFileInfo.extension
  ) else {
    print("Failed to load the model file with name: \(modelFilename).")
    return nil
  }

  // Specify the options for the `Interpreter`.
  self.threadCount = threadCount
  var options = InterpreterOptions()
  options.threadCount = threadCount
  do {
    // Create the `Interpreter`.
    interpreter = try Interpreter(modelPath: modelPath, options: options)
    // Allocate memory for the model's input `Tensor`s.
    try interpreter.allocateTensors()
  } catch let error {
    print("Failed to create the interpreter with error: \(error.localizedDescription)")
    return nil
  }
  // Load the classes listed in the labels file.
  loadLabels(fileInfo: labelsFileInfo)
}

Es gibt einige Zeilen, die näher diskutiert werden sollten.

Die folgende Zeile erstellt den TFLite-Interpreter:

ModelDataHandler.swift

interpreter = try Interpreter(modelPath: modelPath, options: options)

Der Interpreter ist für die Übergabe von Rohdateneingaben über die TensorFlow-Grafik verantwortlich. Wir übergeben dem Interpreter den Pfad zu unserem Modell auf dem Laufwerk und der Interpreter lädt es dann als FlatBufferModel.

Mit der letzten Zeile wird die Labelliste geladen:

loadLabels(fileInfo: labelsFileInfo)

Dabei werden lediglich Zeichenfolgen aus einer Textdatei in den Speicher geladen.

Modell ausführen

Der zweite interessante Block ist die Methode runModel. Sie nimmt eine CVPixelBuffer als Eingabe an, führt den Interpreter aus und gibt den zu druckenden Text an die App zurück.

ModelDataHandler.swift

try interpreter.copy(rgbData, toInputAt: 0)
// ...
try interpreter.invoke()
// ...
outputTensor = try interpreter.output(at: 0)

10. Nächste Schritte

Unter den folgenden Links finden Sie weitere Informationen: