1. Zanim zaczniesz
TensorFlow to wszechstronna platforma systemów uczących się. Może być używany do trenowania dużych modeli w klastrach w chmurze lub do uruchamiania modeli lokalnie w osadzonym systemie, takim jak telefon.
To wyzwanie korzysta z TensorFlow Lite do uruchamiania modelu klasyfikacji audio na urządzeniu z Androidem.
Czego się nauczysz
- Jak znaleźć wytrenowany model systemów uczących się gotowy do użycia.
- Jak klasyfikować dźwięk w czasie rzeczywistym?
- Dowiedz się, jak korzystać z Biblioteki pomocy TensorFlow Lite, aby wstępnie przetwarzać dane wejściowe modelu i dokonać ich przetwarzania.
- Jak korzystać z Biblioteki zadań audio, aby wykonywać wszystkie zadania związane z dźwiękiem.
Co stworzysz
Prosta aplikacja do rozpoznawania dźwięku, która uruchamia model rozpoznawania dźwięku TensorFlow Lite do identyfikowania dźwięku z mikrofonu w czasie rzeczywistym
Czego potrzebujesz
- Najnowsza wersja Androida Studio (wersja 4.1.2 lub nowsza)
- Fizyczne urządzenie z Androidem w wersji API 23 (Android 6.0)
- Przykładowy kod
- Podstawowa wiedza na temat rozwoju Androida w Kotlinie
2. Pobieranie przykładowego kodu
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
) ze wszystkimi potrzebnymi zasobami. W tym ćwiczeniu z programowania będziesz potrzebować tylko źródeł w podkatalogu audio_classification/codelab1/android
.
Uwaga: jeśli wolisz, możesz skopiować repozytorium:
git clone https://github.com/googlecodelabs/odml-pathways.git
Podkatalog android
w repozytorium audio_classification/codelab1/android
zawiera 2 katalogi:
- starter – kod uruchamiany na potrzeby tego ćwiczenia.
- final (końcowy) – gotowy kod gotowej aplikacji.
Importowanie aplikacji startowej
Zacznijmy od zaimportowania aplikacji startowej do Android Studio.
- Otwórz Androida Studio i wybierz Importuj projekt (Gradle, Eclipse ADT itp.)
- Otwórz folder
starter
(audio_classification/codelab1/android/starter
) z pobranego wcześniej kodu źródłowego.
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.
- Na pasku narzędzi Androida Studio wybierz Sync Project with Gradle Files (Synchronizuj projekt z plikami 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 i kliknij Uruchom ( ) na pasku narzędzi Android Studio.
3. Znajdowanie wytrenowanego modelu
Klasyfikacja dźwięku jest niezbędna. Zacznij od wytrenowanego modelu, aby nie trzeba było go trenować samodzielnie.
Aby znaleźć wytrenowane modele, użyj TensorFlow Hub ( www.tfhub.dev).
Modele są podzielone na domeny. Obecnie potrzebne są domeny problemów z dźwiękiem.
W przypadku aplikacji przeprowadzisz klasyfikację zdarzeń za pomocą modelu YAMNet.
YAMNet to klasyfikator zdarzeń dźwiękowych, który wykorzystuje falę dźwiękową jako dane wejściowe i tworzy niezależne prognozy dla każdego zdarzenia audio 521.
Model yamnet/classification został już przekonwertowany na kod TensorFlow Lite i zawiera określone metadane, które umożliwiają użycie biblioteki zadań TFLite dla audio, aby ułatwić korzystanie z tego modelu na urządzeniach mobilnych.
Wybierz odpowiednią kartę: TFLite (yamnet/classification/tflite) i kliknij Download (Pobierz). Na dole możesz też zobaczyć metadane modelu.
Ten plik modelu (lite-model_yamnet_classification_tflite_1.tflite
) zostanie użyty w następnym kroku.
4. Importowanie nowego modelu do aplikacji podstawowej
Pierwszym krokiem jest przeniesienie pobranego modelu z poprzedniego kroku do folderu zasobów w aplikacji.
W Android Studio w eksploratorze projektu kliknij prawym przyciskiem myszy folder assets.
Pojawi się wyskakujące okienko z listą opcji. Jednym z nich jest otwarcie folderu w systemie plików. Na Macu będzie to Reveal Finder, w systemie Windows – Open in Explorer (Otwórz w Eksploratorze), a w systemie Ubuntu – Show in Files. Wybierz odpowiednią dla swojego systemu operacyjnego i wybierz ją.
Następnie skopiuj do niego pobrany model.
Gdy to zrobisz, wróć do Androida Studio – plik powinien znajdować się w folderze assets.
5. Wczytaj nowy model do aplikacji podstawowej
Teraz wykonasz niektóre zadania do wykonania i włączysz klasyfikację dźwięku na podstawie modelu dodanego przed chwilą do projektu w poprzednim kroku.
Aby znaleźć Listę zadań do wykonania, w Android Studio otwórz menu: Widok > Narzędzie Windows > TODO. Otworzy się okno z listą i możesz go kliknąć, aby przejść bezpośrednio do kodu.
W pliku build.gradle
(w wersji modułu) znajdziesz pierwsze zadanie.
TODO 1: dodaj zależności Androida:
implementation 'org.tensorflow:tensorflow-lite-task-audio:0.2.0'
Pozostałe zmiany w kodzie zostaną udostępnione MainActivity
TODO 2.1 tworzy zmienną o nazwie modelu w celu wczytania w następnych krokach.
var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"
TODO 2.2 zdefiniujesz minimalny próg, który chcesz zaakceptować na podstawie prognozy. Ta zmienna zostanie użyta później.
var probabilityThreshold: Float = 0.3f
TODO 2.3 to miejsce, w którym możesz wczytać model z folderu zasobów. Klasa AudioClassifier zdefiniowana w Bibliotece zadań audio jest gotowa do załadowania modelu i udostępnia wszystkie metody potrzebne do uruchamiania wnioskowania, a także pomaga w tworzeniu nagrania.
val classifier = AudioClassifier.createFromFile(this, modelPath)
6. Przechwytuj dźwięk
Interfejs Audio Tasks API ma kilka metod pomocnych w tworzeniu rejestratora dźwięku o odpowiedniej konfiguracji, której oczekuje Twój model (np. częstotliwość próbkowania, szybkość transmisji bitów, liczba kanałów). Dzięki temu nie musisz go znajdować ręcznie. Możesz też tworzyć obiekty konfiguracyjne.
TODO 3.1: utwórz zmienną tensora, która będzie przechowywać nagranie do wnioskowania i utwórz specyfikację formatu dla dyktafonu.
val tensor = classifier.createInputTensorAudio()
TODO 3.2: wyświetla dane techniczne Dyktafonu zdefiniowane przez metadane modelu w poprzednim kroku.
val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
"Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs
TODO 3.3: utwórz rejestrator dźwięku i rozpocznij nagrywanie.
val record = classifier.createAudioRecord()
record.startRecording()
Obecnie aplikacja słucha dźwięku z mikrofonu telefonu, ale nie ma to żadnych wpływu na działanie. W następnym kroku zajmiemy się tą sprawą.
7. Dodaj wnioskowanie do modelu
W tym kroku dodasz kod sugerowany do aplikacji i pokażesz go na ekranie. Kod ma już wątek minutnika, który jest uruchamiany co pół sekundy. To w nim będzie wykonywane wnioskowanie.
Parametry metody scheduleAtFixedRate
określają, jak długo musi upłynąć, zanim rozpocznie się wykonywanie zadania, oraz czas między kolejnymi wykonaniami. Użyj kodu poniżej 500 milisekund.
Timer().scheduleAtFixedRate(1, 500) {
...
}
TODO 4.1 Dodaj kod, by użyć modelu. Najpierw wczytaj nagranie do tensora audio i przekaż je do klasyfikatora:
tensor.load(record)
val output = classifier.classify(tensor)
TODO 4.2, by uzyskać lepsze wyniki wnioskowania, odfiltrowujemy wszystkie klasyfikacje o bardzo małym prawdopodobieństwie. W tym miejscu użyjesz zmiennej utworzonej w poprzednim kroku (probabilityThreshold
):
val filteredModelOutput = output[0].categories.filter {
it.score > probabilityThreshold
}
TODO 4.3: Aby ułatwić odczytywanie wyników, utwórz ciąg znaków z filtrowanymi wynikami:
val outputStr = filteredModelOutput.sortedBy { -it.score }
.joinToString(separator = "\n") { "${it.label} -> ${it.score} " }
TODO 4.4 Zaktualizuj interfejs użytkownika. W tej prostej aplikacji wynik jest po prostu wyświetlany w elemencie TextView. Ponieważ klasyfikacja nie jest w wątku głównym, musisz zaktualizować te elementy za pomocą modułu obsługi.
runOnUiThread {
textView.text = outputStr
}
Dodano cały kod niezbędny do:
- Wczytaj model z folderu zasobów
- Utwórz rejestrator dźwięku z odpowiednią konfiguracją
- Bieżące sprawdzanie
- Pokaż najlepsze wyniki na ekranie
Teraz wystarczy tylko przetestować aplikację.
8. Uruchamianie ostatecznej wersji aplikacji
Zintegrowano z aplikacją model klasyfikacji dźwięku, więc przetestujmy go.
Podłącz urządzenie z Androidem i kliknij Uruchom ( ) na pasku narzędzi Android Studio.
Przy pierwszym uruchomieniu musisz przyznać aplikacji uprawnienia do nagrywania dźwięku.
Gdy to zrobisz, aplikacja będzie korzystać z mikrofonu telefonu. Aby przetestować tę funkcję, zacznij mówić w pobliżu telefonu, ponieważ jedną z klas wykrytych przez YAMNet jest mowa. Inna klasa, którą można łatwo przetestować, to pękanie lub klaśnięcie.
Możesz też wykrywać szczekanie psa i wiele innych zdarzeń (521). Pełną listę znajdziesz w kodzie źródłowym tych plików. Możesz też bezpośrednio przejrzeć metadane w pliku etykiet.
9. Gratulacje!
Dzięki nim dowiesz się, jak znaleźć wytrenowany model do klasyfikacji dźwięku i wdrożyć go w aplikacji mobilnej za pomocą TensorFlow Lite. Aby dowiedzieć się więcej o TFLite, zobacz inne przykłady TFLite.
Omawiane zagadnienia
- Jak wdrożyć model TensorFlow Lite w aplikacji na Androida.
- Jak znaleźć i wykorzystać modele z TensorFlow Hub.
Następne kroki
- Dostosuj model na podstawie własnych danych.
Więcej informacji
- Dokumentacja TensorFlow Lite
- Biblioteka pomocy TensorFlow Lite
- Biblioteka zadań TensorFlow Lite
- Dokumentacja TensorFlow Hub
- Systemy uczące się działające na urządzeniu z technologiami Google