1. Zanim zaczniesz
W ramach poprzedniego ćwiczenia z programowania stworzyliśmy podstawową aplikację do klasyfikacji dźwięku.
Co w sytuacji, gdy chcesz dostosować model klasyfikacji dźwięku, aby rozpoznawał dźwięk z różnych klas, które nie znajdują się na wytrenowanym modelu? A jeśli chcesz dostosować model na podstawie własnych danych?
W tym ćwiczeniach z programowania dostosujesz wytrenowany model klasyfikacji audio tak, aby wykrywał dźwięki ptaków. Ta sama technika może być replikowana z wykorzystaniem Twoich własnych danych.
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 przenieść naukę w domenie audio?
- Tworzenie własnych danych
- Jak wdrożyć własny model w aplikacji na Androida
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. Zbiór danych ptaków
Użyjesz już zbioru danych Birdsong, który jest już gotowy do łatwiejszego użycia. Wszystkie pliki dźwiękowe pochodzą ze strony Xeno-canto.
Ten zbiór danych zawiera utwory z:
Nazwa: Wróbel domu | Kod: houspa |
Nazwa: Czerwony Krzyż | Kod: redcro |
Nazwa: biała (drewniana) | Kod: wbwwre1 |
Nazwa: Antpitta w koronach kasztanów | Kod: chcant2 |
Nazwa: Azara&s | Kod: azaspi1 |
Ten zbiór danych znajduje się w pliku ZIP, którego zawartość to:
metadata.csv
: zawiera wszystkie informacje o każdym pliku dźwiękowym, w tym informacje o tym, kto go nagrał, gdzie zostało nagrane, jaka jest jego licencja i jaka jest nazwa ptaka.- Folder pociągu i testu.
- W folderze pociągu/testu znajduje się folder na każdy kod ptaków. W każdym z nich znajdują się wszystkie pliki .wav tego ptactwa.
Wszystkie pliki audio są w formacie WAV i są zgodne z tą specyfikacją:
- Częstotliwość próbkowania 16000 Hz
- 1 kanał audio (mono)
- 16 szybkości transmisji bitów
Ta specyfikacja jest ważna, ponieważ będziesz używać modelu podstawowego, który oczekuje danych w tym formacie. Więcej informacji na ten temat znajdziesz w tym poście na blogu.
Aby ułatwić sobie cały proces, nie musisz pobierać zbioru danych na swoje urządzenie. Będzie on potrzebny w Google Colab (później w tym przewodniku).
Jeśli chcesz użyć własnych danych, wszystkie pliki audio również powinny mieć ten format.
3. Pobieranie przykładowego kodu
Pobieranie kodu
Aby pobrać cały kod do tych ćwiczeń z programowania, kliknij ten link:
Możesz też skopiować repozytorium:
git clone https://github.com/googlecodelabs/odml-pathways.git
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/codelab2/android
.
Podkatalog android
w repozytorium audio_classification/codelab2/android
zawiera 2 katalogi:
- starter – kod uruchamiany na potrzeby tego ćwiczenia.
- final (końcowy) – gotowy kod gotowej aplikacji.
Importowanie aplikacji startowej
Zacznij od zaimportowania aplikacji startowej do Androida Studio:
- Otwórz Androida Studio i wybierz Importuj projekt (Gradle, Eclipse ADT itp.)
- Otwórz folder
starter
(audio_classification/codelab2/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) ().
4. Omówienie aplikacji startowej
Jest to ta sama aplikacja, która została utworzona w pierwszym ćwiczeniu programowania na potrzeby klasyfikacji dźwięku: utwórz podstawową aplikację do klasyfikacji dźwięku.
Aby lepiej zrozumieć kod, zalecamy wykonanie tych ćwiczeń z programowania.
Cały kod znajduje się w atrybucie MainActivity
(aby maksymalnie uprościć kod).
Kod obejmuje zadania:
- Wczytuję model
val classifier = AudioClassifier.createFromFile(this, modelPath)
- Tworzę rejestrator dźwięku i rozpoczynam nagrywanie
val tensor = classifier.createInputTensorAudio()
val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
"Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs
val record = classifier.createAudioRecord()
record.startRecording()
- Tworzenie wątku minutnika, aby wyciągać wnioski. Parametry metody
scheduleAtFixedRate
określają czas oczekiwania na wykonanie wykonania oraz czas między kolejnymi wykonaniami zadań. W poniższym kodzie rozpocznie się za 1 milisekundę i będzie uruchamiany ponownie co 500 milisekund.
Timer().scheduleAtFixedRate(1, 500) {
...
}
- Wpływ na przechwycony dźwięk
val numberOfSamples = tensor.load(record)
val output = classifier.classify(tensor)
- Filtruj klasyfikację pod kątem niskich wyników
val filteredModelOutput = output[0].categories.filter {
it.score > probabilityThreshold
}
- Pokaż wyniki na ekranie
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
.joinToString(separator = "\n")
runOnUiThread {
textView.text = outputStr
}
Teraz możesz uruchomić aplikację i zapoznać się z nią w niezmienionej postaci, ale pamiętaj, że wymaga ona bardziej ogólnego, wytrenowanego modelu.
5. Wytrenuj własny model klasyfikacji audio za pomocą Kreatora modeli
W poprzednim kroku pobrałeś aplikację, która używa już wytrenowanego modelu do klasyfikowania zdarzeń dźwiękowych. Czasem jednak trzeba dostosować ten model do zdarzeń dźwiękowych, które Cię interesują, lub nadać im bardziej specjalistyczny charakter.
Jak już wspomnieliśmy, wytrenujesz model dźwięku dla ptaków. Oto zbiór danych z dźwiękiem ptaków wybranych ze strony Xeno-canto.
Colaboratory
Przejdźmy teraz do Google Colab, aby wytrenować model niestandardowy.
Wytrenowanie modelu niestandardowego potrwa około 30 minut.
Jeśli chcesz pominąć ten krok, możesz pobrać model, który został wytrenowany przez współpracownika przy użyciu podanego zbioru danych i przejść do następnego kroku.
6. Dodawanie niestandardowego modelu TFLite do aplikacji na Androida
Po wytrenowaniu własnego modelu klasyfikacji audio i zapisaniu go lokalnie musisz umieścić go w folderze zasobów aplikacji na Androida.
Pierwszym krokiem jest przeniesienie pobranego modelu z poprzedniego kroku do folderu zasobów w aplikacji.
- W Android Studio w widoku projektu na Androida kliknij prawym przyciskiem myszy folder zasobów.
- Pojawi się wyskakujące okienko z listą opcji. Jednym z nich jest otwarcie folderu w systemie plików. Wybierz odpowiednią dla swojego systemu operacyjnego i wybierz ją. Na Macu będzie to Reveal Finder (Windows), opcja Otwórz w Eksploratorze, a na Ubuntu – Show in Files.
- Skopiuj pobrany model do folderu.
Gdy to zrobisz, wróć do Android Studio, gdzie plik powinien się pojawić w folderze zasobów.
7. Wczytaj nowy model do aplikacji podstawowej
Aplikacja podstawowa korzysta już z już wytrenowanego modelu. Zastąpisz to, z którego właśnie trenujesz.
- TODO 1: aby wczytać nowy model po dodaniu go do folderu assets, zmień wartość zmiennej
modelPath
:
var modelPath = "my_birds_model.tflite"
Nowy model ma dwa dane wyjściowe (nagłówki):
- Oryginalne, bardziej ogólne dane wyjściowe z używanego modelu podstawowego, w tym przypadku YAMNet.
- Dodatkowe dane wyjściowe dotyczące ptaków używanych podczas trenowania.
Jest to konieczne, ponieważ YAMNet świetnie sobie radzi z rozpoznawaniem wielu popularnych klas, takich jak Silence. Dzięki temu nie musisz się martwić o pozostałe zajęcia, których nie udało Ci się dodać do zbioru danych.
Jeśli klasyfikacja YAMNet wykaże najwyższy wynik w przypadku danej klasy ptaków, należy sprawdzić, który ptaszek występuje w jego pozostałych danych.
- TODO 2: przeczytaj, jeśli pierwszy w klasyfikacji ma dużą pewność, że dźwięk brzmi ptaka. Tutaj możesz zmienić filtrowanie, by odfiltrować też wszystkie treści, które nie są ptakami:
val filteredModelOuput = output[0].categories.filter {
it.label.contains("Bird") && it.score > .3
}
- TODO 3: jeśli podstawowa głowica modelu wykryje ptaka w dźwięku, z dużym prawdopodobieństwem wyświetli go na drugiej głowie:
if (filteredModelOutput.isNotEmpty()) {
Log.i("Yamnet", "bird sound detected!")
filteredModelOutput = output[1].categories.filter {
it.score > probabilityThreshold
}
}
To wszystko. Zmiana modelu tak, by używała tego właśnie wytrenowanego modelu jest prosta.
Następnym krokiem jest przetestowanie tej funkcji.
8. Testowanie aplikacji na nowym modelu
Zintegrowałeś 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.
Aplikacja powinna być w stanie poprawnie przewidywać dźwięk ptaków. Aby ułatwić testowanie, po prostu odtwórz jeden z plików audio z komputera (z poprzednich kroków), a telefon wykryje go. Jeśli tak się stanie, wyświetli na ekranie nazwę ptaka oraz prawdopodobieństwo, że jest on prawidłowy.
9. Gratulacje
Dzięki nim dowiesz się, jak za pomocą Kreatora modeli utworzyć własny model klasyfikacji dźwięku i wdrożyć go w aplikacji mobilnej TensorFlow Lite. Aby dowiedzieć się więcej o TFLite, zobacz inne przykłady TFLite.
Omawiane zagadnienia
- Jak przygotować własny zbiór danych
- Jak przenieść klasyfikację dźwięku za pomocą Kreatora modeli
- Jak korzystać z modelu w aplikacji na Androida
Następne kroki
- Wypróbuj własne dane
- Pokaż nam, co tworzysz
Więcej informacji
- Link do ścieżki szkoleniowej
- Dokumentacja TensorFlow Lite
- Dokumentacja Kreatora modeli
- Dokumentacja TensorFlow Hub
- Systemy uczące się działające na urządzeniu z technologiami Google