Este repositorio contiene el código del siguiente artículo:
D. Fried*, R. Hu*, V. Cirik*, A. Rohrbach, J. Andreas, L.-P. Morency, T. Berg-Kirkpatrick, K. Saenko, D. Klein**, T. Darrell**, Modelos de hablante-seguidor para la navegación por visión y lenguaje . en 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 contribución igual)
Página del proyecto: http://ronghanghu.com/speaker_follower
Si solo desea utilizar nuestro aumento de datos en el conjunto de datos de R2R pero no necesita nuestros modelos, puede descargar directamente nuestros datos aumentados en R2R (archivo JSON que contiene datos sintéticos generados por nuestro modelo de altavoz) aquí. Este archivo JSON tiene el mismo formato que el conjunto de datos R2R original, con una instrucción sintética por cada nueva trayectoria muestreada.
Tenga en cuenta que primero entrenamos con la combinación de los datos originales y aumentados, y luego ajustamos los datos de entrenamiento originales.
Instale Python 3 (se recomienda Anaconda: https://www.continuum.io/downloads).
Instale PyTorch siguiendo las instrucciones en https://pytorch.org/ (usamos PyTorch 0.3.1 en nuestros experimentos).
Descargue este repositorio o clone de forma recursiva con Git y luego ingrese al directorio raíz del repositorio:
# Make sure to clone with --recursive git clone --recursive https://github.com/ronghanghu/speaker_follower.git cd speaker_follower
Si no clonaste con el indicador --recursive
, necesitarás clonar manualmente el submódulo pybind desde el directorio de nivel superior:
git submodule update --init --recursive
Instale las dependencias para Matterport3D Simulator:
sudo apt-get install libopencv-dev python-opencv freeglut3 freeglut3-dev libglm-dev libjsoncpp-dev doxygen libosmesa6-dev libosmesa6 libglew-dev
Compile el simulador Matterport3D:
mkdir build && cd build cmake .. make cd ../
Nota: Este repositorio se basa en el código base de Matterport3DSimulator. Se pueden encontrar detalles adicionales sobre el simulador Matterport3D en README_Matterport3DSimulator.md
.
Descargue las funciones de imagen de ResNet de precomputación y extráigalas en 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 ..
(En caso de que la URL anterior no funcione, es probable que se deba a que el conjunto de datos Room-to-Room cambió las URL de sus funciones. Puede encontrar los enlaces de descarga más recientes aquí).
Después de este paso, img_features/
debe contener ResNet-152-imagenet.tsv
. (Tenga en cuenta que solo necesita descargar las funciones extraídas de ResNet previamente entrenado con ImageNet para ejecutar los siguientes experimentos. No se requieren funciones de ResNet previamente entrenado en Places ni imágenes reales).
Descargue el conjunto de datos R2R y nuestras trayectorias de muestra para aumentar los datos:
./tasks/R2R/data/download.sh
Entrene el modelo de altavoz:
python tasks/R2R/train_speaker.py
Genere instrucciones sintéticas a partir del modelo de hablante capacitado como aumento de datos:
# 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
Después de este paso, R2R_literal_speaker_data_augmentation_paths.json
se generará en tasks/R2R/data/
. Este archivo JSON contiene instrucciones sintéticas generadas por el modelo de altavoz en nuevas trayectorias muestreadas en el entorno del tren (es decir, el aumento de datos impulsado por el altavoz en nuestro artículo).
Alternativamente, puede descargar directamente nuestro aumento de datos precomputado impulsado por los altavoces con ./tasks/R2R/data/download_precomputed_augmentation.sh
.
Entrene el modelo de seguidor con la combinación de los datos de entrenamiento originales y aumentados.
python tasks/R2R/train.py --use_pretraining --pretrain_splits train literal_speaker_data_augmentation_paths
El seguidor primero será capacitado en la combinación del entorno train
original y los nuevos literal_speaker_data_augmentation_paths
(generados en el Paso 2 anterior) para 50000 iteraciones, y luego se ajustará el entorno train
original para 20000 iteraciones. Este paso puede llevar mucho tiempo. (Parecen aproximadamente 50 horas usando una sola GPU en nuestra máquina local).
Todos los comandos anteriores se ejecutan en una sola GPU. Puede elegir una GPU específica configurando la variable de entorno CUDA_VISIBLE_DEVICES
(por ejemplo, export CUDA_VISIBLE_DEVICES=1
para usar la GPU 1).
Puede descargar directamente nuestro modelo de orador capacitado y modelo de seguidor con
./tasks/R2R/snapshots/release/download_speaker_release.sh # Download speaker ./tasks/R2R/snapshots/release/download_follower_release.sh # Download follower
Los scripts anteriores guardarán los modelos descargados en ./tasks/R2R/snapshots/release/
. Para utilizar estos modelos descargados, configure los prefijos de ruta del hablante y del seguidor de la siguiente manera:
export SPEAKER_PATH_PREFIX=tasks/R2R/snapshots/release/speaker_final_release export FOLLOWER_PATH_PREFIX=tasks/R2R/snapshots/release/follower_final_release
También se puede entrenar al seguidor solo con los datos de entrenamiento originales sin utilizar los datos aumentados del hablante de la siguiente manera:
python tasks/R2R/train.py
Establezca los prefijos de ruta para el modelo de hablante y seguidor capacitado:
# 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
Genere predicciones de trayectoria de primer nivel con inferencia 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
Esto generará los archivos de predicción en el directorio de EVAL_FILE_PREFIX
y también imprimirá el rendimiento en las divisiones val_seen
y val_unseen
. (El rendimiento mostrado será cero en la división test
, ya que el archivo JSON de prueba no contiene ubicaciones de objetivos reales). Las trayectorias predichas con el script anterior contienen solo las trayectorias con mayor puntuación entre todas las trayectorias candidatas, clasificadas con inferencia pragmática. . Las tasas de éxito esperadas son 70,1% y 54,6% en val_seen
y val_unseen
, respectivamente.
Para participar en el Desafío de navegación por visión y lenguaje, agregue la opción --physical_traversal
para generar predicciones de trayectoria físicamente plausibles con inferencia 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
Esto generará los archivos de predicción en el directorio EVAL_FILE_PREFIX
. Estos archivos de predicción se pueden enviar a https://evalai.cloudcv.org/web/challenges/challenge-page/97/overview para su evaluación. La tasa de éxito esperada en el conjunto de pruebas de desafío es del 53,5%.
La principal diferencia con --physical_traversal
es que ahora las trayectorias generadas contienen todos los estados visitados por el algoritmo de búsqueda en el orden en que son atravesados . El agente expande cada ruta paso a paso y luego cambia para expandir la siguiente ruta. Los detalles se explican en el Apéndice E de nuestro artículo.
Además, también es posible evaluar el desempeño del seguidor solo, utilizando una decodificación codiciosa (sin inferencia pragmática del hablante):
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
Esto generará los archivos de predicción en el directorio de EVAL_FILE_PREFIX
y también imprimirá el rendimiento en las divisiones val_seen
y val_unseen
. (El rendimiento mostrado será cero en la división test
, ya que el archivo JSON de prueba no contiene ubicaciones de destino reales). Las tasas de éxito esperadas son 66,4 % y 35,5 % en val_seen
y val_unseen
, respectivamente.
Este repositorio se basa en el código base de Matterport3DSimulator.