Tworzenie i wdrażanie niestandardowego modelu wykrywania obiektów za pomocą TensorFlow Lite (Android)

1. Zanim zaczniesz

Z tego modułu dowiesz się, jak wytrenować niestandardowy model wykrywania obiektów przy użyciu zestawu obrazów do trenowania za pomocą Kreatora modeli TFLite, a następnie wdrożyć go w aplikacji na Androida przy użyciu Biblioteki zadań TFLite. W ramach ćwiczenia:

  • Stwórz aplikację na Androida, która wykrywa składniki posiłków.
  • Zintegruj wstępnie wytrenowany model wykrywania obiektów TFLite i sprawdź, ile jest w stanie wykryć model.
  • Wytrenuj niestandardowy model wykrywania obiektu do wykrywania składników i składników posiłku za pomocą niestandardowego zbioru danych o nazwie salad i modelu TFLite Model Maker.
  • Wdróż model niestandardowy w aplikacji na Androida przy użyciu biblioteki zadań TFLite.

Na koniec stworzysz coś podobnego do tego:

b9705235366ae162.png

Wymagania wstępne

To ćwiczenie zostało opracowane z myślą o doświadczonych programistach mobilnych, którzy chcą nauczyć się obsługi systemów uczących się. Pamiętaj:

  • Tworzenie aplikacji na Androida za pomocą Kotlin i Androida Studio
  • Podstawowa składnia w języku Python

Czego się nauczysz:

  • Jak wytrenować niestandardowy model wykrywania obiektów za pomocą Kreatora modeli TFLite.
  • Jak wdrożyć model wykrywania obiektów TFLite za pomocą biblioteki zadań TFLite.

Czego potrzebujesz

  • Najnowsza wersja Androida Studio (wersja 4.2 lub nowsza)
  • Emulator Androida Studio lub fizyczne urządzenie z Androidem
  • Przykładowy kod
  • Podstawowa wiedza na temat rozwoju Androida w Kotlinie

2. Wykrywanie obiektów

Wykrywanie obiektów to zestaw zadań związanych z rozpoznawaniem obrazów, które mogą wykrywać i znajdować obiekty na obrazie cyfrowym. Na podstawie obrazu lub strumienia wideo model wykrywania obiektów może wykryć, który ze znanych zbiorów obiektów istnieje, i podać informacje o położeniu na obrazie.

TensorFlow oferuje gotowe modele zoptymalizowane pod kątem urządzeń mobilnych, takie jak samochody, pomarańcze itd. Możesz zintegrować te wytrenowane modele w aplikacji mobilnej za pomocą kilku linijek kodu. Czasami warto jednak wykrywać obiekty w bardziej charakterystycznych lub niekonwencjonalnych kategoriach. Wymaga to zebrania własnych obrazów treningowych, a następnie trenowania i wdrażania własnego modelu wykrywania obiektów.

TensorFlow Lite

TensorFlow Lite to wieloplatformowa biblioteka systemów uczących się zoptymalizowana pod kątem urządzeń z systemami uczącymi się na urządzeniach brzegowych, w tym urządzeniach mobilnych z Androidem i iOS.

TensorFlow Lite to właściwy mechanizm używany w ML Kit do uruchamiania modeli systemów uczących się. Istnieją 2 komponenty ekosystemu TensorFlow Lite, które ułatwiają trenowanie i wdrażanie modeli systemów uczących się na urządzeniach mobilnych:

  • Kreator modeli to biblioteka w Pythonie, która ułatwia trenowanie modeli TensorFlow Lite przy użyciu własnych danych za pomocą kilku linijek kodu bez konieczności posiadania systemów uczących się.
  • Biblioteka zadań to międzyplatformowa biblioteka ułatwiająca wdrażanie modeli TensorFlow Lite za pomocą kilku linijek kodu w aplikacjach mobilnych.

To ćwiczenie programowania skupia się na TFLite. Pojęcia i blokady kodu, które nie są istotne w przypadku TFLite'a i wykrywania obiektów, nie są objaśnione i można je po prostu skopiować i wkleić.

