1. Zanim zaczniesz
ML Kit to pakiet SDK na urządzenia mobilne, który udostępnia mechanizmy uczenia się maszynowego Google na potrzeby aplikacji na Androida i iOS. Możesz używać zaawansowanych, a jednocześnie prostych w użyciu interfejsów Vision i Natural Language API, aby rozwiązywać typowe problemy w aplikacjach lub tworzyć zupełnie nowe wrażenia dla użytkowników. Wszystkie są oparte na najlepszych w swojej klasie modelach ML od Google i oferowane bezpłatnie.
Interfejsy API ML Kit działają na urządzeniu, co umożliwia stosowanie ich w czasie rzeczywistym, np. do przetwarzania strumienia danych z kamery. Oznacza to też, że funkcja jest dostępna offline.
W tym Codelab znajdziesz proste instrukcje dodawania wykrywania i śledzenia obiektów (ODT) w przypadku danego obrazu w dotychczasowej aplikacji na Androida. Pamiętaj, że w tym przypadku używamy skrótów, aby pokazać, jak korzystać z funkcji ODT w ML Kit.
Co utworzysz
W tym ćwiczeniu z programowania utworzysz aplikację na Androida za pomocą ML Kit. Aplikacja będzie wykrywać obiekty na danym obrazie za pomocą interfejsu ML Kit Object Detection and Tracking API.Ostatecznie powinno się wyświetlić coś podobnego do obrazu po prawej stronie. |
Czego się nauczysz
- Jak zintegrować pakiet ML Kit SDK z aplikacją na Androida
- Interfejs API ML Kit do wykrywania i śledzenia obiektów
Czego potrzebujesz
- najnowsza wersja Android Studio (4.1.2 lub nowsza);
- emulator Android Studio lub fizyczne urządzenie z Androidem,
- Przykładowy kod
- podstawowa znajomość tworzenia aplikacji na Androida w Kotlinie;
Ten moduł dotyczy ML Kit. Nieistotne koncepcje i bloki kodu zostały zamaskowane. Można je po prostu skopiować i wkleić.
2. Konfiguracja
Pobieranie kodu
Aby pobrać cały kod tego ćwiczenia, kliknij ten link:
Rozpakuj pobrany plik ZIP. Spowoduje to rozpakowanie folderu głównego (mlkit-android-main
) ze wszystkimi potrzebnymi zasobami. W tym ćwiczeniu będziesz potrzebować tylko źródeł w podkatalogu object-detection
.
Podkatalog wykrywania obiektów w repozytorium mlkit-android zawiera 2 katalogi:
- starter – kod startowy, na którym możesz budować w ramach tego ćwiczenia z programowania.
- final – gotowy kod gotowej przykładowej aplikacji.
3. Dodawanie do projektu interfejsu ML Kit Object Detection and 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 poprzednio pobranego kodu źródłowego.
Dodawanie zależności dla wykrywania i śledzenia obiektów w ML Kit
Zależność ML Kit umożliwia zintegrowanie pakietu SDK ML Kit ODT 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'
}
Synchronizacja projektu z plikami Gradle
Aby mieć pewność, że wszystkie zależności są dostępne dla aplikacji, na tym etapie zsynchronizuj projekt z plikami Gradle.
Na pasku narzędzi Android Studio wybierz Synchronizuj projekt z plikami Gradle ( ).
(Jeśli ten przycisk jest wyłączony, importuj tylko starter/app/build.gradle
, a nie całe repozytorium).
4. Uruchamianie aplikacji wyjściowej
Po zaimportowaniu projektu do Android Studio i dodaniu zależności dla wykrywania i śledzenia obiektów 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 się uruchomić na urządzeniu z Androidem. Zawiera on pewien szablon kodu, który umożliwia zrobienie zdjęcia lub wybranie wstępnie ustawionego obrazu i przekazanie go do systemu wykrywania i śledzenia obiektów, który utworzysz w tym ćwiczeniu. Zanim zaczniesz pisać kod, przyjrzyj się aplikacji.
Na dole znajduje się przycisk ( ), który umożliwia:
- otwórz aplikację aparatu zintegrowaną z urządzeniem lub emulatorem.
- zrobić zdjęcie w aplikacji aparatu,
- otrzymasz zrobione zdjęcie w aplikacji startowej.
- wyświetlać obraz.
Kliknij przycisk Zrób zdjęcie, postępuj zgodnie z wyświetlanymi instrukcjami, aby zrobić zdjęcie, zaakceptuj zdjęcie i obserwuj, jak wyświetla się ono w aplikacji startowej.
Powtórz te czynności kilka razy, aby zobaczyć, jak to działa:
Po drugie, możesz wybrać 1 z 3 wstępnie przygotowanych obrazów. Jeśli używasz emulatora Androida, możesz później użyć tych obrazów do przetestowania kodu wykrywania obiektów.
Wybierz 1 z 3 wstępnie ustawionych obrazów. Sprawdź, czy obraz jest widoczny w większym widoku:
5. Dodawanie wykrywania obiektów na urządzeniu
W tym kroku dodasz do aplikacji startowej funkcję wykrywania obiektów na zdjęciach. Jak widzisz w poprzednim kroku, aplikacja startowa zawiera kod szablonowy do robienia zdjęć za pomocą aplikacji aparatu na urządzeniu. W aplikacji znajdziesz też 3 wstępnie ustawione obrazy, na których możesz przetestować wykrywanie obiektów, jeśli korzystasz z ćwiczenia z programowania na emulatorze Androida.
Gdy wybierzesz obraz z gotowych obrazów lub zrobisz zdjęcie za pomocą aplikacji aparatu, kod szablonu dekoduje ten obraz w instancję Bitmap
, wyświetli go na ekranie i wywoła metodę runObjectDetection
z tym obrazem.
W tym kroku dodasz kod do metody runObjectDetection
, aby wykrywać obiekty.
Konfigurowanie i uruchamianie wykrywania obiektów na urządzeniu na obrazie
Aby skonfigurować ML Kit ODT, wystarczy wykonać 3 proste kroki i użyć 3 interfejsów API:
- przygotuj obraz:
InputImage
- utworzyć obiekt detektora:
ObjectDetection.getClient(options)
- połącz 2 powyżej wymienione obiekty:
process(image)
Zmienne te są dostępne w funkcji runObjectDetection(bitmap: Bitmap)
w pliku MainActivity.kt
.
/**
* ML Kit Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
}
Obecnie funkcja jest pusta. Aby zaimplementować ODT ML Kit, wykonaj te czynności. W trakcie importowania Android Studio poprosi Cię o dodanie niezbędnych plików:
com.google.mlkit.vision.common.InputImage
com.google.mlkit.vision.objects.ObjectDetection
com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions
Krok 1. Utwórz InputImage
ML Kit udostępnia 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 pliku runObjectDetection(bitmap:Bitmap)
.
Krok 2. Utwórz instancję wzorca do wykrywania treści
ML Kit stosuje wzorzec projektowy Builder. Konfigurację przekażesz kreatorowi, a potem uzyskasz od niego detektor. Dostępne są 3 opcje do skonfigurowania (w tym ćwiczeniu używamy opcji w pogrubieniu):
- tryb wzorca do wykrywania (pojedynczy obraz lub strumień);
- tryb wykrywania (pojedyncze lub wielokrotne wykrywanie obiektów);
- tryb klasyfikacji (włączony lub wyłączony);
To Codelab służy do wykrywania i klasyfikowania wielu obiektów na jednym obrazie. Dodaj to 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 obrazy do wykrywacza
Wykrywanie i klasyfikowanie obiektów odbywa się asynchronicznie:
- Wysyłasz obraz do wykrywacza (za pomocą
process()
). - Detektor bardzo ciężko pracuje.
- Detektor powiadomi Cię o wyniku za pomocą wywołania zwrotnego.
Poniżej znajduje się kod, który to robi (skopiuj i dodaj go do istniejącego kodu w pliku 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 działania detektor powiadomi Cię o tym:
- Łączna liczba wykrytych obiektów. Każdy wykryty obiekt jest opisany za pomocą tych informacji:
trackingId
: liczba całkowita używana do śledzenia obiektu w ramach poszczególnych klatek (NIE jest używana w tym laboratorium kodu).boundingBox
: ramka ograniczająca obiektu.labels:
listę etykiet dla wykrytego obiektu (tylko gdy włączona jest klasyfikacja):index
(pobierz indeks tej etykiety)text
(uzyskaj tekst tej etykiety, w tym „Towary modowe”, „Produkty spożywcze”, „Towary domowe”, „Miejsca”, „Rośliny”)confidence
( liczba zmiennoprzecinkowa od 0,0 do 1,0, gdzie 1,0 oznacza 100%).
Zauważysz pewnie, że kod wykonuje przetwarzanie wykrycia za pomocą funkcji printf (debugPrint()
).
Dodaj je do klasy MainActivity
:
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}")
}
}
}
Możesz już akceptować obrazy do wykrywania.
Uruchom Codelab, klikając Uruchom ( ) na pasku narzędzi Android Studio. Spróbuj wybrać gotowy obraz lub zrobić zdjęcie, a potem otwórz okno logcat( ) w IDE.
Powinien pojawić się ekran 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 wykrywca zobaczył 3 obiekty:
- Te kategorie to Jedzenie i Towary domowe.
- Druga kategoria nie jest zwracana, ponieważ jest to nieznany typ.
- Nie
trackingId
(ponieważ jest to tryb wykrywania pojedynczego obrazu). - Położenie wewnątrz prostokąta
boundingBox
(np. (481, 2021) – (2426, 3376)) - Detektor jest dość pewny, że pierwszy element to Food (90% pewności – to była sałatka).
Technicznie rzecz biorąc, to wszystko, czego potrzebujesz, aby uruchomić wykrywanie obiektów za pomocą ML Kit: masz już wszystko. Gratulacje!
W przypadku interfejsu użytkownika nadal jesteś na etapie, na którym zaczęliśmy, ale możesz wykorzystać wykryte wyniki w interfejsie, np. narysować prostokąt ograniczający, aby zwiększyć wygodę korzystania z aplikacji. Przejdźmy do następnego kroku, czyli post-processingu wykrytych wyników.
6. Przetwarzanie wyników wykrywania
W poprzednich krokach wydrukowałeś wynik wykrycia w logcat: szybko i bezproblemowo.
W tej sekcji wykorzystasz wynik w obrazie:
- narysuj ramkę ograniczającą na obrazie
- narysuj nazwę kategorii i poziom pewności w ramce
Informacje o narzędziach do wizualizacji
W ramach tego ćwiczenia znajdziesz kod szablonowy, który pomoże Ci zwizualizować wynik wykrywania. Aby uprościć kod wizualizacji, użyj tych narzędzi:
data class BoxWithText(val box: Rect, val text: String)
To klasa danych służąca do przechowywania wyników wykrywania obiektów na potrzeby wizualizacji.box
to ramka ograniczająca, w której znajduje się obiekt, atext
to ciąg znaków z wynikiem wykrywania, który ma być wyświetlany razem z ramką ograniczającą obiektu.fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap
Ta metoda rysuje wyniki wykrywania obiektów wdetectionResults
na wejściubitmap
i zwraca zmodyfikowaną kopię.
Oto przykład danych wyjściowych metody pomocniczej drawDetectionResult
:
Wizualizacja wyniku wykrywania za pomocą ML Kit
Użyj narzędzi do wizualizacji, aby na obrazie wejściowym narysować wynik wykrywania obiektów za pomocą ML Kit.
Przejdź do miejsca, w którym wywołujesz funkcję debugPrint()
, i dodaj pod nią 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)
}
- Najpierw musisz przeanalizować
DetectedObject
z ML Kit i utworzyć listę obiektówBoxWithText
, aby wyświetlić wynik wizualizacji. - Następnie za pomocą metody pomocniczej
drawDetectionResult
rysujesz wynik wykrywania na obrazie wejściowym i wyświetlasz go na ekranie.
Uruchom
Teraz na pasku narzędzi Android Studio kliknij Uruchom ( ).
Po załadowaniu aplikacji naciśnij przycisk z ikoną aparatu, skieruj aparat na obiekt, zrób zdjęcie, zaakceptuj zdjęcie (w aplikacji Aparat) lub wybierz dowolne zdjęcie z biblioteki. Powinieneś zobaczyć wyniki wykrywania. Naciśnij ponownie przycisk lub wybierz inny obraz, aby powtórzyć proces kilka razy i sprawdzić najnowszą wersję ML Kit ODT.
7. Gratulacje!
Użyłeś/użyłaś ML Kit, aby dodać do aplikacji funkcję wykrywania obiektów:
- 3 kroki z 3 interfejsami API
- Tworzenie obrazu wejściowego
- Tworzenie wzorca
- Wysyłanie obrazu do wykrywacza
To wszystko, czego potrzebujesz, aby zacząć korzystać z usługi.
W miarę postępów możesz ulepszać model: jak widzisz, model domyślny rozpoznaje tylko 5 kategorii – nie zna nawet noża, widelca i butelki. Aby dowiedzieć się, jak wytrenować własny model, zapoznaj się z innymi laboratoriami kodu na ścieżce nauki dotyczącej systemów uczących się na urządzeniu – wykrywanie obiektów.
Omówione zagadnienia
- Dodawanie wykrywania i śledzenia obiektów za pomocą ML Kit do aplikacji na Androida
- Wykrywanie i śledzenie obiektów na urządzeniu w ML Kit do wykrywania obiektów na zdjęciach
Następne kroki
- Poznaj więcej możliwości ML Kit ODT dzięki większej liczbie obrazów i filmów na żywo, aby sprawdzić dokładność i skuteczność wykrywania oraz klasyfikacji
- Aby dowiedzieć się, jak wytrenować model niestandardowy, zapoznaj się z materiałami z sekcji „Systemowe uczenie maszynowe – ścieżka edukacyjna dotycząca wykrywania obiektów”.
- Stosowanie pakietu ODT ML Kit w aplikacji na Androida