lxmert

GitHub
966 162 较难 1 次阅读 2个月前MIT语言模型图像其他
AI 解读 由 AI 自动生成,仅供参考

LXMERT 是一个基于 PyTorch 开发的开源深度学习框架,源自 EMNLP 2019 的学术论文。它致力于解决计算机视觉与自然语言处理之间的跨模态理解难题,让 AI 能够像人类一样同时“看”图并“读”懂文字描述,从而精准回答相关问题或进行逻辑推理。

该工具的核心亮点在于其独特的 Transformer 架构设计,通过专门的交叉模态编码器,高效地融合图像特征与文本语义。在 VQA(视觉问答)、GQA 及 NLVR2 等权威基准测试中,LXMERT 曾取得顶尖成绩,证明了其强大的泛化能力与准确性。项目不仅提供了经过大规模预训练的模型权重,方便用户直接调用或微调,还完整复现了从预训练到下游任务适配的全流程代码。

LXMERT 非常适合人工智能研究人员、算法工程师以及高校师生使用。如果你正在探索多模态学习领域,或者需要构建能够理解图文内容的智能应用,LXMERT 提供了一个坚实且透明的技术基线。尽管部署和训练过程需要一定的深度学习基础及 GPU 资源支持,但其详尽的文档和成熟的代码库能显著降低研究门槛,助力开发者快速验证想法并推进前沿探索。

使用场景

某电商平台的智能客服团队正在开发一款能同时理解商品图片和用户文字提问的自动问答机器人,以处理如“这件红色连衣裙有口袋吗?”这类复杂的跨模态查询。

没有 lxmert 时

  • 模型架构割裂:开发人员需要分别训练独立的图像识别模型和文本理解模型,再通过繁琐的规则或简单的拼接层强行融合,导致图文语义对齐效果差。
  • 研发周期漫长:从零开始构建跨模态注意力机制需要深厚的算法功底,团队需花费数周时间复现论文逻辑并调试底层代码,严重拖慢项目进度。
  • 冷启动性能低下:由于缺乏大规模预训练权重支持,模型在少量标注数据上难以收敛,面对未见过的商品组合时,回答准确率远低于预期。
  • 多任务适配困难:每新增一个视觉语言任务(如从看图说话切换到视觉推理),都需要重新设计网络结构并从头训练,维护成本极高。

使用 lxmert 后

  • 原生跨模态融合:lxmert 内置的 Transformer 编码器能直接在底层实现图像区域与文本单词的深度交互,精准捕捉“红色”与“连衣裙”之间的细粒度关联。
  • 开箱即用的高效部署:团队直接加载 lxmert 提供的 870MB 预训练权重,仅需针对电商数据微调 4 个 epoch 即可上线,将研发周期从数周缩短至几天。
  • 卓越的泛化能力:得益于在大规模数据集上的预训练,lxmert 在零样本或少样本场景下依然保持高准确率,有效解决了新商品上架时的冷启动问题。
  • 统一的多任务框架:无论是视觉问答还是自然语言视觉推理,lxmert 只需调整少量超参数即可复用同一套代码库,极大降低了后续功能迭代的复杂度。

lxmert 通过提供成熟的跨模态预训练底座,让开发者无需重复造轮子,即可快速构建出具备深度图文理解能力的生产级 AI 应用。

运行环境要求

操作系统
  • Linux
GPU
  • 必需 NVIDIA GPU
  • 预训练默认设置需要 4 张 GPU
  • 微调过程指定了 GPU ID(如 bash 脚本中的参数 0),未明确具体型号,但需支持 Faster R-CNN 特征处理及大模型训练,建议显存充足(通常此类任务需 16GB+ 以支持较大 Batch Size)
  • CUDA 版本未说明
内存

未说明(但下载图像特征文件需约 17GB-30GB 磁盘空间,处理大规模数据建议大内存)

依赖
notes1. 代码库基于 PyTorch,需通过 'pip install -r requirements.txt' 安装依赖,但 README 未列出具体库版本。2. 预训练默认配置需要 4 张 GPU,耗时约一周;微调 VQA 任务约需 8 小时,GQA 任务约需 16 小时。3. 必须下载外部预处理数据:包括 Faster R-CNN 提取的图像特征(MS COCO 和 Visual Genome 等,总计约 50GB+)以及重新分发的 JSON 数据文件。4. 支持使用 virtualenv 创建 Python 3 虚拟环境。5. 提供了预训练模型(870MB)及不同 epoch 的检查点下载链接。
pythonPython 3
torch (PyTorch)
requirements.txt 中列出的其他依赖
lxmert hero image

快速开始

LXMERT:从 Transformer 学习跨模态编码器表示

我们的服务器又出问题了 :(。我已经更新了链接,现在应该可以正常使用了。对于造成的不便,我们深感抱歉。如果还有其他问题,请随时告知我。谢谢!--Hao,12月03日

简介

这是 EMNLP 2019 论文 "LXMERT: Learning Cross-Modality Encoder Representations from Transformers" 的 PyTorch 代码实现。我们在 EMNLP 2019 上的演讲幻灯片可在此 查看

  • 若要分析预训练模型的输出(而非在下游任务上进行微调),请加载权重 https://nlp.cs.unc.edu/data/github_pretrain/lxmert20/Epoch20_LXRT.pth,该权重是按照[预训练]部分所述的方式训练得到的。默认权重此处则是使用与此代码略有不同的协议进行训练的。

结果(基于此 GitHub 版本)

划分 VQA GQA NLVR2
局部验证 69.90% 59.80% 74.95%
测试-开发 72.42% 60.00% 74.45% (Test-P)
测试-标准 72.54% 60.33% 76.18% (Test-U)

表中所有结果均完全由本代码库生成。 由于 VQAGQA 的测试服务器仅允许有限次数的“测试-标准”提交, 我们便利用自己在 2019 年 VQA/GQA 挑战赛中剩余的提交名额来获得这些结果。 至于 NLVR2,我们仅在未公开的测试集(test-U)上进行了单次测试。

我们使用此代码(结合模型集成)参加了 2019 年的 VQAGQA 挑战赛。 我们是这两项挑战赛中唯一一支同时进入 前三名 的队伍。

预训练模型

预训练模型(870 MB)可在 http://nlp.cs.unc.edu/data/model_LXRT.pth 获取,下载命令如下:

mkdir -p snap/pretrained 
wget https://nlp.cs.unc.edu/data/model_LXRT.pth -P snap/pretrained

若下载速度较慢,也可从其他来源下载预训练模型。请将下载的文件放置于 snap/pretrained/model_LXRT.pth

我们还在[预训练]部分提供了用于预训练模型的数据和命令。默认设置需要 4 张 GPU 卡,整个过程大约需要一周时间。使用本代码库训练的预训练权重可从 https://nlp.cs.unc.edu/data/github_pretrain/lxmert/EpochXX_LXRT.pth 下载,其中 XX 为 01 至 12。这些权重仅预训练了 12 个 epoch(而 EMNLP 论文中为 20 个 epoch),因此在各数据集上的微调结果会低约 0.3%。

在视觉-语言任务上进行微调

我们使用以下超参数对 LXMERT 预训练模型进行各个任务的微调:

数据集 批量大小 学习率 轮数 加载答案
VQA 32 5e-5 4
GQA 32 1e-5 4
NLVR2 32 5e-5 4

尽管微调过程几乎相同,只是超参数有所不同, 我们仍针对每个数据集提供了详细说明,以确保涵盖所有细节。

一般说明

该代码需要 Python 3,请通过以下命令安装 Python 依赖:

pip install -r requirements.txt

此外,您也可以创建并激活一个 Python 3 虚拟环境:

virtualenv name_of_environment -p python3
source name_of_environment/bin/activate

VQA

微调

  1. 请确保 LXMERT 预训练模型已 下载预训练 完成。

  2. 下载重新分发的 VQA 2.0 数据集 JSON 文件。原始 VQA 2.0 数据集可从 官方网站 下载。

    mkdir -p data/vqa
    wget https://nlp.cs.unc.edu/data/lxmert_data/vqa/train.json -P data/vqa/
    wget https://nlp.cs.unc.edu/data/lxmert_data/vqa/nominival.json -P  data/vqa/
    wget https://nlp.cs.unc.edu/data/lxmert_data/vqa/minival.json -P data/vqa/
    
  3. 下载 MS COCO train2014(17 GB)和 val2014(8 GB)图像的 Faster R-CNN 特征(VQA 2.0 是基于 MS COCO 数据集收集的)。 这些图像特征也可在 Google Drive 和 Baidu Drive 上获取(详情参见 替代下载链接)。

    mkdir -p data/mscoco_imgfeat
    wget https://nlp.cs.unc.edu/data/lxmert_data/mscoco_imgfeat/train2014_obj36.zip -P data/mscoco_imgfeat
    unzip data/mscoco_imgfeat/train2014_obj36.zip -d data/mscoco_imgfeat && rm data/mscoco_imgfeat/train2014_obj36.zip
    wget https://nlp.cs.unc.edu/data/lxmert_data/mscoco_imgfeat/val2014_obj36.zip -P data/mscoco_imgfeat
    unzip data/mscoco_imgfeat/val2014_obj36.zip -d data && rm data/mscoco_imgfeat/val2014_obj36.zip
    
  4. 在对整个 VQA 2.0 训练集进行微调之前,建议先在一个小型训练集(512 张图像)上验证脚本和模型。 第一个参数 0 表示 GPU ID。第二个参数 vqa_lxr955_tiny 是本次实验的名称。

    bash run/vqa_finetune.bash 0 vqa_lxr955_tiny --tiny
    
  5. 如果没有出现错误,则可以开始在完整 VQA 语料库上训练模型:

    bash run/vqa_finetune.bash 0 vqa_lxr955
    

大约需要 8 小时(每轮 2 小时 × 4 轮)才能收敛。日志模型快照将保存在 snap/vqa/vqa_lxr955 文件夹下。训练后的验证结果约为 69.7%70.2%

本地验证

在训练过程中会打印出验证集(我们的 minival 集)上的结果。验证结果也会保存到 snap/vqa/[experiment-name]/log.log 文件中。如果日志文件被意外删除,也可以通过模型快照重现训练中的验证结果:

bash run/vqa_test.bash 0 vqa_lxr955_results --test minival --load snap/vqa/vqa_lxr955/BEST

提交至 VQA 测试服务器

  1. 下载我们重新分发的包含 VQA 2.0 测试数据的 JSON 文件。
    wget https://nlp.cs.unc.edu/data/lxmert_data/vqa/test.json -P data/vqa/
    
  2. 下载 MS COCO test2015 分割的 Faster R-CNN 特征(16 GB)。
    wget https://nlp.cs.unc.edu/data/lxmert_data/mscoco_imgfeat/test2015_obj36.zip -P data/mscoco_imgfeat
    unzip data/mscoco_imgfeat/test2015_obj36.zip -d data && rm data/mscoco_imgfeat/test2015_obj36.zip
    
  3. 由于 VQA 提交系统要求提交完整的测试数据,我们需要对所有测试分割(即 test dev、test standard、test challenge 和 test held-out)运行推理。运行测试推理大约需要 10~15 分钟(共 448K 个实例)。
    bash run/vqa_test.bash 0 vqa_lxr955_results --test test --load snap/vqa/vqa_lxr955/BEST
    

测试结果将保存在 snap/vqa_lxr955_results/test_predict.json 中。今年的 VQA 2.0 挑战赛在 EvalAIhttps://evalai.cloudcv.org/web/challenges/challenge-page/163/overview 上举行。挑战赛结束后仍可继续提交。请查看 VQA 挑战赛官网 获取详细信息,并按照 EvalAI 上的说明进行提交。通常情况下,注册完成后,只需上传 test_predict.json 文件并等待结果即可。

使用完全相同的代码,test-dev 的测试准确率为 72.42%,test-standard 的测试准确率为 72.54%。基于该代码库的结果也已在 VQA 2.0 排行榜 上以条目 LXMERT github version 公开展示。

GQA

微调

  1. 请确保 LXMERT 预训练模型已下载预训练完成。

  2. 下载 GQA 平衡版本数据集的重新分发 JSON 文件。
    原始 GQA 数据集可在其官网的“下载”部分获取:https://cs.stanford.edu/people/dorarad/gqa/download.html,预处理脚本位于 data/gqa/process_raw_data_scripts 目录下。

    mkdir -p data/gqa
    wget https://nlp.cs.unc.edu/data/lxmert_data/gqa/train.json -P data/gqa/
    wget https://nlp.cs.unc.edu/data/lxmert_data/gqa/valid.json -P data/gqa/
    wget https://nlp.cs.unc.edu/data/lxmert_data/gqa/testdev.json -P data/gqa/
    
  3. 下载 Visual Genome 和 GQA 测试图像的 Faster R-CNN 特征(30 GB)。
    GQA 的训练和验证数据来自 Visual Genome,而其测试图像则来自 MS COCO 测试集(这一点已由 GQA 的作者之一 Drew A. Hudson 确认,LinkedIn 链接:https://www.linkedin.com/in/drew-a-hudson/)。
    图像特征也可通过 Google Drive 和百度网盘获取(详情见替代下载链接)。

    mkdir -p data/vg_gqa_imgfeat
    wget https://nlp.cs.unc.edu/data/lxmert_data/vg_gqa_imgfeat/vg_gqa_obj36.zip -P data/vg_gqa_imgfeat
    unzip data/vg_gqa_imgfeat/vg_gqa_obj36.zip -d data && rm data/vg_gqa_imgfeat/vg_gqa_obj36.zip
    wget https://nlp.cs.unc.edu/data/lxmert_data/vg_gqa_imgfeat/gqa_testdev_obj36.zip -P data/vg_gqa_imgfeat
    unzip data/vg_gqa_imgfeat/gqa_testdev_obj36.zip -d data && rm data/vg_gqa_imgfeat/gqa_testdev_obj36.zip
    
  4. 在对整个 GQA 训练+验证集进行微调之前,建议先在小规模训练集(512 张图像)上验证脚本和模型。
    第一个参数 0 表示 GPU ID,第二个参数 gqa_lxr955_tiny 是本次实验的名称。

    bash run/gqa_finetune.bash 0 gqa_lxr955_tiny --tiny
    
  5. 如果未出现错误,则可以开始在完整的 GQA 语料库(训练集 + 验证集)上训练模型,并在 testdev 集上进行验证:

    bash run/gqa_finetune.bash 0 gqa_lxr955
    

    大约需要 16 小时(每轮 4 小时 × 4 轮)才能收敛。
    日志模型快照将保存在 snap/gqa/gqa_lxr955 文件夹中。
    训练后的验证结果大约在 59.8% 到 60.1% 之间。

本地验证

训练过程中会打印出 testdev 上的结果,并保存在 snap/gqa/gqa_lxr955/log.log 中。
也可以通过以下命令重新计算:

bash run/gqa_test.bash 0 gqa_lxr955_results --load snap/gqa/gqa_lxr955/BEST --test testdev --batchSize 1024

注意:我们的本地 testdev 结果通常比提交的 testdev 结果低 0.1% 至 0.5%。
这是因为测试服务器使用了高级评估系统,而我们本地的评估器仅计算精确匹配。
如果您希望在不提交的情况下获得准确的分数,请使用官方评估工具(784 MB)。

提交至 GQA 测试服务器

  1. 下载我们重新分发的包含 GQA 测试数据的 JSON 文件。

    wget https://nlp.cs.unc.edu/data/lxmert_data/gqa/submit.json -P data/gqa/
    
  2. 由于 GQA 提交系统要求提交完整的测试数据,因此我们需要对所有测试分割运行推理。
    运行测试推理大约需要 30–60 分钟(共需处理 420 万个实例)。

    bash run/gqa_test.bash 0 gqa_lxr955_results --load snap/gqa/gqa_lxr955/BEST --test submit --batchSize 1024
    
  3. 运行测试脚本后,snap/gqa/gqa_lxr955_results 目录下会生成一个名为 submit_predict.json 的文件,其中包含所有预测结果,可直接提交。
    GQA 挑战赛 2019 由 EvalAI 托管,网址为:https://evalai.cloudcv.org/web/challenges/challenge-page/225/overview
    注册账号、上传 submit_predict.json 文件并等待结果即可。
    请同时关注GQA 官方网站,以防测试服务器发生变更。

使用完全相同的代码,test-dev 的测试准确率为 60.00%,test-standard 的测试准确率为 60.33%
基于该代码库的结果也已在GQA 排行榜上公开显示,条目为 LXMERT github version

NLVR2

微调

  1. 从官方 GitHub 仓库 下载 NLVR2 数据。

    git submodule update --init
    
  2. 将 NLVR2 数据处理为 JSON 文件。

    bash -c "cd data/nlvr2/process_raw_data_scripts && python process_dataset.py"
    
  3. 下载 NLVR2 的训练集(21 GB)和验证集(1.6 GB)的图像特征。这些图像特征也可在 Google Drive 和百度网盘上获取(详情请参见 替代下载链接)。如需访问原始图像,请按照 NLVR2 官方 GitHub 上的说明操作。图像可以通过提供的 URL 直接下载,也可以通过签署数据使用协议来获取。特征提取方法请参考 Faster R-CNN 特征提取

    mkdir -p data/nlvr2_imgfeat
    wget https://nlp.cs.unc.edu/data/lxmert_data/nlvr2_imgfeat/train_obj36.zip -P data/nlvr2_imgfeat
    unzip data/nlvr2_imgfeat/train_obj36.zip -d data && rm data/nlvr2_imgfeat/train_obj36.zip
    wget https://nlp.cs.unc.edu/data/lxmert_data/nlvr2_imgfeat/valid_obj36.zip -P data/nlvr2_imgfeat
    unzip data/nlvr2_imgfeat/valid_obj36.zip -d data && rm data/nlvr2_imgfeat/valid_obj36.zip
    
  4. 在对整个 NLVR2 训练集进行微调之前,建议先在一个小型训练集(512 张图像)上验证脚本和模型。第一个参数 0 是 GPU ID;第二个参数 nlvr2_lxr955_tiny 是本次实验的名称。如果在这个小规模数据集上的结果较低(50~55),也不必担心,因为使用完整训练数据后性能会回升。

    bash run/nlvr2_finetune.bash 0 nlvr2_lxr955_tiny --tiny
    
  5. 如果上一步没有出现任何错误,则说明代码、数据和图像特征均已准备就绪。请使用以下命令在完整训练集上进行训练。在 NLVR2 验证集(dev)上的结果大约会在 74.074.5 之间。

    bash run/nlvr2_finetune.bash 0 nlvr2_lxr955
    

在公开测试集上的推理

  1. 下载 NLVR2 公开测试集的图像特征(1.6 GB)。

    wget https://nlp.cs.unc.edu/data/lxmert_data/nlvr2_imgfeat/test_obj36.zip -P data/nlvr2_imgfeat
    unzip data/nlvr2_imgfeat/test_obj36.zip -d data/nlvr2_imgfeat && rm data/nlvr2_imgfeat/test_obj36.zip
    
  2. 使用以下命令在公开测试集(对应于 NLVR2 排行榜 中的 'test-P')上进行测试:

    bash run/nlvr2_test.bash 0 nlvr2_lxr955_results --load snap/nlvr2/nlvr2_lxr955/BEST --test test --batchSize 1024
    
  3. 大约 5~10 分钟后,屏幕上会显示测试准确率。预测结果也会保存在 snap/nlvr2_lxr955_reuslts 目录下的 test_predict.csv 文件中,该文件与 NLVR2 官方评估脚本 兼容。除了准确率外,官方评估脚本还会计算一致性指标('Cons')。我们可以通过运行以下命令来验证结果:

    python data/nlvr2/nlvr/nlvr2/eval/metrics.py snap/nlvr2/nlvr2_lxr955_results/test_predict.csv data/nlvr2/nlvr/nlvr2/data/test1.json
    

公开测试集('test-P')的准确率应与验证集('dev')大致相同,约为 74.0% 至 74.5%。

未发布的测试集

若要在未发布的保留测试集(排行榜 上的 'test-U')上进行测试,需要提交代码。详情请查看 NLVR2 官方 GitHubNLVR 项目官网

常见调试选项

由于加载特征需要几分钟时间,代码提供了一个选项,可以使用少量训练数据进行原型测试。

# 使用 512 张图像进行训练:
bash run/vqa_finetune.bash 0 --tiny 
# 使用 4096 张图像进行训练:
bash run/vqa_finetune.bash 0 --fast

预训练

  1. 从 MS COCO、Visual Genome、VQA 和 GQA 下载我们聚合的 LXMERT 数据集(总大小约 700MB)。联合答案标签保存在 data/lxmert/all_ans.json 中。

    mkdir -p data/lxmert
    wget https://nlp.cs.unc.edu/data/lxmert_data/lxmert/mscoco_train.json -P data/lxmert/
    wget https://nlp.cs.unc.edu/data/lxmert_data/lxmert/mscoco_nominival.json -P data/lxmert/
    wget https://nlp.cs.unc.edu/data/lxmert_data/lxmert/vgnococo.json -P data/lxmert/
    wget https://nlp.cs.unc.edu/data/lxmert_data/lxmert/mscoco_minival.json -P data/lxmert/
    
  2. [如果您已经运行过 VQA 微调,请跳过此步骤。] 下载 MS COCO 图像的检测特征。

    mkdir -p data/mscoco_imgfeat
    wget https://nlp.cs.unc.edu/data/lxmert_data/mscoco_imgfeat/train2014_obj36.zip -P data/mscoco_imgfeat
    unzip data/mscoco_imgfeat/train2014_obj36.zip -d data/mscoco_imgfeat && rm data/mscoco_imgfeat/train2014_obj36.zip
    wget https://nlp.cs.unc.edu/data/lxmert_data/mscoco_imgfeat/val2014_obj36.zip -P data/mscoco_imgfeat
    unzip data/mscoco_imgfeat/val2014_obj36.zip -d data && rm data/mscoco_imgfeat/val2014_obj36.zip
    
  3. [如果您已经运行过 GQA 微调,请跳过此步骤。] 下载 Visual Genome 图像的检测特征。

    mkdir -p data/vg_gqa_imgfeat
    wget https://nlp.cs.unc.edu/data/lxmert_data/vg_gqa_imgfeat/vg_gqa_obj36.zip -P data/vg_gqa_imgfeat
    unzip data/vg_gqa_imgfeat/vg_gqa_obj36.zip -d data && rm data/vg_gqa_imgfeat/vg_gqa_obj36.zip
    
  4. 在 MS COCO + Visual Genome 数据集的一个小子集上进行测试:

    bash run/lxmert_pretrain.bash 0,1,2,3 --multiGPU --tiny
    
  5. 在整个 MS COCOVisual Genome 相关数据集(即 VQAGQACOCO 字幕VG 字幕VG QA)上运行。这里我们采用简单的单阶段预训练策略(所有预训练任务共 20 个 epoch),而不是论文中的两阶段策略(无图像 QA 的 10 个 epoch 和有图像 QA 的 10 个 epoch)。在 4 张 GPU 上,预训练大约需要 8.5 天 完成。顺便说一句,我希望我在该项目中的 经验分享 能够帮助那些计算资源有限的人。

    bash run/lxmert_pretrain.bash 0,1,2,3 --multiGPU
    

    多 GPU:参数 0,1,2,3 表示使用 4 张 GPU 来预训练 LXMERT。如果服务器没有 4 张 GPU(对此我深表遗憾),请考虑将 batch-size 减半,或者使用 NVIDIA/apex 库来支持半精度计算。代码使用 PyTorch 默认的数据并行机制,因此可以扩展到更多或更少的 GPU。Python 主线程负责数据加载。在 4 张 GPU 上,我们并未发现数据加载成为瓶颈(约 5% 的开销)。

    GPU 类型:我们发现 Titan XP、GTX 2080 和 Titan V 都可以支持这项预训练。然而,GTX 1080 的显存只有 11G,略显不足,因此请将 batch_size 调整为 224(而不是 256)。

  6. 我已经用 12 个 epoch 验证了这些预训练命令。之前过程中的预训练权重可以从 https://nlp.cs.unc.edu/data/github_pretrain/lxmert/EpochXX_LXRT.pth 下载,XX 从 0112。结果大致相同(由于 epoch 数较少,在下游任务中准确率会低约 0.3%)。

  7. 对预训练脚本 run/lxmert_pretrain.bash 中参数的解释:

    python src/pretrain/lxmert_pretrain_new.py \
        # 预训练任务
        --taskMaskLM --taskObjPredict --taskMatched --taskQA \  
        
        # 视觉子任务
        # obj / attr:检测到的对象/属性标签预测。
        # feat:RoI 特征回归。
        --visualLosses obj,attr,feat \
        
        # 词语和物体的掩码率
        --wordMaskRate 0.15 --objMaskRate 0.15 \
        
        # 训练集和验证集
        # mscoco_nominival + mscoco_minival = mscoco_val2014
        # visual genome - mscoco = vgnococo
        --train mscoco_train,mscoco_nominival,vgnococo --valid mscoco_minival \
        
        # 每个编码器的层数
        --llayers 9 --xlayers 5 --rlayers 5 \
        
        # 从头开始训练(使用初始化权重),而不是加载 BERT 权重。
        --fromScratch \
    
        # 超参数
        --batchSize 256 --optim bert --lr 1e-4 --epochs 20 \
        --tqdm --output $output ${@:2}
    

替代数据集和特征下载链接

所有默认的下载链接都由我们在 UNC CS 部门 的服务器提供,并托管在我们的 NLP 小组网站 上,但网络带宽可能会有限。因此,我们提供了几个通过 Google Drive 和 Baidu Drive 的替代选项。

在线存储中的文件结构与我们的仓库几乎相同,但由于具体政策的不同,存在一些差异。从这些存储中下载数据和特征后,请按照以下示例将其重新组织到 data/ 文件夹下:

REPO ROOT
 |
 |-- data                  
 |    |-- vqa
 |    |    |-- train.json
 |    |    |-- minival.json
 |    |    |-- nominival.json
 |    |    |-- test.json
 |    |
 |    |-- mscoco_imgfeat
 |    |    |-- train2014_obj36.tsv
 |    |    |-- val2014_obj36.tsv
 |    |    |-- test2015_obj36.tsv
 |    |
 |    |-- vg_gqa_imgfeat -- *.tsv
 |    |-- gqa -- *.json
 |    |-- nlvr2_imgfeat -- *.tsv
 |    |-- nlvr2 -- *.json
 |    |-- lxmert -- *.json          # 预训练数据
 | 
 |-- snap
 |-- src

如果发现有任何缺失,请随时与我们联系!

Google Drive

作为从我们的 UNC 服务器下载特征的一种替代方式,您也可以通过以下 Google Drive 链接下载特征:https://drive.google.com/drive/folders/1Gq1uLUk6NdD0CcJOptXjxE6ssY5XAuat?usp=sharing。云端文件夹的结构如下:

Google Drive 根目录
 |-- data                  # 原始数据和图像特征,未压缩
 |    |-- vqa
 |    |-- gqa
 |    |-- mscoco_imgfeat
 |    |-- ......
 |
 |-- image_feature_zips    # 图像特征压缩包(压缩率约 45%)
 |    |-- mscoco_imgfeat.zip
 |    |-- nlvr2_imgfeat.zip
 |    |-- vg_gqa_imgfeat.zip
 |
 |-- snap -- pretrained -- model_LXRT.pth # PyTorch 预训练模型权重。

注意:压缩包中的图像特征(例如 mscoco_mgfeat.zip)与 data/ 中的特征(即 data/mscoco_imgfeat)完全相同。如果您希望节省网络带宽,可以直接下载这些压缩包,而无需再下载 data/ 下的 *_imgfeat 文件夹。

百度网盘

由于Google Drive 并未在全球范围内正式开放, 我们也在百度网盘(即百度盘)上创建了一个镜像。 数据集和特征可以通过共享链接 https://pan.baidu.com/s/1m0mUVsq30rO6F1slxPZNHA 以及提取码 wwma 下载。

百度网盘根目录
 |
 |-- vqa
 |    |-- train.json
 |    |-- minival.json
 |    |-- nominival.json
 |    |-- test.json
 |
 |-- mscoco_imgfeat
 |    |-- train2014_obj36.zip
 |    |-- val2014_obj36.zip
 |    |-- test2015_obj36.zip
 |
 |-- vg_gqa_imgfeat -- *.zip.*  # 请阅读该文件夹下的 README.txt
 |-- gqa -- *.json
 |-- nlvr2_imgfeat -- *.zip.*   # 请阅读该文件夹下的 README.txt
 |-- nlvr2 -- *.json
 |-- lxmert -- *.json
 | 
 |-- pretrained -- model_LXRT.pth

由于百度网盘不支持超大文件, 我们将部分特征压缩包拆分成了多个小文件。 请按照 baidu_drive/vg_gqa_imgfeatbaidu_drive/nlvr2_imgfeat 文件夹下的 README.txt 说明, 使用 cat 命令将这些小文件重新拼接成完整的特征压缩包。

代码与项目说明

  • 所有代码均位于 src 文件夹中,基础部分在 lxrt 中。 与预训练和微调相关的 Python 文件分别保存在 src/pretrainsrc/tasks 文件夹内。
  • 我们将包含图像特征的文件夹(如 mscoco_imgfeat)与视觉-语言数据集(如 vqa, lxmert)分开存放, 因为多个视觉-语言数据集会共享相同的图像。
  • 我们将框架命名为 lxmert,而将模型称为 lxrt(即语言、跨模态与对象关系Transformer)。
  • 为保持与 lxrt 名称的一致性, 我们用 lxrXXX 来表示层数。 例如,lxr955(当前预训练模型中使用的配置)表示一个具有 9 层语言模块、5 层跨模态模块和 5 层对象关系模块的模型。 若将单模态层视为跨模态层的一半,则总层数为 (9 + 5) / 2 + 5 = 12,这与 BERT_BASE 的层数相同。
  • 我们在两个跨模态注意力子层之间共享权重。请查看 visual_attention 变量,它同时用于计算 lang->visnvisn->lang 的注意力。(很抱歉,visual_attention 这个名称容易引起误解,因为我当时删除了 lang_attention。)共享权重主要是为了节省计算资源,同时也(直观地)有助于将视觉和语言特征映射到一个共同的子空间。
  • 框架坐标并未从 [0, 1] 归一化到 [-1, 1],这看似是一个笔误,但实际上并非如此;对坐标进行归一化并不会影响框编码器的输出结果(无论从数学还是数值计算的角度来看都是如此)。(提示:可以考虑位置编码中的 LayerNorm)

Faster R-CNN 特征提取

我们使用的是“Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering”, CVPR 2018”论文中展示的 Faster R-CNN 特征提取方法, 其代码已在 Bottom-Up-Attention GitHub 仓库 上公开。 该方法基于 Visual Genome 数据集进行训练,并且是在特定版本的 Caffe 框架上实现的。

为了使用这套 Caffe Faster R-CNN 提取特征,我们在 Docker Hub 上公开发布了 airsplay/bottom-up-attention 镜像,其中已预先配置好所有依赖项和库的安装。下方提供了详细的说明和示例。您也可以参考 Bottom-Up Attention GitHub 仓库中的安装指南来搭建工具:https://github.com/peteanderson80/bottom-up-attention

BUTD 特征提取器已被广泛应用于许多其他项目中。如果您希望复现该论文中的实验结果,欢迎直接使用我们的 Docker 镜像作为工具。

使用 Docker 进行特征提取

Docker 是一个易于使用的虚拟化工具,它允许你在无需安装库的情况下即插即用。

用于 Bottom-Up Attention 的预构建 Docker 镜像已在 Docker Hub 上发布,可以通过以下命令下载:

sudo docker pull airsplay/bottom-up-attention

Dockerfile 可以从这里下载,这使得你可以使用其他版本的 CUDA。

拉取 Docker 镜像后,你可以通过以下命令测试运行容器:

docker run --gpus all --rm -it airsplay/bottom-up-attention bash

如果出现关于 --gpus all 的错误,请阅读下一节。

Docker GPU 访问

请注意,参数 --gpus all 的作用是将 GPU 设备暴露给 Docker 容器,它需要 Docker >= 19.03 以及 nvidia-container-toolkit

  1. Docker CE 19.03
  2. nvidia-container-toolkit

对于使用较旧版本 Docker 的情况,可以将其更新到 19.03,或者使用 --runtime=nvidia 标志代替 --gpus all

示例:为 NLVR2 提取特征

我们演示如何提取 NLVR2 图像的 Faster R-CNN 特征。

  1. 请首先按照 NLVR2 官方仓库 中的说明获取图像。

  2. 下载预训练的 Faster R-CNN 模型。我们没有使用默认的预训练模型(该模型是在 10 到 100 个框上训练的),而是使用了 'alternative pretrained model',该模型是在 36 个框上训练的。

    wget 'https://www.dropbox.com/s/2h4hmgcvpaewizu/resnet101_faster_rcnn_final_iter_320000.caffemodel?dl=1' -O data/nlvr2_imgfeat/resnet101_faster_rcnn_final_iter_320000.caffemodel
    
  3. 使用以下命令运行 Docker 容器:

    docker run --gpus all -v /path/to/nlvr2/images:/workspace/images:ro -v /path/to/lxrt_public/data/nlvr2_imgfeat:/workspace/features --rm -it airsplay/bottom-up-attention bash
    

    -v 将主机上的文件夹挂载到 Docker 容器中。

    注意0:如果提示权限相关问题,请在命令前加上 sudo

    注意1:如果提示 --gpus all 相关错误,则表示 GPU 选项未正确设置。请参阅 Docker GPU 访问 获取允许 GPU 访问的说明。

    注意2:/path/to/nlvr2/images 文件夹应包含 traindevtest1test2 子文件夹。

    注意3:/path/to/nlvr2/images//path/to/lxrt_public 均需使用绝对路径。

  4. Docker 容器内提取特征。提取脚本源自 butd/tools/generate_tsv.py,并由 Jie Lei 和我进行了修改。

    cd /workspace/features
    CUDA_VISIBLE_DEVICES=0 python extract_nlvr2_image.py --split train 
    CUDA_VISIBLE_DEVICES=0 python extract_nlvr2_image.py --split valid
    CUDA_VISIBLE_DEVICES=0 python extract_nlvr2_image.py --split test
    
  5. 训练集的提取大约需要 5 到 6 小时,而验证集和测试集则分别需要 1 到 2 小时。由于速度较慢,建议如果有多个 GPU,可以并行运行这些任务。可以通过更改 CUDA_VISIBLE_DEVICES=$gpu_id 中的 gpu_id 来实现。

提取的特征将保存在 Docker 容器外部的 data/nlvr2_imgfeat 目录下的 train.tsvvalid.tsvtest.tsv 文件中。我已经验证过,提取的图像特征与我在 NLVR2 微调 中提供的特征一致。

另一个示例:为 MS COCO 图像提取特征

  1. MS COCO 官方网站 下载 MS COCO 的 train2014、val2014 和 test2015 图像。

  2. 下载预训练的 Faster R-CNN 模型。

    mkdir -p data/mscoco_imgfeat
    wget 'https://www.dropbox.com/s/2h4hmgcvpaewizu/resnet101_faster_rcnn_final_iter_320000.caffemodel?dl=1' -O data/mscoco_imgfeat/resnet101_faster_rcnn_final_iter_320000.caffemodel
    
  3. 使用以下命令运行 Docker 容器:

    docker run --gpus all -v /path/to/mscoco/images:/workspace/images:ro -v $(pwd)/data/mscoco_imgfeat:/workspace/features --rm -it airsplay/bottom-up-attention bash
    

    注意:-v 选项会将容器外的文件夹挂载到容器内的路径。

    注意1:请使用 MS COCO 图像文件夹 images绝对路径。该文件夹包含 train2014val2014test2015 子文件夹。(这是保存 MS COCO 图像的标准方式。)

  4. Docker 容器内提取特征。

    cd /workspace/features
    CUDA_VISIBLE_DEVICES=0 python extract_coco_image.py --split train 
    CUDA_VISIBLE_DEVICES=0 python extract_coco_image.py --split valid
    CUDA_VISIBLE_DEVICES=0 python extract_coco_image.py --split test
    
  5. 退出 Docker 容器(在 bash 中执行 exit 命令)。提取的特征将保存在 data/mscoco_imgfeat 文件夹下。

参考文献

如果你觉得这个项目对你有帮助,请引用我们的论文 :)

@inproceedings{tan2019lxmert,
  title={LXMERT: Learning Cross-Modality Encoder Representations from Transformers},
  author={Tan, Hao and Bansal, Mohit},
  booktitle={Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing},
  year={2019}
}

致谢

我们感谢ARO-YIP奖#W911NF-18-1-0336,以及来自Google、Facebook、Salesforce和Adobe的资助支持。

我们感谢Peter AndersonBottom-Up-Attention GitHub仓库中提供的Faster R-CNN代码和预训练模型。同时,我们也感谢Hengyuan Hu实现的PyTorch VQA,我们的VQA实现借鉴了其中预处理的答案。

此外,我们感谢hugginface发布的优秀PyTorch代码库PyTorch Transformers

我们特别感谢Drew A. Hudson解答了我们关于GQA规范的所有问题。同时,我们也感谢Alane Suhr协助我们在NLVR2未公开的测试集上测试LXMERT,并提供了详细分析

我们还要感谢所有视觉与语言数据集的作者和标注者(例如:MS COCOVisual GenomeVQAGQANLVR2),正是他们的工作使我们能够开发出用于视觉与语言任务的预训练模型。

最后,我们感谢Jie LeiLicheng Yu的有益讨论。我也要特别感谢Shaoqing Ren在我于MSRA期间传授的视觉知识,并感谢他帮助审阅我们的代码。如果您发现任何问题,请随时与我们联系,我们非常欢迎您的反馈。

LXR致谢。

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|6天前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

151.3k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|2天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|2天前
插件Agent图像

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|6天前
语言模型图像Agent