Giter Site home page Giter Site logo

zhenhua32 / chinese-clip Goto Github PK

View Code? Open in Web Editor NEW

This project forked from ofa-sys/chinese-clip

0.0 1.0 0.0 1.79 MB

Chinese version of CLIP which achieves Chinese cross-modal retrieval and representation generation.

License: MIT License

Shell 1.23% Python 18.40% PowerShell 0.73% Jupyter Notebook 79.64%

chinese-clip's Introduction

[TOC]

安装

conda activate nlp
python -m venv ./venv
.\venv\Scripts\activate

# 通过pip安装
pip install cn_clip

# 或者从源代码安装. 用了这种方式安装的
cd Chinese-CLIP
pip install -e .

.\run_scripts\muge_finetune_vit-b-16_rbt-base.ps1 ./datapath

数据集在 datapath 目录下,

报错解决

pytorch/examples#526

调参

请注意finetune中间给出的验证集准确率,是验证集batch内部,图文对之间的Recall@1正确率,与比赛指标要求的从整个验证集/测试集图片池召回的Recall@1并不是同一个指标。这里仅用于观察训练趋势,如果要评测模型效果,请完整运行下文的特征提取、KNN召回和计算Recall流程

这个不能看训练过程中的准确率.

# 这是在 batch_size=128, valid_batch_size=128, lr=5e-5 下的结果.
2023-05-16,01:32:35 | INFO | Rank 0 | Validation Result (epoch 3 @ 5868 steps) | Valid Loss: 0.596188 | Image2Text Acc: 82.87 | Text2Image Acc: 82.41 | logit_scale: 4.586 | Valid Batch Size: 128

默认配置的总batch_size 是 128 per-GPU * 8 GPU, lr 是 5e-5. notebook 中的 batch_size 是 48, lr 是 6e-6. 要求的显存大小是 8GB. 我用 3090 的 24 GB 显存下, batch_size 最大能到 160.

有个参数选项是 --accum-freq=1 指定梯度累计频率, 用来模拟更大的 batch_size.

accum-freq: 梯度累积频率,默认为1。指定为大于1的整数时开启对比学习梯度累积,模拟更大的batch size。如果单卡batch size为m,则总的batch size为accum_freq * m * GPU数。

有个加速方式是使用 use-flash-attention, 但是 v100 不支持. 我也装不上, 但是是扯上编译的, 就不要在 Windows 下进行.

# 装不上
pip install flash-attn==1.0.5 -i https://pypi.org/simple

中文说明 | English




ModelScope  |  Demo  |  Paper  |  Blog



本项目为 CLIP 模型的中文版本,使用大规模中文数据进行训练(~2 亿图文对),旨在帮助用户快速实现中文领域的图文特征&相似度计算跨模态检索零样本图片分类等任务。本项目代码基于open_clip project建设,并针对中文领域数据以及在中文数据上实现更好的效果做了优化。本项目提供了 API、训练代码和测试代码,下文中将详细介绍细节。

新闻

  • 2023.5.9 Chinese-CLIP 适配 Pytorch2.0。
  • 2023.3.20 新增对比学习的梯度累积支持,可模拟更大 batch size 的训练效果
  • 2023.2.16 新增FlashAttention支持,提升训练速度,降低显存占用,详见flash_attention.md
  • 2023.1.15 新增部署ONNXTensorRT模型支持(并提供预训练 TensorRT 模型),提升特征推理速度,满足部署需求,详见deployment.md
  • 2022.12.12 新增实现FLIP训练策略,在 finetune 训练时可激活使用(感谢@zwkkk同学贡献代码❤️)
  • 2022.12.3 公开ELEVATER图像分类数据集的中文版本,详见数据文档
  • 2022.12.1 Chinese-CLIP 模型代码&特征提取 API,同步合入 Huggingface transformers🤗 代码库
  • 2022.11.22 新增零样本图像分类代码,可支持ELEVATER benchmark零样本分类评测任务
  • 2022.11.3 新增 RN50,ViT-H-14 模型,公开技术报告
  • 2022.9.22 新增 ViT-L-14,ViT-L-14-336 模型
  • 2022.7.13 新增图文特征提取快速 API,几行代码快速调用中文 CLIP 模型,计算图文特征&相似度
  • 2022.7.8 Chinese-CLIP 项目正式开源,开源图文检索代码

