该存储库包含以下论文的代码:
D. Fried*、R. Hu*、V. Cirik*、A. Rohrbach、J. Andreas、L.-P。 Morency、T. Berg-Kirkpatrick、K. Saenko、D. Klein**、T. Darrell**,视觉和语言导航的说话者跟随者模型。在 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} }
(*、**:表示同等贡献)
项目页面:http://ronghanghu.com/speaker_follower
如果您只想在 R2R 数据集上使用我们的数据增强,但不需要我们的模型,您可以在此处直接下载 R2R 上的增强数据(包含由我们的说话人模型生成的合成数据的 JSON 文件)。该 JSON 文件与原始 R2R 数据集的格式相同,每个采样的新轨迹都有一个合成指令。
请注意,我们首先对原始数据和增强数据的组合进行训练,然后对原始训练数据进行微调。
安装 Python 3(推荐 Anaconda:https://www.continuum.io/downloads)。
按照 https://pytorch.org/ 上的说明安装 PyTorch(我们在实验中使用 PyTorch 0.3.1)。
下载此存储库或使用Git递归克隆,然后进入存储库的根目录:
# Make sure to clone with --recursive git clone --recursive https://github.com/ronghanghu/speaker_follower.git cd speaker_follower
如果您没有使用--recursive
标志进行克隆,那么您需要从顶级目录手动克隆 pybind 子模块:
git submodule update --init --recursive
安装 Matterport3D 模拟器的依赖项:
sudo apt-get install libopencv-dev python-opencv freeglut3 freeglut3-dev libglm-dev libjsoncpp-dev doxygen libosmesa6-dev libosmesa6 libglew-dev
编译 Matterport3D 模拟器:
mkdir build && cd build cmake .. make cd ../
注意:此存储库基于 Matterport3DSimulator 代码库构建。有关 Matterport3D Simulator 的更多详细信息,请参阅README_Matterport3DSimulator.md
。
下载预计算 ResNet 图像特征,并将其提取到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 ..
(如果上面的 URL 不起作用,可能是因为 Room-to-Room 数据集更改了其特征 URL。您可以在此处找到最新的下载链接。)
在此步骤之后, img_features/
应包含ResNet-152-imagenet.tsv
。 (注意,您只需要下载从ImageNet预训练的ResNet中提取的特征即可运行以下实验。不需要Places预训练的ResNet特征或实际图像。)
下载 R2R 数据集和我们用于数据增强的采样轨迹:
./tasks/R2R/data/download.sh
训练说话人模型:
python tasks/R2R/train_speaker.py
从经过训练的说话人模型生成合成指令作为数据增强:
# 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
完成此步骤后,会在tasks/R2R/data/
下生成R2R_literal_speaker_data_augmentation_paths.json
。该 JSON 文件包含由说话者模型根据训练环境中采样的新轨迹生成的合成指令(即我们论文中的说话者驱动的数据增强)。
或者,您可以使用./tasks/R2R/data/download_precomputed_augmentation.sh
直接下载我们预先计算的扬声器驱动的数据增强。
结合原始训练数据和增强训练数据来训练追随者模型。
python tasks/R2R/train.py --use_pretraining --pretrain_splits train literal_speaker_data_augmentation_paths
follower将首先在原始train
环境和新的literal_speaker_data_augmentation_paths
(在上面的步骤2中生成)的组合上进行50000次迭代的训练,然后在原始train
环境上进行20000次迭代的微调。这一步可能需要很长时间。 (在我们的本地计算机上使用单个 GPU 看起来大约需要 50 小时。)
上述所有命令都在单个 GPU 上运行。您可以通过设置CUDA_VISIBLE_DEVICES
环境变量来选择特定的 GPU(例如, export CUDA_VISIBLE_DEVICES=1
以使用 GPU 1)。
您可以直接下载我们训练有素的说话者模型和跟随者模型
./tasks/R2R/snapshots/release/download_speaker_release.sh # Download speaker ./tasks/R2R/snapshots/release/download_follower_release.sh # Download follower
上面的脚本将把下载的模型保存在./tasks/R2R/snapshots/release/
下。要使用这些下载的模型,请按如下方式设置发言者和跟随者路径前缀:
export SPEAKER_PATH_PREFIX=tasks/R2R/snapshots/release/speaker_final_release export FOLLOWER_PATH_PREFIX=tasks/R2R/snapshots/release/follower_final_release
人们还可以仅使用原始训练数据来训练跟随者,而不使用来自说话者的增强数据,如下所示:
python tasks/R2R/train.py
设置训练好的说话者和跟随者模型的路径前缀:
# 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
通过实用推理生成顶级轨迹预测:
# 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
这将在EVAL_FILE_PREFIX
目录中生成预测文件,并打印val_seen
和val_unseen
分割的性能。 ( test
分割上显示的性能将为零,因为测试 JSON 文件不包含真实目标位置。)使用上述脚本预测的轨迹仅包含所有候选轨迹中得分最高的轨迹,并通过实用推理进行排名。 val_seen
和val_unseen
的预期成功率分别为 70.1% 和 54.6%。
要参加视觉和语言导航挑战赛,请添加--physical_traversal
选项,以通过实用推理生成物理上合理的轨迹预测:
# 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
这将在EVAL_FILE_PREFIX
目录中生成预测文件。这些预测文件可以提交到 https://evalai.cloudcv.org/web/challenges/challenge-page/97/overview 进行评估。挑战测试集的预期成功率为 53.5%。
与--physical_traversal
的主要区别在于,现在生成的轨迹包含搜索算法按照遍历顺序访问的所有状态。代理将每条路线一次向前扩展一步,然后切换以扩展下一条路线。详细信息在我们论文的附录 E 中进行了解释。
此外,还可以使用贪婪解码单独评估跟随者的性能(无需来自说话者的实用推理):
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
这将在EVAL_FILE_PREFIX
目录中生成预测文件,并打印val_seen
和val_unseen
分割的性能。 ( test
分割上显示的性能将为零,因为测试 JSON 文件不包含真实目标位置。) val_seen
和val_unseen
预期成功率分别为 66.4% 和 35.5%。
该存储库基于 Matterport3DSimulator 代码库构建。