Rozpoznawanie kwiatów za pomocą TensorFlow Lite w iOS

1. Wprowadzenie

657431be3173fa86.png

TensorFlow to wielofunkcyjna platforma systemów uczących się. TensorFlow można używać w każdym miejscu: od trenowania ogromnych modeli w klastrach w chmurze po uruchamianie modeli lokalnie w umieszczonym systemie takim jak telefon.

W ramach tych ćwiczeń w Codelabs wykorzystano TensorFlow Lite do uruchomienia modelu rozpoznawania obrazów na urządzeniu z iOS.

Czego się nauczysz

  • Jak zoptymalizować model za pomocą konwertera TFLite.
  • Jak uruchomić go w gotowej aplikacji na iOS przy użyciu interpretera TFLite.

Co utworzysz

Prosta aplikacja aparatu, która rozpoznaje kwiaty przy użyciu programu do rozpoznawania obrazów TensorFlow.

Wymagania wstępne

Jeśli wykonujesz ćwiczenia z programowania na własnym sprzęcie, upewnij się, że masz zainstalowane:

  • Xcode 10 lub nowsza
  • CocoaPods w wersji 1.8.0 lub nowszej

c45ecd122998622e.png

Licencja: do użytku bezpłatnie

2. Wytrenuj system rozpoznawania kwiatów za pomocą Colab

To ćwiczenia w programie będą korzystać z Colaboratory i Xcode.

Otwórz Colab, który używa Kreatora modeli TensorFlow Lite, aby wytrenować klasyfikator do rozpoznawania kwiatów za pomocą systemów uczących się i wyeksportować model TFLite do użycia w aplikacji mobilnej.

3. Skonfiguruj katalog roboczy

Klonowanie repozytorium Git

Następujące polecenie sklonuje repozytorium Git zawierające pliki wymagane do wykonania tego ćwiczenia z programowania:

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

Teraz cd do głównego projektu Xcode utworzonego właśnie klona. W tym miejscu będziesz wykonywać resztę tego ćwiczenia z programowania:

cd examples/lite/examples/image_classification/ios

4. Konfigurowanie aplikacji na iOS

Zainstaluj zależności

Za pomocą CocoaPods zainstaluj zależności aplikacji na iOS (w tym TensorFlow Lite). Po zakończeniu polecenia instalacji otwórz ImageClassification.xcworkspace, aby otworzyć projekt w Xcode.

pod install --repo-update
open ImageClassification.xcworkspace

5. Przetestuj uruchamianie aplikacji

Aby używać kamery, musisz uruchomić aplikację na prawdziwym urządzeniu, ponieważ symulator iOS nie ma dostępu do aparatu Maca. Aby utworzyć kompilację na urządzeniu z iOS, musisz należeć do programu Apple dla deweloperów lub mieć dostęp do urządzenia, które udostępniła Ci inna osoba.

Jeśli chcesz uruchomić to ćwiczenia z programowania w symulatorze, musisz skopiować obrazy do wklejenia z Safari w samym symulatorze. Oto kroki przetwarzania zdjęcia za pomocą symulatora:

  1. Utwórz aplikację do wybranego celu symulatora.
  2. W symulatorze iOS naciśnij Cmd+Shift+H, aby zminimalizować aplikację.
  3. Dotknij Safari u dołu ekranu głównego i wyszukaj obraz.
  4. W wynikach wyszukiwania Grafiki Google kliknij wynik i przytrzymaj obraz. W wyświetlonym oknie wybierz „Kopiuj”.
  5. Wróć do aplikacji TFL Classify. Skopiowany obraz powinien wyświetlić się automatycznie wraz z wynikami wnioskowania. Jeśli tak nie jest, upewnij się, że zostały skopiowane dane zdjęcia, a nie adres URL obrazu.

Testowanie kompilacji i instalowania aplikacji

Zanim wprowadzisz jakiekolwiek zmiany w aplikacji, uruchom wersję, która jest wysyłana razem z repozytorium. Wybierz swoje urządzenie z iOS z menu w lewym górnym rogu:

275753d3a77a0df3.png

Następnie naciśnij klawisze Cmd + R lub kliknij przycisk Odtwórz f96cf117245c0fa6.png w Xcode, aby utworzyć aplikację na swoim urządzeniu. Aplikacja powinna uruchomić się automatycznie po zainstalowaniu na urządzeniu.