模型及实验

模型规模 & 下载链接

Chinese-CLIP 目前开源 5 个不同规模,其模型信息和下载方式见下表:

模型规模下载链接参数量视觉侧骨架视觉侧参数量文本侧骨架文本侧参数量分辨率
CN-CLIPRN50Download77MResNet5038MRBT339M224
CN-CLIPViT-B/16Download188MViT-B/1686MRoBERTa-wwm-Base102M224
CN-CLIPViT-L/14Download406MViT-L/14304MRoBERTa-wwm-Base102M224
CN-CLIPViT-L/14@336pxDownload407MViT-L/14304MRoBERTa-wwm-Base102M336
CN-CLIPViT-H/14Download958MViT-H/14632MRoBERTa-wwm-Large326M224


实验结果

针对图文检索任务,我们在MUGE RetrievalFlickr30K-CNCOCO-CN上进行了 zero-shot 和 finetune 的实验。针对图像零样本分类,我们在ELEVATER的 10 个数据集上进行了实验。实验结果如下表所示。篇幅所限,我们这里给出 baseline 模型和 Chinese-CLIP 的最优规模模型结果,关于 Chinese-CLIP 各规模的详细结果指标,请详见Results.md

MUGE Text-to-Image Retrieval (Official Validation Set):

SetupZero-shotFinetune
MetricR@1R@5R@10MRR@1R@5R@10MR
Wukong42.769.078.063.252.777.985.672.1
R2D249.575.783.269.560.182.989.477.5
CN-CLIP63.084.189.278.868.988.793.183.6

Flickr30K-CN Retrieval (Official Test Set):

TaskText-to-ImageImage-to-Text
SetupZero-shotFinetuneZero-shotFinetune
MetricR@1R@5R@10R@1R@5R@10R@1R@5R@10R@1R@5R@10
Wukong51.778.986.377.494.597.076.194.897.592.799.199.6
Taiyi60.885.091.0---------
R2D260.986.892.784.496.798.477.696.798.995.699.8100.0
CN-CLIP71.291.495.583.896.998.681.697.598.895.399.7100.0

COCO-CN Retrieval (Official Test Set):

TaskText-to-ImageImage-to-Text
SetupZero-shotFinetuneZero-shotFinetune
MetricR@1R@5R@10R@1R@5R@10R@1R@5R@10R@1R@5R@10
Wukong53.480.290.174.094.498.155.281.090.673.394.098.0
Taiyi60.084.093.3---------
R2D256.485.093.179.196.598.963.389.395.779.397.198.7
CN-CLIP69.289.996.181.596.999.163.086.692.983.597.399.2

Zero-shot Image Classification:

TaskCIFAR10CIFAR100DTDEuroSATFERFGVCKITTIMNISTPCVOC
GIT88.561.142.943.441.46.722.168.950.080.2
ALIGN94.976.866.152.150.825.041.274.055.283.0
CLIP94.977.056.063.048.333.311.579.062.384.0
Wukong95.477.140.950.3------
CN-CLIP96.079.751.252.055.126.249.979.463.584.9



开始用起来!

安装要求

开始本项目前,需先检查是否满足下列环境配置要求:

  • python >= 3.6.4
  • pytorch >= 1.8.0 (with torchvision >= 0.9.0)
  • CUDA Version >= 10.2

运行下列命令即可安装本项目所需的三方库。

pip install -r requirements.txt

API 快速上手

下面提供一段简单的代码示例说明如何使用中文 CLIP 的 API。开始使用前,请先安装 cn_clip:

# 通过pip安装
pip install cn_clip

# 或者从源代码安装
cd Chinese-CLIP
pip install -e .

安装成功后,即可通过如下方式轻松调用 API,传入指定图片(示例)和文本,提取图文特征向量并计算相似度:

import torch
from PIL import Image

