这是 ECCV 2022 论文《可靠的视觉问答:弃权而不是错误回答》的实现。如果您发现我们的论文或此存储库对您自己的工作有用,请引用:
@inproceedings{whitehead2022reliablevqa, title={Reliable Visual Question Answering: Abstain Rather Than Answer Incorrectly}, author={Whitehead, Spencer and Petryk, Suzanne and Shakib, Vedaad and Gonzalez, Joseph and Darrell, Trevor and Rohrbach, Anna and Rohrbach, Marcus}, booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, year={2022} }
该存储库使用 PyTorch 并构建在 MMF 之上。它包含以下内容:
我们论文中使用的指标的实现,包括风险、覆盖范围和有效可靠性。
最大概率 (MaxProb)、校准和学习多模态选择函数 (Selector) 的实现。
我们工作中模型的训练配置。
下载我们工作中使用的 VQA v2 数据集分割、训练模型检查点和预提取特征的链接。
更新:此存储库的先前版本无意中在字段answers
中使用了 MMF 中的默认地面真实答案,其参考答案略有不同(例如,如果某些条目不在 3k 答案的词汇表中,则它会替换它们)。因此,我们提供了一个独立的评估脚本(eval_scripts/),它使用原始的 VQA v2 注释作为评估的参考。此更新反映在 arXiv 版本中(请参阅附录中的变更日志),未来的工作应使用更新的评估来报告结果。
该存储库中的文件夹结构如下:
configs/
:
experiments/
包含用于训练每个 VQA 模型和相应选择函数的 YAML 配置。
datasets/
包含自定义vqa2_extended
数据集的 YAML 配置。
datasets/
:包含vqa2_extended
的数据集实现和构建器。该数据集与 MMF 中的 VQA v2 相同,但它还支持选择函数的附加模型置信度输出和用于校准评估的多项选择注释。
eval_scripts/
:包含论文中计算风险覆盖率和有效可靠性指标的评估脚本。
reliable_vqa_eval.py
:包含计算不同指标的评估器对象。
run.py
:用于运行给定模型预测和地面实况注释的评估的脚本。
vqa.py
:包含一个用于与 VQA v2 注释和预测交互的对象。
models/
:对于我们实验中的每个 VQA 模型,我们在原始模型之上注册一个版本,该版本返回选择函数所需的额外置信度和中间特征输出。
selective_predictors.py
包含校准和选择器模型的实现。
modules/
:
losses.py
包含学习的选择器模型的正确性预测损失函数。
metrics.py
包含 MMF 中用于验证的风险覆盖率和有效可靠性指标的实现。
__init__.py
:导入 MMF 使用的自定义 MMF 组件。
请按照此处的 MMF 安装说明进行操作:https://mmf.sh/docs/。我们建议从源代码安装。请注意,从源安装时,您不需要克隆此存储库下的 MMF 存储库。您可以简单地将 MMF 克隆到其自己的目录中。我们还建议使用 conda 环境进行安装和运行,该环境可用于 MMF 和此存储库。
安装 MMF 后,您的环境应安装 Python 3.7+ 和 PyTorch 1.6+。您还需要 scikit-learn 1.0+ 和 pandas 1.3.4+。
TL;DR:我们使用 VQA v2 数据集。我们将 VQA v2 验证集分为 3 部分,并提供下面的注释。我们还为 CLIP-ViL 模型提取自定义网格特征,如下所示。所有其他注释和功能均由 MMF 自动下载,如本存储库中每个配置所指定的那样。
首先,从此处下载原始 VQA v2 验证问题和答案注释 JSON 文件:https://visualqa.org/download.html。这些将用于评估。
第一次使用我们的配置文件之一运行 MMF 时,MMF 应自动下载 VQA v2 的功能和注释。这些目录/文件将存储在vqa2
目录下的$MMF_DATA_DIR
( env.data_dir
) 中。请参阅 MMF 了解更多详细信息。我们建议首先通过此存储库运行 Pythia+MaxProb,这将下载用于 Pythia、ViLBERT 和 VisualBERT 的注释和功能(详细信息请参阅培训)
我们还建议将验证拆分和 CLIP 功能(在下一节中描述)也保存在这些目录中,以下设置假设情况如此。如果您决定以不同的方式构建目录,那么您将需要相应地更新您的配置路径等。
标准VQA v2训练集用于训练VQA模型。然而,由于答案注释不适用于 test-dev 和 test-std VQA v2 分割,因此我们将 VQA v2 验证集分成 3 个不相交的集(即,不共享图像或问题)以用于评估目的:
dev
:VQA 模型训练的验证集和选择性预测变量的训练集。
val
:选择性预测变量的验证集。
test
:所有模型的测试集,以及我们在论文中报告结果的内容。
这些分割注释文件可以在这里下载:下载
下载后,将压缩文件放置在<env.data_dir>/vqa2/
目录中。解压该文件应该会建立以下目录结构:
vqa2/ reliable_vqa/ annotations/ imdb_val2014-dev.npy imdb_val2014-test.npy imdb_val2014-val.npy
要按原样使用我们的配置文件,这些注释文件应放置在路径<env.data_dir>/vqa2/reliable_vqa/annotations
下。否则,您将需要编辑配置和注释文件以匹配您的路径。例如,用于训练 VQA 模型的配置中的数据集注释为:
dataset_config: vqa2_extended: annotations: train: - vqa2/defaults/annotations/imdb_train2014.npy val: - vqa2/reliable_vqa/annotations/imdb_val2014-dev.npy test: - vqa2/reliable_vqa/annotations/imdb_val2014-test.npy
而训练选择器的注释是:
dataset_config: vqa2_extended: annotations: train: - vqa2/reliable_vqa/annotations/imdb_val2014-dev.npy val: - vqa2/reliable_vqa/annotations/imdb_val2014-val.npy test: - vqa2/reliable_vqa/annotations/imdb_val2014-test.npy
为了训练所有 VQA 模型,我们使用预先提取的特征而不是图像来提高速度和一致性。 Pythia、ViLBERT 和 VisualBERT 模型都使用可在通过 MMF 运行时自动下载的功能。然而,CLIP-ViL 使用 CLIP 的网格图像功能。我们提供了预先计算的特征以及来自 CLIP-ViL 存储库的提取脚本的稍微调整版本,可用于独立提取 CLIP 特征。
下载功能(下载)及其更新的注释文件(下载)。重要提示:这些功能非常大(压缩后约为 150GB),下载可能需要很长时间。
解压<env.data_dir>/vqa2/
中文件内的注释,结果如下:
vqa2/ reliable_vqa-clip/ annotations/ imdb_train2014.npy imdb_val2014-dev.npy imdb_val2014-test.npy imdb_val2014-val.npy
将下载的功能放在注释目录旁边的目录中:
vqa2/ reliable_vqa-clip/ annotations/ ... clip_features.tar.gz
解压reliable_vqa-clip
目录中的功能。您的目录结构应镜像 MMF 的:
vqa2/ reliable_vqa-clip/ annotations/ ... features/ train2014/ val2014/
[可选] 我们建议创建一个单独的 conda 环境(使用 Python 3.7+)用于特征提取。
克隆 CLIP-ViL 存储库并按照其安装/设置说明进行操作(即从 CLIP-ViL 提供的本地克隆安装 Detectron2)。请注意,无需在此存储库中克隆 CLIP-ViL 存储库。
下载 COCO train+val 2014 图像和注释,并将它们放在具有以下结构和路径名的目录中:
coco_2014/ annotations/ instances_train2014.json instances_val2014.json images/ train2014/ val2014/
将fixed_mcan_clip_grid_feature.py
复制/移动到CLIP-ViL存储库中的CLIP-ViL/CLIP-ViL-Direct/vqa
。
将CLIP-ViL/CLIP-ViL-Direct/vqa/configs/R-50-grid.yaml
中的OUTPUT_DIR
更改为所需的功能目录(即<env.data_dir>/vqa2/reliable_vqa-clip/features
)。
在 train2014 图像上运行以下命令(重复使用coco_2014_val
在 val2014 图像上运行):
DETECTRON2_DATASETS=<PATH_TO_PARENT_DIR_OF_coco_2014> python fixed_mcan_clip_grid_feature.py --config-file configs/R-50-grid.yaml --dataset coco_2014_train --model_type RN50x4
您可以按照预提取功能部分下载更新的注释,也可以运行映射脚本来为 CLIP-ViL 创建更新的注释文件:
python clipvil_anns_conversion.py --input_dir <env.data_dir>/vqa2/reliable_vqa/annotations --output_dir <env.data_dir>/vqa2/reliable_vqa-clip/annotations
我们为论文中 4 个 VQA 模型和 3 个选择函数的每种组合提供了经过训练的模型检查点。请注意,MaxProb 模型检查点只是 VQA 模型。校准和选择器选择性预测器本身比 VQA 模型小得多,但为了方便起见,我们将 VQA 模型包含在其相应的检查点中。
请注意,MaxProb ViLBERT 和 VisualBERT 与 MMF 中的相同(经过预训练和微调),因此也可以通过 MMF 模型库下载它们。从 MMF 模型动物园来看,ViLBERT 对应于vilbert.finetuned.vqa2.from_vqa2_train
,VisualBERT 对应于visual_bert.finetuned.vqa2.from_coco_train
。
最大概率 | 校准 | 选择器 | |
---|---|---|---|
皮提亚 | 下载 | 下载 | 下载 |
维尔伯特 | MMF下载 | 下载 | 下载 |
视觉BERT | MMF下载 | 下载 | 下载 |
夹子ViL | 下载 | 下载 | 下载 |
在这里,我们提供了用于训练和评估模型的示例命令。这些示例使用 CLIP-ViL 模型(称为movie_mcan
,这是相应的模型架构)。使用其他模型运行只需将config
更改为正确的路径,并将model
参数更改为pythia
、 vilbert
、 visual_bert
或movie_mcan
之一(使用 MaxProb 时)或对模型使用select_*
*
使用校准或选择器时,例如, select_visual_bert
)。请注意,CLIP-ViL 的注释文件有所不同,因为使用了 CLIP 功能(例如,请参见configs/experiments/movie_mcan/vqa2/defaults.yaml
),而所有其他模型都使用同一组注释文件,因此请务必使用正确的对应注释文件和要素路径。
所有命令都应从reliable_vqa
目录运行,并在 MMF 命令行选项中设置env.user_dir=<PATH_TO_REPO>/reliable_vqa
(或者等效地,在命令之前设置MMF_USER_DIR=$PWD
)。
训练 VQA 模型:
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_MAXPROB_SAVE_DIR> dataset=vqa2_extended model=movie_mcan config=configs/experiments/movie_mcan/vqa2/defaults.yaml run_type=train_val
为 VQA 模型训练学习的多模态选择函数(Selector):
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_SELECTOR_SAVE_DIR> dataset=vqa2_extended model=select_movie_mcan config=configs/experiments/movie_mcan/vqa2/select_pred.yaml run_type=train_val checkpoint.resume_pretrained=True checkpoint.resume_file=<YOUR_MAXPROB_SAVE_DIR>/best.ckpt
checkpoint.resume_file
选项也可以是上面下载的model.pth
文件之一。另外,最好确保 MaxProb 和 Selector 的env.save_dir
不同。否则,它们将互相覆盖。
对于 ViLBERT 和 VisualBERT,我们利用 MMF 提供的已在 VQA v2 上微调的模型。这些用作 ViLBERT 和 VisualBERT 的 MaxProb 选择性模型。要使用 ViLBERT 或 VisualBERT 训练选择器,您应该提供从模型动物园(或上面的链接)下载的 MMF 模型.pth
文件的checkpoint.resume_file
路径:
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_SELECTOR_SAVE_DIR> dataset=vqa2_extended model=select_visual_bert config=configs/experiments/visual_bert/vqa2/select_pred.yaml run_type=train_val checkpoint.resume_pretrained=True checkpoint.resume_file=<YOUR_MMF_MODEL_SAVE_DIR>/visual_bert.finetuned.vqa2.from_coco_train/model.pth
我们首先对验证集和测试集进行预测,然后使用评估脚本对其进行评估。
要获取预测,请将运行类型更改为 test ( run_type=test
),添加参数evaluation.predict=True
,并将配置中的test
注释路径替换为要获取预测的注释路径(例如, vqa2/reliable_vqa/annotations/imdb_val2014-test.npy
vqa2/reliable_vqa/annotations/imdb_val2014-val.npy
vqa2/reliable_vqa/annotations/imdb_val2014-test.npy
):
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_RESULT_SAVE_DIR> dataset=vqa2_extended model=select_movie_mcan config=configs/experiments/movie_mcan/vqa2/select_pred.yaml run_type=test evaluation.predict=True checkpoint.resume=True checkpoint.resume_file=<YOUR_SELECTOR_SAVE_DIR>/best.ckpt dataset_config.vqa2_extended.annotations.test=vqa2/reliable_vqa-clip/annotations/imdb_val2014-test.npy
要使用 MaxProb 从 ViLBERT 和 VisualBERT 获取预测,您还可以简单地使用这些模型的 Zoo 版本:
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_RESULT_SAVE_DIR> dataset=vqa2_extended model=visual_bert config=configs/experiments/visual_bert/vqa2/defaults.yaml run_type=test evaluation.predict=True checkpoint.resume=True checkpoint.resume_zoo=visual_bert.finetuned.vqa2.from_coco_train dataset_config.vqa2_extended.annotations.test=vqa2/reliable_vqa-clip/annotations/imdb_val2014-test.npy
这将在env.save_dir
中生成一个 JSON 文件(与 VQA v2 结果格式类似的格式),其中包含我们用于评估的模型答案和置信度。使用imdb_val2014-val.npy
作为测试集重复此操作,以获得用于选择阈值的 val 数据结果。
接下来,我们使用独立的评估脚本来获取评估指标,该脚本接受原始 VQA v2 问题和注释 JSON 作为参考:
python eval_scripts/run.py --questions <PATH>/v2_OpenEnded_mscoco_val2014_questions.json --annotations <PATH/v2_mscoco_val2014_annotations.json --predictions <RESULTS_ON_TEST_DATA>.json --threshold_predictions <RESULTS_ON_VAL_DATA>.json
此命令将输出VQA 准确度、覆盖率@风险、风险覆盖率曲线的AUC和有效可靠性。请注意,由于这使用原始 VQA v2 注释和与 VQA 结果格式类似的格式,因此该评估脚本应该通过在预测中提供额外的confidence
字段来与此存储库之外的模型的预测兼容。
我们要感谢 MMF 的创建者的开源实现。我们感谢 Shen Shen 和《CLIP 对视觉和语言任务有多大好处?》的作者。为提取特征、重现模型以及发布代码提供帮助。我们还感谢艾西瓦娅·阿格拉瓦尔 (Aishwarya Agrawal) 对评估提出的意见。最后,我们感谢 Grace Luo 对 MMF 的早期帮助。
大多数 Reliable VQA 均在 CC-BY-NC 下获得许可(有关详细信息,请参阅许可证),但是,fixed_mcan_clip_grid_feature.py 是根据 https://github.com/clip-vil/CLIP-ViL 中的 mcan_clip_grid_feature.py 脚本修改的/tree/master/CLIP-ViL-Direct/vqa,已获得 Apache 2.0 许可证和 eval_scripts/vqa.py 许可eval_scripts/reliable_vqa_eval.py 是从 https://github.com/GT-Vision-Lab/VQA 中的 vqa.py 和 vqaEval.py 修改而来,并根据 BSD 2-Clause License 获得许可。