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:
- starter – kod początkowy, który utworzysz w ramach tego ćwiczenia z programowania.
- final – 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.
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) () 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 ( ) 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 ( ), 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:
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:
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 ( ) na pasku narzędzi Android Studio. Wybierz gotowy obraz lub zrób zdjęcie i spójrz na okno logcat( ) 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, atext
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ścidetectionResults
z danych wejściowychbitmap
i zwraca jego zmodyfikowaną kopię.
Oto przykład danych wyjściowych metody narzędzia drawDetectionResult
:
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ówBoxWithText
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 ( ) 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.
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