import cn_clip.clip as clip
from cn_clip.clip import load_from_name, available_models
print("Available models:", available_models())
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')
model.eval()
image = preprocess(Image.open("examples/pokemon.jpeg")).unsqueeze(0).to(device)
text = clip.tokenize(["杰尼龟", "妙蛙种子", "小火龙", "皮卡丘"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    # 对特征进行归一化,请使用归一化后的图文特征用于下游任务
    image_features /= image_features.norm(dim=-1, keepdim=True)
    text_features /= text_features.norm(dim=-1, keepdim=True)

    logits_per_image, logits_per_text = model.get_similarity(image, text)
    probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print("Label probs:", probs)  # [[1.268734e-03 5.436878e-02 6.795761e-04 9.436829e-01]]

我们也准备了部署 ONNX 和 TensorRT 模型的相关支持,流程详见deployment.md

如果你不满足于仅仅使用 API,欢迎继续阅读本文档,了解如何使用我们的项目进行 CLIP 模型的训练和测试。

教程

下文将包括跨模态检索教程(包含 finetune 和 inference,及 KNN 计算等)以及零样本图像分类教程

跨模态检索

代码组织

下载本项目后, 请创建新的文件夹 ${DATAPATH} 以存放数据集、预训练 ckpt、以及 finetune 产生的模型日志&ckpt。推荐工作区目录结构如下:

Chinese-CLIP/
├── run_scripts/
│   ├── muge_finetune_vit-b-16_rbt-base.sh
│   ├── flickr30k_finetune_vit-b-16_rbt-base.sh
│   └── ...           # 更多finetune或评测脚本...
└── cn_clip/
    ├── clip/
    ├── eval/
    ├── preprocess/
    └── training/

${DATAPATH}
├── pretrained_weights/
├── experiments/
├── deploy/	      # 用于存放ONNX & TensorRT部署模型
└── datasets/
    ├── MUGE/
    ├── Flickr30k-CN/
    └── .../          # 更多自定义数据集...

准备工作

这里我们提供预训练模型参数的下载方式,以及进行 finetune 前对数据进行的预处理过程

预训练 CKPT

请参考前文模型规模 & 下载链接部分,下载对应模型 ckpt。推荐将下载的 ckpt 文件存放于${DATAPATH}/pretrained_weights/目录下。

数据集格式预处理

为了与 Chinese-CLIP 代码适配,同时保证数据处理和读取的效率,我们建议将训练&评测使用的图文数据集统一组织成如下的方式:

${DATAPATH}
└── datasets/
    └── ${dataset_name}/
        ├── train_imgs.tsv      # 图片id & 图片内容
        ├── train_texts.jsonl   # 文本id & 文本内容,连同匹配的图片id列表
        ├── valid_imgs.tsv
        ├── valid_texts.jsonl
        ├── test_imgs.tsv
        └── test_texts.jsonl

其中${dataset_name}代指数据集名称(如 MUGE)

为保证文件处理效率,我们不是将图片以大量的小文件方式存放,而是将训练/验证/测试图片以 base64 形式分别存放在${split}_imgs.tsv文件中。文件每行表示一张图片,包含图片 id(int 型)与图片 base64,以 tab 隔开,格式如下:

1000002	/9j/4AAQSkZJ...YQj7314oA//2Q==

将图片原始文件转换为 base64 的方式非常简单,请执行以下 python 代码:

from PIL import Image
from io import BytesIO
import base64

img = Image.open(file_name) # 访问图片路径
img_buffer = BytesIO()
img.save(img_buffer, format=img.format)
byte_data = img_buffer.getvalue()
base64_str = base64.b64encode(byte_data) # bytes
base64_str = base64_str.decode("utf-8") # str

文本信息及图文对匹配关系则保存在${split}_texts.jsonl文件。文件每行是一行 json,格式如下:

{"text_id": 8428, "text": "高级感托特包斜挎", "image_ids": [1076345, 517602]}

对于测试集只有文本,不知道图文对匹配关系的情况,每行的image_ids字段处理为空列表即可,即"image_ids": []

最后,我们还需要将 tsv 和 jsonl 文件一起序列化,转换为内存索引的 LMDB 数据库文件,方便训练时的随机读取

python cn_clip/preprocess/build_lmdb_dataset.py \
    --data_dir ${DATAPATH}/datasets/${dataset_name}
    --splits train,valid,test

例如对于 MUGE 数据集,则${dataset_name}设为 MUGE,--splits指定需要转换的数据集划分,以逗号不加空格分隔。转换后,数据集文件夹下会对应增加以下 LMDB 序列化文件

${DATAPATH}
└── datasets/
    └── ${dataset_name}/
        └── lmdb/
            ├── train
            │   ├── imgs
            │   └── pairs
            ├── valid
            └── test

为了降低上手难度,我们也提供了按上述步骤预处理好的 MUGE 数据(下载链接)和 Flickr30K-CN 数据(下载链接)压缩包,直接下载解压并放置于${DATAPATH}/datasets/目录下即可。如果需要COCO-CN数据,请向原作者进行申请许可完成后,邮件联系我们吧。

模型 finetune

在此我们介绍训练的步骤,方便其他用户了解模型细节,使用我们提供的中文 CLIP 预训练模型进行 finetune。基于 MUGE 和 Flickr30K-CN 两个下游检索数据集,我们提供了训练样例脚本run_scripts/muge_finetune_vit-b-16_rbt-base.shrun_scripts/flickr30k_finetune_vit-b-16_rbt-base.sh运行脚本同时支持单机(单卡或多卡)和多机分布式训练,请在运行前,先根据脚本开头的指引注释,填写好分布式相关配置,之后运行如下命令即可开始训练(多机训练请在各机器上都运行命令)。对于显存不足的情况,可以考虑激活配置项中的重计算策略训练产生的 log 和模型 ckpt 文件,会自动保存在用户指定的目录下:

cd Chinese-CLIP/
bash run_scripts/muge_finetune_vit-b-16_rbt-base.sh ${DATAPATH}

相关的训练配置项包括:

  • 分布式
    • WORKER_CNT: 训练的机器个数
    • GPUS_PER_NODE: 每个机器上的 GPU 个数
  • 训练/验证数据
    • train-data: 训练数据 LMDB 目录,准备 LMDB 数据文件的预处理流程见上。
    • val-data: 验证数据 LMDB 目录,指定为 None 时,则不进行训练过程中的验证。
    • num-workers: 训练集数据处理(DataLoader)的进程数,默认为 4。
    • valid-num-workers: 验证集数据处理(DataLoader)的进程数(如果进行验证),默认为 1。
  • 训练超参数
    • vision-model: 指定视觉 backbone, 从 ["ViT-B-16", "ViT-L-14", "ViT-L-14-336", "ViT-H-14", "RN50"]选择。
    • text-model: 指定文本 backbone, 从 ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"]选择。
    • context-length: 文本输入序列长度。
    • warmup: warmup 步数。
    • batch-size: 训练时单卡 batch-size。(请保证训练样本总数 > batch-size * GPU数,至少满足 1 个训练 batch)
    • lr: 学习率。
    • wd: weight decay。
    • max-steps: 训练步数,也可通过max-epochs指定训练轮数。
    • freeze-vision: 是否 freeze 视觉 backbone。
    • use-augment: 是否使用AutoAugment对图片进行数据增强。
    • valid-batch-size: 验证时单机 batch-size。(请保证验证集样本总数 > batch-size * GPU数,至少满足 1 个验证 batch)
    • valid-step-intervalvalid-epoch-interval: 验证 step/epoch 频率,指定为-1 时则在训练中不进行验证。
    • grad-checkpointing: 使用重计算策略,在前向过程中不保存中间结果,以训练时间换取更小的显存开销,适用于显存不足的情况。(store_true参数,直接在脚本中加上--grad-checkpointing即可,目前要求 Pytorch>1.8.0)
    • mask-ratio: 参照FLIP的策略,在 finetune 时可指定随机 mask 一定比例的图像 patch,以降低显存开销、加快训练速度。默认为 0.0,即不激活这一策略。
    • use-flash-attention: 使用FlashAttention,可在不影响效果的条件下为 Chinese-CLIP 的 finetune 过程显著提速以及降低显存占用。(store_true参数,配置好环境后,在脚本中加上--use-flash-attention即可,请详见flash_attention.md
    • accum-freq: 梯度累积频率,默认为 1。指定为大于 1 的整数时开启对比学习梯度累积,模拟更大的 batch size。如果单卡 batch size 为m,则总的 batch size 为accum_freq * m * GPU数
    • gather-with-grad: 是否在分布式训练时进行带有完整梯度的特征 gather,默认关闭。
  • 输出选项
    • name: 指定输出路径。超参日志, 训练日志以及产出 ckpt 均会存放至 ${DATAPATH}/experiments/${name}/
    • save-step-frequencysave-epoch-frequency: 存 ckpt 的步数或轮数间隔。
    • report-training-batch-acc: 日志是否报告训练图到文&文到图 batch 准确率。
  • 权重读取相关选项
    • resume: 权重读取的路径。示例脚本中指定为预训练 ckpt 路径,也可以指定为用户自己 finetune 的 ckpt 路径做继续训练。
    • reset-data-offset: 是否从此前的数据断点续跑。如 batch size 或 GPU 卡数超参改变,建议打开此选项。
    • reset-optimizer: 是否使用 optimizer state。

训练完毕,log 会自动存在${DATAPATH}/experiments/${name}/out_${timestamp}.log,训练 log 格式如下所示:

2022-12-11,20:40:34 | INFO | Rank 0 | Global Steps: 1/735 | Train Epoch: 1 [1024/250880 (0%)] | Loss: 2.371020 | Image2Text Acc: 49.90 | Text2Image Acc: 48.73 | Data Time: 1.039s | Batch Time: 3.625s | LR: 0.000000 | logit_scale: 4.605 | Global Batch Size: 1024

验证 log 格式如下所示:

2022-12-11,20:42:47 | INFO | Rank 0 | Validation Result (epoch 1 @ 150 steps) | Valid Loss: 0.502810 | Image2Text Acc: 84.95 | Text2Image Acc: 84.26 | logit_scale: 4.605 | Valid Batch Size: 128

注意: 对比学习的训练收敛和稳定性和总 batch size 相关。如您使用更小的 batch size(相比默认配置 128 per-GPU * 8 GPU),建议使用更小的学习率。我们推荐使用更多的 GPU 和更大的 batch size 以取得更好的效果。

预测及评估

我们提供特征提取、以及图文检索任务评估的流程,具体如下:

图文特征提取

目前本代码支持使用 GPU 单卡进行图文特征提取,请参考使用以下命令。我们也提供了部署 ONNX 和 TensorRT 模型,加速特征推理的支持,详见deployment.md

cd Chinese-CLIP/
export CUDA_VISIBLE_DEVICES=0
export PYTHONPATH=${PYTHONPATH}:`pwd`/cn_clip

split=valid # 指定计算valid或test集特征
resume=${DATAPATH}/pretrained_weights/clip_cn_vit-b-16.pt

python -u cn_clip/eval/extract_features.py \
    --extract-image-feats \
    --extract-text-feats \
    --image-data="${DATAPATH}/datasets/${dataset_name}/lmdb/${split}/imgs" \
    --text-data="${DATAPATH}/datasets/${dataset_name}/${split}_texts.jsonl" \
    --img-batch-size=32 \
    --text-batch-size=32 \
    --context-length=52 \
    --resume=${resume} \
    --vision-model=ViT-B-16 \
    --text-model=RoBERTa-wwm-ext-base-chinese

产出图文特征默认将保存于${DATAPATH}/datasets/${dataset_name}目录下,图片特征保存于${split}_imgs.img_feat.jsonl文件,每行以 json 存储一张图片的特征,格式如下:

{"image_id": 1000002, "feature": [0.0198, ..., -0.017, 0.0248]}

文本特征则保存于${split}_texts.txt_feat.jsonl,格式如下:

{"text_id": 248816, "feature": [0.1314, ..., 0.0018, -0.0002]}

KNN 检索

对于小规模的学术检索数据集,我们提供一个简单的 KNN 检索实现,便于计算文到图、图到文检索的 top-k 召回结果(tips:如想仿照我们在项目中搭建检索 demo,建议基于中文 CLIP 模型产出图文特征后,结合开源工程框架clip-retrieval搭建前后端服务。)

对于文到图检索(文本召回相关图片),请运行以下命令:

cd Chinese-CLIP/
split=valid # 指定计算valid或test集特征
python -u cn_clip/eval/make_topk_predictions.py \
    --image-feats="${DATAPATH}/datasets/${dataset_name}/${split}_imgs.img_feat.jsonl" \
    --text-feats="${DATAPATH}/datasets/${dataset_name}/${split}_texts.txt_feat.jsonl" \
    --top-k=10 \
    --eval-batch-size=32768 \
    --output="${DATAPATH}/datasets/${dataset_name}/${split}_predictions.jsonl"

产出的结果保存在指定的 jsonl 文件中,每行表示一个文本召回的 top-k 图片 id,格式如下:

{
  "text_id": 153915,
  "image_ids": [
    5791244, 1009692167, 7454547004, 3564007203, 38130571, 2525270674, 2195419145, 2503091968, 4966265765, 3690431163
  ]
}

对于图到文检索(图片召回相关文本),类似地,请运行以下命令:

split=valid # 指定计算valid或test集特征
python -u cn_clip/eval/make_topk_predictions_tr.py \
    --image-feats="${DATAPATH}/datasets/${dataset_name}/${split}_imgs.img_feat.jsonl" \
    --text-feats="${DATAPATH}/datasets/${dataset_name}/${split}_texts.txt_feat.jsonl" \
    --top-k=10 \
    --eval-batch-size=32768 \
    --output="${DATAPATH}/datasets/${dataset_name}/${split}_tr_predictions.jsonl"

产出结果每行表示一个图片召回的 top-k 文本 id,格式如下:

{ "image_id": 977856234, "text_ids": [156914, 157914, 158914, 155914, 156179, 158907, 157179, 154179, 154914, 154723] }

Recall 计算

我们提供了评测脚本计算检索任务的 Recall@1/5/10,同时给出 mean recall(Recall@1/5/10 的平均数)。运行如下命令即可获取分数:

对于文到图检索,请运行命令:

split=valid # 指定计算valid或test集特征
python cn_clip/eval/evaluation.py \
    ${DATAPATH}/datasets/${dataset_name}/${split}_texts.jsonl \
    ${DATAPATH}/datasets/${dataset_name}/${split}_predictions.jsonl \
    output.json
cat output.json

对于图到文检索,请先运行下面的命令,将图文对标注的 jsonl 文件由文到图的格式转为图到文:

python cn_clip/eval/transform_ir_annotation_to_tr.py \
    --input ${DATAPATH}/datasets/${dataset_name}/${split}_texts.jsonl

完成后,请运行命令:

split=valid # 指定计算valid或test集特征
python cn_clip/eval/evaluation_tr.py \
    ${DATAPATH}/datasets/${dataset_name}/${split}_texts.tr.jsonl \
    ${DATAPATH}/datasets/${dataset_name}/${split}_tr_predictions.jsonl \
    output.json
cat output.json

打印出的结果格式将如下:

{
  "success": true,
  "score": 85.67,
  "scoreJson": { "score": 85.67, "mean_recall": 85.67, "r1": 71.2, "r5": 90.5, "r10": 95.3 }
}

关于整套跨模态检索的训练和测试流程,我们以 MUGE 检索数据集(多模态电商图文挑战赛)为例,也提供了一个包含上述全部流程并可运行的 Jupyter Notebook(下载链接),欢迎大家上手实践。


零样本图像分类

本部分介绍如何使用 Chinese-CLIP 实现零样本图像分类,以零样本图像分类 Benchmark ELEVATER 中的数据集为例。ELEVATER 是由多个知名的分类数据集(包括 CIFAR-10、CIFAR-100、MNIST 等)组成的评测集合,评测模型在这些数据集上的零样本效果。我们在实验中,给其中每个数据集准备了中文版本的 prompt、类别标签连同原始图片,详见数据文档,用于测试 Chinese-CLIP 模型。更多关于该 benchmark 的详情请点击链接。大家也可以参考我们提供的流程,仿照在自己的中文分类数据集准备数据并进行测试。

准备工作

首先将数据按照如下格式进行准备。由于零样本图像分类仅需测试,因此只需要准备好测试集和预训练模型参数,按照如下目录结构,存放在用户指定的${DATAPATH}下:

${DATAPATH}
├── pretrained_weights/
└── datasets/
    └── ${dataset_name}/
        ├── label_cn.txt
        └── test/
	    ├── 000/ # label id,如label个数大于10,则将其向左补零到3位数保证字典序
	    │   ├── image_0003.jpg # 图片样本,命名无特殊要求
	    │   ├── image_0005.jpg
	    │   └── ...
	    ├── 001/
	    │   ├── image_0001.jpg
	    │   ├── image_0002.jpg
	    │   └── ...
	    └── 002/
	        ├── image_0003.jpg
	        ├── image_0005.jpg
	        └── ...
	    ...

测试集保证 test 文件夹内数据按照 label 对应的 id 进行划分,并保证 id 为字典序(10 以上的多位数,需向左补零label.zfill(3), 如 001,002 等)。label_cn.txt为数据标签,每行一个标签名,如下所示:

手风琴
飞机
锚
...

每行的标签对应的 label id 为行号-1,如第 1 行的标签的 id 为 0,第二行的标签的 id 为 1。如果标签总数大于 10,则统一向左补零到 3 位数,比如标签个数为 100,标签 id 则为000-099。用户需为每个 label id 生成对应的文件夹,并将标注该 label 的样本放入其中。我们以 ELEVATER 中的CIFAR-100 数据集为样例,请点击链接下载处理好的数据。如果想尝试在其他 ELEVATER 包含的数据集上测试 Chinese-CLIP,请参见我们的数据文档

预测和评估

我们准备了预测脚本,请查看run_scripts/zeroshot_eval.sh。运行命令例子如下:

bash run_scripts/zeroshot_eval.sh 0 \
    ${DATAPATH} ${dataset_name} \
    ${vision_model} ${text_model} \
    ${ckpt_path} ${index_file}

其中各参数意义为:

  • 第一个入参0为 GPU id
  • DATAPATH参见上面的准备工作部分,根据实际位置输入对应路径
  • dataset_name参见上面的准备工作部分,输入评测的数据集目录名,如cifar-100
  • vision_model为指定模型类型,选项包括["ViT-B-32", "ViT-B-16", "ViT-L-14", "ViT-L-14-336", "RN50", "ViT-H-14"]
  • text_model包括["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"]
  • ckpt_path为模型预训练 ckpt 的完整路径
  • index_file(可选,仅提交 ELEVATER 官网评测需要指定),请参见数据文档

例如,用 ViT-B/16 规模预训练模型进行评测 CIFAR-100,则运行(${DATAPATH}需根据实际情况替换):

bash run_scripts/zeroshot_eval.sh 0 \
    ${DATAPATH} cifar-100 \
    ViT-B-16 RoBERTa-wwm-ext-base-chinese \
    ${DATAPATH}/pretrained_weights/clip_cn_vit-b-16.pt

返回结果会打印 top-1 的准确率。

Result:
zeroshot-top1: 0.6444

在 CIFAR-100 上,ViT-B/16 规模的 Chinese-CLIP 预期应该达到 64.4%。我们在 ELEVATER 上其他规模、其他数据集的零样本分类结果,请详见Results.md

同时,程序还会存下一个 json 文件用于提交 ELEVATER 官方用,json 文件内容如下所示:

{
  "model_name": "CN-CLIP-ViT-B-16",
  "dataset_name": "cifar-100",
  "num_trainable_params": 0,
  "num_params": 188262913,
  "num_visual_params": 86192640,
  "num_backbone_params": 188262913,
  "n_shot": 0,
  "rnd_seeds": [123],
  "predictions": "prediction probability tensor [size: (1, 10000, 100)]"
}

其中包括模型名model_name、数据集名称dataset_name、总参数量num_params、视觉塔的参数量num_visual_params等模型的 meta 信息,以及模型输出结果,即模型的预测概率 tensor,size 为[1, 样本数, 标签个数]

零样本分类在线 Demo

基于我们集成于 Huggingface transformers 的特征提取 API,我们在 Huggingface Model Hub🤗 提供了在线简单尝试零样本图像分类的 demo(Hosted inference API),各个模型规模的 demo 链接见下,欢迎尝试!

引用

如果觉得本项目好用,希望能给我们提个 star 并分享给身边的用户,欢迎给相关工作 citation,感谢支持!

@article{chinese-clip,
  title={Chinese CLIP: Contrastive Vision-Language Pretraining in Chinese},
  author={Yang, An and Pan, Junshu and Lin, Junyang and Men, Rui and Zhang, Yichang and Zhou, Jingren and Zhou, Chang},
  journal={arXiv preprint arXiv:2211.01335},
  year={2022}
}

chinese-clip's People

Contributors

yangapku avatar justinlin610 avatar dtyxs avatar zhenhua32 avatar jxst539246 avatar zwkkk avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.