Simple image captioning model
CLIP前缀标题生成
“ClipCap:CLIP前缀图像标题生成”论文的官方实现
简介
图像标题生成是一项复杂的任务,通常需要预训练的检测网络,并需要对象注解形式的额外监督。我们提出了一种新方法,无需额外信息(即只需要图像和标题),因此可以应用于任何数据。此外,我们的模型训练时间比同类方法快得多,同时在包含超过300万张图片的Conceptual Captions数据集上也能达到与最先进的结果相当。
在我们的工作中,我们使用了CLIP模型,它已经在极大量的图像上进行了预训练,因此能够对任意图像生成语义编码,而不需要额外监督。为了生成有意义的句子,我们微调了一个预先训练的语言模型,这已被证明对其他自然语言任务成功。关键思想是利用CLIP编码作为文本标题的前缀,通过一个简单的映射网络处理原始编码,然后微调我们的语言模型以生成有效的标题。此外,我们还提供了一个变体,其中我们将映射网络设计为变压器架构,避免了对GPT-2的微调。然而,我们的轻量级模型在nocaps数据集上的表现仍然可与最先进的模型相媲美。
COCO示例
![]() |
![]() |
![]() |
| 一对人站在大象旁边。 | 一张木桌靠窗而置。 | 一串香蕉放在桌子上。 |
![]() |
![]() |
![]() |
| 一位女士手持装着蛋糕片的盘子遮住脸。 | 一张木桌上摆满了木制厨具。 | 一辆红色摩托车停在泥土田上。 |
概念性标题示例
![]() |
![]() |
![]() |
| 三维渲染的人手持地球仪。 | 学生们欣赏樱花盛开。 | 一片白色盘子里的生菜叶子。 |
![]() |
![]() |
![]() |
| 水边的酒店和赌场。 | 三角形代表灵魂的象征。 | 卡通男孩在洗澡。 |
推理笔记本
为了可视化结果,我们在notebooks/clip_prefix_captioning_inference.ipynb中提供了一个Colab笔记本。这个笔记本会下载预训练模型,并对样例图像或您选择的图像运行推理。建议在Google Colab上运行此笔记本。
对于**变压器映射网络(不微调GPT-2)**的推理笔记本,可以在COCO模型处找到,也位于notebooks/transformer_inference.ipynb。
针对mlp映射网络,提供了COCO和概念性标题的预训练模型。对于不微调GPT-2的变压器,我们提供了COCO的预训练模型。
推理图形用户界面
- 使用replicate.ai UI在浏览器中运行。
- 集成到Huggingface Spaces,采用Gradio。演示:
(目前不支持束搜索)
训练先决条件
克隆、创建环境并安装依赖项:
git clone https://github.com/rmokady/CLIP_prefix_caption && cd CLIP_prefix_caption
conda env create -f environment.yml
conda activate clip_prefix_caption
COCO训练
将train_captions下载到data/coco/annotations。
下载训练图像和验证图像并解压缩(我们使用Karpathy等人划分)。
提取CLIP特征(输出为data/coco/oscar_split_ViT-B_32_train.pkl):
python parse_coco.py --clip_model_type ViT-B/32
微调GPT2进行训练:
python train.py --data ./data/coco/oscar_split_ViT-B_32_train.pkl --out_dir ./coco_train/
仅训练变换器映射网络:
python train.py --only_prefix --data ./data/coco/oscar_split_ViT-B_32_train.pkl --out_dir ./coco_train/ --mapping_type transformer --num_layres 8 --prefix_length 40 --prefix_length_clip 40
如果您希望使用基于ResNet的CLIP:
python parse_coco.py --clip_model_type RN50x4
python train.py --only_prefix --data ./data/coco/oscar_split_RN50x4_train.pkl --out_dir ./coco_train/ --mapping_type transformer --num_layres 8 --prefix_length 40 --prefix_length_clip 40 --is_rn
概念性训练
从概念性标题(Conceptual Captions)下载.TSV格式的训练/验证文件,并将其放置在<data_root>目录下。
通过以下命令下载图片并提取CLIP特征(输出结果分别保存于<data_root>/conceptual_clip_ViT-B_32_train.pkl和<data_root>/conceptual_clip_ViT-B_32_val.pkl):
python parse_conceptual.py --clip_model_type ViT-B/32 --data_root <data_root> --num_threads 16
请注意,下载图片可能需要几天时间。
使用GPT-2微调的方式进行训练:
python train.py --data <data_root>/conceptual_clip_ViT-B_32_train.pkl --out_dir ./conceptual_train/
类似于COCO数据集的训练,您可以训练一个变换映射网络,并且/或者使用基于ResNet的CLIP来解析图像。
引用
如果您在研究中使用了这段代码,请引用如下文献:
@article{mokady2021clipcap,
title={ClipCap: CLIP Prefix for Image Captioning},
author={Mokady, Ron and Hertz, Amir and Bermano, Amit H},
journal={arXiv preprint arXiv:2111.09734},
year={2021}
}
致谢
本仓库极大地依赖于CLIP和Hugging Face Transformers的仓库。 在训练过程中,我们使用了COCO数据集和概念性标题(Conceptual Captions)的数据。
联系方式
如有任何咨询,请通过以下邮箱联系我们:ron.mokady@gmail.com 或 amirhertz@mail.tau.ac.il。











