Este repositório contém o código do seguinte artigo:
D. Fried*, R. Hu*, V. Cirik*, A. Rohrbach, J. Andreas, L.-P. Morency, T. Berg-Kirkpatrick, K. Saenko, D. Klein **, T. Darrell **, Modelos de alto-falante-seguidor para navegação por visão e linguagem . em NeurIPS, 2018. (PDF)
@inproceedings{fried2018speaker, title={Speaker-Follower Models for Vision-and-Language Navigation}, author={Fried, Daniel and Hu, Ronghang and Cirik, Volkan and Rohrbach, Anna and Andreas, Jacob and Morency, Louis-Philippe and Berg-Kirkpatrick, Taylor and Saenko, Kate and Klein, Dan and Darrell, Trevor}, booktitle={Neural Information Processing Systems (NeurIPS)}, year={2018} }
(*, **: indica contribuição igual)
Página do projeto: http://ronghanghu.com/speaker_follower
Se você deseja usar nosso aumento de dados apenas no conjunto de dados R2R, mas não precisa de nossos modelos, você pode baixar diretamente nossos dados aumentados em R2R (arquivo JSON contendo dados sintéticos gerados por nosso modelo de alto-falante) aqui. Este arquivo JSON está no mesmo formato do conjunto de dados R2R original, com uma instrução sintética por nova trajetória amostrada.
Observe que primeiro treinamos na combinação dos dados originais e aumentados e, em seguida, ajustamos os dados de treinamento originais.
Instale o Python 3 (recomendado Anaconda: https://www.continuum.io/downloads).
Instale o PyTorch seguindo as instruções em https://pytorch.org/ (usamos o PyTorch 0.3.1 em nossos experimentos).
Baixe este repositório ou clone recursivamente com Git e insira o diretório raiz do repositório:
# Make sure to clone with --recursive git clone --recursive https://github.com/ronghanghu/speaker_follower.git cd speaker_follower
Se você não clonou com o sinalizador --recursive
, precisará clonar manualmente o submódulo pybind do diretório de nível superior:
git submodule update --init --recursive
Instale as dependências do Simulador Matterport3D:
sudo apt-get install libopencv-dev python-opencv freeglut3 freeglut3-dev libglm-dev libjsoncpp-dev doxygen libosmesa6-dev libosmesa6 libglew-dev
Compile o Simulador Matterport3D:
mkdir build && cd build cmake .. make cd ../
Nota: Este repositório é construído sobre a base de código Matterport3DSimulator. Detalhes adicionais sobre o Simulador Matterport3D podem ser encontrados em README_Matterport3DSimulator.md
.
Baixe os recursos de imagem ResNet de pré-computação e extraia-os em img_features/
:
mkdir -p img_features/ cd img_features/ wget https://www.dropbox.com/s/o57kxh2mn5rkx4o/ResNet-152-imagenet.zip?dl=1 -O ResNet-152-imagenet.zip unzip ResNet-152-imagenet.zip cd ..
(Caso o URL acima não funcione, é provável que o conjunto de dados Room-to-Room tenha alterado seus URLs de recursos. Você pode encontrar os links de download mais recentes aqui.)
Após esta etapa, img_features/
deve conter ResNet-152-imagenet.tsv
. (Observe que você só precisa baixar os recursos extraídos do ResNet pré-treinado pelo ImageNet para executar os experimentos a seguir. Os recursos ResNet pré-treinados por locais ou imagens reais não são necessários.)
Baixe o conjunto de dados R2R e nossas trajetórias amostradas para aumento de dados:
./tasks/R2R/data/download.sh
Treine o modelo do alto-falante:
python tasks/R2R/train_speaker.py
Gere instruções sintéticas a partir do modelo de falante treinado como aumento de dados:
# the path prefix to the speaker model (trained in Step 1 above) export SPEAKER_PATH_PREFIX=tasks/R2R/speaker/snapshots/speaker_teacher_imagenet_mean_pooled_train_iter_20000 python tasks/R2R/data_augmentation_from_speaker.py $SPEAKER_PATH_PREFIX tasks/R2R/data/R2R
Após esta etapa, R2R_literal_speaker_data_augmentation_paths.json
será gerado em tasks/R2R/data/
. Este arquivo JSON contém instruções sintéticas geradas pelo modelo de alto-falante em novas trajetórias amostradas no ambiente de trem (ou seja, o aumento de dados acionado por alto-falante em nosso artigo).
Alternativamente, você pode baixar diretamente nosso aumento de dados pré-computado acionado por alto-falante com ./tasks/R2R/data/download_precomputed_augmentation.sh
.
Treine o modelo seguidor na combinação dos dados de treinamento originais e aumentados.
python tasks/R2R/train.py --use_pretraining --pretrain_splits train literal_speaker_data_augmentation_paths
O seguidor será primeiro treinado na combinação do ambiente train
original e os novos literal_speaker_data_augmentation_paths
(gerados na Etapa 2 acima) para 50.000 iterações e, em seguida, ajustado no ambiente train
original para 20.000 iterações. Esta etapa pode demorar muito. (Parece aproximadamente 50 horas usando uma única GPU em nossa máquina local.)
Todos os comandos acima são executados em uma única GPU. Você pode escolher uma GPU específica definindo a variável de ambiente CUDA_VISIBLE_DEVICES
(por exemplo, export CUDA_VISIBLE_DEVICES=1
para usar a GPU 1).
Você pode baixar diretamente nosso modelo de alto-falante treinado e modelo de seguidor com
./tasks/R2R/snapshots/release/download_speaker_release.sh # Download speaker ./tasks/R2R/snapshots/release/download_follower_release.sh # Download follower
Os scripts acima salvarão os modelos baixados em ./tasks/R2R/snapshots/release/
. Para usar esses modelos baixados, defina os prefixos do caminho do locutor e do seguidor da seguinte forma:
export SPEAKER_PATH_PREFIX=tasks/R2R/snapshots/release/speaker_final_release export FOLLOWER_PATH_PREFIX=tasks/R2R/snapshots/release/follower_final_release
Também é possível treinar o seguidor apenas nos dados de treinamento originais , sem usar os dados aumentados do locutor, como segue:
python tasks/R2R/train.py
Defina os prefixos de caminho para o modelo de falante treinado e seguidor:
# the path prefixes to the trained speaker and follower model # change these path prefixes if you are using downloaded models. export SPEAKER_PATH_PREFIX=tasks/R2R/speaker/snapshots/speaker_teacher_imagenet_mean_pooled_train_iter_20000 export FOLLOWER_PATH_PREFIX=tasks/R2R/snapshots/follower_with_pretraining_sample_imagenet_mean_pooled_train_iter_11100
Gere previsões de trajetória de alto nível com inferência pragmática:
# Specify the path prefix to the output evaluation file export EVAL_FILE_PREFIX=tasks/R2R/eval_outputs/pragmatics python tasks/R2R/rational_follower.py $FOLLOWER_PATH_PREFIX $SPEAKER_PATH_PREFIX --batch_size 15 --beam_size 40 --state_factored_search --use_test_set --eval_file $EVAL_FILE_PREFIX
Isso irá gerar os arquivos de previsão no diretório EVAL_FILE_PREFIX
e também imprimir o desempenho nas divisões val_seen
e val_unseen
. (O desempenho exibido será zero na divisão test
, uma vez que o arquivo JSON de teste não contém locais de destino verdadeiros.) As trajetórias previstas com o script acima contêm apenas as trajetórias de maior pontuação entre todas as trajetórias candidatas, classificadas com inferência pragmática . As taxas de sucesso esperadas são de 70,1% e 54,6% em val_seen
e val_unseen
, respectivamente.
Para participar do Desafio de Navegação de Visão e Linguagem, adicione a opção --physical_traversal
para gerar previsões de trajetória fisicamente plausíveis com inferência pragmática:
# Specify the path prefix to the output evaluation file export EVAL_FILE_PREFIX=tasks/R2R/eval_outputs/pragmatics_physical python tasks/R2R/rational_follower.py $FOLLOWER_PATH_PREFIX $SPEAKER_PATH_PREFIX --batch_size 15 --beam_size 40 --state_factored_search --use_test_set --physical_traversal --eval_file $EVAL_FILE_PREFIX
Isso irá gerar os arquivos de previsão no diretório EVAL_FILE_PREFIX
. Esses arquivos de previsão podem ser enviados para https://evalai.cloudcv.org/web/challenges/challenge-page/97/overview para avaliação. A taxa de sucesso esperada no conjunto de testes de desafio é de 53,5%.
A principal diferença com --physical_traversal
é que agora as trajetórias geradas contêm todos os estados visitados pelo algoritmo de busca na ordem em que são percorridos . O agente expande cada rota um passo por vez e depois alterna para expandir a próxima rota. Os detalhes são explicados no Apêndice E do nosso artigo.
Além disso, também é possível avaliar o desempenho do seguidor sozinho, utilizando decodificação gananciosa (sem inferência pragmática do falante):
export EVAL_FILE_PREFIX=tasks/R2R/eval_outputs/greedy python tasks/R2R/validate.py $FOLLOWER_PATH_PREFIX --batch_size 100 --use_test_set --eval_file $EVAL_FILE_PREFIX
Isso irá gerar os arquivos de previsão no diretório EVAL_FILE_PREFIX
e também imprimir o desempenho nas divisões val_seen
e val_unseen
. (O desempenho exibido será zero na divisão test
, já que o arquivo JSON de teste não contém locais de destino verdadeiros.) As taxas de sucesso esperadas são de 66,4% e 35,5% em val_seen
e val_unseen
, respectivamente.
Este repositório é construído sobre a base de código Matterport3DSimulator.