Wykrywanie obiektów na obrazach za pomocą ML Kit: Android

1. Zanim zaczniesz

ML Kit to mobilny pakiet SDK, który pozwala korzystać z opracowanej przez Google wiedzy z zakresu systemów uczących się działających na urządzeniu w aplikacjach na Androida i iOS. Możesz użyć zaawansowanych, ale prostych w obsłudze interfejsów API Vision i naturalnych języka, aby rozwiązywać typowe problemy z aplikacjami lub tworzyć zupełnie nowe wrażenia użytkowników. Wszystkie są oparte na najlepszych w swojej klasie modelach systemów uczących się opracowanych przez Google i oferowane bezpłatnie.

Wszystkie interfejsy API ML Kit działają na urządzeniu, dzięki czemu można na przykład przetworzyć transmisję z kamery w czasie rzeczywistym. Oznacza to też, że funkcja jest dostępna offline.

Dzięki nim dowiesz się, jak w prosty sposób dodać wykrywanie i śledzenie obiektów (ODT) do wcześniej utworzonej aplikacji na Androida. Uwaga: to ćwiczenia z programowania zawiera skróty, aby wyróżnić użycie ML Kit ODT.

Co utworzysz

W ramach tego ćwiczenia w Codelabs dowiesz się, jak utworzyć aplikację na Androida przy użyciu ML Kit. Twoja aplikacja będzie używać interfejsu ML Kit Object Detection i Tracking API do wykrywania obiektów na danym obrazie.Po prawej stronie zobaczysz coś podobnego do tego na obrazie.

Czego się nauczysz

  • Jak zintegrować ML Kit SDK z aplikacją na Androida
  • Interfejs API wykrywania i śledzenia obiektów ML Kit

Czego potrzebujesz

  • najnowszą wersję Android Studio (4.1.2 lub nowszą),
  • Emulator Android Studio lub fizyczne urządzenie z Androidem
  • Przykładowy kod
  • Podstawowa wiedza o programowaniu na Androida w Kotlin

To ćwiczenia w programowaniu koncentrują się na ML Kit. Nieistotne koncepcje i bloki kodu zostały zamaskowane. Można je po prostu skopiować i wkleić.

2. Konfiguracja

Pobieranie kodu

Kliknij poniższy link, aby pobrać cały kod do tego ćwiczenia w Codelabs:

Rozpakuj pobrany plik ZIP. Spowoduje to rozpakowanie folderu głównego (mlkit-android-main) ze wszystkimi potrzebnymi zasobami. W tym ćwiczeniu w Codelabs będziesz potrzebować tylko źródeł znajdujących się w podkatalogu object-detection.

Podkatalog wykrywania obiektów w repozytorium mlkit-android zawiera 2 katalogi:

  • android_studio_folder.pngstarter – kod początkowy, który utworzysz w ramach tego ćwiczenia z programowania.
  • android_studio_folder.pngfinal – kompletny kod gotowej przykładowej aplikacji.

3. Dodaj do projektu interfejs ML Kit Object Detection i Tracking API

Importowanie aplikacji do Android Studio

Zacznijmy od zaimportowania aplikacji startowej do Android Studio.

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

7c0f27882a2698ac.png

Dodawanie zależności na potrzeby wykrywania i śledzenia obiektów ML Kit

Zależności ML Kit umożliwiają zintegrowanie pakietu ML Kit ODT SDK z aplikacją. Dodaj te wiersze na końcu pliku app/build.gradle projektu:

build.gradle

dependencies {
  // ...
  implementation 'com.google.mlkit:object-detection:16.2.4'
}

Synchronizowanie projektu z plikami Gradle

Aby mieć pewność, że w przypadku aplikacji dostępne są wszystkie zależności, zsynchronizuj projekt z plikami Gradle.

Wybierz Sync Project with Gradle Files (Synchronizuj projekt z plikami Gradle) (b451ab2d04d835f9.png) na pasku narzędzi Android Studio.

(Jeśli ten przycisk jest wyłączony, upewnij się, że importujesz tylko starter/app/build.gradle , a nie całe repozytorium.)

4. Uruchom aplikację startową

Po zaimportowaniu projektu do Android Studio i dodaniu zależności na potrzeby wykrywania i śledzenia obiektów ML Kit możesz uruchomić aplikację po raz pierwszy.

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

