Este é o repositório para o método apresentado no artigo "Modelagem de idiomas para detecção de eventos de som com forçando professores e amostragem programada", de K. Drossos, S. Gharib, P, Magron e T. Virtanen.
Nosso artigo é apresentado à detecção e classificação de cenas e eventos acústicos (DCase) Workshop 2019. Você pode encontrar uma versão on -line do nosso artigo em Arxiv: https://arxiv.org/abs/1907.08506
Se você usar nosso método, cite nosso artigo.
Você pode obter a versão do código usado no artigo de
A detecção de eventos sonoros (SED) é a tarefa de identificar atividades de eventos sonoros a partir de representações de áudio de curto período de tempo. Por exemplo, dado um vetor de recurso de áudio que é extraído de 0,04 segundos, um método sed deve identificar as atividades de diferentes eventos de som nesse vetor. Geralmente, o SED é aplicado em uma sequência de vetores de recursos de áudio de curto período de tempo e a identificação de atividades de eventos sonoros é realizada para cada vetor de recurso de entrada. Ou seja, como uma entrada recebe uma matriz, com T e F como a quantidade de vetores e recursos de recursos, respectivamente, a saída é a matriz, que mantém as previsões para cada uma das classes C em cada vetor de característica t .
Nas gravações da vida real, os vários eventos sonoros provavelmente têm estruturas temporais dentro e entre os eventos . Por exemplo, um evento de "passos" pode ser repetido com pausas intermediárias (estrutura intra-evento). Por outro lado, é provável que o "chifre de carro" siga ou precede o evento de som "carros que passa" (estrutura entre eventos). Tais estruturas temporais são empregadas e usadas em outras tarefas de aprendizado de máquina, por exemplo, na tradução da máquina, na legenda da imagem e no reconhecimento da fala. Nessas tarefas, o método desenvolvido também aprende um modelo das associações temporais das classes direcionadas. Essas associações geralmente são denominadas modelo de idioma.
Os métodos SED podem se beneficiar de um modelo de idioma. O método neste repositório é exatamente isso. Um método para aproveitar o modelo de linguagem para sed.
Para aproveitar as estruturas temporais mencionadas acima, usamos a técnica de forçar o professor [1]. O forçamento do professor é o condicionamento da entrada a um RNN com as atividades de eventos sonoros na etapa de horário anterior. Aquilo é,
Onde está a saída do RNN no tempo T , é a entrada para o RNN (de uma camada anterior) e no tempo t , e são as atividades dos eventos sonoros no tempo T-1 .
Se como forem os valores da verdade do solo, o RNN não será robusto aos casos em que a atividade de classe não é correta. Por exemplo, no processo de teste em que não há valores de verdade no fundamento.
Se forem usados as previsões do classificador, o RNN terá dificuldade em aprender quaisquer dependências dos eventos sonoros, porque durante o treinamento (e especialmente no início do processo de treinamento), ele será alimentado com atividades de classe incorretas.
Para enfrentar os dois acima, empregamos a técnica de amostragem programada [2]. Ou seja, no início do treinamento que usamos como os valores da verdade do solo. À medida que o treinamento prossegue e o classificador aprende a prever cada vez mais atividades de classe corretas, empregamos gradualmente as previsões do classificador.
[1] RJ Williams e D. Zipser, “Um algoritmo de aprendizado para executar continuamente redes neurais totalmente recorrentes”, Neural Computation, vol. 1, não. 2, pp. 270–280, junho de 1989.
[2] S. Bengio, O. Vinyals, N. Jaitly e N. Shazeer, “Amostragem programada para previsão de sequência com redes neurais recorrentes”, em Anais da 28ª Conferência Internacional sobre Sistemas de Processamento de Informações Neurais, volume 1, Ser. Nips'15. Cambridge, MA, EUA: MIT Press, 2015, pp. 1171-1179. On-line. Disponível: http://dl.acm.org/citation.cfm?id=2969239.2969370
Para começar a usar nosso projeto, você precisa:
Use Python 3.6. O código deste repositório é testado e trabalha com o Python 3.6. Provavelmente, o uso de outras versões Python 3.x ficará bem, mas lembre -se de que este código é para o Python 3.6.
Configure as dependências usando os arquivos pip (PIP_ReQuirements.txt) ou conda (CONDA_REQUIREMENTS.TXT). Navegue com o seu terminal dentro do diretório raiz do projeto (ou seja, o diretório criado após a clonagem deste repositório) e depois emita o comando adequado no terminal:
pip : $ pip install -r requirements/pip_requirements.txtconda , você pode emitir o comando $ conda install --yes --file requirements/conda_requirements.txtFaça o download dos dados de áudio. Você pode baixar os três conjuntos de dados de áudio de:
O conjunto de dados sintético de 2016 da TUT-SED está disponível a partir daqui.
Faça o download dos arquivos de áudio (ou seja, o áudio 1/5, áudio 2/5, ..., áudio 5/5), faça sua extração de recursos e siga as instruções na seção de configuração de dados.
O Tut Sound Events 2016 está disponível a partir daqui.
Faça o download dos arquivos de áudio, faça sua extração de recursos e siga as instruções na seção de configuração de dados.
O Tut Sound Event 2017 está disponível daqui
Faça o download dos arquivos de áudio, faça sua extração de recursos e siga as instruções na seção de configuração de dados.
Agora, o projeto está configurado e você pode usá-lo com os dados que obteve da Etapa 3.
Você pode usar o Sedlm diretamente para seus dados ou verificar o código e adotar o Sedlm na sua tarefa sed ou repetir o processo descrito em nosso artigo.
O código Sedlm é baseado em Pytorch, versão 1.1.0.
No formulário atual, diferentes variáveis do código são especificadas em um arquivo YAML, mantendo todas as configurações do código. Todos os arquivos YAML estão no diretório settings e as pesquisas da função de carregamento da YAML no diretório settings de arquivos YAML. Em geral, você pode alterar os valores das configurações no arquivo YAML e executar o código.
Os dados devem estar no diretório data .
Se você deseja usar os carregadores de dados existentes, deve ter seus dados organizados de uma maneira específica. Primeiro de tudo, você deve ter arquivos diferentes para recursos de entrada e valores de destino. Por exemplo, input_features.npy e target_values.npy . Então, dependendo do conjunto de dados que você usará, você deve ter seus dados em diretórios diferentes. Aquilo é:
Tutsed sintético 2016.
Os dados devem estar em um diretório chamado synthetic , no diretório data . Isto é, data/synthetic . Em seguida, os arquivos para os dados de treinamento, validação e teste devem estar em um diretório diferente. Aquilo é:
data/synthetic/trainingdata/synthetic/validationdata/synthetic/testingVocê precisa ter arquivos Numpy diferentes para os recursos de entrada e os valores de destino. Você pode especificar o nome de cada um dos arquivos de entrada ou destino no arquivo de configurações da YAML. Por exemplo, os arquivos de treinamento devem ser como:
data/synthetic/training/input_features.npydata/synthetic/training/target_values.npyO código carregará os arquivos Numpy e os usará para treinar o método Sedlm. Você pode garantir que os recursos de entrada e os valores de destino sejam ordenados corretamente. Ou seja, o primeiro elemento nos recursos de entrada corresponde ao primeiro elemento nos valores de destino.
TUt Real Life 2016
Os dados devem estar em um diretório chamado real_life_2016 , no diretório data . Isto é, data/real_life_2016 . Em seguida, os arquivos para cada uma das dobras devem estar em um diretório diferente. Aquilo é:
data/real_life_2016/fold_1data/real_life_2016/fold_2data/real_life_2016/fold_3data/real_life_2016/fold_4Você precisa ter arquivos de picles diferentes para os recursos de entrada e os valores de destino e para o treinamento e teste de cada dobra. Como existem vários arquivos por cena e por dobra, você não pode ter todos os recursos em uma matriz Numpy. Assim, você deve ter todos os dados em uma lista e serializar (isto é, armazenar para disco) dessa lista usando o pacote de picles. Além disso, existem arquivos para treinamento e teste em cada dobra.
Por conveniência, o Sedlm usa automaticamente um pré-fix para os nomes de arquivos. Ou seja, ele adiciona automaticamente "trem" e "teste" ao nome do arquivo especificado.
Você pode especificar o nome de cada um dos arquivos de entrada ou destino no arquivo de configurações da YAML. Por exemplo, os arquivos devem ser como:
input_features.ptarget_values.pEm seguida, o código Sedlm procurará os arquivos adequados e para cada dobra. Por exemplo, para a dobra 1 e a cena residencial, os seguintes arquivos serão solicitados:
data/real_life_2016/home/fold_1/train_input_features.pdata/real_life_2016/home/fold_1/train_target_values.pdata/real_life_2016/home/fold_1/test_input_features.pdata/real_life_2016/home/fold_1/test_target_values.pO código carregará os arquivos de picles e os usará para treinar o método Sedlm. Você pode garantir que os recursos de entrada e os valores de destino sejam ordenados corretamente. Ou seja, o primeiro elemento nos recursos de entrada corresponde ao primeiro elemento nos valores de destino.
TUt Real Life 2017
Os dados devem estar em um diretório chamado real_life_2017 , no diretório data . Isto é, data/real_life_2017 . Em seguida, os arquivos para cada uma das dobras devem estar em um diretório diferente. Aquilo é:
data/real_life_2017/fold_1data/real_life_2017/fold_2data/real_life_2017/fold_3data/real_life_2017/fold_4Você precisa ter arquivos de picles diferentes para os recursos de entrada e os valores de destino e para o treinamento e teste de cada dobra. Como existem vários arquivos por dobra, você não pode ter todos os recursos em uma matriz Numpy. Assim, você deve ter todos os dados em uma lista e serializar (isto é, armazenar para disco) dessa lista usando o pacote de picles. Além disso, existem arquivos para treinamento e teste em cada dobra.
Por conveniência, o Sedlm usa automaticamente um pré-fix para os nomes de arquivos. Ou seja, ele adiciona automaticamente "trem" e "teste" ao nome do arquivo especificado.
Você pode especificar o nome de cada um dos arquivos de entrada ou destino no arquivo de configurações da YAML. Por exemplo, os arquivos devem ser como:
input_features.ptarget_values.pEm seguida, o código Sedlm procurará os arquivos adequados e para cada dobra. Por exemplo, para a dobra 1, os seguintes arquivos serão solicitados:
data/real_life_2017/fold_1/train_input_features.pdata/real_life_2017/fold_1/train_target_values.pdata/real_life_2017/fold_1/test_input_features.pdata/real_life_2017/fold_1/test_target_values.pO código carregará os arquivos de picles e os usará para treinar o método Sedlm. Você pode garantir que os recursos de entrada e os valores de destino sejam ordenados corretamente. Ou seja, o primeiro elemento nos recursos de entrada corresponde ao primeiro elemento nos valores de destino.
Os hiper-parâmetros podem ser ajustados nos arquivos de configurações da YAML. Os hiper-parâmetros disponíveis para ajustar são:
Você pode executar o sistema usando um script bash. Um exemplo desse script são os arquivos:
example_bash_script_baseline.sh , que executa a configuração da linha de base para o sedlmexample_bash_script_tf.sh , que executa o Sedlm com o conjunto de dados TUT Real Life 2017.