Dieses Repository enthält den Code für das folgende Papier:
D. Fried*, R. Hu*, V. Cirik*, A. Rohrbach, J. Andreas, L.-P. Morency, T. Berg-Kirkpatrick, K. Saenko, D. Klein**, T. Darrell**, Speaker-Follower-Modelle für Vision-and-Language-Navigation . in 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} }
(*, **: zeigt gleichen Beitrag an)
Projektseite: http://ronghanghu.com/speaker_follower
Wenn Sie unsere Datenerweiterung nur für den R2R-Datensatz verwenden möchten, aber unsere Modelle nicht benötigen, können Sie unsere erweiterten Daten für R2R (JSON-Datei mit synthetischen Daten, die von unserem Sprechermodell generiert wurden) hier direkt herunterladen. Diese JSON-Datei hat das gleiche Format wie der ursprüngliche R2R-Datensatz, mit einer synthetischen Anweisung pro abgetasteter neuer Trajektorie.
Beachten Sie, dass wir zunächst auf der Kombination der ursprünglichen und erweiterten Daten trainiert haben und dann eine Feinabstimmung anhand der ursprünglichen Trainingsdaten vorgenommen haben.
Installieren Sie Python 3 (Anaconda empfohlen: https://www.continuum.io/downloads).
Installieren Sie PyTorch gemäß den Anweisungen auf https://pytorch.org/ (wir haben in unseren Experimenten PyTorch 0.3.1 verwendet).
Laden Sie dieses Repository herunter oder klonen Sie es rekursiv mit Git und geben Sie dann das Stammverzeichnis des Repositorys ein:
# Make sure to clone with --recursive git clone --recursive https://github.com/ronghanghu/speaker_follower.git cd speaker_follower
Wenn Sie nicht mit dem Flag --recursive
geklont haben, müssen Sie das pybind-Submodul manuell aus dem Verzeichnis der obersten Ebene klonen:
git submodule update --init --recursive
Installieren Sie die Abhängigkeiten für den Matterport3D-Simulator:
sudo apt-get install libopencv-dev python-opencv freeglut3 freeglut3-dev libglm-dev libjsoncpp-dev doxygen libosmesa6-dev libosmesa6 libglew-dev
Kompilieren Sie den Matterport3D-Simulator:
mkdir build && cd build cmake .. make cd ../
Hinweis: Dieses Repository basiert auf der Matterport3DSimulator-Codebasis. Weitere Details zum Matterport3D-Simulator finden Sie in README_Matterport3DSimulator.md
.
Laden Sie die Precomputing ResNet Image Features herunter und extrahieren Sie sie in 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 ..
(Falls die obige URL nicht funktioniert, liegt dies wahrscheinlich daran, dass der Room-to-Room-Datensatz seine Funktions-URLs geändert hat. Die neuesten Download-Links finden Sie hier.)
Nach diesem Schritt sollte img_features/
ResNet-152-imagenet.tsv
enthalten. (Beachten Sie, dass Sie nur die aus dem mit ImageNet vorab trainierten ResNet extrahierten Funktionen herunterladen müssen, um die folgenden Experimente durchzuführen. Mit den Orten vorab trainierte ResNet-Funktionen oder tatsächliche Bilder sind nicht erforderlich.)
Laden Sie den R2R-Datensatz und unsere erfassten Flugbahnen zur Datenerweiterung herunter:
./tasks/R2R/data/download.sh
Trainieren Sie das Sprechermodell:
python tasks/R2R/train_speaker.py
Generieren Sie synthetische Anweisungen aus dem trainierten Sprechermodell als Datenerweiterung:
# 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
Nach diesem Schritt wird R2R_literal_speaker_data_augmentation_paths.json
unter tasks/R2R/data/
generiert. Diese JSON-Datei enthält synthetische Anweisungen, die vom Sprechermodell für abgetastete neue Trajektorien in der Zugumgebung generiert werden (dh die sprechergesteuerte Datenerweiterung in unserem Artikel).
Alternativ können Sie unsere vorberechnete sprechergesteuerte Datenerweiterung direkt mit ./tasks/R2R/data/download_precomputed_augmentation.sh
herunterladen.
Trainieren Sie das Follower-Modell anhand der Kombination der ursprünglichen und erweiterten Trainingsdaten.
python tasks/R2R/train.py --use_pretraining --pretrain_splits train literal_speaker_data_augmentation_paths
Der Follower wird zunächst für 50.000 Iterationen auf die Kombination der ursprünglichen train
und der neuen literal_speaker_data_augmentation_paths
(generiert in Schritt 2 oben) trainiert und anschließend für 20.000 Iterationen auf die ursprüngliche train
abgestimmt. Dieser Schritt kann lange dauern. (Mit einer einzelnen GPU auf unserem lokalen Rechner sieht es nach etwa 50 Stunden aus.)
Alle oben genannten Befehle werden auf einer einzelnen GPU ausgeführt. Sie können eine bestimmte GPU auswählen, indem Sie die Umgebungsvariable CUDA_VISIBLE_DEVICES
festlegen (z. B. export CUDA_VISIBLE_DEVICES=1
um GPU 1 zu verwenden).
Sie können unser Modell für geschulte Sprecher und Follower direkt herunterladen
./tasks/R2R/snapshots/release/download_speaker_release.sh # Download speaker ./tasks/R2R/snapshots/release/download_follower_release.sh # Download follower
Die oben genannten Skripte speichern die heruntergeladenen Modelle unter ./tasks/R2R/snapshots/release/
. Um diese heruntergeladenen Modelle zu verwenden, legen Sie die Präfixe für den Sprecher- und Follower-Pfad wie folgt fest:
export SPEAKER_PATH_PREFIX=tasks/R2R/snapshots/release/speaker_final_release export FOLLOWER_PATH_PREFIX=tasks/R2R/snapshots/release/follower_final_release
Man kann den Follower auch nur anhand der ursprünglichen Trainingsdaten trainieren , ohne die erweiterten Daten des Sprechers wie folgt zu verwenden :
python tasks/R2R/train.py
Legen Sie die Pfadpräfixe für das trainierte Sprecher- und Followermodell fest:
# 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
Generieren Sie erstklassige Flugbahnvorhersagen mit pragmatischer Schlussfolgerung:
# 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
Dadurch werden die Vorhersagedateien im Verzeichnis EVAL_FILE_PREFIX
generiert und die Leistung auch auf val_seen
und val_unseen
Splits gedruckt. (Die angezeigte Leistung beträgt bei der test
Null, da die Test-JSON-Datei keine Ground-Truth-Zielorte enthält.) Die mit dem obigen Skript vorhergesagten Trajektorien enthalten nur die Trajektorien mit der höchsten Bewertung unter allen Kandidatentrajektorien, geordnet nach pragmatischer Schlussfolgerung . Die erwarteten Erfolgsraten liegen bei 70,1 % bzw. 54,6 % für val_seen
und val_unseen
.
Um an der Vision-and-Language Navigation Challenge teilzunehmen, fügen Sie die Option --physical_traversal
hinzu, um physikalisch plausible Flugbahnvorhersagen mit pragmatischer Schlussfolgerung zu generieren:
# 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
Dadurch werden die Vorhersagedateien im Verzeichnis EVAL_FILE_PREFIX
generiert. Diese Vorhersagedateien können zur Auswertung an https://evalai.cloudcv.org/web/challenges/challenge-page/97/overview gesendet werden. Die erwartete Erfolgsquote beim Challenge-Testsatz beträgt 53,5 %.
Der Hauptunterschied zu --physical_traversal
besteht darin, dass die generierten Trajektorien jetzt alle vom Suchalgorithmus besuchten Zustände in der Reihenfolge enthalten, in der sie durchlaufen werden . Der Agent erweitert jede Route Schritt für Schritt und wechselt dann zur Erweiterung der nächsten Route. Die Einzelheiten werden in Anhang E unseres Artikels erläutert.
Darüber hinaus ist es auch möglich, die Leistung des Followers allein mithilfe der gierigen Dekodierung (ohne pragmatische Schlussfolgerung des Sprechers) zu bewerten:
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
Dadurch werden die Vorhersagedateien im Verzeichnis EVAL_FILE_PREFIX
generiert und die Leistung auch auf val_seen
und val_unseen
Splits gedruckt. (Die angezeigte Leistung beträgt bei der test
Null, da die Test-JSON-Datei keine Ground-Truth-Zielorte enthält.) Die erwarteten Erfolgsraten betragen 66,4 % bzw. 35,5 % für val_seen
und val_unseen
.
Dieses Repository basiert auf der Matterport3DSimulator-Codebasis.