Path: blob/master/site/pt-br/tutorials/audio/transfer_learning_audio.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Aprendizado por transferência com a YAMNet para classificação de sons do ambiente
A YAMNet é uma rede neural profunda pré-treinada que pode prever eventos de áudio de 521 classes, como risada, latido ou sirene.
Neste tutorial, você aprenderá a:
Carregar e usar o modelo YAMNet para inferência.
Criar um novo modelo usando os embeddings da YAMNet para classificar sons de gatos e cães.
Avaliar e exportar seu modelo.
Importe o TensorFlow e outras bibliotecas
Para começar, instale o TensorFlow I/O, que facilitará o carregamento dos arquivos de áudio fora do disco.
Sobre a YAMNet
A YAMNet é uma rede neural pré-treinada que usa a arquitetura de convolução separável em profundidade MobileNetV1. Ela consegue usar uma forma de onda de áudio como entrada e fazer previsões independentes para cada um dos 521 eventos de áudio do corpus do AudioSet.
Internamente, o modelo extrai "frames" do sinal de áudio e processa lotes desses frames. Essa versão do modelo usa frames com duração de 0,96 segundo e extrai um frame a cada 0,48 segundo.
O modelo aceita um Tensor 1-D float32 ou um array do NumPy com uma forma de onda de duração arbitrária, representada como amostras de 16 kHz em canal único (mono) no intervalo [-1.0, +1.0]
. Este tutorial contém código para ajudar você a converter arquivos WAV para o formato compatível.
O modelo retorna 3 saídas, incluindo as pontuações das classes, os embeddings (que você usará para o aprendizado por transferência) e o espectrograma log mel. Confira mais detalhes aqui.
Um uso específico da YAMNet é como um extrator de características de alto nível — a saída de embedding 1.024-dimensional. Você usará as características de entrada do modelo (YAMNet) base para alimentar o modelo mais superficial, que consiste em uma camada tf.keras.layers.Dense
oculta. Em seguida, você treinará a rede com uma pequena quantidade de dados para a classificação de áudio sem precisar de vários dados rotulados e treinamento de ponta a ponta. (Isso é parecido com o aprendizado por transferência para a classificação de imagens com o TensorFlow Hub, se você quiser saber mais.)
Primeiro, você testará o modelo e verá os resultados da classificação de áudio. Depois, você construirá o pipeline de pré-processamento dos dados.
Carregando a YAMNet do TensorFlow Hub
Você usará a YAMNet pré-treinada do TensorFlow Hub para extrair os embeddings dos arquivos de som.
Para carregar um modelo do TensorFlow Hub, é simples: escolha o modelo, copie a URL dele e use a função load
.
Observação: para ler a documentação do modelo, use a URL dele no seu navegador.
Com o modelo carregado, siga o tutorial de uso básico da YAMNet e baixe um arquivo WAV de amostra para realizar a inferência.
Você precisará de uma função para carregar arquivos de áudio, que também será usada mais tarde ao trabalhar com os dados de treinamento. (Saiba mais sobre a leitura dos arquivos de áudio e dos rótulos deles em Reconhecimento de áudio simples.)
Observação: o wav_data
retornado do load_wav_16k_mono
já está normalizado para os valores no intervalo [-1.0, 1.0]
(para mais informações, acesse a documentação da YAMNet no TF Hub).
Carregue o mapeamento das classes
É importante carregar os nomes das classes que a YAMNet consegue reconhecer. O arquivo de mapeamento está em yamnet_model.class_map_path()
no formato CSV.
Realize a inferência
A YAMNet oferece pontuações de classe no nível do frame (ou seja, 521 pontuações para cada frame). Para determinar as previsões no nível do clipe, as pontuações podem ser agregadas por classe nos frames (por exemplo, usando a agregação média ou máxima). Isso é realizado abaixo por scores_np.mean(axis=0)
. Por fim, para encontrar a classe com a maior pontuação no nível do clipe, determine o máximo das 521 pontuações agregadas.
Observação: o modelo inferiu corretamente o som de um animal. Seu objetivo neste tutorial é aumentar a eficácia do modelo para classes específicas. Além disso, observe que o modelo gerou 13 embeddings, um por frame.
Dataset ESC-50
O dataset ESC-50 (Piczak, 2015) é uma coleção rotulada de 2 mil gravações de áudio do ambiente com 5 segundos de duração. O dataset consiste em 50 classes, com 40 exemplos por classe.
Baixe e extraia o dataset.
Explore os dados
Os metadados para cada arquivo estão especificados no arquivo CSV em ./datasets/ESC-50-master/meta/esc50.csv
e todos os arquivos de áudio estão em ./datasets/ESC-50-master/audio/
Você criará um DataFrame
do pandas com o mapeamento e usará isso para ter uma visão mais clara dos dados.
Filtre os dados
Agora que os dados estão armazenados no DataFrame
, aplique algumas transformações:
Filtre as linhas e use apenas as classes selecionadas –
dog
ecat
. Se você quiser usar outras classes, é aqui que elas devem ser escolhidas.Altere o nome do arquivo para incluir o caminho completo. Isso facilitará o carregamento depois.
Mude os alvos para um determinado intervalo. Neste exemplo,
dog
permanecerá0
, mascat
será1
em vez do valor original5
.
Carregue os arquivos de áudio e recupere os embeddings
Aqui, você aplicará o load_wav_16k_mono
e preparará os dados WAV para o modelo.
Ao extrair embeddings dos dados WAV, você obterá um array de formato (N, 1024)
, em que N
é o número de frames encontrados pela YAMNet (um para cada 0,48 segundo de áudio).
Seu modelo usará cada frame como uma entrada. Portanto, você precisa criar uma nova coluna com um frame por linha. Você também precisa expandir os rótulos e a coluna fold
para refletir essas novas linhas de maneira adequada.
A coluna fold
expandida mantém os valores originais. Não é possível misturar frames porque, ao fazer as divisões, você pode acabar com partes do mesmo áudio em conjuntos diferentes, tornando os passos de teste e validação menos eficazes.
Divida os dados
Você usará a coluna fold
para dividir o dataset em conjuntos de treinamento, validação e teste.
O ESC-50 é disposto em cinco fold
s de validação cruzada com tamanho uniforme. Assim, os clipes da mesma fonte original estão sempre no mesmo fold
— saiba mais no documento ESC: Dataset for Environmental Sound Classification (Dataset para a classificação de sons do ambiente).
A última etapa é remover a coluna fold
do dataset, já que ela não será usada durante o treinamento.
Crie seu modelo
Você já fez a maior parte do trabalho! Em seguida, defina um modelo Sequential bastante simples com uma camada oculta e duas saídas para reconhecer gatos e cães nos sons.
Vamos executar o método evaluate
nos dados de teste só para conferir se não há overfitting.
Você conseguiu!
Teste seu modelo
Em seguida, teste seu modelo no embedding do teste anterior usando apenas a YAMNet.
Salve um modelo que aceite diretamente um arquivo WAV como entrada
Seu modelo funciona ao fornecer embeddings como entrada.
Em um cenário real, você usará dados de áudio como entrada direta.
Para fazer isso, você combinará a YAMNet e o seu modelo em um único modelo que possa ser exportado para outros aplicativos.
Para facilitar o uso do resultado do modelo, a camada final será uma operação reduce_mean
. Ao usar esse modelo para implantação (que você aprenderá depois no tutorial), será necessário o nome da camada final. Se você não definir um, o TensorFlow definirá automaticamente um nome incremental que dificulta o teste, já que mudará sempre que você treinar o modelo. Ao usar uma operação do TensorFlow pura, não é possível atribuir um nome. Para resolver esse problema, crie uma camada personalizada que aplique reduce_mean
e chame-a de 'classifier'
.
Carregue seu modelo salvo para verificar se ele funciona conforme esperado.
E para o teste final: ao fornecer alguns dados de som, seu modelo retorna o resultado correto?
Se você quiser testar seu novo modelo em uma configuração de implantação, use a assinatura 'serving_default'.
(Opcional) Mais testes
O modelo está pronto.
Vamos compará-lo a YAMNet no dataset de teste.
Próximos passos
Você criou um modelo que consegue classificar sons de cães ou gatos. Com a mesma ideia e um dataset diferente, você pode tentar, por exemplo, criar um identificador acústico de pássaros com base nos seus cantos.
Compartilhe seu projeto com a equipe do TensorFlow nas redes sociais!