1. Antes de começar
No codelab anterior, você criou um app básico para classificação de áudio.
E se você quiser personalizar o modelo de classificação de áudio para reconhecer áudios de diferentes classes não presentes em um modelo pré-treinado? E se você quiser personalizar o modelo usando seus próprios dados?
Neste codelab, você personalizará um modelo pré-treinado de classificação de áudio para detectar sons de pássaros. A mesma técnica pode ser replicada com seus próprios dados.
Prerequisites
Este codelab foi projetado para desenvolvedores móveis experientes que querem ganhar experiência com machine learning. Você precisa:
- Desenvolvimento para Android usando Kotlin e Android Studio
- Sintaxe básica do Python
O que você aprenderá
- Como fazer aprendizado por transferência no domínio de áudio
- Como criar seus próprios dados
- Como implantar seu próprio modelo em um app Android
Pré-requisitos
- Uma versão recente do Android Studio (v4.1.2 ou mais recente)
- Dispositivo físico Android com a versão 23 da API (Android 6.0)
- Código de amostra
- Conhecimento básico de desenvolvimento Android no Kotlin.
2. O conjunto de dados "birds"
Você usará um conjunto de dados do Birong que já está preparado para facilitar o uso. Todos os arquivos de áudio podem ser encontrados no site do Xeno-canto.
Este conjunto de dados contém músicas de:
Nome: House Sparrow | Código: houspa |
Nome: Red Crossbill | Código: redcro |
Nome: madeira de madeira branca | Código: wbwwre1 |
Nome: Antpitta com coroa de castanhas | Código: chcant2 |
Nome: Spinetail de Azara | Código: azaspi1 |
Este conjunto de dados está em um arquivo ZIP, e o conteúdo dele é:
- Um
metadata.csv
com todas as informações sobre cada arquivo de áudio, como quem gravou o áudio, onde ele foi gravado, a licença de uso e o nome do pássaro. - Uma pasta de treinamento e teste
- Dentro das pastas de treinamento/teste, há uma pasta para cada código de pássaros. Dentro de cada um deles há todos os arquivos .wav para o pássaro dessa divisão.
Os arquivos de áudio estão todos no formato wav e seguem esta especificação:
- Taxa de amostragem de 16.000 Hz
- 1 canal de áudio (mono)
- Taxa de bits de 16
Essa especificação é importante porque você usará um modelo base que espera dados nesse formato. Para saber mais, leia outras informações nesta postagem do blog.
Para facilitar todo o processo, não é necessário fazer o download do conjunto de dados na sua máquina. Ele será usado no Google Colab (mais adiante neste guia).
Se você quiser usar seus próprios dados, todos os arquivos de áudio também precisarão estar nesse formato específico.
3. Como obter o código de amostra
Fazer o download do código
Clique no link abaixo para fazer o download de todo o código para este codelab:
Se preferir, clone o repositório:
git clone https://github.com/googlecodelabs/odml-pathways.git
Descompacte o arquivo ZIP transferido por download. Isso descompactará uma pasta raiz (odml-pathways
) com todos os recursos necessários. Neste codelab, você só precisará das origens no subdiretório audio_classification/codelab2/android
.
O subdiretório android
no repositório audio_classification/codelab2/android
contém dois diretórios:
- starter: o código inicial que você usará como base para este codelab.
- final: o código concluído do app de exemplo finalizado.
Importar o app inicial
Comece importando o app inicial para o Android Studio:
- Abra o Android Studio e selecione Import Project (Gradle, Eclipse ADT, etc.)
- Abra a pasta
starter
(audio_classification/codelab2/android/starter
) no código-fonte que você salvou antes.
Para garantir que todas as dependências estejam disponíveis para seu app, sincronize o projeto com arquivos do Gradle quando o processo de importação for concluído.
- Selecione Sync Project with Gradle Files ( ) na barra de ferramentas do Android Studio.
4. Entender o app inicial
Este app é o mesmo que foi criado no primeiro codelab para classificação de áudio: Criar um app básico para classificação de áudio.
Para entender melhor o código, faça o codelab antes de continuar.
Todo o código está no MainActivity
(para ser o mais simples possível).
Em resumo, o código abrange as tarefas de:
- Como carregar o modelo
val classifier = AudioClassifier.createFromFile(this, modelPath)
- Como criar o gravador de áudio e iniciar a gravação
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()
- Criar uma linha de execução do timer para executar a inferência. Os parâmetros do método
scheduleAtFixedRate
são o tempo que ele vai esperar para iniciar a execução e o tempo entre a execução sucessiva da tarefa. No código abaixo, ele começará em 1 milissegundo e será executado novamente a cada 500 milissegundos.
Timer().scheduleAtFixedRate(1, 500) {
...
}
- Como executar a inferência no áudio capturado
val numberOfSamples = tensor.load(record)
val output = classifier.classify(tensor)
- Classificação de filtros para pontuações baixas
val filteredModelOutput = output[0].categories.filter {
it.score > probabilityThreshold
}
- Mostrar os resultados na tela
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
.joinToString(separator = "\n")
runOnUiThread {
textView.text = outputStr
}
Agora, você pode executar o app e brincar com ele no estado em que se encontra, mas lembre-se de que ele usa um modelo pré-treinado mais genérico.
5. Treinar um modelo personalizado de classificação de áudio com o Model Maker
Na etapa anterior, você fez o download de um app que usa um modelo pré-treinado para classificar eventos de áudio. No entanto, às vezes você precisa personalizar esse modelo para eventos de áudio do seu interesse ou para torná-lo uma versão mais especializada.
Como mencionado anteriormente, você especializará o modelo para sons de pássaros. Veja um conjunto de dados com áudios de pássaros, selecionado do site do Xeno-canto.
Colaboratory
Agora vamos acessar o Google Colab para treinar o modelo personalizado.
O treinamento do modelo personalizado levará cerca de 30 minutos.
Se você quiser pular esta etapa, faça o download do modelo que você treinou no conjunto de dados com o conjunto de dados fornecido e vá para a próxima etapa
6. Adicionar o modelo TFLite personalizado ao app Android
Agora que você treinou seu próprio modelo de classificação de áudio e o salvou localmente, precisará colocá-lo na pasta de recursos do app Android.
A primeira etapa é mover o modelo transferido da etapa anterior para a pasta de recursos no seu app.
- No Android Studio, com a visualização Android Project, clique com o botão direito na pasta de recursos.
- Você verá um pop-up com uma lista de opções. Uma delas será abrir a pasta no seu sistema de arquivos. Encontre e selecione o sistema adequado para seu sistema operacional. No Mac, ela será Reveal in Finder e, no Windows, será Open in Explorer. No Ubuntu, ela será Show in Files.
- Copie o modelo salvo na pasta.
Depois de fazer isso, volte ao Android Studio, e você verá seu arquivo na pasta de recursos.
7. Carregar o novo modelo no app base
O app base já usa um modelo pré-treinado. Você vai substituí-la pela nova que acabou de treinar.
- TODO 1: para carregar o novo modelo após adicioná-lo à pasta assets, altere o valor da variável
modelPath
:
var modelPath = "my_birds_model.tflite"
O novo modelo tem duas saídas (cabeçalhos):
- A saída original e mais genérica do modelo base que você usou, neste caso, YAMNet.
- O resultado secundário específico para os pássaros usados no treinamento.
Isso é necessário porque o YAMNet reconhece muito bem várias classes que são comuns, como a Silenciar, por exemplo. Com isso, você não precisa se preocupar com todas as outras classes que não adicionou ao conjunto de dados.
O que você fará agora é, se a classificação YAMNet mostrar uma alta pontuação para a classe de pássaro, você examinará qual é o pássaro na outra saída.
- TODO 2:leia se a primeira cabeça de classificação tem a confiança alta de que é um som de pássaros. Aqui você altera a filtragem para filtrar também todos os itens que não são Bird:
val filteredModelOuput = output[0].categories.filter {
it.label.contains("Bird") && it.score > .3
}
- TODO 3:se a cabeça de base do modelo detectar que há um pássaro no áudio com boa probabilidade, você verá qual deles está na segunda cabeça:
if (filteredModelOutput.isNotEmpty()) {
Log.i("Yamnet", "bird sound detected!")
filteredModelOutput = output[1].categories.filter {
it.score > probabilityThreshold
}
}
Pronto. É simples mudar o modelo para usar o que você acabou de treinar.
A próxima etapa é fazer testes.
8. Testar o app com o novo modelo
Como você integrou o modelo de classificação de áudio ao app, vamos testá-lo.
- Conecte seu dispositivo Android e clique em "Run" () na barra de ferramentas do Android Studio.
O app precisa prever corretamente o áudio dos pássaros. Para facilitar os testes, basta tocar um dos áudios do seu computador (das etapas anteriores), e o smartphone poderá detectá-lo. Quando isso acontece, o nome e o status das aves são exibidos na tela.
9. Parabéns
Neste codelab, você aprendeu a criar seu próprio modelo de classificação de áudio com o Model Maker e a implantá-lo no seu app para dispositivos móveis usando o TensorFlow Lite. Para saber mais sobre o TFLite, veja outras amostras do TFLite.
O que vimos
- Como preparar seu próprio conjunto de dados
- Como fazer o aprendizado de transferência para classificação de áudio com o Model Maker
- Como usar o modelo em um app Android.
Próximas etapas
- Testar com seus próprios dados
- Diga o que você criou
Saiba mais
- Link para o programa de aprendizado
- Documentação do TensorFlow Lite
- Documentação do Model Maker
- Documentação do TensorFlow Hub
- Tecnologias de machine learning no dispositivo com o Google