Ce référentiel contient le code de l'article suivant :
D. Fried*, R. Hu*, V. Cirik*, A. Rohrbach, J. Andreas, L.-P. Morency, T. Berg-Kirkpatrick, K. Saenko, D. Klein**, T. Darrell**, Modèles de locuteurs-suiveurs pour la navigation visuelle et linguistique . dans 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} }
(*, ** : indique une contribution égale)
Page du projet : http://ronghanghu.com/speaker_follower
Si vous souhaitez uniquement utiliser notre augmentation de données sur le jeu de données R2R mais n'avez pas besoin de nos modèles, vous pouvez directement télécharger nos données augmentées sur R2R (fichier JSON contenant des données synthétiques générées par notre modèle de haut-parleur) ici. Ce fichier JSON est au même format que l'ensemble de données R2R d'origine, avec une instruction synthétique par nouvelle trajectoire échantillonnée.
Notez que nous nous sommes d'abord entraînés sur la combinaison des données originales et augmentées, puis avons affiné les données d'entraînement originales.
Installez Python 3 (Anaconda recommandé : https://www.continuum.io/downloads).
Installez PyTorch en suivant les instructions sur https://pytorch.org/ (nous avons utilisé PyTorch 0.3.1 dans nos expériences).
Téléchargez ce dépôt ou clonez -le de manière récursive avec Git, puis entrez le répertoire racine du dépôt :
# Make sure to clone with --recursive git clone --recursive https://github.com/ronghanghu/speaker_follower.git cd speaker_follower
Si vous n'avez pas cloné avec l'indicateur --recursive
, vous devrez alors cloner manuellement le sous-module pybind à partir du répertoire de niveau supérieur :
git submodule update --init --recursive
Installez les dépendances pour le simulateur Matterport3D :
sudo apt-get install libopencv-dev python-opencv freeglut3 freeglut3-dev libglm-dev libjsoncpp-dev doxygen libosmesa6-dev libosmesa6 libglew-dev
Compilez le simulateur Matterport3D :
mkdir build && cd build cmake .. make cd ../
Remarque : ce référentiel est construit sur la base de code Matterport3DSimulator. Des détails supplémentaires sur le simulateur Matterport3D peuvent être trouvés dans README_Matterport3DSimulator.md
.
Téléchargez les fonctionnalités d'image ResNet de pré-calcul et extrayez-les dans 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 ..
(Si l'URL ci-dessus ne fonctionne pas, c'est probablement parce que l'ensemble de données Room-to-Room a modifié ses URL de fonctionnalités. Vous pouvez trouver les derniers liens de téléchargement ici.)
Après cette étape, img_features/
doit contenir ResNet-152-imagenet.tsv
. (Notez qu'il vous suffit de télécharger les fonctionnalités extraites de ResNet pré-entraîné avec ImageNet pour exécuter les expériences suivantes. Les fonctionnalités ResNet pré-entraînées par Places ou les images réelles ne sont pas requises.)
Téléchargez l'ensemble de données R2R et nos trajectoires échantillonnées pour l'augmentation des données :
./tasks/R2R/data/download.sh
Entraîner le modèle de haut-parleur :
python tasks/R2R/train_speaker.py
Générez des instructions synthétiques à partir du modèle de locuteur entraîné en tant qu'augmentation des données :
# 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
Après cette étape, R2R_literal_speaker_data_augmentation_paths.json
sera généré sous tasks/R2R/data/
. Ce fichier JSON contient des instructions synthétiques générées par le modèle de locuteur sur de nouvelles trajectoires échantillonnées dans l'environnement du train (c'est-à-dire l'augmentation des données pilotée par le locuteur dans notre article).
Alternativement, vous pouvez télécharger directement notre augmentation de données précalculée pilotée par le locuteur avec ./tasks/R2R/data/download_precomputed_augmentation.sh
.
Entraînez le modèle suiveur sur la combinaison des données d’entraînement originales et augmentées.
python tasks/R2R/train.py --use_pretraining --pretrain_splits train literal_speaker_data_augmentation_paths
Le suiveur sera d'abord formé sur la combinaison de l'environnement train
d'origine et des nouveaux literal_speaker_data_augmentation_paths
(générés à l'étape 2 ci-dessus) pendant 50 000 itérations, puis affiné sur l'environnement train
d'origine pendant 20 000 itérations. Cette étape peut prendre beaucoup de temps. (Cela prend environ 50 heures en utilisant un seul GPU sur notre machine locale.)
Toutes les commandes ci-dessus s'exécutent sur un seul GPU. Vous pouvez choisir un GPU spécifique en définissant la variable d'environnement CUDA_VISIBLE_DEVICES
(par exemple, export CUDA_VISIBLE_DEVICES=1
pour utiliser le GPU 1).
Vous pouvez télécharger directement notre modèle de locuteur formé et notre modèle de suiveur avec
./tasks/R2R/snapshots/release/download_speaker_release.sh # Download speaker ./tasks/R2R/snapshots/release/download_follower_release.sh # Download follower
Les scripts ci-dessus enregistreront les modèles téléchargés sous ./tasks/R2R/snapshots/release/
. Pour utiliser ces modèles téléchargés, définissez les préfixes de chemin du locuteur et du suiveur comme suit :
export SPEAKER_PATH_PREFIX=tasks/R2R/snapshots/release/speaker_final_release export FOLLOWER_PATH_PREFIX=tasks/R2R/snapshots/release/follower_final_release
On peut également former le suiveur uniquement sur les données d'entraînement originales sans utiliser les données augmentées du locuteur comme suit :
python tasks/R2R/train.py
Définissez les préfixes de chemin pour le modèle de locuteur et de suiveur formé :
# 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
Générez des prédictions de trajectoire de premier ordre avec une inférence pragmatique :
# 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
Cela générera les fichiers de prédiction dans le répertoire de EVAL_FILE_PREFIX
, et imprimera également les performances sur les splits val_seen
et val_unseen
. (Les performances affichées seront nulles sur la division test
, car le fichier JSON de test ne contient pas d'emplacements cibles de vérité terrain.) Les trajectoires prédites avec le script ci-dessus contiennent uniquement les trajectoires les mieux notées parmi toutes les trajectoires candidates, classées avec inférence pragmatique. . Les taux de réussite attendus sont respectivement de 70,1 % et 54,6 % sur val_seen
et val_unseen
.
Pour participer au défi de navigation Vision-and-Language, ajoutez l'option --physical_traversal
pour générer des prédictions de trajectoire physiquement plausibles avec une inférence pragmatique :
# 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
Cela générera les fichiers de prédiction dans le répertoire de EVAL_FILE_PREFIX
. Ces fichiers de prédiction peuvent être soumis à https://evalai.cloudcv.org/web/challenges/challenge-page/97/overview pour évaluation. Le taux de réussite attendu sur l'ensemble de tests de provocation est de 53,5 %.
La différence majeure avec --physical_traversal
est que désormais les trajectoires générées contiennent tous les états visités par l'algorithme de recherche dans l'ordre dans lequel ils sont traversés . L'agent développe chaque itinéraire étape par étape, puis passe à l'extension de l'itinéraire suivant. Les détails sont expliqués à l’annexe E de notre article.
De plus, il est également possible d'évaluer les performances du suiveur seul, en utilisant un décodage glouton (sans inférence pragmatique de la part du locuteur) :
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
Cela générera les fichiers de prédiction dans le répertoire de EVAL_FILE_PREFIX
, et imprimera également les performances sur les splits val_seen
et val_unseen
. (Les performances affichées seront nulles sur la division test
, puisque le fichier JSON de test ne contient pas d'emplacements cibles de vérité terrain.) Les taux de réussite attendus sont de 66,4 % et 35,5 % sur val_seen
et val_unseen
, respectivement.
Ce référentiel est construit sur la base de code Matterport3DSimulator.