Uruchamianie i poznawanie aplikacji

Aplikacja powinna uruchomić się na urządzeniu z Androidem. Zawiera stały kod, który umożliwia zrobienie zdjęcia lub wybranie gotowego obrazu i przekazanie go do potoku wykrywania i śledzenia obiektów, który utworzysz w ramach tego ćwiczenia. Przyjrzyjmy się aplikacji trochę, zanim zaczniesz pisać kod.

Najpierw na dole znajduje się przycisk ( c6d965d639c3646.png), który umożliwia:

  • wyświetl aplikację aparatu zintegrowaną z urządzeniem/emulatorem
  • zrób zdjęcie w aplikacji aparatu
  • otrzymuj zrzut ekranu w aplikacji startowej
  • wyświetl obraz

Wypróbuj przycisk Zrób zdjęcie. Postępuj zgodnie z instrukcjami, aby zrobić zdjęcie, zaakceptuj zdjęcie i zobacz, jak wyświetla się w aplikacji startowej.

Powtórz kilka razy, aby zobaczyć, jak to działa:

9ec541980dbe2d31.png 8312dde41425ba4b.png fa8492bfc1914ff0.png

Masz do wyboru 3 gotowe obrazy. Możesz ich później użyć do przetestowania kodu wykrywania obiektów, jeśli korzystasz z emulatora Androida.

Wybierz obraz z 3 gotowych obrazów. Zobacz, że obraz pojawia się w większym widoku:

1dd41b3ec978f1d9.png

5. Dodaj wykrywanie obiektów na urządzeniu

W tym kroku dodasz do aplikacji startowej funkcję wykrywania obiektów na obrazach. Jak widać w poprzednim kroku, aplikacja startowa zawiera stały kod służący do robienia zdjęć aparatem na urządzeniu. W aplikacji są też 3 gotowe obrazy, w których możesz wypróbować wykrywanie obiektów, jeśli wykonujesz ćwiczenia z programowania w emulatorze Androida.

Gdy wybierzesz obraz z gotowych zdjęć lub zrobisz zdjęcie za pomocą aplikacji aparatu, stały kod zdekoduje ten obraz do instancji Bitmap, wyświetli go na ekranie i wywoła metodę runObjectDetection z obrazem.

W tym kroku dodasz do metody runObjectDetection kod służący do wykrywania obiektów.

Konfigurowanie i uruchamianie wykrywania obiektów na urządzeniu na zdjęciu

Aby skonfigurować ML Kit ODT, musisz wykonać tylko 3 proste kroki i 3 interfejsy API:

  • przygotuj obraz: InputImage
  • utwórz obiekt wzorca: ObjectDetection.getClient(options)
  • połącz 2 obiekty powyżej: process(image)

Osiągasz je w funkcji runObjectDetection(bitmap: Bitmap) w pliku MainActivity.kt.

/**
 * ML Kit Object Detection Function
 */
private fun runObjectDetection(bitmap: Bitmap) {
}

W tej chwili funkcja jest pusta. Przejdź do poniższych kroków, aby wdrożyć ML Kit ODT. W międzyczasie Android Studio wyświetli prośbę o dodanie niezbędnych importów:

  • com.google.mlkit.vision.common.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

Krok 1. Utwórz obraz wejściowy

ML Kit zapewnia prosty interfejs API do tworzenia InputImage z Bitmap. Następnie możesz przesłać InputImage do interfejsów ML Kit API.

// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)

Dodaj powyższy kod na początku kodu runObjectDetection(bitmap:Bitmap).

Krok 2. Utwórz instancję wzorca do wykrywania treści

ML Kit jest zgodny ze wzorcem projektu kompilacji. W ten sposób przekażesz konfigurację do kreatora, a następnie pobierzesz z niego detektor. Dostępne są 3 opcje konfiguracji (opcje wyróżnione pogrubieniem zostały użyte w tym ćwiczeniu w programowaniu):

  • tryb wzorca do wykrywania (pojedynczy obraz lub strumień)
  • tryb wykrywania (wykrywanie pojedynczego lub wielu obiektów)
  • tryb klasyfikacji (wł. lub wyłączony)

