中文說明| English
ModelScope | Demo | Paper | Blog
本項目為CLIP模型的中文版本,使用大規模中文數據進行訓練(~2億圖文對),旨在幫助用戶快速實現中文領域的圖文特徵&相似度計算、跨模態檢索、零樣本圖片分類等任務。本項目代碼基於open_clip project建設,並針對中文領域數據以及在中文數據上實現更好的效果做了優化。本項目提供了API、訓練代碼和測試代碼,下文中將詳細介紹細節。
Chinese-CLIP目前開源5個不同規模,其模型信息和下載方式見下表:
| 模型規模 | 下載鏈接 | 參數量 | 視覺側骨架 | 視覺側參數量 | 文本側骨架 | 文本側參數量 | 分辨率 |
|---|---|---|---|---|---|---|---|
| CN-CLIP RN50 | Download | 77M | ResNet50 | 38M | RBT3 | 39M | 224 |
| CN-CLIP ViT-B/16 | Download | 188M | ViT-B/16 | 86M | RoBERTa-wwm-Base | 102M | 224 |
| CN-CLIP ViT-L/14 | Download | 406M | ViT-L/14 | 304M | RoBERTa-wwm-Base | 102M | 224 |
| CN-CLIP ViT-L/14@336px | Download | 407M | ViT-L/14 | 304M | RoBERTa-wwm-Base | 102M | 336 |
| CN-CLIP ViT-H/14 | Download | 958M | ViT-H/14 | 632M | RoBERTa-wwm-Large | 326M | 224 |
針對圖文檢索任務,我們在MUGE Retrieval、Flickr30K-CN和COCO-CN上進行了zero-shot和finetune的實驗。針對圖像零樣本分類,我們在ELEVATER的10個數據集上進行了實驗。實驗結果如下表所示。篇幅所限,我們這裡給出baseline模型和Chinese-CLIP的最優規模模型結果,關於Chinese-CLIP各規模的詳細結果指標,請詳見Results.md。
MUGE Text-to-Image Retrieval (Official Validation Set) :
| Setup | Zero-shot | Finetune | ||||||
|---|---|---|---|---|---|---|---|---|
| Metric | R@1 | R@5 | R@10 | MR | R@1 | R@5 | R@10 | MR |
| Wukong | 42.7 | 69.0 | 78.0 | 63.2 | 52.7 | 77.9 | 85.6 | 72.1 |
| R2D2 | 49.5 | 75.7 | 83.2 | 69.5 | 60.1 | 82.9 | 89.4 | 77.5 |
| CN-CLIP | 63.0 | 84.1 | 89.2 | 78.8 | 68.9 | 88.7 | 93.1 | 83.6 |
Flickr30K-CN Retrieval (Official Test Set) :
| Task | Text-to-Image | Image-to-Text | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Setup | Zero-shot | Finetune | Zero-shot | Finetune | ||||||||
| Metric | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 |
| Wukong | 51.7 | 78.9 | 86.3 | 77.4 | 94.5 | 97.0 | 76.1 | 94.8 | 97.5 | 92.7 | 99.1 | 99.6 |
| Taiyi | 60.8 | 85.0 | 91.0 | - | - | - | - | - | - | - | - | - |
| R2D2 | 60.9 | 86.8 | 92.7 | 84.4 | 96.7 | 98.4 | 77.6 | 96.7 | 98.9 | 95.6 | 99.8 | 100.0 |
| CN-CLIP | 71.2 | 91.4 | 95.5 | 83.8 | 96.9 | 98.6 | 81.6 | 97.5 | 98.8 | 95.3 | 99.7 | 100.0 |
COCO-CN Retrieval (Official Test Set) :
| Task | Text-to-Image | Image-to-Text | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Setup | Zero-shot | Finetune | Zero-shot | Finetune | ||||||||
| Metric | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 |
| Wukong | 53.4 | 80.2 | 90.1 | 74.0 | 94.4 | 98.1 | 55.2 | 81.0 | 90.6 | 73.3 | 94.0 | 98.0 |
| Taiyi | 60.0 | 84.0 | 93.3 | - | - | - | - | - | - | - | - | - |
| R2D2 | 56.4 | 85.0 | 93.1 | 79.1 | 96.5 | 98.9 | 63.3 | 89.3 | 95.7 | 79.3 | 97.1 | 98.7 |
| CN-CLIP | 69.2 | 89.9 | 96.1 | 81.5 | 96.9 | 99.1 | 63.0 | 86.6 | 92.9 | 83.5 | 97.3 | 99.2 |
Zero-shot Image Classification :
| Task | CIFAR10 | CIFAR100 | DTD | EuroSAT | FER | FGVC | KITTI | MNIST | PC | VOC |
|---|---|---|---|---|---|---|---|---|---|---|
| GIT | 88.5 | 61.1 | 42.9 | 43.4 | 41.4 | 6.7 | 22.1 | 68.9 | 50.0 | 80.2 |
| ALIGN | 94.9 | 76.8 | 66.1 | 52.1 | 50.8 | 25.0 | 41.2 | 74.0 | 55.2 | 83.0 |
| CLIP | 94.9 | 77.0 | 56.0 | 63.0 | 48.3 | 33.3 | 11.5 | 79.0 | 62.3 | 84.0 |
| Wukong | 95.4 | 77.1 | 40.9 | 50.3 | - | - | - | - | - | - |
| CN-CLIP | 96.0 | 79.7 | 51.2 | 52.0 | 55.1 | 26.2 | 49.9 | 79.4 | 63.5 | 84.9 |
開始本項目前,需先檢查是否滿足下列環境配置要求:
運行下列命令即可安裝本項目所需的三方庫。
pip install -r requirements.txt下面提供一段簡單的代碼示例說明如何使用中文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文件存放於${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數據,請向原作者進行申請許可完成後,郵件聯繫我們吧。
在此我們介紹訓練的步驟,方便其他用戶了解模型細節,使用我們提供的中文CLIP預訓練模型進行finetune。基於MUGE和Flickr30K-CN兩個下游檢索數據集,我們提供了訓練樣例腳本run_scripts/muge_finetune_vit-b-16_rbt-base.sh和run_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-interval和valid-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-frequency及save-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檢索實現,便於計算文到圖、圖到文檢索的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@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 idDATAPATH參見上面的準備工作部分,根據實際位置輸入對應路徑dataset_name參見上面的準備工作部分,輸入評測的數據集目錄名,如cifar-100vision_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, 样本数, 标签个数] 。
基於我們集成於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}
}