3. Konfiguracja

Pobieranie kodu

Aby pobrać cały kod do tych ćwiczeń z programowania, kliknij ten link:

Rozpakuj pobrany plik ZIP. Spowoduje to rozpakowanie folderu głównego (odml-pathways-main) ze wszystkimi potrzebnymi zasobami. W tym ćwiczeniu z programowania będziesz potrzebować tylko źródeł w podkatalogu object-detection/codelab2/android.

Podkatalog android w repozytorium object-detection/codelab2/android zawiera 2 katalogi:

  • folder_android_studio.pngstarter – kod uruchamiany na potrzeby tego ćwiczenia.
  • folder_android_studio.pngfinal (końcowy) – gotowy kod gotowej aplikacji.

Importowanie aplikacji startowej

Zacznijmy od zaimportowania aplikacji startowej do Android Studio.

  1. Otwórz Androida Studio i wybierz Importuj projekt (Gradle, Eclipse ADT itp.)
  2. Otwórz folder starter z pobranego wcześniej kodu źródłowego.

7C0f27882a2698ac.png

Aby mieć pewność, że wszystkie zależności są dostępne dla Twojej aplikacji, musisz zsynchronizować projekt z plikami Gradle po zakończeniu procesu importowania.

  1. Na pasku narzędzi Androida Studio wybierz Sync Project with Gradle Files (Synchronizuj projekt z plikami Gradle) (b451ab2d04d835f9.png). Importuj plik starter/app/build.gradle

Uruchamianie aplikacji startowej

Po zaimportowaniu projektu do Android Studio możesz uruchomić aplikację po raz pierwszy.

Podłącz urządzenie z Androidem przez USB do komputera lub uruchom emulator Androida Studio i kliknij Uruchom ( wykonaj.png) na pasku narzędzi Android Studio.

4. Omówienie aplikacji startowej

Aby ułatwić Ci ćwiczenia z programowania i skupić się na bitach systemów uczących, aplikacja startowa zawiera kod stały, który wykonuje kilka czynności za Ciebie:

  • Może robić zdjęcia aparatem.
  • Szablon zawiera kilka obrazów z banku zdjęć, które można wypróbować w emulatorze Androida.
  • Jest to wygodna metoda rysowania wyniku wykrywania obiektu na wejściowej mapie bitowej.

Większość sposobów obsługi szkieletu aplikacji to:

  • fun runObjectDetection(bitmap: Bitmap) Ta metoda jest wywoływana, gdy wybierzesz gotowe zdjęcie lub zrobisz zdjęcie. bitmap to obraz wejściowy używany do wykrywania obiektów. W dalszej części tego ćwiczenia dodasz kod wykrywania obiektów do tej metody.
  • data class DetectionResult(val boundingBoxes: Rect, val text: String) Jest to klasa danych, która reprezentuje wynik wykrywania obiektów do wizualizacji. boundingBoxes to prostokąt, w którym znajduje się obiekt. text to ciąg wyniku wykrywania, który jest wyświetlany wraz z ramką ograniczającą.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<DetectionResult>): Bitmap Ta metoda pobiera wyniki wykrywania obiektu w polu detectionResults w danych wejściowych bitmap i zwraca zmodyfikowaną kopię obiektu.

Oto przykładowe dane wyjściowe metody drawDetectionResult.

f6b1e6dad726e129.png

5. Dodawanie wykrywania obiektów na urządzeniu

Teraz zbudujesz prototyp, integrując już wytrenowany model TFLite, który potrafi wykrywać typowe obiekty w aplikacji początkowej.

Pobieranie już wytrenowanego modelu wykrywania obiektów TFLite

W TensorFlow Hub jest kilka modeli wzorców do wykrywania obiektów, których możesz używać. Na potrzeby tego ćwiczenia pobierzesz model EfficientDet-Lite Object wykrywanie, wytrenowany z użyciem zbioru danych COCO 2017, zoptymalizowany pod kątem TFLite i zaprojektowany pod kątem wydajności na procesorach mobilnych, GPU i EdgeTPU.