To ćwiczenie w Codelabs dotyczy pojedynczych zdjęć, wykrywania wielu obiektów klasyfikacja danych. Dodaj teraz:

// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
   .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
   .enableMultipleObjects()
   .enableClassification()
   .build()
val objectDetector = ObjectDetection.getClient(options)

Krok 3. Prześlij zdjęcia do wzorca

Wykrywanie i klasyfikacja obiektów jest przetwarzane asynchroniczne:

  • Wysyłasz obraz do wzorca do wykrywania treści (za pomocą aplikacji process()).
  • Czujnik robi na nim dość intensywnie.
  • Wzorzec do wykrywania treści przekazuje Ci wynik przez wywołanie zwrotne.

Służy do tego poniższy kod (skopiuj i dołącz go do istniejącego kodu wewnątrz tagu fun runObjectDetection(bitmap:Bitmap)):).

// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
   .addOnSuccessListener {
       // Task completed successfully
        debugPrint(it)
   }
   .addOnFailureListener {
       // Task failed with an exception
       Log.e(TAG, it.message.toString())
   }

Po zakończeniu detektor powiadomi Cię w ten sposób:

  • Łączna liczba wykrytych obiektów. Każdy wykryty obiekt jest opisany w następujący sposób:
  • trackingId: liczba całkowita służąca do śledzenia jej w obrębie ramek (NIE jest używana w tym ćwiczeniu z programowania).
  • boundingBox: ramka ograniczająca obiektu.
  • labels: listę etykiet wykrytego obiektu (tylko wtedy, gdy włączona jest klasyfikacja):
  • index (Pobierz indeks tej etykiety)
  • text (pobierz tekst tej etykiety, np. „Odzież”, „Żywność”, „Wyposażenie domu”, „Miejsce”, „Roślina”)
  • confidence ( liczba zmiennoprzecinkowa między 0,0 a 1,0 z wartością 1,0 oznacza 100%)

Pewnie już wiesz, że w przypadku wykrytego wyniku kod debugPrint() przetwarza dane w rodzaju „printf”.

Dodaj je do MainActivity zajęć:

private fun debugPrint(detectedObjects: List<DetectedObject>) {
   detectedObjects.forEachIndexed { index, detectedObject ->
       val box = detectedObject.boundingBox

       Log.d(TAG, "Detected object: $index")
       Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
       Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
       detectedObject.labels.forEach {
           Log.d(TAG, " categories: ${it.text}")
           Log.d(TAG, " confidence: ${it.confidence}")
       }
   }
}

Teraz możesz akceptować obrazy do wykrywania.

Wykonajmy ćwiczenia w Codelabs, klikając Uruchom ( Wykonaj.png) na pasku narzędzi Android Studio. Wybierz gotowy obraz lub zrób zdjęcie i spójrz na okno logcat( 16bd6ea224cf8cf1.png) w IDE.

Zobaczysz tekst podobny do tego:

D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection:  categories: Food
D/MLKit Object Detection:  confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection:  categories: Home good
D/MLKit Object Detection:  confidence: 0.75390625

...co oznacza, że detektor wykrył 3 obiekty:

  • Dostępne kategorie to Jedzenie i Produkty domowe.
  • 2 miejsce nie zostało zwrócone, ponieważ jest to klasa nieznana.
  • Nie trackingId (ponieważ jest to tryb wykrywania pojedynczego obrazu).
  • Pozycja wewnątrz prostokąta boundingBox (np. (481, 2021) – (2426, 3376))
  • Wzorzec do wykrywania treści jest dość pewny, że pierwsza pozycja to Jedzenie (pewność 90% – to była sałatka).

To wszystko, czego potrzebujesz, aby wykrywanie obiektów za pomocą ML Kit działało. Masz już wszystko, czego potrzebujesz. Gratulacje!

Jeśli chodzi o interfejs, to wciąż jesteś na etapie początkowym, ale możesz wykorzystać wykryte wyniki w interfejsie, na przykład narysować ramkę ograniczającą, aby zwiększyć wygodę użytkowania. Przejdźmy do następnego kroku, czyli do przetworzenia wykrytych wyników.

6. Przetwarzanie wyników wykrywania

Wykryte wyniki wydrukujesz do pliku logcat. To proste i szybkie rozwiązanie.

