คำอธิบายภาษาจีน ภาษาอังกฤษ
ModelsCope | การสาธิต | กระดาษ | บล็อก
โครงการนี้เป็นรุ่นคลิปรุ่น จีน และใช้ข้อมูลจีนขนาดใหญ่สำหรับการฝึกอบรม (~ 200 ล้านคู่กราฟิกและข้อความ) โดยมีจุดประสงค์เพื่อช่วยให้ผู้ใช้ตระหนักถึงงานอย่างรวดเร็วเช่นลักษณะกราฟิกและข้อความและการคำนวณความคล้ายคลึงกัน รหัสของโครงการนี้ขึ้นอยู่กับ โครงการ 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 ขนาดใหญ่ | 326m | 224 |
สำหรับงานกราฟิกและการดึงข้อความเราได้ทำการทดลองแบบไม่มีการยิงและ Finetune ในการดึง MUGE, Flickr30K-CN และ Coco-CN สำหรับการจำแนกภาพศูนย์ภาพเราทำการทดลองในชุดข้อมูล 10 ชุดของ Elevater ผลการทดลองแสดงในตารางด้านล่าง เนื่องจากข้อ จำกัด ด้านอวกาศเราที่นี่ให้ผลลัพธ์ที่ดีที่สุดของโมเดลพื้นฐานของแบบจำลองพื้นฐานและคลิปจีน สำหรับรายละเอียดตัวชี้วัดรายละเอียดของการคลิปจีนแต่ละระดับโปรดดูผลลัพธ์สำหรับรายละเอียด
การดึงข้อความสู่ภาพ muge (ชุดตรวจสอบความถูกต้องอย่างเป็นทางการ) :
| การตั้งค่า | เป็นศูนย์ | finetune | ||||||
|---|---|---|---|---|---|---|---|---|
| ตัวชี้วัด | 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 Retrieval (ชุดทดสอบอย่างเป็นทางการ) :
| งาน | ข้อความเป็นภาพ | ภาพถึงข้อความ | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| การตั้งค่า | เป็นศูนย์ | finetune | เป็นศูนย์ | finetune | ||||||||
| ตัวชี้วัด | 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 |
| 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 | 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 (ชุดทดสอบอย่างเป็นทางการ) :
| งาน | ข้อความเป็นภาพ | ภาพถึงข้อความ | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| การตั้งค่า | เป็นศูนย์ | finetune | เป็นศูนย์ | finetune | ||||||||
| ตัวชี้วัด | 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 |
| 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 | 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 :
| งาน | CIFAR10 | CIFAR100 | DTD | เงินยูโร | เฟอร์ | FGVC | ลูกแมว | MNIST | พีซี | VOC |
|---|---|---|---|---|---|---|---|---|---|---|
| กระตวน | 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 |
ก่อนที่จะเริ่มโครงการนี้คุณต้องตรวจสอบว่าเป็นไปตามข้อกำหนดการกำหนดค่าสภาพแวดล้อมต่อไปนี้หรือไม่:
เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งไลบรารีสามพรรคที่จำเป็นสำหรับโครงการนี้
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 และ Tensorrt สำหรับรายละเอียดโปรดดูที่การปรับใช้
หากคุณไม่พอใจกับการใช้ API โปรดอ่านเอกสารนี้ต่อไปเพื่อเรียนรู้วิธีการใช้โครงการของเราสำหรับการฝึกอบรมและการทดสอบแบบจำลองคลิป
ต่อไปนี้จะรวมถึงบทช่วยสอนการดึงข้ามรูปแบบ (รวมถึง finetune และการอนุมานการคำนวณ KNN ฯลฯ ) และบทเรียนการจำแนกภาพตัวอย่างเป็นศูนย์
หลังจากดาวน์โหลดโครงการนี้โปรดสร้างโฟลเดอร์ใหม่ ${DATAPATH} เพื่อจัดเก็บชุดข้อมูล CKPT ที่ผ่านการฝึกอบรมมาล่วงหน้าและ Model Log & CKPT ที่สร้างโดย Finetune โครงสร้างไดเรกทอรีพื้นที่ทำงานที่แนะนำมีดังนี้:
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/ Directory
เพื่อปรับให้เข้ากับรหัสคลิปจีนและให้แน่ใจว่าประสิทธิภาพของการประมวลผลข้อมูลและการอ่านเราขอแนะนำให้จัดระเบียบกราฟิกและชุดข้อมูลข้อความที่ใช้สำหรับการฝึกอบรมและการประเมินผลเป็นวิธีการต่อไปนี้:
${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) และ base 64 ภาพคั่นด้วยแท็บและรูปแบบมีดังนี้:
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 ขึ้นอยู่กับชุดข้อมูลการค้นหาแบบดาวน์สตรีมสองชุดของ MUGE และ FLICKR30K-CN เราให้บริการสคริปต์ตัวอย่างการฝึกอบรม 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 ดูด้านบนสำหรับกระบวนการประมวลผลล่วงหน้าสำหรับการเตรียมไฟล์ข้อมูล LMDBval-data : ตรวจสอบไดเรกทอรีข้อมูล LMDB เมื่อระบุว่าไม่มีการตรวจสอบระหว่างการฝึกอบรมจะไม่ดำเนินการnum-workers : จำนวนกระบวนการในการประมวลผลข้อมูลชุดการฝึกอบรม (dataloader), ค่าเริ่มต้นคือ 4valid-num-workers : จำนวนกระบวนการสำหรับการประมวลผลข้อมูลชุดการตรวจสอบ (Dataloader) (หากดำเนินการตรวจสอบ) ค่าเริ่มต้นคือ 1vision-model : ระบุกระดูกสันหลังที่มองเห็นได้เลือกจาก ["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 : ขนาดแบทช์การ์ดเดียวระหว่างการฝึกอบรม (โปรดตรวจสอบ训练样本总数> batch-size * GPU数ซึ่งตรงกับการฝึกอบรมอย่างน้อย 1 ชุด)lr : อัตราการเรียนรู้wd : การสลายตัวของน้ำหนักmax-steps : จำนวนขั้นตอนการฝึกอบรมและจำนวนรอบการฝึกอบรมสามารถระบุได้ผ่าน max-epochsfreeze-vision : ไม่ว่าจะเป็นกระดูกสันหลังที่มองเห็นได้หรือไม่use-augment : ไม่ว่าจะใช้ AutoAugment เพื่อปรับปรุงข้อมูลของภาพหรือไม่valid-batch-size : ขนาดแบทช์แบบสแตนด์อโลนในระหว่างการตรวจสอบ (โปรดตรวจสอบให้แน่ใจว่า验证集样本总数> batch-size * GPU数, น่าพึงพอใจอย่างน้อย 1 ชุดการตรวจสอบ)valid-step-interval และ valid-epoch-interval : ตรวจสอบความถี่ขั้นตอน/ยุค หากระบุเป็น -1 การตรวจสอบจะไม่ดำเนินการระหว่างการฝึกอบรมgrad-checkpointing : ใช้กลยุทธ์การคำนวณใหม่เพื่อไม่บันทึกผลลัพธ์ระดับกลางในระหว่างกระบวนการส่งต่อเพื่อแลกกับค่าใช้จ่ายหน่วยความจำที่น้อยลงในเวลาฝึกอบรมซึ่งเหมาะสำหรับหน่วยความจำไม่เพียงพอ (พารามิเตอร์ store_true เพียงเพิ่ม --grad-checkpointing ลงในสคริปต์ปัจจุบันต้องใช้ 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 : ช่วงเวลาระหว่างขั้นตอนหรือรอบของ CKPTreport-training-batch-acc : บันทึกรายงานความถูกต้องของกราฟการฝึกอบรมไปยังข้อความและข้อความไปยังแบตช์กราฟิกหรือไม่resume : เส้นทางที่จะอ่านโดยน้ำหนัก สคริปต์ตัวอย่างระบุว่าเป็นเส้นทาง CKPT ที่ผ่านการฝึกอบรมมาก่อนหรือสามารถระบุได้ว่าเป็นเส้นทาง Finetune CKPT ของผู้ใช้สำหรับการฝึกอบรมอย่างต่อเนื่องreset-data-offset : จะดำเนินการต่อจากจุดพักข้อมูลก่อนหน้าหรือไม่ หากขนาดแบทช์หรือหมายเลขบัตร GPU เกินพารามิเตอร์ขอแนะนำให้เปิดตัวเลือกนี้reset-optimizer : จะใช้สถานะ Optimizer หรือไม่ หลังจากการฝึกอบรมบันทึกจะมีอยู่โดยอัตโนมัติ ${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 และ Tensorrt เพื่อเร่งการอนุมานคุณสมบัติดูการปรับใช้ 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 สำหรับการค้นหาแบบข้อความและกราฟิกต่อข้อความ (เคล็ดลับ: หากคุณต้องการสร้างตัวอย่างการค้นหาในโครงการ
สำหรับการค้นหาข้อความเป็นภาพ (รูปภาพที่เกี่ยวข้องกับการเรียกคืนข้อความ) ให้เรียกใช้คำสั่งต่อไปนี้:
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 ที่ระบุ แต่ละบรรทัดแสดงถึง ID Image Top-K ของการเรียกคืนข้อความและรูปแบบมีดังนี้:
{ "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 "แต่ละบรรทัดของผลลัพธ์ผลลัพธ์แสดงถึง ID ข้อความ Top-K ของการเรียกคืนภาพและรูปแบบมีดังนี้:
{ "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 ที่ทำเครื่องหมายด้วยรูปแบบ image-to-text เป็น image-to-text:
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 (ลิงก์ดาวน์โหลด) ซึ่งรวมถึงกระบวนการทั้งหมดข้างต้นและสามารถเรียกใช้ได้ ทุกคนยินดีที่จะฝึกฝน
ส่วนนี้แนะนำวิธีการใช้คลิปจีนเพื่อใช้การจำแนกภาพตัวอย่างเป็นศูนย์โดยใช้ชุดข้อมูลในเกณฑ์มาตรฐาน Elevater เป็นตัวอย่าง 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 อยู่ในลำดับพจนานุกรม (ตัวเลขหลายหลักเหนือ 10 จะต้องเสริมด้วยศูนย์ไปยัง label.zfill(3) เช่น 001, 002 002 ฯลฯ ) label_cn.txt เป็นฉลากข้อมูลที่มีชื่อฉลากต่อบรรทัดดังที่แสดงด้านล่าง:
手风琴
飞机
锚
...
ID ฉลากที่สอดคล้องกับฉลากของแต่ละบรรทัดคือ行号-1 เช่น ID ของฉลากของบรรทัดแรกคือ 0 และ ID ของฉลากของบรรทัดที่สองคือ 1 ถ้าจำนวนแท็กทั้งหมดมากกว่า 10 จากนั้นศูนย์ถึงสามหลักจะถูกเพิ่มไปทาง 000-099 ผู้ใช้จำเป็นต้องสร้างโฟลเดอร์ที่เกี่ยวข้องสำหรับแต่ละ ID ฉลากและใส่ตัวอย่างที่ทำเครื่องหมายไว้ด้วยฉลากลงไป เรา ใช้ชุดข้อมูล CIFAR-100 ใน Elevater เป็นตัวอย่างโปรดคลิกลิงก์เพื่อดาวน์โหลดข้อมูลที่ประมวลผล หากคุณต้องการลองทดสอบคลิปจีนในชุดข้อมูลอื่น ๆ ที่มีอยู่ใน Elevater ดูเอกสารข้อมูลของเรา
เราได้เตรียมสคริปต์การทำนายโปรดตรวจสอบ 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 เท่านั้น) โปรดดูเอกสารข้อมูล ตัวอย่างเช่นหากคุณใช้โมเดลที่ได้รับการฝึกอบรมมาก่อนเพื่อประเมิน CIFAR ${DATAPATH} 100 จากมาตราส่วน VIT-B/16 SCAL
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% สำหรับรายละเอียดโปรดดูผลลัพธ์ 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 , พารามิเตอร์ทาวเวอร์ Visual Vuisher ปริมาณ num_visual_params และรุ่นอื่น ๆ รวมถึงผลลัพธ์ผลลัพธ์ของโมเดลนั่นคือ [1, 样本数, 标签个数]
จาก API การสกัดคุณลักษณะของเรารวมอยู่ใน Transformers HuggingFace เราให้บริการสาธิต (โฮสต์การอนุมาน API) ที่สามารถลองการจำแนกภาพตัวอย่างเป็นศูนย์ออนไลน์ใน HuggingFace Model Hub ดูลิงก์ตัวอย่างสำหรับแต่ละรุ่นด้านล่าง ยินดีต้อนรับสู่ลอง!
หากคุณคิดว่าโครงการนี้มีประโยชน์ฉันหวังว่าคุณจะให้ดาวและแบ่งปันกับผู้ใช้รอบตัวคุณ ยินดีต้อนรับสู่การอ้างอิงงานที่เกี่ยวข้องขอบคุณสำหรับการสนับสนุนของคุณ!
@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}
}