Następnie zintegruj wytrenowany model TFLite z biblioteką zadań TFLite ze swoją aplikacją startową, która ułatwia integrację modeli systemów uczących się zoptymalizowanych pod kątem urządzeń mobilnych z tą aplikacją. Obsługuje wiele popularnych przypadków użycia systemów uczących się, w tym wykrywanie obiektów, klasyfikację obrazów i klasyfikację tekstu. Możesz załadować model TFLite i uruchomić go za pomocą kilku linijek kodu.

Dodawanie modelu do aplikacji startowej

  1. Skopiuj pobrany właśnie model do folderu assets aplikacji startowej. Znajdziesz go w panelu użytkownika Projekt w Android Studio.

C2609599b7d22641

  1. Nazwij plik model.tflite.

C83e9397177c4561.png

Aktualizowanie zależności od biblioteki Listy zadań

Przejdź do pliku app/build.gradle i dodaj ten wiersz do konfiguracji dependencies:

implementation 'org.tensorflow:tensorflow-lite-task-vision:0.3.1'

Synchronizowanie projektu z plikami Gradle

Aby mieć pewność, że wszystkie zależności są dostępne dla Twojej aplikacji, zsynchronizuj projekt z plikami Gradle. Na pasku narzędzi Androida Studio wybierz Sync Project with Gradle Files (Synchronizuj projekt z plikami Gradle) (b451ab2d04d835f9.png).

(Jeśli ten przycisk jest wyłączony, zaimportuj tylko polecenie starter/app/build.gradle, a nie całe repozytorium).

Konfigurowanie i uruchamianie wykrywania obiektu na urządzeniu na obrazie

Do wczytania i uruchomienia modelu wykrywania obiektów potrzebne są tylko 3 proste kroki z 3 interfejsami API:

  • przygotowanie obrazu/strumienia: TensorImage
  • utwórz obiekt wzorca do wykrywania treści: ObjectDetector
  • połącz 2 powyższe obiekty: detect(image)

Możesz to zrobić w ramach funkcji runObjectDetection(bitmap: Bitmap)w pliku MainActivity.kt.