W tej sekcji użyjesz wyniku na obrazie:

  • narysuj na obrazie ramkę ograniczającą
  • narysuj nazwę kategorii i poziom ufności w ramce ograniczającej

Korzystanie z narzędzi do wizualizacji

W ćwiczeniach z programowania znajdziesz stały kod, który pomoże Ci zwizualizować wynik wykrywania. Opisane poniżej narzędzia pozwalają uprościć kod wizualizacji:

  • data class BoxWithText(val box: Rect, val text: String) To klasa danych do przechowywania wyniku wykrywania obiektów na potrzeby wizualizacji. box to ramka ograniczająca, w której znajduje się obiekt, a text to ciąg wyniku wykrywania, który jest wyświetlany razem z ramką ograniczającą obiektu.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap Ta metoda pobiera wynik wykrywania obiektu w wartości detectionResults z danych wejściowych bitmap i zwraca jego zmodyfikowaną kopię.

Oto przykład danych wyjściowych metody narzędzia drawDetectionResult:

58c6f1d4ddb00dfa.png

Wizualizacja wyniku wykrywania ML Kit

Za pomocą narzędzi do wizualizacji rysuj wynik wykrywania obiektów ML Kit na obrazie wejściowym.

Przejdź do miejsca, w którym wywołujesz debugPrint(), i dodaj pod nim ten fragment kodu:

// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
    var text = "Unknown"

    // We will show the top confident detection result if it exist
    if (obj.labels.isNotEmpty()) {
        val firstLabel = obj.labels.first()
        text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
    }
    BoxWithText(obj.boundingBox, text)
}

// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)

// Show the detection result on the app screen
runOnUiThread {
    inputImageView.setImageBitmap(visualizedResult)
}
  • Zacznij od analizy elementu DetectedObject ML Kit i utworzenia listy obiektów BoxWithText do wyświetlenia wyniku wizualizacji.
  • Następnie rysujesz wynik wykrywania na obrazie wejściowym, używając metody narzędzia drawDetectionResult, i pokazujesz go na ekranie.

Uruchamianie

Teraz kliknij Uruchom ( Wykonaj.png) na pasku narzędzi Android Studio.

Po załadowaniu aplikacji naciśnij przycisk z ikoną aparatu, skieruj aparat na obiekt, zrób zdjęcie lub zaakceptuj je (w aplikacji Aparat) albo z łatwością kliknij dowolne z gotowych zdjęć. Powinny wyświetlić się wyniki wykrycia. jeszcze raz naciśnij przycisk lub wybierz inny obraz, aby powtórzyć te czynności kilka razy i cieszyć się najnowszą wersją ML Kit ODT.

a03109cb30d5014d.png

7. Gratulacje!

Udało Ci się dodać do swojej aplikacji funkcje wykrywania obiektów za pomocą ML Kit:

  • 3 kroki z 3 interfejsami API
  • Utwórz obraz wejściowy
  • Utwórz detektor
  • Wyślij obraz do detektora

To wszystko, czego potrzebujesz, aby zacząć korzystać z tej funkcji.

Kontynuując, możesz ulepszyć model: jak widać, że model domyślny rozpoznaje tylko 5 kategorii – nie zna nawet noża, widelca ani butelki. Zapoznaj się z innymi ćwiczeniami z programowania w ramach ścieżki szkoleniowej „Uczenie maszynowe – wykrywanie obiektów na urządzeniu”, aby dowiedzieć się, jak wytrenować model niestandardowy.

Omówione zagadnienia

  • Jak dodać wykrywanie i śledzenie obiektów ML Kit do aplikacji na Androida
  • Jak używać wykrywania i śledzenia obiektów na urządzeniu w ML Kit do wykrywania obiektów na obrazach

Następne kroki

  • Dowiedz się więcej dzięki ML Kit ODT z większą liczbą obrazów i transmisji wideo na żywo, aby wykryć dokładność i skuteczność klasyfikacji
  • Zapoznaj się ze ścieżką szkoleniową Wykrywanie obiektów na urządzeniu, aby dowiedzieć się, jak wytrenować model niestandardowy
  • Stosowanie ML Kit ODT w własnej aplikacji na Androida

Więcej informacji