Chinesische Beschreibung | Englisch
ModelsCope | Demo | Papier | Blog
Dieses Projekt ist eine chinesische Version des Clip-Modells und verwendet groß angelegte chinesische Daten für das Training (~ 200 Millionen Grafik- und Textpaare), um den Benutzern dabei zu helfen, Aufgaben wie Grafik- und Texteigenschaften und Ähnlichkeitsberechnung, cross-modales Abrufen und Bildklassifizierung von Null-Proben im chinesischen Feld schnell zu realisieren. Der Code dieses Projekts basiert auf dem Open_clip -Projekt und ist für chinesische Felddaten optimiert und um bessere Ergebnisse für chinesische Daten zu erzielen. Dieses Projekt enthält API, Trainingscode und Testcode, und Details werden nachstehend ausführlich beschrieben.
Der Chinese-Clip ist derzeit auf 5 verschiedenen Skalen offen und seine Modellinformationen und Download-Methoden sind in der folgenden Tabelle angezeigt:
| Modellgröße | Link herunterladen | Parametermenge | Visuelles Seitenskelett | Visuelle Seitenparametermenge | Textseite Skelett | Textseite Parametermenge | Auflösung |
|---|---|---|---|---|---|---|---|
| CN-Clip RN50 | Herunterladen | 77m | Resnet50 | 38m | RBT3 | 39m | 224 |
| CN-Clip Vit-B/16 | Herunterladen | 188m | Vit-B/16 | 86 m | Roberta-wwm-Base | 102 m | 224 |
| CN-Clip Vit-L/14 | Herunterladen | 406 m | Vit-L/14 | 304 m | Roberta-wwm-Base | 102 m | 224 |
| CN-Clip Vit-L/14@336px | Herunterladen | 407 m | Vit-L/14 | 304 m | Roberta-wwm-Base | 102 m | 336 |
| CN-Clip Vit-H/14 | Herunterladen | 958 m | Vit-H/14 | 632 m | Roberta-wwm-large | 326 m | 224 |
Für die grafische und textabrufaufgabe haben wir null-shot- und fellunexperimente zu retrieval, flickr30k-cn und coco-cn durchgeführt. Für die Klassifizierung von Image Zero-Probe haben wir Experimente an 10 Datensätzen mit REGATER durchgeführt. Die experimentellen Ergebnisse sind in der folgenden Tabelle gezeigt. Aufgrund von Platzbeschränkungen geben wir hier die optimalen Skalenmodellergebnisse des Basismodells und des chinesischen Clips an. Detaillierte Ergebnisseindikatoren für jede Skala des chinesischen Clips finden Sie unter results.md für Einzelheiten.
Retrieval des Text-zu-im-Im-Im-Im-Im-Im-Im-Im-Impfings (offizieller Validierungssatz) :
| Aufstellen | Null-Shot | Finetune | ||||||
|---|---|---|---|---|---|---|---|---|
| Metrisch | R@1 | R@5 | R@10 | HERR | R@1 | R@5 | R@10 | HERR |
| 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-Abruf (offizieller Testset) :
| Aufgabe | Text-to-Image | Bild-zu-Text | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Aufstellen | Null-Shot | Finetune | Null-Shot | Finetune | ||||||||
| Metrisch | 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 |
Retrieval von Coco-CN (offizieller Testset) :
| Aufgabe | Text-to-Image | Bild-zu-Text | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Aufstellen | Null-Shot | Finetune | Null-Shot | Finetune | ||||||||
| Metrisch | 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 |
Null-Shot-Bildklassifizierung :
| Aufgabe | 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 |
| AUSRICHTEN | 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 |
Bevor Sie mit diesem Projekt beginnen, müssen Sie überprüfen, ob die folgenden Umgebungskonfigurationsanforderungen erfüllt sind:
Führen Sie den folgenden Befehl aus, um die für dieses Projekt erforderlichen Drei-Parteien-Bibliotheken zu installieren.
pip install -r requirements.txtHier ist ein einfaches Code -Beispiel, um zu veranschaulichen, wie die chinesische Clip -API verwendet wird. BITTE CN_CLIP INSTALLEN, bevor Sie mit der Verwendung beginnen:
# 通过pip安装
pip install cn_clip
# 或者从源代码安装
cd Chinese-CLIP
pip install -e .Nachdem die Installation erfolgreich ist, können Sie die API problemlos über die folgenden Methoden aufrufen, das angegebene Bild (Beispiel) und Text übergeben, den Grafikfunktionsvektor extrahieren und die Ähnlichkeit berechnen:
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]]Wir haben auch die relevante Unterstützung für die Bereitstellung von ONNX- und Tensorrt -Modellen erstellt. Weitere Informationen finden Sie unter Bereitstellung.md.
Wenn Sie mit der Verwendung der API nicht zufrieden sind, lesen Sie dieses Dokument weiter, um zu erfahren, wie Sie unser Projekt zum Training und Testen von Clip -Modellen verwenden.
Das Folgende umfasst die Tutorials für quer-modale Abrufs (einschließlich Fintune und Inferenz, KNN-Berechnung usw.) und Abbildungsstufe der Null-Stichprobe.
Nach dem Herunterladen dieses Projekts erstellen Sie bitte einen neuen Ordner ${DATAPATH} um den Datensatz, den vorgebreiteten CKPT und das von Finetune generierte Modellprotokoll & CKPT zu speichern. Die empfohlene Arbeitsbereichsverzeichnisstruktur lautet wie folgt:
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/
└── .../ # 更多自定义数据集...
Hier bieten wir die Download-Methode der vorgebreiteten Modellparameter sowie den Vorverarbeitungsprozess von Daten vor dem Finetune an.
Weitere Informationen finden Sie im vorherigen Abschnitt der Modellskala und des Download -Links zum Herunterladen des entsprechenden Modells CKPT. Es wird empfohlen, die heruntergeladene CKPT -Datei im Verzeichnis ${DATAPATH}/pretrained_weights/ Verzeichnisse zu speichern.
Um sich an den chinesischen CLIP-Code anzupassen und die Effizienz der Datenverarbeitung und des Lesens zu gewährleisten, empfehlen wir, die für Schulungen und Bewertungen verwendeten Grafik- und Textdatensätze in folgenden Methoden zu organisieren:
${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
wobei ${dataset_name} sich auf den Datensatznamen bezieht (z. B. MUGE)
Um die Effizienz der Dateiverarbeitung zu gewährleisten, speichern wir keine Bilder in großen Mengen kleiner Dateien, speichern jedoch die Bilder/Überprüfungs-/Testbilder in Base64 in der Datei ${split}_imgs.tsv . Jede Zeile der Datei stellt ein Bild dar, einschließlich der Bild -ID (int -Typ) und der Bildbasis64, die durch Registerkarte getrennt ist, und das Format lautet wie folgt:
1000002 /9j/4AAQSkZJ...YQj7314oA//2Q==
Die Möglichkeit, die Originalbilddatei in Base64 umzuwandeln, ist sehr einfach. Führen Sie bitte den folgenden Python -Code aus:
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 Die Textinformationen und die passende Beziehung zwischen den Grafik- und Textpaaren werden in der Datei ${split}_texts.jsonl gespeichert. Jede Zeile der Datei ist eine JSON -Zeile. Das Format lautet wie folgt:
{"text_id": 8428, "text": "高级感托特包斜挎", "image_ids": [1076345, 517602]}
Für den Testsatz gibt es nur Text und ich kenne die passende Beziehung zwischen den Bild- und Textpaaren nicht, das Feld image_ids jeder Zeile kann als leere Liste verarbeitet werden, dh "image_ids": [] .
Schließlich müssen wir auch die TSV- und JSONL-Dateien serialisieren und sie in Speicherindexed LMDB-Datenbankdateien umwandeln, um das zufällige Lesen während des Trainings zu erleichtern.
python cn_clip/preprocess/build_lmdb_dataset.py
--data_dir ${DATAPATH}/datasets/${dataset_name}
--splits train,valid,test
Zum Beispiel wird ${dataset_name} für Muge -Datensatz auf Muge eingestellt, und --splits gibt den Datensatzbereich an, der konvertiert und durch Kommas ohne Leerzeichen getrennt werden muss. Nach der Konvertierung werden die folgenden serialisierten LMDB -Dateien zum Dataset -Ordner hinzugefügt.
${DATAPATH}
└── datasets/
└── ${dataset_name}/
└── lmdb/
├── train
│ ├── imgs
│ └── pairs
├── valid
└── test
Um die Schwierigkeit des Einstiegs zu verringern, stellen wir auch die Muge-Daten (Download-Link) und FlickR30K-C-CN-Daten (Download-Link) -Komprimierungspaket nach den oben genannten Schritten vor. Laden Sie einfach herunter und dekomprimieren Sie es und platzieren Sie es in ${DATAPATH}/datasets/ Verzeichnis. Wenn CoCO-CN-Daten erforderlich sind, kontaktieren Sie uns bitte per E-Mail, nachdem Sie die Erlaubnis des ursprünglichen Autors beantragt haben.
Hier führen wir die Schulungsschritte ein, um anderen Benutzern die Modelldetails zu verstehen und das vorgeborene chinesische Clip-Modell zu verwenden, das wir für Finetune bieten. Basierend auf den beiden nachgeschalteten Suchdatensätzen von Muge und FlickR30K-CN bieten wir Trainingsmuster-Skripte run_scripts/muge_finetune_vit-b-16_rbt-base.sh und run_scripts/flickr30k_finetune_vit-b-16_rbt-base.sh . Durch das Ausführen von Skripten unterstützt sowohl Einzelmaschine (Einzel- oder mehrere Karten) als auch ein Multi-Maschinen-Verteilungstraining. Bevor Sie vor dem Ausführen die verteilten verwandten Konfigurationen entsprechend den Richtlinien und Kommentaren zu Beginn des Skripts entsprechen, füllen Sie bitte die folgenden Befehle aus, um das Training zu starten. Für den unzureichenden Videospeicher können Sie in Betracht ziehen, die Neuberechnungstrategie im Konfigurationselement zu aktivieren. Die vom Training generierten Protokoll- und Modell -CKPT -Dateien werden im vom Benutzer angegebenen Verzeichnis automatisch gespeichert:
cd Chinese-CLIP/
bash run_scripts/muge_finetune_vit-b-16_rbt-base.sh ${DATAPATH}Die verwandten Trainingskonfigurationselemente umfassen:
WORKER_CNT : Die Anzahl der ausgebildeten MaschinenGPUS_PER_NODE : Anzahl der GPUs auf jeder Maschinetrain-data : Das LMDB-Verzeichnis der Trainingsdaten finden Sie im Vorverarbeitungsprozess zur Vorbereitung von LMDB-Datendateien.val-data : Überprüfen Sie das LMDB-Verzeichnis von Daten. Wenn dies als keine angegeben ist, wird die Überprüfung während des Trainings nicht durchgeführt.num-workers : Die Anzahl der Prozesse in der Schulungssatzdatenverarbeitung (Dataloader), Standardeinstellung, beträgt 4.valid-num-workers : Die Anzahl der Prozesse für die Verifizierungssatzdatenverarbeitung (Dataloader) (falls die Validierung durchgeführt wird), beträgt Standard 1.vision-model : Geben Sie das visuelle Rückgrat an, wählen Sie aus ["ViT-B-16", "ViT-L-14", "ViT-L-14-336", "ViT-H-14", "RN50"] .text-model : Geben Sie das Textergrad an, wählen Sie aus ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"] .context-length : Texteingangssequenzlänge.warmup : Aufwärmschritte.batch-size : Einzelkarten-Stapelgröße während des Trainings. (Bitte stellen Sie sicher, dass训练样本总数> batch-size * GPU数, die mindestens 1 Trainingsstapel entsprechen)lr : Lernrate.wd : Gewichtsverfall.max-steps : Die Anzahl der Trainingsschritte und die Anzahl der Trainingsrunden können auch durch max-epochs angegeben werden.freeze-vision : Ob ein visuelles Rückgrat einfrieren.use-augment : Unabhängig davon, ob Sie die Daten des Bildes erhöhen möchten.valid-batch-size : eigenständige Stapelgröße während der Überprüfung. (Bitte stellen Sie sicher, dass验证集样本总数> batch-size * GPU数, die mindestens 1 Überprüfungsstapel erfüllen.)valid-step-interval und valid-epoch-interval : Überprüfen Sie die Frequenz von Schritt/Epochen. Wenn dies als -1 angegeben ist, wird die Überprüfung während des Trainings nicht durchgeführt.grad-checkpointing : Verwenden Sie die Neuberechnungstrategie, um während des Vorwärtsverfahrens nicht Zwischenergebnisse zu sparen, um in der Trainingszeit gegen weniger Speicheraufwand zu überziehen, was für unzureichende Speicher geeignet ist. ( store_true Parameter, einfach hinzufügen --grad-checkpointing in das Skript, derzeit ist pytorch> 1.8.0 erforderlich).mask-ratio : In Bezug auf die Flip -Strategie kann eine zufällige Maske in einem bestimmten Anteil der Bild Patches während des Finetunes angegeben werden, um den Speicheraufwand zu reduzieren und das Training zu beschleunigen. Der Standardwert ist 0,0, was bedeutet, dass diese Richtlinie nicht aktiviert wird.use-flash-attention : Die Verwendung von Flashattention kann den Finetune-Prozess des chinesischen Clips erheblich beschleunigen und den Speicherverbrauch verringern, ohne den Effekt zu beeinflussen. ( store_true Parameter. Nach Konfiguration der Umgebung finden Sie hinzufügen --use-flash-attention in das Skript. Weitere Informationen finden Sie unter Flash_attention.md).)accum-freq : Die Gradientenakkumulationsfrequenz ist standardmäßig 1. Wenn die Vergleichs -Lerngradientenakkumulation als Ganzzahl mehr als 1 angegeben ist, kann eine größere Chargengröße simulieren. Wenn die einzelne Karten -Stapelgröße m ist, ist die Gesamtstapelgröße accum_freq * m * GPU数.gather-with-grad : Ob während des verteilten Trainings eine Funktion mit vollen Gradienten ausführen soll, wird es standardmäßig ausgeschaltet.name : Geben Sie den Ausgangspfad an. Das Hyperparameter -Protokoll, das Trainingsprotokoll und die Ausgabe CKPT werden in ${DATAPATH}/experiments/${name}/ gespeichert.save-step-frequency und save-epoch-frequency : Das Intervall zwischen den Schritten oder Runden von CKPT.report-training-batch-acc : Ob das Protokoll die Genauigkeit des Trainingsdiagramms zu Text und Text in die Grafikstapel meldet.resume : Der Weg zum Gewicht zu lesen. Das Beispielskript gibt als vorgebildetes CKPT-Pfad an oder kann als eigener Finetune-CKPT-Pfad des Benutzers für kontinuierliches Training angegeben werden.reset-data-offset : Ob Sie weiter aus dem vorherigen Datenbestandteilen ausgeführt werden sollen. Wenn die Stapelgröße oder die GPU -Kartennummer den Parameter überschreitet, wird empfohlen, diese Option einzuschalten.reset-optimizer : Ob Sie den Optimierer-Status verwenden möchten. Nach dem Training existiert das Protokoll automatisch ${DATAPATH}/experiments/${name}/out_${timestamp}.log . Das Trainingsprotokollformat lautet wie folgt:
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
Das Verifizierungsprotokollformat lautet wie folgt:
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
Hinweis : Vergleich der Trainingskonvergenz und der Lernstabilität korreliert mit der Gesamtstapelgröße. Wenn Sie eine kleinere Chargengröße verwenden (im Vergleich zur Standardkonfiguration von 128 pro GPU * 8-GPU), wird empfohlen, eine kleinere Lernrate zu verwenden. Wir empfehlen, mehr GPUs und größere Chargengröße zu verwenden, um bessere Ergebnisse zu erzielen.
Wir bieten den Prozess der Feature -Extraktion und der Bewertung der grafischen Abrufaufgaben, die wie folgt lautet:
Derzeit unterstützt dieser Code die Verwendung der GPU -Einzelkarte für die Grafikfunktionsextraktion. Weitere Informationen finden Sie im folgenden Befehl. Wir bieten auch Unterstützung für die Bereitstellung von ONNX- und Tensorrt -Modellen, um die Merkmalsinferenz zu beschleunigen. Weitere Informationen finden Sie in Bereitstellung.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 Die Grafikfunktionen der Ausgabe werden standardmäßig im Verzeichnis ${DATAPATH}/datasets/${dataset_name} gespeichert, und die Bildfunktionen werden in der Datei ${split}_imgs.img_feat.jsonl gespeichert. Jede Zeile speichert die Merkmale eines Bildes in JSON, und das Format lautet wie folgt:
{"image_id": 1000002, "feature": [0.0198, ..., -0.017, 0.0248]}
Textfunktionen werden in ${split}_texts.txt_feat.jsonl mit dem Format wie folgt gespeichert:
{"text_id": 248816, "feature": [0.1314, ..., 0.0018, -0.0002]}
Für kleine akademische Suchdatensätze bieten wir eine einfache KNN-Such-Implementierung, um die Berechnung der Top-K-Rückrufergebnisse für Text-to-Graphic- und Graph-to-Text-Suche zu erleichtern (Tipps: Wenn Sie im Projekt eine Suchdemo im Projekt erstellen möchten, wird empfohlen, Grafik- und Textfunktionen basierend auf dem chinesischen Clipmodell zu erstellen und die offenen Source Engineering-Framework-Clip-Ress-Retrieval-Retrivente zu erstellen.
Führen Sie den folgenden Befehl aus: Führen Sie für die Suche nach Text-zu-Image-Suchen (Text-Rückruf-Verwandte Bilder): Führen Sie den folgenden Befehl aus:
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 "Das Ergebnis wird in der angegebenen JSONL -Datei gespeichert. Jede Zeile repräsentiert die Top-K-Bild-ID eines Text-Rückrufs, und das Format lautet wie folgt:
{ "text_id" : 153915 , "image_ids" : [ 5791244 , 1009692167 , 7454547004 , 3564007203 , 38130571 , 2525270674 , 2195419145 , 2503091968 , 4966265765 , 3690431163 ]}Führen Sie für die Bild-zu-Text-Suche (im Bildrückruf verwandter Text) den folgenden Befehl aus:
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 "Jede Zeile der Ausgabeergebnisse repräsentiert die obere Text-ID eines Bildrückrufs, und das Format lautet wie folgt:
{ "image_id" : 977856234 , "text_ids" : [ 156914 , 157914 , 158914 , 155914 , 156179 , 158907 , 157179 , 154179 , 154914 , 154723 ]}Wir stellen das Evaluierungsskript an, um den Rückruf@1/5/10 der Suchaufgabe zu berechnen und den mittleren Rückruf (den Durchschnitt von RECE@1/5/10) zu berechnen. Führen Sie den folgenden Befehl aus, um die Punktzahl zu erhalten:
Führen Sie den Befehl für die Suche nach Text-zu-Bild-Suche aus:
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.jsonFür die Bild-zu-Text-Suche führen Sie bitte zuerst den folgenden Befehl aus, um die mit dem Bild-zu-Text-Format gekennzeichnete JSONL-Datei in Bild-zu-Text-Form zu konvertieren:
python cn_clip/eval/transform_ir_annotation_to_tr.py
--input ${DATAPATH} /datasets/ ${dataset_name} / ${split} _texts.jsonlFühren Sie nach Abschluss den Befehl aus:
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.jsonDas Format des gedruckten Ergebniss lautet wie folgt:
{ "success" : true , "score" : 85.67 , "scoreJson" : { "score" : 85.67 , "mean_recall" : 85.67 , "r1" : 71.2 , "r5" : 90.5 , "r10" : 95.3 }}In Bezug auf den Trainings- und Testprozess des Cross-Modal-Abrufs nehmen wir als Beispiel den Muge-Suchdatensatz (multimodale E-Commerce-Grafik und Textherausforderung) an und bieten auch ein Jupyter-Notizbuch (Download-Link), das alle oben genannten Prozesse enthält und ausgeführt werden kann. Jeder ist herzlich eingeladen, es zu üben.
In diesem Abschnitt wird die Verwendung von Chinese-Clips zur Implementierung der Bildklassifizierung von Null-Stichproben vorgestellt und den Datensatz in Benchmark-REGATER als Beispiel eingenommen. Elevater ist ein Bewertungssatz, der aus mehreren bekannten klassifizierten Datensätzen (einschließlich CIFAR-10, CIFAR-100, MNIST usw.) besteht, um den Null-Stichproben-Effekt des Modells auf diesen Datensätzen zu bewerten. In unserem Experiment haben wir für jeden Datensatz eine chinesische Version des ProPT, die Kategoriebezeichnungen und Originalbilder erstellt. Weitere Informationen finden Sie im Datendokument, um das chinesische Clip-Modell zu testen. Für weitere Informationen zu diesem Benchmark klicken Sie bitte auf den Link. Sie können auch auf den Prozess verweisen, den wir zur Verfügung stellen, um Daten zu erstellen und in Ihrem eigenen chinesischen Klassifizierungsdatensatz zu testen.
Bereiten Sie zuerst die Daten im folgenden Format vor. Da die Bildklassifizierung von Null-Stichproben nur getestet werden muss, müssen Sie nur die Test-Set- und vorgebildeten Modellparameter vorbereiten und unter den von Nutzern angegebenen ${DATAPATH} gemäß der folgenden Verzeichnisstruktur speichern:
${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
└── ...
...
Der Testsatz stellt sicher, dass die Daten im Testordner gemäß der ID geteilt werden, die dem Etikett entspricht, und stellt sicher, dass sich die ID in der Wörterbuchreihenfolge befindet (mehrere Ziffern über 10 müssen mit Nullen zum linken label.zfill(3) ergänzt werden. label_cn.txt ist eine Datenbezeichnung mit einem Labelnamen pro Zeile, wie unten gezeigt:
手风琴
飞机
锚
...
Die der Beschriftung jeder Zeile entsprechende Etiketten -ID ist行号-1 , z. B. die ID der Etikett der ersten Zeile ist 0, und die ID der Etikett der zweiten Zeile beträgt 1. Wenn die Gesamtzahl der Tags größer als 10 ist, beträgt null bis drei Ziffern links, die Anzahl der Tags und die Tag -ID wird 000-099 addiert. Der Benutzer muss den entsprechenden Ordner für jede Etikett -ID generieren und das mit der Beschriftung markierte Beispiel einfügen. Wir nehmen den CIFAR-100-Datensatz als Beispiel in Elevater. Bitte klicken Sie auf den Link, um die verarbeiteten Daten herunterzuladen. Wenn Sie versuchen möchten, chinesisches Clip auf anderen in Eilern enthaltenen Datensätzen zu testen, siehe unsere Datendokumentation.
Wir haben das Vorhersageskript vorbereitet. Bitte lesen Sie run_scripts/zeroshot_eval.sh . Ein Beispiel für das Ausführen eines Befehls ist wie folgt:
bash run_scripts/zeroshot_eval.sh 0
${DATAPATH} ${dataset_name}
${vision_model} ${text_model}
${ckpt_path} ${index_file}Die Bedeutungen jedes Parameters sind:
0 ist die GPU -IDDATAPATH Siehe den Abschnitt "Vorbereitungsabschnitt oben" und geben Sie den entsprechenden Pfad gemäß dem tatsächlichen Standort ein.dataset_name Siehe Abschnitt Vorbereitungsabschnitt oben und geben Sie den Verzeichnisnamen des Datensatzes zur Bewertung ein, z. B. cifar-100vision_model ist der angegebene Modelltyp, und die Optionen umfassen ["ViT-B-32", "ViT-B-16", "ViT-L-14", "ViT-L-14-336", "RN50", "ViT-H-14"]text_model enthält ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"]ckpt_path ist der vollständige Pfad von CKPT vorübergebildetindex_file (optional, nur die Bewertung der offiziellen Website für die offizielle Website für die Website Wenn Sie beispielsweise ein vorgebildetes Vit-B/16-Skala verwenden, um CIFAR-100 zu bewerten, dann muss ausgeführt werden ( ${DATAPATH} muss gemäß den tatsächlichen Bedingungen ersetzt werden):
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.ptDurch die Rückgabe des Ergebnisses wird die Genauigkeit von Top-1 gedruckt.
Result:
zeroshot-top1: 0.6444
Auf CIFAR-100 sollte der chinesische Clip der Vit-B/16-Skala von 64,4%erwartet werden. Weitere Informationen finden Sie unter Ergebniss.md finden Sie für Informationen zu unseren Klassifizierungsergebnissen in der Zero-Stichprobe für andere Skalen und andere Datensätze.
Gleichzeitig speichert das Programm auch eine JSON -Datei für die Übermittlung des offiziellen Höhe. Der Inhalt der JSON -Datei lautet wie folgt:
{ "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)] " } Dazu gehören die Meta -Informationen des Modellnamens model_name , Datensatzname dataset_name , Gesamtparametermenge num_params , Visual Tower Parameter Quantity num_visual_params und andere Modelle sowie das Modellausgabeergebnis, dh die Vorhersagewahrscheinlichkeit Tensor des Modells und die Größe [1, 样本数, 标签个数] .
Basierend auf unserer Feature-Extraktions-API, die in Huggingface-Transformatoren integriert ist, bieten wir eine Demo (gehostete Inferenz-API), die einfach online in der Bildklassifizierung von Null-Stichproben in Huggingface-Modell-Hub versuchen kann. Siehe die Demo -Links für jede Modellskala unten. Willkommen, um es zu versuchen!
Wenn Sie der Meinung sind, dass dieses Projekt nützlich ist, hoffe ich, dass Sie uns einen Stern geben und es mit den Benutzern in Ihrer Umgebung teilen können. Willkommen im relevanten Arbeitszitat, vielen Dank für Ihre Unterstützung!
@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}
}