Ta wersja aplikacji korzysta ze standardowej platformy MobileNet, która została wstępnie wytrenowana na podstawie 1000 kategorii ImageNet. Powinna wyglądać mniej więcej tak:

d11436f0bb5a75db.jpeg

6. Uruchamianie dostosowanej aplikacji

Domyślna konfiguracja aplikacji klasyfikuje obrazy w jednej z 1000 klas ImageNet przy użyciu standardowej MobileNet.

Zmodyfikujmy teraz aplikację, aby korzystała z naszego ponownie wytrenowanego modelu na potrzeby niestandardowych kategorii obrazów wytrenowanych w Colab.

7. Przekonwertuj aplikację, aby uruchomić model

Dodaj pliki modelu do projektu

Zasoby modelu projektu znajdują się w nawigatorze projektów Xcode w lokalizacji ImageClassification > Model. Aby je zastąpić, najpierw usuń 2 dotychczasowe pliki w grupie Model. Gdy pojawi się komunikat, wybierz „Przenieś do kosza”:

cf2f7fefb2e5075f.png

Następnie przeciągnij pliki model.tflite i labels.txt pobrane z Colab do grupy modeli. Gdy pojawi się komunikat, zaznacz Copy items if needed i Add to targets.

281d7eb72635bb5f.png

Modyfikowanie kodu aplikacji

Aby aplikacja działała, musimy zaktualizować ścieżkę logiki wczytywania modelu, wskazującą nowo dodany model.

Otwórz ModelDataHandler.swift (ścieżka nawigacyjna Xcode: klasyfikacja obrazów -> ModelDataHandler -> ModelDataHandler.swift) i zmień wiersz 36 na

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

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

Pamiętaj, by zapisać wszystkie zmiany.

8. Uruchamianie aplikacji dostosowanej

Naciśnij klawisze Cmd+B lub kliknij przycisk Odtwórz f96cf117245c0fa6.png w Xcode, aby utworzyć aplikację na swoim urządzeniu. Po uruchomieniu aplikacja powinna wyglądać mniej więcej tak:

c45ecd122998622e.png

Aby zrobić zrzut ekranu, możesz przytrzymać przyciski zasilania i zwiększania głośności.

Teraz wyszukaj w internecie kwiaty, skieruj aparat na ekran komputera i sprawdź, czy zdjęcia są poprawnie sklasyfikowane.

Możesz też poprosić znajomego o zrobienie Ci zdjęcia i sprawdzić, jakim typem TensorFlower jesteś \\uf339 \\uf33b \\uf337.

9. Jak to działa?

Teraz gdy aplikacja jest już uruchomiona, przyjrzyjmy się kodowi TensorFlow Lite.

TensorFlowLiteSwift

Ta aplikacja korzysta z biblioteki TensorFlowLite Swift w CocoaPods. Biblioteka Swift jest cienkim kodem interfejsu TFLite C API, który sam w sobie jest otoką biblioteki TFLite C++.

Poniższe wiersze w pliku Podfile modułu pobierają do projektu najnowszą wersję globalnego repozytorium specyfikacji podów CocoaPods.

Plik Podfile

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

Korzystanie z interfejsu TensorFlow Lite Swift API

Kod, który wchodzi w interakcję z TensorFlow Lite, jest zawarty w ModelDataHandler.swift.

Konfiguracja

Pierwszy blok zainteresowań to inicjator dla 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)
}

Jest kilka wierszy, które należy omówić bardziej szczegółowo.

Następujący wiersz tworzy interpreter TFLite:

ModelDataHandler.swift

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

Tłumacz odpowiada za przekazywanie nieprzetworzonych danych przez graf TensorFlow. Przekazujemy interpreterowi ścieżkę do naszego modelu na dysku, który następnie interpretuje jako FlatBufferModel.

Ostatni wiersz wczytuje listę etykiet:

loadLabels(fileInfo: labelsFileInfo)

Pozwala to jedynie wczytać ciągi tekstowe z pliku tekstowego do pamięci.

Uruchamianie modelu

Drugi blok zainteresowań to metoda runModel. Pobiera ona CVPixelBuffer jako dane wejściowe, uruchamia tłumacza i zwraca tekst do wydrukowania w aplikacji.

ModelDataHandler.swift

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

10. Co dalej?

Oto kilka linków do dodatkowych informacji: