1. Einführung
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
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:
- Erstellen Sie die App für ein Simulatorziel Ihrer Wahl.
- Drücken Sie im iOS-Simulator die Tastenkombination Cmd + Umschalt + H, um die App zu minimieren.
- Tippe unten auf dem Startbildschirm auf Safari und suche nach einem Bild.
- 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.
- 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:
Drücken Sie dann Cmd + R oder drücken Sie in Xcode die Schaltfläche „Play “ (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:
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:
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.
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“ in Xcode, um die App für Ihr Gerät zu erstellen. Nach dem Starten der App sollte dies in etwa so aussehen:
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
!
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.
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
:
/// 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:
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.
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:
- Weitere Informationen zu TFLite finden Sie in den Dokumenten auf tensorflow.org und dem Quell-Repository.
- Testen Sie andere vortrainierte TFLite-Modelle, einschließlich einer Hotword-Erkennung für die Sprachausgabe und einer Version für intelligente Antworten auf dem Gerät.
- Allgemeine Informationen zu TensorFlow finden Sie in der Dokumentation zum Einstieg.