UNITER: UNiversal Image-TExt Representation Learning
论文地址:https://arxiv.org/abs/1909.11740点击进入
代码地址:https://github.com/ChenRocks/UNITER点击进入
GitHub界面翻译
这是 UNITER (ECCV 2020) 的官方存储库。 该存储库目前支持在 NLVR2、VQA、VCR、SNLI-VE、COCO 和 Flickr30k 的图像文本检索以及引用表达式理解(RefCOCO、RefCOCO+ 和 RefCOCO-g)上微调 UNITER。 UNITER-base 和 UNITER-large 预训练检查点均已发布。 还可以使用域内数据进行基于 UNITER 的预训练。
这个 repo 中的一些代码是从 PyTorch、HuggingFace、OpenNMT 和 Nvidia 提供的开源实现中复制/修改的。 使用 BUTD 提取图像特征。
要求
我们提供 Docker 镜像以便于复制。 请安装以下内容:
nvidia driver (418+)
Docker (19.03+)
nvidia-container-toolkit
我们的脚本要求用户具有 docker 组成员资格,以便无需 sudo 即可运行 docker 命令。 我们仅支持带有 NVIDIA GPU 的 Linux。 我们在 Ubuntu 18.04 和 V100 卡上进行测试。 我们使用混合精度训练,因此推荐使用带有 Tensor Cores 的 GPU。
快速开始
注意:请运行
bash scripts/download_pretrained.sh $PATH_TO_STORAGE
以获取我们最新的预训练检查点。 这将下载基本模型和大型模型。
我们使用 NLVR2 作为使用此代码库的端到端示例。
1.使用以下命令下载处理过的数据和预训练模型。
bash scripts/download_nlvr2.sh $PATH_TO_STORAGE
下载后,您应该看到以下文件夹结构:
├── ann
│ ├── dev.json
│ └── test1.json
├── finetune
│ ├── nlvr-base
│ └── nlvr-base.tar
├── img_db
│ ├── nlvr2_dev
│ ├── nlvr2_dev.tar
│ ├── nlvr2_test
│ ├── nlvr2_test.tar
│ ├── nlvr2_train
│ └── nlvr2_train.tar
├── pretrained
│ └── uniter-base.pt
└── txt_db
├── nlvr2_dev.db
├── nlvr2_dev.db.tar
├── nlvr2_test1.db
├── nlvr2_test1.db.tar
├── nlvr2_train.db
└── nlvr2_train.db.tar
2.启动 Docker 容器以运行实验。
# docker 镜像应该被自动拉取
source launch_container.sh $PATH_TO_STORAGE/txt_db $PATH_TO_STORAGE/img_db \
$PATH_TO_STORAGE/finetune $PATH_TO_STORAGE/pretrained
启动脚本尊重 $CUDA_VISIBLE_DEVICES 环境变量。 请注意,源代码是挂载到 /src 下的容器中,而不是内置到图像中,以便用户修改将反映在不重新构建图像的情况下。 (数据文件夹单独安装到容器中,以提高文件夹结构的灵活性。)
3.为 NLVR2 任务运行微调。
# 容器内部
python train_nlvr2.py --config config/train-nlvr2-base-1gpu.json
# 更多定制
horovodrun -np $N_GPU python train_nlvr2.py --config $YOUR_CONFIG_JSON
4.对 NLVR2 任务运行推理,然后进行评估。
# 推理
python inf_nlvr2.py --txt_db /txt/nlvr2_test1.db/ --img_db /img/nlvr2_test/ \
--train_dir /storage/nlvr-base/ --ckpt 6500 --output_dir 。 --fp16
# 评估
# 在 docker 外运行这个命令(用 python 3.6 测试)
# 或者将注解json复制到mounted文件夹中
python 脚本/eval_nlvr2.py ./results.csv $PATH_TO_STORAGE/ann/test1.json
上面的命令对我们训练的模型运行推理。 随意将 --train_dir 和 --ckpt 替换为您在第 3 步中训练的自己的模型。目前我们仅支持单 GPU 推理。
5.定制
# 训练选项
python train_nlvr2.py --help
命令行参数覆盖 JSON 配置文件
JSON 配置覆盖 argparse 默认值
使用 horovodrun 运行多 GPU 训练
–gradient_accumulation_steps 模拟多 GPU 训练
6.杂项
# 文本标注预处理
bash scripts/create_txtdb.sh $PATH_TO_STORAGE/txt_db $PATH_TO_STORAGE/ann
# 图像特征提取(在 Titan-Xp 上测试;可能无法在最新的 GPU 上运行)
bash scripts/extract_imgfeat.sh $PATH_TO_IMG_FOLDER $PATH_TO_IMG_NPY
# 图像预处理
bash scripts/create_imgdb.sh $PATH_TO_IMG_NPY $PATH_TO_STORAGE/img_db
以防您想复制整个预处理管道。
下游任务微调
VQA
注意:训练和推理应该在 docker 容器内运行
1.下载数据
bash scripts/download_vcr.sh $PATH_TO_STORAGE
2.训练
horovodrun -np 4 python train_vcr.py --config config/train-vcr-base-4gpu.json \
--output_dir $VCR_EXP
3.推理
horovodrun -np 4 python inf_vcr.py --txt_db /txt/vcr_test.db \
--img_db "/img/vcr_gt_test/;/img/vcr_test/" \
--split test --output_dir $VCR_EXP --checkpoint 8000 \
--pin_mem --fp16
结果文件会写入$VCR_EXP/results_test/results_8000_all.csv,可以提交到VCR排行榜进行评估。
VCR 2nd Stage Pre-training
注意:预训练应该在 docker 容器内运行
1.如果您还没有下载 VCR 数据
bash scripts/download_vcr.sh $PATH_TO_STORAGE
2.第二阶段预训练
horovodrun -np 4 python pretrain_vcr.py --config config/pretrain-vcr-base-4gpu.json \
--output_dir $PRETRAIN_VCR_EXP
Visual Entailment (SNLI-VE)
注意:训练应该在 docker 容器内运行
1.下载数据
bash scripts/download_ve.sh $PATH_TO_STORAGE
2.训练
horovodrun -np 2 python train_ve.py --config config/train-ve-base-2gpu.json \
--output_dir $VE_EXP
Image-Text Retrieval
下载数据
bash scripts/download_itm.sh $PATH_TO_STORAGE
注意:图像文本检索的计算量很大,尤其是在 COCO 上。
Zero-shot Image-Text Retrieval (Flickr30k)
# every image-text pair has to be ranked; please use as many GPUs as possible
horovodrun -np $NGPU python inf_itm.py \
--txt_db /txt/itm_flickr30k_test.db --img_db /img/flickr30k \
--checkpoint /pretrain/uniter-base.pt --model_config /src/config/uniter-base.json \
--output_dir $ZS_ITM_RESULT --fp16 --pin_mem
Image-Text Retrieval (Flickr30k)
正常微调
horovodrun -np 8 python train_itm.py --config config/train-itm-flickr-base-8gpu.json
用硬底片进行微调(finetune with hard negatives)
horovodrun -np 16 python train_itm_hard_negatives.py \
--config config/train-itm-flickr-base-16gpu-hn.jgon
Image-Text Retrieval (COCO)
用硬底片进行微调(finetune with hard negatives)
horovodrun -np 16 python train_itm_hard_negatives.py \
--config config/train-itm-coco-base-16gpu-hn.json
引用表达式
1.下载数据
bash scripts/download_re.sh $PATH_TO_STORAGE
2.训练
python train_re.py --config config/train-refcoco-base-1gpu.json \
--output_dir $RE_EXP
3.推理和评估
source scripts/eval_refcoco.sh $RE_EXP
结果文件将写入 $RE_EXP/results_test/
同样,更改运行 RefCOCO+/RefCOCOg 的相应配置/脚本。
预训练
下载
bash scripts/download_indomain.sh $PATH_TO_STORAGE
预训练
horovodrun -np 8 python pretrain.py --config config/pretrain-indomain-base-8gpu.json \
--output_dir $PRETRAIN_EXP
不幸的是,我们无法托管 CC/SBU 功能,因为它们很大。 用户需要自己处理它们。 我们将很快提供一个较小的样本,以便于参考预期的格式。
引文
如果您发现此代码对您的研究有用,请考虑引用:
@inproceedings{chen2020uniter,
title={Uniter: Universal image-text representation learning},
author={Chen, Yen-Chun and Li, Linjie and Yu, Licheng and Kholy, Ahmed El and Ahmed, Faisal and Gan, Zhe and Cheng, Yu and Liu, Jingjing},
booktitle={ECCV},
year={2020}
}
License
MIT