Tianyu Zhang†, Suyuchen Wang†, Lu Li, Ge Zhang, Perouz Taslakian, Sai Rajeswar, Jie Fu, Bang Liu, Yoshua Bengio
† 共同第一作者
- 🔥🔥🔥 [2024-07-14] 我们已经将VCR-wiki评估过程整合进VLMEvalKit和lmms-eval框架中。现在,用户可以通过一行命令运行模型在VCR-wiki测试数据集上的评估。
- 🔥🔥🔥 [2024-06-24] 我们更新了arXiv论文。现在,论文中包括了Claude 3.5 Sonnet、Claude 3 Opus、GPT-4o、GPT-4-Turbo、Qwen-VL-Max、Reka Core和Gemini-1.5-pro的评估结果。评估脚本也已发布,请查看
src/evaluation/closed_source_eval.py
。 - 🔥🔥🔥 [2024-06-15] 我们发布了torch中的VCR变换,使得给定任意图像-文本对,我们可以生成包含文本的VCR图像。此变换可以作为VLMs中的预训练任务之一使用。
- 🔥🔥🔥 [2024-06-13] 我们发布了开源模型、闭源模型的评估代码以及创建数据集的流水线。
- 🔥🔥🔥 [2024-06-11] 我们的论文已在arXiv发布,包含了一系列模型的评估结果。
- 🔥🔥🔥 [2024-06-10] 我们已经发布了VCR-wiki数据集,该数据集包含来自维基百科的211万个英文实体和346万个中文实体,提供易难两种变体。数据集可在Hugging Face数据集库中获取。
pip install datasets
from datasets import load_dataset
# 加载英文简单模式数据集
dataset = load_dataset("vcr-org/VCR-wiki-en-easy")
# 加载英文难模式数据集
dataset = load_dataset("vcr-org/VCR-wiki-en-hard")
# 加载中文简单模式数据集
dataset = load_dataset("vcr-org/VCR-wiki-zh-easy")
# 加载中文难模式数据集
dataset = load_dataset("vcr-org/VCR-wiki-zh-hard")
for obs in dataset['train']: # 或 'validation' 或 'test'
# 在此处编写你的代码
在论文中,我们使用 500 个测试子集对封闭源模型进行评估,使用 5000 个测试子集对开放源模型进行评估。100 测试子集用于人工评估。
我们呈现了VCR-wiki,这是一个为视觉字幕恢复(VCR)任务设计的数据集。
请参阅下方我们的主要图例,了解VCR任务的概述。
VCR挑战模型恢复图像内部分被遮挡的文本,利用像素级提示和上下文线索。不同于传统的基于文本的任务,VCR需要对 视觉图像(VI)、字符串文本(ST) 和 嵌入图像的文本(TEI) 进行协同理解与对齐。我们通是通过全自动的方式的合成图像-字幕文本对,其难度可调节。以下展示了创建数据集的,我们将很快发布创建数据集的代码。我们开源了全自动合成合成图像-字幕文本对的脚本以及合成数据集的代码以及torch框架下的VCR变换。这个变换函数可以被用在VLMs的预训练任务中。
VCR-wiki包含211万英文和34.6万中文样例,其来源于维基百科。我们提供了易和难两个版本。初步结果表明,当前的视觉语言模型在该任务上与人类表现相比差距明显。
EM 表示 "完全匹配",Jaccard 表示 "Jaccard 相似度"。封闭源代码和开放源代码中的最佳结果以粗体标出。闭源模型基于 500 个测试样本进行评估,而开源模型基于 5000 个测试样本进行评估。
请注意,我们的基准和数据数据集正式面向公众的时间为2024年6月24日。
Model | Size (unknown for closed source) | Released date (MMDDYY) | En Easy EM | En Easy Jaccard | En Hard EM | En Hard Jaccard | Zh Easy EM | Zh Easy Jaccard | Zh Hard EM | Zh Hard Jaccard |
---|---|---|---|---|---|---|---|---|---|---|
Claude 3 Opus | - | 030424 | 62.0 | 77.67 | 37.8 | 57.68 | 0.9 | 11.5 | 0.3 | 9.22 |
Claude 3.5 Sonnet | - | 062024 | 63.85 | 74.65 | 41.74 | 56.15 | 1.0 | 7.54 | 0.2 | 4.0 |
GPT-4 Turbo | - | 040924 | 78.74 | 88.54 | 45.15 | 65.72 | 0.2 | 8.42 | 0.0 | 8.58 |
GPT-4V | - | 012524 | 52.04 | 65.36 | 25.83 | 44.63 | - | - | - | - |
GPT-4o | - | 051324 | 91.55 | 96.44 | 73.2 | 86.17 | 14.87 | 39.05 | 2.2 | 22.72 |
GPT-4o-mini | - | 071824 | 83.60 | 87.77 | 54.04 | 73.09 | 1.10 | 5.03 | 0 | 2.02 |
Gemini 1.5 Pro | - | 051524 | 62.73 | 77.71 | 28.07 | 51.9 | 1.1 | 11.1 | 0.7 | 11.82 |
Gemini 2 Flash Exp | - | 121124 | 40.62 | 73.93 | 16.65 | 47.05 | 10.88 | 33.48 | 0.7 | 11.64 |
Gemini 2 Flash Thinking Exp | - | 121124 | 24.60 | 55.99 | 8.70 | 40.32 | 4.09 | 23.44 | 0.4 | 14.20 |
Qwen-VL-Max | - | 082223 | 76.8 | 85.71 | 41.65 | 61.18 | 6.34 | 13.45 | 0.89 | 5.4 |
Reka Core | - | 041624 | 66.46 | 84.23 | 6.71 | 25.84 | 0.0 | 3.43 | 0.0 | 3.35 |
Cambrian-1 | 34B | 062524 | 79.69 | 89.27 | 27.20 | 50.04 | 0.03 | 1.27 | 0.00 | 1.37 |
Cambrian-1 | 13B | 062524 | 49.35 | 65.11 | 8.37 | 29.12 | - | - | - | - |
Cambrian-1 | 8B | 062524 | 71.13 | 83.68 | 13.78 | 35.78 | - | - | - | - |
CogVLM | 17B | 092823 | 73.88 | 86.24 | 34.58 | 57.17 | - | - | - | - |
CogVLM2 | 19B | 051324 | 83.25 | 89.75 | 37.98 | 59.99 | 9.15 | 17.12 | 0.08 | 3.67 |
CogVLM2-Chinese | 19B | 051324 | 79.90 | 87.42 | 25.13 | 48.76 | 33.24 | 57.57 | 1.34 | 17.35 |
DeepSeek-VL | 1.3B | 051324 | 23.04 | 46.84 | 0.16 | 11.89 | 0.0 | 6.56 | 0.0 | 6.46 |
DeepSeek-VL | 7B | 051324 | 38.01 | 60.02 | 1.0 | 15.9 | 0.0 | 4.08 | 0.0 | 5.11 |
DocOwl-1.5-Omni | 8B | 053124 | 0.84 | 13.34 | 0.04 | 7.76 | 0.0 | 1.14 | 0.0 | 1.37 |
GLM-4v | 9B | 060424 | 43.72 | 74.73 | 24.83 | 53.82 | 31.78 | 52.57 | 1.20 | 14.73 |
Idefics2 | 8B | 041524 | 15.75 | 31.97 | 0.65 | 9.93 | - | - | - | - |
InternLM-XComposer2-VL | 7B | 012524 | 46.64 | 70.99 | 0.7 | 12.51 | 0.27 | 12.32 | 0.07 | 8.97 |
InternLM-XComposer2-VL-4KHD | 7B | 040924 | 5.32 | 22.14 | 0.21 | 9.52 | 0.46 | 12.31 | 0.05 | 7.67 |
InternLM-XComposer2.5-VL | 7B | 051924 | 41.35 | 63.04 | 0.93 | 13.82 | 0.46 | 12.97 | 0.11 | 10.95 |
InternVL-V1.5 | 26B | 041824 | 14.65 | 51.42 | 1.99 | 16.73 | 4.78 | 26.43 | 0.03 | 8.46 |
InternVL-V2 | 26B | 070324 | 74.51 | 86.74 | 6.18 | 24.52 | 9.02 | 32.50 | 0.05 | 9.49 |
InternVL-V2 | 40B | 070824 | 84.67 | 92.64 | 13.10 | 33.64 | 22.09 | 47.62 | 0.48 | 12.57 |
InternVL-V2 | 76B | 071524 | 83.20 | 91.26 | 18.45 | 41.16 | 20.58 | 44.59 | 0.56 | 15.31 |
InternVL-V2-Pro | - | - | 77.41 | 86.59 | 12.94 | 35.01 | 19.58 | 43.98 | 0.84 | 13.97 |
MiniCPM-V2.5 | 8B | 051924 | 31.81 | 53.24 | 1.41 | 11.94 | 4.1 | 18.03 | 0.09 | 7.39 |
MiniCPM-V2.6 | 8B | 080424 | 73.88 | 85.71 | 4.72 | 19.76 | 10.18 | 23.61 | 0.26 | 7.51 |
Monkey | 7B | 112223 | 50.66 | 67.6 | 1.96 | 14.02 | 0.62 | 8.34 | 0.12 | 6.36 |
Phi-3.5-V | 7B | 082124 | 39.27 | 60.40 | 0.90 | 15.00 | - | - | - | - |
Qwen-VL | 7B | 082023 | 49.71 | 69.94 | 2.0 | 15.04 | 0.04 | 1.5 | 0.01 | 1.17 |
Qwen2-VL | 7B | 082824 | 89.70 | 93.84 | 74.32 | 85.47 | 59.94 | 76.95 | 18.33 | 43.55 |
Qwen2-VL | 72B | 091724 | 91.30 | 94.64 | 69.87 | 71.70 | 65.38 | 74.08 | 15.30 | 27.35 |
Yi-VL | 34B | 011824 | 0.82 | 5.59 | 0.07 | 4.31 | 0.0 | 4.44 | 0.0 | 4.12 |
Yi-VL | 6B | 011724 | 0.75 | 5.54 | 0.06 | 4.46 | 0.00 | 4.37 | 0.00 | 4.0 |
Ovis1.6-Gemma2 | 9B | 091824 | 58.74 | 79.20 | 3.49 | 21.74 | - | - | - | - |
Ovis1.6-Gemma2 | 27B | 091824 | 64.58 | 81.06 | 5.02 | 25.49 | - | - | - | - |
Ovis1.6-Llama3.2 | 3B | 101624 | 45.80 | 66.94 | 2.28 | 18.05 | - | - | - | - |
我们支持的开源模型_id:
["openbmb/MiniCPM-Llama3-V-2_5",
"openbmb/MiniCPM-V-2_6",
"OpenGVLab/InternVL-Chat-V1-5",
"internlm/internlm-xcomposer2-vl-7b",
"internlm/internlm-xcomposer2-4khd-7b",
"internlm/internlm-xcomposer2d5-7b",
"HuggingFaceM4/idefics2-8b",
"Qwen/Qwen-VL-Chat",
"Qwen/Qwen2-VL-2B-Instruct",
"Qwen/Qwen2-VL-7B-Instruct",
"Qwen/Qwen2-VL-72B-Instruct",
"THUDM/cogvlm2-llama3-chinese-chat-19B",
"THUDM/cogvlm2-llama3-chat-19B",
"THUDM/cogvlm-chat-hf",
"echo840/Monkey-Chat",
"THUDM/glm-4v-9b",
"nyu-visionx/cambrian-phi3-3b",
"nyu-visionx/cambrian-8b",
"nyu-visionx/cambrian-13b",
"nyu-visionx/cambrian-34b",
"microsoft/Phi-3.5-vision-instruct",
"OpenGVLab/InternVL2-1B",
"OpenGVLab/InternVL2-2B",
"OpenGVLab/InternVL2-4B",
"OpenGVLab/InternVL2-8B",
"OpenGVLab/InternVL2-26B",
"OpenGVLab/InternVL2-40B"
"OpenGVLab/InternVL2-Llama3-76B",
"AIDC-AI/Ovis1.6-Gemma2-9B",
"AIDC-AI/Ovis1.6-Gemma2-27B",
"AIDC-AI/Ovis1.6-Gemma2-27B",
"mistralai/Pixtral-12B-2409",
"meta-llama/Llama-3.2-11B-Vision-Instruct",
"meta-llama/Llama-3.2-90B-Vision-Instruct"
"deepseek-ai/deepseek-vl2",
"deepseek-ai/deepseek-vl2-small",
]
对于未在列表中的模型,它们未与huggingface集成,请参考它们的github仓库创建评估流程。
pip install -r requirements.txt
# 我们以 Hugging FaceM4/idefics2-8b 模型为例
cd src/evaluation
# 评估结果并将评估指标保存为 {model_id}_{difficulty}_{language}_evaluation_result.json
python3 evaluation_pipeline.py --dataset_handler "vcr-org/VCR-wiki-en-easy-test" --model_id HuggingFaceM4/idefics2-8b --device "cuda" --output_path . --bootstrap --end_index 5000
对于像 "OpenGVLab/InternVL2-Llama3-76B" 这样的大型模型,你可能需要使用多个 GPU 来进行评估。你可以将 --device 设置为 None 以使用所有可用的 GPU。
我们提供了闭源模型评估脚本,位于 src/evaluation/closed_source_eval.py
。
你需要一个 API Key、一个预先保存的测试数据集,并指定保存论文数据的路径
pip install -r requirements.txt
cd src/evaluation
# [下载图片以在本地推理选项1] 使用 huggingface 的脚本将测试数据集保存到指定路径
python3 save_image_from_dataset.py --output_path .
# [下载图片以在本地推理选项2] 使用 github 仓库将测试数据集保存到指定路径
# 以 en-easy-test-500 为例
git clone https://github.com/tianyu-z/VCR-wiki-en-easy-test-500.git
# 如果你想通过本地上传图像推理,请通过 --image_path "path_to_image" 指定图片路径,否则,脚本将从 github 仓库流式传输图片
python3 closed_source_eval.py --model_id gpt4o --dataset_handler "VCR-wiki-en-easy-test-500" --api_key "Your_API_Key"
# 评估结果并将评估指标保存为 {model_id}_{difficulty}_{language}_evaluation_result.json
python3 evaluation_metrics.py --model_id gpt4o --output_path . --json_filename "gpt4o_en_easy.json" --dataset_handler "vcr-org/VCR-wiki-en-easy-test"
# 获取 `jsons_path` 中所有 `{model_id}_{difficulty}_{language}_evaluation_result.json` 的平均分数(如果使用 `--bootstrap`,则会保存标准差以及置信区间)的评估指标
python3 gather_results.py --jsons_path .
以下是中文翻译:
方法2:使用 VLMEvalKit 框架
如果 VLMEvalKit 框架不支持您的模型的推理方法,您可能需要将其整合进去。详情请参考这里。
git clone https://github.com/open-compass/VLMEvalKit.git
cd VLMEvalKit
# 我们以 HuggingFaceM4/idefics2-8b 和 VCR_EN_EASY_ALL 为例
python run.py --data VCR_EN_EASY_ALL --model idefics2_8b --verbose
您可以在这里找到支持的模型列表。
VLMEvalKit
支持以下 VCR --data
设置:
- 英语
- 简单
VCR_EN_EASY_ALL
(完整测试集,5000个实例)VCR_EN_EASY_500
(VCR_EN_EASY_ALL设置中的前500个实例)VCR_EN_EASY_100
(VCR_EN_EASY_ALL设置中的前100个实例)
- 困难
VCR_EN_HARD_ALL
(完整测试集,5000个实例)VCR_EN_HARD_500
(VCR_EN_HARD_ALL设置中的前500个实例)VCR_EN_HARD_100
(VCR_EN_HARD_ALL设置中的前100个实例)
- 简单
- 中文
- 简单
VCR_ZH_EASY_ALL
(完整测试集,5000个实例)VCR_ZH_EASY_500
(VCR_ZH_EASY_ALL设置中的前500个实例)VCR_ZH_EASY_100
(VCR_ZH_EASY_ALL设置中的前100个实例)
- 困难
VCR_ZH_HARD_ALL
(完整测试集,5000个实例)VCR_ZH_HARD_500
(VCR_ZH_HARD_ALL设置中的前500个实例)VCR_ZH_HARD_100
(VCR_ZH_HARD_ALL设置中的前100个实例)
- 简单
如果 lmms-eval 框架不支持您的模型的推理方法,您可能需要将其整合进去。详情请参考这里。
pip install git+https://github.com/EvolvingLMMs-Lab/lmms-eval.git
# 我们以 HuggingFaceM4/idefics2-8b 和 vcr_wiki_en_easy 为例
python3 -m accelerate.commands.launch --num_processes=8 -m lmms_eval --model idefics2 --model_args pretrained="HuggingFaceM4/idefics2-8b" --tasks vcr_wiki_en_easy --batch_size 1 --log_samples --log_samples_suffix HuggingFaceM4_idefics2-8b_vcr_wiki_en_easy --output_path ./logs/
您可以在这里找到支持的模型列表。
lmms-eval
支持以下 VCR --tasks
设置:
- 英语
- 简单
vcr_wiki_en_easy
(完整测试集,5000个实例)vcr_wiki_en_easy_500
(vcr_wiki_en_easy设置中的前500个实例)vcr_wiki_en_easy_100
(vcr_wiki_en_easy设置中的前100个实例)
- 困难
vcr_wiki_en_hard
(完整测试集,5000个实例)vcr_wiki_en_hard_500
(vcr_wiki_en_hard设置中的前500个实例)vcr_wiki_en_hard_100
(vcr_wiki_en_hard设置中的前100个实例)
- 简单
- 中文
- 简单
vcr_wiki_zh_easy
(完整测试集,5000个实例)vcr_wiki_zh_easy_500
(vcr_wiki_zh_easy设置中的前500个实例)vcr_wiki_zh_easy_100
(vcr_wiki_zh_easy设置中的前100个实例)
- 困难
vcr_wiki_zh_hard
(完整测试集,5000个实例)vcr_wiki_zh_hard_500
(vcr_wiki_zh_hard设置中的前500个实例)vcr_wiki_zh_hard_100
(vcr_wiki_zh_hard设置中的前100个实例)
- 简单
from vcr_transform import VCRTransform
# "crossed_text" 是可选的,当它为 None 或未提供时,VCRTransform 将自动生成 crossed_text。
example = {
"image": Image.open("assets/main_pic.png"),
"caption": "来自全球各地的机器学习研究人员都对新型 GPU 感到兴奋。即使它只有炉灶那么大,其尖端功能也能让大规模实验更高效、更便宜。",
"crossed_text": [
"研究人员都对新型 GPU 感到",
"即使它只有炉灶那么大",
"尖端功能也能让大规模",
],
}
# 以中文的简单模式为例
transform = VCRTransform(mode="easy", language="en")
transformed_example = transform(example)
以下是VCRTransform
初始化的全部参数列表:
--mode
:'easy' 或 'hard' 或 None。若为 'easy',文本将会在图像中间被划掉。若为 'hard',文本将会在图像上半部被划掉。若为 None,则会使用参数 mask_mode、mask_p、n_gram、n_lines、language、font_path、font_size、background_color、output_tensor。--mask_mode
(str):'nouns' 或 'sentence' 或 'percentage' 或 'ngram'。--mask_p
(float):要划掉的单词百分比。默认为 0.5。--n_gram
(int):要划掉的子词数。--n_lines
(int):将文本最多拆分成的行数。默认为 5。--language
(str):'en' 或 'zh'。--font_path
(str):渲染图像文本的字体文件路径。--font_size
(int):渲染图像文本的字体大小。默认为 20。--background_color
(str):渲染图像文本的背景色。默认为 'white'。--output_tensor
(bool):是否将图像输出为张量。默认为 False。
生成VCR数据集的代码在 src/dataset
中。在开始之前,您需要:
- 包含两列的数据集:
image
和caption
,其中image
包含 PIL.Image 对象,而caption
是相应的标题。 - 用于在图像上渲染文本的字体文件。在我们的实验中,英文使用 Arial,中文使用 SimSum。
- (可选)用于初始过滤有害条目的审查词列表。
要生成VCR数据集,您可以运行以下命令:
cd src/build_dataset
python generate_vcr_dataset.py \
--dataset_path /path/to/dataset \
--is_local_dataset True \
--mask_mode "ngram" \
--language "en" \
--font_path /path/to/font \
--censor_path /path/to/censor \
--output_dir /path/to/output
generate_vcr_dataset.py
的所有参数列表如下:
--dataset_path
: 原始图像文本对数据集的名称或路径。需要具有 "image" 和 "caption" 列。--is_local_dataset
: 数据集是否存储在本地。如果为True,则脚本将调用datasets.load_from_disk()
来加载数据集。--mask_mode
: 生成VCR数据集的掩码模式之一。可以是 "nouns"、"sentence"、"percentage"、"ngram" 中的一个。默认为 "ngram"。--mask_p
: 当mask_mode
为 "percentage" 时,要屏蔽的词的百分比。默认为0.5。--n_gram
: 当mask_mode
为 "ngram" 时的n-gram长度。默认为5。--n_lines
: 在图像中保留的标题行数。默认为5。--language
: 数据集的语言。目前,必须是 "en" 或 "zh" 之一。--easy_mode
: 是否生成易模式数据集。默认为False。--font_path
: 用于在图像上渲染文本的字体文件的路径。您需要自己下载字体文件。--font_size
: 在图像上渲染文本的字体大小。默认为20。--background_color
: 用于在图像上渲染文本的背景颜色。默认为 "white"。--save_image_examples
: 是否保存示例图像。默认为False。--save_image_name
: 保存示例图像的名称。默认为None。--num_examples
: 输出数据集中的实例数。默认为0(无限制)。--censor_path
: 用于初始数据集过滤的审查词列表的路径。默认为None。--random_seed
: 数据集生成的随机种子。默认为42。--output_dir
: 生成的VCR数据集的输出目录。默认为./data
。
如果您发现VCR对您的研究和应用有用,请使用以下BibTeX引用:
@article{zhang2024vcr,
title = {VCR: Visual Caption Restoration},
author = {Tianyu Zhang and Suyuchen Wang and Lu Li and Ge Zhang and Perouz Taslakian and Sai Rajeswar and Jie Fu and Bang Liu and Yoshua Bengio},
year = {2024},
journal = {arXiv preprint arXiv: 2406.06462}
}