[English](./README.md) | 简体中文 ## _ERNIE-ViL_: Knowledge Enhanced Vision-Language Representations Through Scene Graph - [模型框架](#模型框架) - [预训练模型](#预训练模型) - [下游任务](#下游任务) * [视觉常识推理](#视觉常识推理) * [视觉问答](#视觉问答) * [跨模态检索](#跨模态检索) * [引用表达式理解](#引用表达式理解) - [使用说明](#使用说明) * [安装飞桨](#安装飞桨) * [运行微调](#运行微调) * [预测](#预测) - [引用](#引用) 关于算法的详细描述,请参见我们的论文 >[_**ERNIE-ViL:Knowledge Enhanced Vision-Language Representations Through Scene Graph**_](https://arxiv.org/abs/2006.16934) > >Fei Yu\*, Jiji Tang\*, Weichong Yin, Yu Sun, Hao Tian, Hua Wu, Haifeng Wang (\* : equal contribution) > >Preprint June 2020 > ![ERNIE-ViL](https://img.shields.io/badge/预训练-视觉语言联合表示-green)![VQA](https://img.shields.io/badge/视觉问答-VQA-yellow) ![VCR](https://img.shields.io/badge/视觉常识推理-VCR-blue) ![RefCOCO](https://img.shields.io/badge/引用表达式理解-RefCOCO+-green) ![IRTR](https://img.shields.io/badge/跨模态检索-IR&TR-yellowgreen) --- **ERNIE-ViL 是面向视觉-语言任务的知识增强预训练框架**,首次在视觉-语言预训练中引入了结构化的知识。ERNIE-ViL利用场景图中的结构化知识,构建了**物体预测,属性预测,关系预测**三种预训练任务,精细地刻画了视觉-语言模态之间细粒度语义的对齐,从而获得了更好的视觉-语言联合表示。 ## 模型框架 基于文本中解析出的场景图,ERNIE-ViL提出了三个多模态场景图预测任务: - **物体预测**:随机选取图中的一部分物体,然后对其在句子中对应的词进行掩码和预测; - **属性预测**:对于场景图中的属性-物体组合,随机选取一部分词对其中属性词进行掩码和预测; - **关系预测**:对于场景图中的物体-关系-物体三元组,对其中的关系词进行掩码和预测。 ![ernie_vil_struct](.meta/ernie_vil_struct.png) ERNIE-ViL 场景图预训练任务结构 ## 预训练模型 ERNIE-ViL使用大规模图文对齐数据作为预训练数据,基于[**Conceptual Captions**](https://www.aclweb.org/anthology/P18-1238.pdf)和[**SBU Captions**](http://papers.nips.cc/paper/4470-im2text-describing-images-using-1-million-captio)两个out-of-domain数据集,训练两种参数规模模型如下: - [**ERNIE-ViL _base_**](https://ernie-github.cdn.bcebos.com/model-ernie-vil-base-en.1.tar.gz) (_lowercased | 12-text-stream-layer, 6-visual-stream-layer_) - [**ERNIE-ViL _large_**](https://ernie-github.cdn.bcebos.com/model-ernie-vil-large-en.1.tar.gz) (_lowercased | 24-text-stream-layer, 6-visual-stream-layer_) 基于两个out-of-domian数据集([**Conceptual Captions**](https://www.aclweb.org/anthology/P18-1238.pdf),[**SBU Captions**](http://papers.nips.cc/paper/4470-im2text-describing-images-using-1-million-captio))和两个in-domain数据集([**MS-COCO**](https://arxiv.org/abs/1405.0312),[**Visual-Genome**](https://arxiv.org/abs/1602.07332))训练了large参数规模的模型: - [**ERNIE-ViL-Out&in-domain _large_**](https://ernie-github.cdn.bcebos.com/model-ernie-vil-all-domain-large-en.1.tar.gz) (_lowercased | 24-text-stream-layer, 6-visual-stream-layer_) ## 下游任务 ERNIE-ViL在五个视觉语言下游任务进行了实验,包括[**视觉常识推理**](https://openaccess.thecvf.com/content_CVPR_2019/papers/Zellers_From_Recognition_to_Cognition_Visual_Commonsense_Reasoning_CVPR_2019_paper.pdf), [**视觉问答**](https://openaccess.thecvf.com/content_iccv_2015/papers/Antol_VQA_Visual_Question_ICCV_2015_paper.pdf), [**跨模态图片检索**](https://www.mitpressjournals.org/doi/abs/10.1162/tacl_a_00166), [**跨模态文本检索**](https://www.mitpressjournals.org/doi/abs/10.1162/tacl_a_00166), [**引用表达式理解**](https://www.aclweb.org/anthology/D14-1086.pdf),与主流模型的效果对比可以参考开源论文。 ### **视觉常识推理** * 数据集合 * 训练、验证和测试集合相关数据可以由[**视觉常识推理官网**](http://visualcommonsense.com/download/)获取; * 视觉端特征的组织方式借鉴[**ViLBERT**](https://github.com/jiasenlu/vilbert_beta), 因此项目直接使用**ViLBERT**中的数据,数据[下载地址](https://github.com/jiasenlu/vilbert_beta/tree/master/data); * 将所有获取的文件放在 data/vcr 目录下; * 任务预训练: 基于ERNIE-ViL的out-of-domain模型,在视觉推理任务中进行了任务预训练,预训练获得模型如下 * [**ERNIE-ViL-VCR-task-pretrain _base_**](https://ernie-github.cdn.bcebos.com/model-ernie-vil-base-VCR-task-pre-en.1.tar.gz) * [**ERNIE-ViL-VCR-task-pretrain _large_**](https://ernie-github.cdn.bcebos.com/model-ernie-vil-large-VCR-task-pre-en.1.tar.gz) * 效果: ERNIE-ViL在视觉常识推理任务上的效果对比如下: | 模型 | Q->A | QA->R | Q->AR | | :---------------------------------- | :---------------------------: | :----------------------------: | :---------------------------: | | ERNIE-ViL (task-pretrain) _base_ | 76.37(77.0) | 79.65(80.3) | 61.24(62.1) | | ERNIE-ViL (task-pretrain) _large_ | 78.52(79.2) | 83.37(83.5) | 65.81(66.3) | _注:括号外表示验证集效果,括号内表示测试集效果,测试集效果提交到[VCR榜单](https://visualcommonsense.com/leaderboard/)获得。_ ### **视觉问答** * 数据集合 * 原始图片、问题和答案可以由[**视觉问答官网**](https://visualqa.org/)获取。 * 视觉端特征使用[**bottom-up attention**](https://github.com/jiasenlu/bottom-up-attention)中的工具提取,提取的box动态值为100-100。 * 训练 & 测试数据按照如下方式组织: ```script question_id, question, answer_label, answer_score, image_w, image_h, number_box, image_loc, image_embeddings ``` _多个答案的label和score用 ‘|’ 分隔,和image相关的项均可以从bottom up attention的工具提取。_ * 效果:ERNIE-ViL的三种预训练模型在**视觉问答**任务下的效果如下表 | 模型 | test-dev | test-std | | :-------------------------------- | :-------------------------------: | :------------------------------: | | ERNIE-ViL _base_ | 73.18 | 73.36 | | ERNIE-ViL _large_ | 73.78 | 73.96 | | ERNIE-ViL-Out&in-domain _large_ | 74.95 | 75.10 | ### **跨模态检索** * 数据集合 * 原始图片和文本描述相关的数据,可以从[**这里**](https://www.kaggle.com/hsankesara/flickr-image-dataset)获取。 * 视觉端特征使用[**bottom-up attention**](https://github.com/jiasenlu/bottom-up-attention)提取,提取的box动态值为0-36。 * 文本相关的数据可以参见data/flickr给出的示例 flickr.dev.data,图片端特征组织方式为 ```script image_w, image_h, number_box, image_loc, image_embeddings ``` * 效果 * ERNIE-ViL的三种预训练模型在**跨模态图片检索(Flickr30k 数据集)**上的效果如下表 | 模型 | R@1 | R@5 | R@10 | | :-------------------------------- | :---------------------: | :----------------------: | :----------------------: | | ERNIE-ViL _base_ | 74.44 | 92.72 | 95.94 | | ERNIE-ViL _large_ | 75.10 | 93.42 | 96.26 | | ERNIE-ViL-Out&in-domain _large_ | 76.66 | 94.16 | 96.76 | * ERNIE-ViL的三种预训练模型在**跨模态文本检索(Flickr30k 数据集)**任务上的效果如下表 | 模型 | R@1 | R@5 | R@10 | | :-------------------------------- | :---------------------: | :----------------------: | :----------------------: | | ERNIE-ViL _base_ | 86.70 | 97.80 | 99.00 | | ERNIE-ViL _large_ | 88.70 | 97.30 | 99.10 | | ERNIE-ViL-Out&in-domain _large_ | 89.20 | 98.50 | 99.20 | ### **引用表达式理解** * 数据集合 * 视觉端特征参考了[MAttNet](https://github.com/lichengunc/MAttNet)的提取方式。 * 单条训练 & 验证 数据的组织方式为 ```script expressions, image_w, image_h, number_box, number_boxes_gt, image_loc, image_embeddings, box_label, label ``` * 效果 * ERNIE-ViL的三种预训练模型在**引用表达式理解**任务上的效果如下表: | 模型 | val | testA | testB | | :-------------------------------- | :---------------------: | :----------------------: | :----------------------: | | ERNIE-ViL _base_ | 74.02 | 80.33 | 64.74 | | ERNIE-ViL _large_ | 74.24 | 80.97 | 64.70 | | ERNIE-ViL-Out&in-domain _large_ | 75.89 | 82.39 | 66.91 | ## 使用说明 ### 安装飞桨 ERNIE-ViL代码基于Paddle Fluid 1.8 和 Python 2.7, 依赖的其他模块也列举在 requirements.txt,可以通过下面的指令安装: ```script pip install -r requirements.txt ``` ### 运行微调 在运行 ERNIE-ViL 微调前,需要将 CUDA 、cuDNN 、NCCL2 的动态库路径添加到 LD_LIBRARY_PATH 。 我们把下游任务的参数配置文件放到了 conf/ ,可以简单地通过配置文件运行。 例如,您可以通过下面的指令在各个下游任务上进行微调: ```script sh run_finetuning.sh $task_name(vqa/flickr/refcoco_plus/vcr) conf/${task_name}/model_conf_${task_name} $vocab_file $ernie_vil_config $pretrain_models_params ``` 前面提供的模型链接中包含了所有需要的文件, 包含词表文件,配置文件和预训练参数。微调相关的模型配置和参数配置可以通过conf/ 目录下的文件找到,这里对论文最优结果(large模型)的一些关键参数进行汇总: | Tasks | Batch Size | Learning Rate | # of Epochs | GPUs | Layer Decay rate | Hidden dropout | | ----- | ----------:| -------------:| -----------:| --------:| ----------------:| --------------:| | VCR | 16(x4) | 1e-4 | 6 | 4x V100 | 0.9 | 0.1 | | VQA 2.0 | 64(x4) | 1e-4 | 15 | 4x V100 | 0.9 | 0.1 | | RefCOCO+ | 64(x2) | 1e-4 | 30 | 2x V100 | 0.9 | 0.2 | | Flickr | 8(x8) | 2e-5 | 40 | 8x V100 | 0.0 | 0.1 | 所有的下游任务的微调实验是在 32 GB 的英伟达V100 GPU上运行,如果您的GPU显存不够,可以考虑更多张卡运行或者减小配置中的batch_size。 ### 预测 基于已经训练的模型,您可以通过下面的命令测试下游任务的效果(相关的配置文件可以从之前下载的包获得) #### VCR ```script Task Q->A: sh run_inference.sh vcr qa $split(val/test) conf/vcr/model_conf_vcr $vocab_file $ernie_vil_config $model_params $res_file ``` ```script Task Q->AR: sh run_inference.sh vcr qar $split(val/test) conf/vcr/model_conf_vcr $vocab_file $ernie_vil_config $model_params $res_file ``` _VCR的测试可以在一张32GB的英伟达V100 GPU上运行,测试的结果包含Q->A 任务、QA->R任务和Q->AR任务,其中Q->AR任务由前两个任务结果合并所得._ #### VQA ```script sh run_inference.sh vqa eval $split(val/test_dev/test_std) conf/vqa/model_conf_vqa $vocab_file $ernie_vil_config $model_params $res_file ``` 注:_VQA的测试样本没有label信息,需要将结果文件提交到[**VQA网站**](https://visualqa.org/)查看结果。_ #### RefCOCO+ ```script sh run_inference.sh refcoco_plus eval $split(val/test_A/test_B) conf/refcoco_plus/model_conf_refcoco_plus $vocab_file $ernie_vil_config $model_params $res_file ``` #### Flickr ```script sh run_inference.sh flickr eval $split(dev/test) conf/flickr/model_conf_flickr $vocab_file $ernie_vil_config $model_params $res_file ``` 注:_Flickr的结果是一个预测结果文件,可以参考 tools/get_recall.py 统计一下最终结果。_ ## 引用 可以按下面的格式引用我们的论文: ``` @article{yu2020ernie, title={ERNIE-ViL: Knowledge Enhanced Vision-Language Representations Through Scene Graph}, author={Yu, Fei and Tang, Jiji and Yin, Weichong and Sun, Yu and Tian, Hao and Wu, Hua and Wang, Haifeng}, journal={arXiv preprint arXiv:2006.16934}, year={2020} } ```