中国語の説明|英語
ModelScope | Demo | Paper |ブログ
このプロジェクトは、中国語版のクリップモデルであり、トレーニングに大規模な中国語データ(〜2億グラフィックとテキストのペア)を使用しています。このプロジェクトのコードは、 Open_Clipプロジェクトに基づいており、中国のフィールドデータ用に最適化され、中国のデータでより良い結果を達成します。このプロジェクトは、API、トレーニングコード、テストコードを提供し、詳細については以下で詳しく説明します。
現在、中国語のクリップは5つの異なるスケールで供給されており、そのモデル情報とダウンロード方法を次の表に示します。
| モデルサイズ | ダウンロードリンク | パラメーター数 | 視覚的なサイドスケルトン | 視覚的なサイドパラメーター数量 | テキストサイドスケルトン | テキストサイドパラメーター数量 | 解決 |
|---|---|---|---|---|---|---|---|
| CN-Clip RN50 | ダウンロード | 77m | Resnet50 | 38m | RBT3 | 39m | 224 |
| CN-Clip VIT-B/16 | ダウンロード | 188m | VIT-B/16 | 86m | roberta-wwm-base | 102m | 224 |
| CN-Clip VIT-L/14 | ダウンロード | 406m | VIT-L/14 | 304m | roberta-wwm-base | 102m | 224 |
| CN-Clip VIT-L/14@336px | ダウンロード | 407m | VIT-L/14 | 304m | roberta-wwm-base | 102m | 336 |
| CN-Clip VIT-H/14 | ダウンロード | 958m | VIT-H/14 | 632m | Roberta-WWM-Large | 326m | 224 |
グラフィックおよびテキスト検索タスクについては、Muge検索、FlickR30K-CN、COCO-CNでゼロショットおよびFinetuneの実験を実施しました。画像ゼロサンプル分類については、Elevaterの10のデータセットで実験を実施しました。実験結果を下の表に示します。スペースの制限により、ここでは、ベースラインモデルと中国クリップの最適なスケールモデル結果を提供します。中国クリップの各スケールの詳細な結果インジケーターについては、詳細についてはresults.mdを参照してください。
Muge Text-to-Image検索(公式検証セット) :
| 設定 | ゼロショット | 微調整 | ||||||
|---|---|---|---|---|---|---|---|---|
| メトリック | R@1 | R@5 | r@10 | 氏 | R@1 | R@5 | r@10 | 氏 |
| ウーコン | 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クリップ | 63.0 | 84.1 | 89.2 | 78.8 | 68.9 | 88.7 | 93.1 | 83.6 |
flickr30k-cn検索(公式テストセット) :
| タスク | テキストから画像へ | 画像からテキスト | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 設定 | ゼロショット | 微調整 | ゼロショット | 微調整 | ||||||||
| メトリック | R@1 | R@5 | r@10 | R@1 | R@5 | r@10 | R@1 | R@5 | r@10 | R@1 | R@5 | r@10 |
| ウーコン | 51.7 | 78.9 | 86.3 | 77.4 | 94.5 | 97.0 | 76.1 | 94.8 | 97.5 | 92.7 | 99.1 | 99.6 |
| 台湾 | 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クリップ | 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検索(公式テストセット) :
| タスク | テキストから画像へ | 画像からテキスト | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 設定 | ゼロショット | 微調整 | ゼロショット | 微調整 | ||||||||
| メトリック | R@1 | R@5 | r@10 | R@1 | R@5 | r@10 | R@1 | R@5 | r@10 | R@1 | R@5 | r@10 |
| ウーコン | 53.4 | 80.2 | 90.1 | 74.0 | 94.4 | 98.1 | 55.2 | 81.0 | 90.6 | 73.3 | 94.0 | 98.0 |
| 台湾 | 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クリップ | 69.2 | 89.9 | 96.1 | 81.5 | 96.9 | 99.1 | 63.0 | 86.6 | 92.9 | 83.5 | 97.3 | 99.2 |
ゼロショット画像分類:
| タスク | CIFAR10 | CIFAR100 | DTD | ユーロサット | fer | FGVC | キティ | mnist | PC | Voc |
|---|---|---|---|---|---|---|---|---|---|---|
| git | 88.5 | 61.1 | 42.9 | 43.4 | 41.4 | 6.7 | 22.1 | 68.9 | 50.0 | 80.2 |
| 整列します | 94.9 | 76.8 | 66.1 | 52.1 | 50.8 | 25.0 | 41.2 | 74.0 | 55.2 | 83.0 |
| クリップ | 94.9 | 77.0 | 56.0 | 63.0 | 48.3 | 33.3 | 11.5 | 79.0 | 62.3 | 84.0 |
| ウーコン | 95.4 | 77.1 | 40.9 | 50.3 | - | - | - | - | - | - |
| CNクリップ | 96.0 | 79.7 | 51.2 | 52.0 | 55.1 | 26.2 | 49.9 | 79.4 | 63.5 | 84.9 |
このプロジェクトを開始する前に、次の環境構成要件が満たされているかどうかを確認する必要があります。
次のコマンドを実行して、このプロジェクトに必要な3つのパーティライブラリをインストールします。
pip install -r requirements.txt中国のクリップ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モデルとTensortモデルの展開に関連するサポートを準備しました。詳細については、deployment.mdを参照してください。
APIの使用だけに満足していない場合は、このドキュメントを読み続けて、クリップモデルのトレーニングとテストにプロジェクトを使用する方法を学びましょう。
以下には、クロスモーダル検索チュートリアル(Finetune and Inference、KNN計算など)およびゼロサンプル画像分類チュートリアルが含まれます。
このプロジェクトをダウンロードした後、新しいフォルダー${DATAPATH}を作成して、Finetuneによって生成されたデータセット、事前トレーニングを受けたCKPT、およびモデルログ&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/ディレクトリに保存することをお勧めします。
中国のクリップコードに適応し、データ処理と読み取りの効率を確保するために、トレーニングと評価に使用されるグラフィックスとテキストデータセットを次の方法に編成することをお勧めします。
${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など)を指します
ファイルの処理効率を確保するために、大量の小さなファイルに画像を保存するのではなく、 ${split}_imgs.tsvファイルにBase64にトレーニング/検証/テスト画像を保存します。ファイルの各行は、[タブで区切られた画像ID(intタイプ)と画像Base64などの画像を表します。形式は次のとおりです。
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の場合、 ${dataset_name}がMugeに設定され、 --splits 、スペースのないコンマで区切られ、変換する必要があるデータセット部門を指定します。変換後、次のLMDBシリアル化されたファイルがデータセットフォルダーに追加されます。
${DATAPATH}
└── datasets/
└── ${dataset_name}/
└── lmdb/
├── train
│ ├── imgs
│ └── pairs
├── valid
└── test
開始の難しさを減らすために、上記の手順に従って事前に処理されたMugeデータ(ダウンロードリンク)とFlickR30K-CNデータ(ダウンロードリンク)コンプレッションパッケージも提供します。ダウンロードして減圧して、 ${DATAPATH}/datasets/ directoryに配置するだけです。 COCO-CNデータが必要な場合は、元の著者からの許可を申請した後、メールでお問い合わせください。
ここでは、他のユーザーがモデルの詳細を理解し、Finetuneに提供する中国のクリップ事前訓練モデルを使用するように促進するトレーニング手順を紹介します。 MugeとFlickR30K-CNの2つのダウンストリーム検索データセットに基づいて、トレーニングサンプルスクリプトrun_scripts/muge_finetune_vit-b-16_rbt-base.shおよびrun_scripts/flickr30k_finetune_vit-b-16_rbt-base.shを提供します。ランニングスクリプトは、シングルマシン(シングルまたは複数のカード)とマルチマシン分散トレーニングの両方をサポートします。実行する前に、スクリプトの先頭にあるガイドラインとコメントに従って分散関連の構成を記入し、次のコマンドを実行してトレーニングを開始します(マルチマシントレーニングのために各マシンでコマンドを実行してください)。ビデオメモリが不十分な場合は、構成アイテムの再計算戦略のアクティブ化を検討できます。トレーニングによって生成されたログとモデルの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ディレクトリを確認します。なしとして指定されている場合、トレーニング中の検証は実行されません。num-workers :トレーニングセットデータ処理(DataloAder)のプロセス数、デフォルトは4です。valid-num-workers :検証セットデータ処理(dataloader)(検証が実行される場合)のプロセス数、デフォルトは1です。vision-model :Visual Backboneを指定し、 ["ViT-B-16", "ViT-L-14", "ViT-L-14-336", "ViT-H-14", "RN50"]から選択します。text-model :テキストバックボーンを指定し、 ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"]から選択します。context-length :テキスト入力シーケンス長。warmup :ウォームアップステップ。batch-size :トレーニング中のシングルカードバッチサイズ。 (少なくとも1つのトレーニングバッチを満たす训练样本总数> batch-size * GPU数を確認してください)lr :学習率。wd :重量減衰。max-steps :トレーニングステップの数とトレーニングラウンドの数も、 max-epochsを通じて指定できます。freeze-vision :視覚的なバックボーンを凍結するかどうか。use-augment :自動検査を使用して画像のデータを強化するかどうか。valid-batch-size :検証中のスタンドアロンバッチサイズ。 (验证集样本总数> batch-size * GPU数を確認し、少なくとも1つの検証バッチを満たしていることを確認してください)valid-step-intervalおよびvalid-epoch-interval :ステップ/エポック周波数を確認します。 -1として指定されている場合、トレーニング中に検証は実行されません。grad-checkpointing :再計算戦略を使用して、トレーニング時間のメモリオーバーヘッドの減少と引き換えに、前方プロセス中に中間結果を節約しないようにします。 ( store_trueパラメーター、add --grad-checkpointing in the script、現在pytorch> 1.8.0が必要です)mask-ratio :フリップ戦略を参照すると、ランダムマスクを、Finetune中に特定の割合の画像パッチに指定して、メモリオーバーヘッドを減らしてトレーニングをスピードアップできます。デフォルトは0.0です。つまり、このポリシーはアクティブ化されていません。use-flash-attention :Flashattentionを使用すると、中国のクリップのFinetuneプロセスを大幅に高速化し、効果に影響を与えることなくメモリ使用量を削減できます。 ( store_trueパラメーター。環境を構成した後、スクリプトに--use-flash-attention 。詳細については、flash_attention.mdを参照してください)accum-freq :勾配蓄積周波数はデフォルトで1です。 1を超える整数として指定された場合、比較学習勾配蓄積が有効になり、より大きなバッチサイズをシミュレートします。シングルカードバッチサイズがmの場合、合計バッチサイズはaccum_freq * m * GPU数です。gather-with-grad :分散トレーニング中に完全なグラデーションでフィーチャーギャザーを実行するかどうかは、デフォルトでオフになります。name :出力パスを指定します。 HyperParameterログ、トレーニングログ、および出力CKPT ${DATAPATH}/experiments/${name}/に保存されます。save-step-frequencyとsave-epoch-frequency :CKPTのステップまたはラウンド間の間隔。report-training-batch-acc :ログがテキストとテキストへのトレーニンググラフの精度をグラフィックスバッチに報告するかどうか。resume :重量で読む道。サンプルスクリプトは、事前に訓練されたCKPTパスとして指定されているか、継続的なトレーニング用のユーザー独自のFinetune CKPTパスとして指定できます。reset-data-offset :以前のデータブレークポイントから実行を続けるかどうか。バッチサイズまたはGPUカード番号がパラメーターを超える場合は、このオプションをオンにすることをお勧めします。reset-optimizer :Optimizer Stateを使用するかどうか。トレーニング後、ログは${DATAPATH}/experiments/${name}/out_${timestamp}.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
検証ログ形式は次のとおりです。
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
注:トレーニングの収束と学習の安定性の比較は、合計バッチサイズと相関しています。より小さなバッチサイズを使用する場合(128個のGPU * 8 GPUのデフォルト構成と比較)、より小さな学習レートを使用することをお勧めします。より良い結果を得るには、より多くのGPUとより大きなバッチサイズを使用することをお勧めします。
機能抽出とグラフィック検索タスク評価のプロセスを提供します。これは次のとおりです。
現在、このコードは、グラフィック機能抽出にGPUシングルカードの使用をサポートしています。次のコマンドを参照してください。また、ONNXモデルとTensortモデルの展開をサポートして、特徴推論を加速します。詳細については、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]}
小規模なアカデミック検索データセットの場合、テキストからグラフからテキストへのテキスト検索のTOP-Kリコール結果の計算を促進するための単純なKNN検索実装を提供します(プロジェクトで検索デモを構築する場合は、中国のクリップモデルに基づいてグラフィックとテキスト機能を作成し、オープンソースのフレームワークを組み合わせることをお勧めします。
テキストから画像への検索(テキストリコール関連画像)の場合、次のコマンドを実行します。
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ファイルに保存されます。各行は、テキストリコールのトップ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 ]}検索タスクのリコール@1/5/10を計算し、平均リコール(リコールの平均@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検索データセット(マルチモーダルeコマースグラフィックとテキストチャレンジ)を例として取り、上記のすべてのプロセスを含み、実行できるJupyterノートブック(ダウンロードリンク)も提供します。誰もがそれを練習することを歓迎します。
このセクションでは、中国語のクリップを使用してゼロサンプル画像分類を実装する方法を紹介し、ベンチマークエレベーターのデータセットを例として取ります。 Elevaterは、これらのデータセットに対するモデルのゼロサンプル効果を評価するために、複数の有名な分類データセット(CIFAR-10、CIFAR-100、MNISTなどを含む)で構成される評価セットです。私たちの実験では、各データセットのPROPT、カテゴリラベル、元の写真の中国語版を準備しました。この詳細については、中国のクリップモデルをテストするためのデータドキュメントを参照してください。このベンチマークの詳細については、リンクをクリックしてください。また、データを準備して、自分の中国分類データセットでデータを準備してテストするために提供するプロセスを参照することもできます。
最初に次の形式でデータを準備します。ゼロサンプル画像の分類にはテストのみが必要なため、テストセットと事前に訓練されたモデルパラメーターを準備し、次のディレクトリ構造に従ってユーザー指定${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
└── ...
...
テストセットは、テストフォルダー内のデータがラベルに対応するIDに従って分割されることを保証し、IDが辞書の順序であることを保証します(001、002などなど、 label.zfill(3)にゼロをゼロで補充する必要があります)。 label_cn.txt 、以下に示すように、行ごとのラベル名を持つデータラベルです。
手风琴
飞机
锚
...
各行のラベルに対応するラベルIDは、1行目のラベルのIDなど、行号-1であり、2行目のラベルのIDは1です。タグの合計数が10を超える場合、左にゼロから3桁が追加されます。たとえば、タグ数は100、タグIDは000-099になります。ユーザーは、各ラベルIDの対応するフォルダーを生成し、ラベルにマークされたサンプルを配置する必要があります。例として、ElevaterのCIFAR-100データセットを取得します。リンクをクリックして、処理されたデータをダウンロードしてください。レベーターに含まれる他のデータセットで中国語のクリップをテストしてみたい場合は、データドキュメントを参照してください。
予測スクリプトを準備しました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公式ウェブサイトの評価のみを指定する必要があります)、データドキュメントを参照してくださいたとえば、CIFAR-100を評価するためにVIT-B/16スケールの事前訓練モデルを使用する場合、実行( ${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スケールの中国クリップは64.4%に達すると予想されるはずです。詳細については、他のスケールや他のデータセットのゼロサンプル分類結果の詳細については、results.mdを参照してください。
同時に、このプログラムは、公式のレベーターを送信するためのJSONファイルも保存されます。 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 、Visual Towerパラメーター数量num_visual_paramsおよびその他のモデル、つまりモデルの出力結果、つまりモデルの予測確率テンソル、サイズは[1, 样本数, 标签个数]です。
Huggingface Transformersに統合された機能抽出APIに基づいて、Huggingface Model Hubでオンラインでゼロサンプルの画像分類を試すことができるデモ(ホストされた推論API)を提供します。以下の各モデルスケールのデモリンクを参照してください。それを試してみてください!
このプロジェクトが便利だと思うなら、私たちにスターを与えて、あなたの周りのユーザーと共有できることを願っています。関連する仕事の引用へようこそ、ご支援ありがとうございます!
@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}
}