/**
* TFLite Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
    //TODO: Add object detection code here
}

Obecnie funkcja jest pusta. Wykonaj poniższe czynności, aby zaimplementować wzorzec do wykrywania obiektów TFLite. W trakcie procesu Android Studio poprosi Cię o dodanie niezbędnych importów:

  • org.tensorflow.lite.support.image.TensorImage
  • org.tensorflow.lite.task.vision.detector.ObjectDetector

Utwórz obiekt graficzny

Obrazy, które zostaną użyte w tym ćwiczeniu, będą pochodzić z aparatu w urządzeniu lub z gotowych obrazów wybranych w interfejsie aplikacji. Obraz wejściowy jest dekodowany do formatu Bitmap i przesyłany do metody runObjectDetection.

TFLite udostępnia prosty interfejs API do tworzenia obiektu TensorImage z Bitmap. Dodaj poniższy kod u góry strony runObjectDetection(bitmap:Bitmap):

// Step 1: create TFLite's TensorImage object
val image = TensorImage.fromBitmap(bitmap)

Tworzenie instancji wzorca do wykrywania treści

Biblioteka zadań TFLite przypomina wzorzec projektowy Builder. Konfigurację przekazujesz do konstruktora, a następnie pobierasz z niego wzorzec. Istnieje kilka opcji konfiguracji, w tym dostosowanie czułości wzorca do wykrywania obiektów:

  • maksymalny wynik (maksymalna liczba obiektów, które ma wykryć model)
  • próg wyniku (jak stopień ufności detektora obiektów powinien zwrócić zwracany obiekt),
  • lista dozwolonych/etykiet odrzuconych (zezwalaj/odmów obiektów na wstępnie zdefiniowanej liście)

Zainicjuj instancję wzorca do wykrywania obiektów, określając nazwę pliku modelu TFLite i opcje konfiguracji:

// Step 2: Initialize the detector object
val options = ObjectDetector.ObjectDetectorOptions.builder()
    .setMaxResults(5)
    .setScoreThreshold(0.5f)
    .build()
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "model.tflite", // must be same as the filename in assets folder
    options
)

Obrazy z kanału do wzorca do wykrywania treści

Dodaj ten kod do fun runObjectDetection(bitmap:Bitmap). Zdjęcia zostaną przesłane do wzorca do wykrywania treści.

// Step 3: feed given image to the model and print the detection result
val results = detector.detect(image)

Po zakończeniu wzorca do wykrywania treści zwraca ona listę obiektów Detection zawierających poszczególne informacje o obiekcie znalezionym na obrazie przez model. Każdy obiekt ma opis:

  • boundingBox: prostokąt z informacją o obecności obiektu i jego lokalizacji na zdjęciu
  • categories: typ obiektu i poziom pewności co do wyniku modelu. Model zwraca wiele kategorii, a najprawdopodobniej pierwsza jest najpewniejsza.
  • label: nazwa kategorii obiektów.
  • classificationConfidence: liczba zmiennoprzecinkowa od 0,0 do 1,0, gdzie 1,0 reprezentuje 100%.

Dodaj ten kod do fun runObjectDetection(bitmap:Bitmap). Wywołuje metodę umożliwiającą wydrukowanie wyników wykrywania obiektów w Catcat.

// Step 4: Parse the detection result and show it
debugPrint(results)

Następnie dodaj tę metodę debugPrint() do klasy MainActivity:

private fun debugPrint(results : List<Detection>) {
    for ((i, obj) in results.withIndex()) {
        val box = obj.boundingBox

        Log.d(TAG, "Detected object: ${i} ")
        Log.d(TAG, "  boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")

        for ((j, category) in obj.categories.withIndex()) {
            Log.d(TAG, "    Label $j: ${category.label}")
            val confidence: Int = category.score.times(100).toInt()
            Log.d(TAG, "    Confidence: ${confidence}%")
        }
    }
} 

Twój wzorzec do wykrywania obiektów jest gotowy. Aby skompilować i uruchomić aplikację, kliknij Uruchom ( wykonaj.png) na pasku narzędzi Android Studio. Gdy aplikacja pojawi się na urządzeniu, kliknij dowolny ze wstępnie przygotowanych obrazów, by uruchomić wzorzec do wykrywania obiektów. Następnie otwórz okno Logcat*(* 16bd6ea224cf8cf1.png*)* w IDE. Jego treść powinna wyglądać podobnie do tego:

D/TFLite-ODT: Detected object: 0 
D/TFLite-ODT:   boundingBox: (0.0, 15.0) - (2223.0,1645.0)
D/TFLite-ODT:     Label 0: dining table
D/TFLite-ODT:     Confidence: 77%
D/TFLite-ODT: Detected object: 1 
D/TFLite-ODT:   boundingBox: (702.0, 3.0) - (1234.0,797.0)
D/TFLite-ODT:     Label 0: cup
D/TFLite-ODT:     Confidence: 69%

Informuje to, że wzorzec wykrył 2 obiekty. Pierwsza to:

  • Obiekt znajduje się wewnątrz prostokąta (0, 15) – (2223, 1645)
  • Etykieta to stół jadalniany
  • Model ma pewność, że pierwszy jest stółem (77%).

Technicznie to wszystko, co jest potrzebne do działania biblioteki zadań TFLite. Wszystko jest już gotowe. Gratulacje!

Jednak po stronie użytkownika nadal jesteś w punkcie początkowym. Teraz musisz skorzystać z wykrytych wyników w interfejsie po przetworzeniu ich.

6. Narysuj wynik wykrywania na obrazie wejściowym

W poprzednich krokach drukowaliśmy wynik w logcat: szybki i prosty. W tym kroku wykorzystasz metodę wykonaną dla Ciebie w aplikacji startowej, która pozwala:

  • narysuj ramkę ograniczającą na zdjęciu
  • narysuj nazwę kategorii i procent ufności w ramce
  1. Zastąp wywołanie debugPrint(results) tym fragmentem kodu:
val resultToDisplay = results.map {
    // Get the top-1 category and craft the display text
    val category = it.categories.first()
    val text = "${category.label}, ${category.score.times(100).toInt()}%"

    // Create a data object to display the detection result
    DetectionResult(it.boundingBox, text)
}
// Draw the detection result on the bitmap and show it.
val imgWithResult = drawDetectionResult(bitmap, resultToDisplay)
runOnUiThread {
    inputImageView.setImageBitmap(imgWithResult)
}
  1. Kliknij Uruchom ( wykonaj.png) na pasku narzędzi Androida Studio.
  2. Po załadowaniu aplikacji kliknij jeden z gotowych obrazów, aby zobaczyć wynik wykrywania.

Chcesz dodać własne zdjęcie? Kliknij przycisk Zrób zdjęcie, aby zrobić zdjęcia niektórych obiektów w pobliżu.

8b024362b15096a6.png

7. Wytrenuj niestandardowy model wykrywania obiektu

W poprzednim kroku zintegrowaliśmy z aplikacją na Androida wytrenowany model wykrywania obiektów TFLite i stwierdziliśmy, że potrafi on wykrywać typowe obiekty, takie jak miski czy tabele jadalniane, na przykładowych obrazach. Jednak Twoim celem jest wykrywanie składników potraw na zdjęciu, więc ogólne wykrywanie obiektów nie sprawdzi się w Twoim przypadku użycia. Chcesz wytrenować niestandardowy model wykrywania obiektu przy użyciu zbioru danych treningowych ze składnikami, które chcemy wykrywać.

Oto zbiór danych zawierający obrazy i etykiety, których możesz użyć do wytrenowania własnego modelu niestandardowego. Utworzony został na podstawie obrazów z zbioru danych Open Images V4.

Colaboratory

Przejdźmy teraz do Google Colab, aby wytrenować model niestandardowy.

Wytrenowanie modelu niestandardowego potrwa około 30 minut.

Jeśli szybko się spieszysz, możesz pobrać model, który został wstępnie wytrenowany z podanego zbioru danych, a następnie przejść do następnego kroku.

8. Integracja niestandardowego modelu TFLite z aplikacją na Androida

Po wytrenowaniu modelu wykrywania sałatki zintegruj go i przełącz aplikację ze zwykłego wzorca do wykrywania obiektów na sald.

  1. Skopiuj model TFLite sałatki do folderu assets. Nazwij nowy model salad.tflite.

91e8d37c4f78eddb.png

  1. Otwórz plik MainActivity.kt i znajdź kod inicjowania ObjectDetector.
  2. Zastąp model EfficientDet-Lite (model.tflite) modelem sałatek (salad.tflite)
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "salad.tflite", // must be same as the filename in assets folder
    options
)
  1. Kliknij Uruchom ( wykonaj.png) na pasku narzędzi Androida Studio, aby ponownie uruchomić aplikację z nowym modelem. Voilà! Aplikacja może teraz rozpoznawać sery, sałatki i wypieki.

b9705235366ae162.png

9. Gratulacje!

Korzystasz z narzędzia TFLite, aby wytrenować model niestandardowy i dodać do niego funkcje wykrywania obiektów. To wszystko, czego potrzebujesz, aby zacząć z niego korzystać.

Omawiane zagadnienia

  • Jak znaleźć wytrenowane modele wykrywania obiektów TFLite w centrum TensorFlow Hub
  • Jak zintegrować modele wykrywania zastrzeżeń z aplikacją na Androida za pomocą biblioteki zadań TFLite
  • Jak wytrenować model wykrywania niestandardowego obiektu za pomocą Kreatora modeli TFLite

Następne kroki

  • Użyj Firebase, aby ulepszyć wdrożenie modelu TFLite
  • Zbieranie danych treningowych do trenowania własnego modelu
  • Stosowanie wykrywania obiektów we własnej aplikacji na Androida

Więcej informacji