중국어 설명 | 영어
ModelScope o 데모 | 종이 | 블로그
이 프로젝트는 중국어 버전의 클립 모델이며, 사용자가 그래픽 및 텍스트 특성 및 유사성 계산, 교차 모달 검색 및 중국 분야의 제로 샘플 이미지 분류와 같은 작업을 신속하게 실현하는 데 도움이되는 대규모 중국 데이터 (~ 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-1/14 | 다운로드 | 406m | vit-1/14 | 304m | Roberta-WWM-Base | 102m | 224 |
| CN-Clip vit-1/14@336px | 다운로드 | 407m | vit-1/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 실험을 수행했습니다. 이미지 제로 샘플 분류를 위해, 우리는 열원의 10 개의 데이터 세트에 대한 실험을 수행했습니다. 실험 결과는 아래 표에 나와 있습니다. 공간 제한으로 인해 여기서 우리는 기준 모델과 중국 클립의 최적 스케일 모델 결과를 제공합니다. 중국 클립의 각 규모의 자세한 결과 지표는 자세한 내용은 results.md를 참조하십시오.
Muge Text-to-Image 검색 (공식 검증 세트) :
| 설정 | 제로 샷 | FINETUNE | ||||||
|---|---|---|---|---|---|---|---|---|
| 메트릭 | r@1 | r@5 | r@10 | 씨 | r@1 | r@5 | r@10 | 씨 |
| 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- 클립 | 63.0 | 84.1 | 89.2 | 78.8 | 68.9 | 88.7 | 93.1 | 83.6 |
FLICKR30K-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 |
| 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 |
| 타이 야 | 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 |
| 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 |
| 타이 야 | 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 | EUROSAT | 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 |
| Wukong | 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 및 Tensorrt 모델 배포에 대한 관련 지원을 준비했습니다. 자세한 내용은 deployment.md를 참조하십시오.
API를 사용하는 것에 만족하지 않는 경우이 문서를 계속 읽고 클립 모델의 교육 및 테스트를 위해 프로젝트를 사용하는 방법을 배우십시오.
다음에는 교차 모달 검색 튜토리얼 (Finetune 및 추론 포함, KNN 계산 등) 및 제로 샘플 이미지 분류 자습서가 포함됩니다.
이 프로젝트를 다운로드 한 후에는 새 폴더 ${DATAPATH} 를 작성하여 DataSet, 사전 훈련 된 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를 다운로드하려면 Model Scale & Download 링크의 이전 섹션을 참조하십시오. 다운로드 된 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)을 나타냅니다.
파일 처리 효율을 보장하기 위해 이미지를 대량의 작은 파일에 저장하지 않지만 각각 ${split}_imgs.tsv 파일에 Base64에 교육/검증/테스트 이미지를 저장합니다. 파일의 각 줄은 그림 ID (int type) 및 그림 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의 두 다운 스트림 검색 데이터 세트를 기반으로, 우리는 교육 샘플 스크립트 run_scripts/muge_finetune_vit-b-16_rbt-base.sh 및 run_scripts/flickr30k_finetune_vit-b-16_rbt-base.sh 제공합니다. Running Scripts는 단일 기계 (단일 또는 다중 카드) 및 멀티 머신 분산 교육을 모두 지원합니다. 실행하기 전에 스크립트 시작시 지침 및 주석에 따라 분산 관련 구성을 작성한 다음 다음 명령을 실행하여 교육을 시작하십시오 (멀티 머신 교육을 위해 각 시스템에서 명령을 실행하십시오). 불충분 한 비디오 메모리의 경우 구성 항목에서 재 계산 전략을 활성화하는 것을 고려할 수 있습니다. 교육에 의해 생성 된 로그 및 모델 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 : 검증 세트 데이터 처리 (데이터 로더) (유효성 검사가 수행되는 경우)의 프로세스 수는 1입니다.vision-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 : 훈련 중 단일 카드 배치 크기. (최소 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 : Step/Epoch 주파수를 확인하십시오. -1로 지정된 경우 훈련 중에 검증이 수행되지 않습니다.grad-checkpointing : 재 계산 전략을 사용하여 전방 프로세스 중에 중간 결과를 저장하지 않으므로 훈련 시간의 메모리 오버 헤드가 적습니다. ( store_true 매개 변수, 그냥 추가 --grad-checkpointing , 현재 pytorch> 1.8.0이 필요합니다)mask-ratio : 플립 전략을 참조하면, 메모리 오버 헤드를 줄이고 훈련 속도를 높이기 위해 Finetune 동안 특정 비율의 이미지 패치로 임의의 마스크를 지정할 수 있습니다. 기본값은 0.0 이므로이 정책이 활성화되지 않았 음을 의미합니다.use-flash-attention : FlashAttention을 사용하면 중국-클립의 최종 공정 속도를 크게 높이고 효과에 영향을 미치지 않고 메모리 사용량을 줄일 수 있습니다. ( store_true 매개 변수. 환경을 구성한 후 스크립트에 --use-flash-attention 추가하십시오. 자세한 내용은 flash_attention.md를 참조하십시오)accum-freq : 그라디언트 축적 주파수는 기본적으로 1입니다. 1보다 큰 정수로 지정되면 비교 학습 구배 축적은 더 큰 배치 크기를 시뮬레이션 할 수 있습니다. 단일 카드 배치 크기가 m 이면 총 배치 크기는 accum_freq * m * GPU数입니다.gather-with-grad : 기능을 수행할지 여부는 분산 교육 중에 전체 그라디언트로 수집할지 기본적으로 꺼집니다.name : 출력 경로를 지정하십시오. 하이퍼 파라미터 로그, 훈련 로그 및 출력 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 : 최적화 상태 사용 여부. 훈련 후 로그는 자동으로 ${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 모델 배포를 지원합니다. 자세한 내용은 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 검색 구현을 제공하여 텍스트-그래픽 및 그래프-텍스트 검색에 대한 최상위 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 파일에 저장됩니다. 각 줄은 텍스트 리콜의 Top-K 이미지 ID를 나타내고 형식은 다음과 같습니다.
{ "text_id" : 153915 , "image_ids" : [ 5791244 , 1009692167 , 7454547004 , 3564007203 , 38130571 , 2525270674 , 2195419145 , 2503091968 , 4966265765 , 3690431163 ]}image-to-text search (이미지 리콜 관련 텍스트)의 경우, 마찬가지로 다음 명령을 실행하십시오.
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를 나타내며 형식은 다음과 같습니다.
{ "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.jsonimage-to-text 검색의 경우 먼저 이미지-텍스트 형식으로 표시된 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 노트북 (다운로드 링크)도 제공합니다. 모두가 연습을 환영합니다.
이 섹션에서는 중국 클립을 사용하여 벤치 마크 속도에서 데이터 세트를 예로 들어 보는 방법을 구현하는 방법을 소개합니다. 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) . label_cn.txt 아래와 같이 라인 당 레이블 이름이있는 데이터 레이블입니다.
手风琴
飞机
锚
...
각 줄의 레이블에 해당하는 레이블 ID는行号-1 입니다. 예를 들어 첫 번째 줄의 레이블의 ID는 0이고, 두 번째 줄의 레이블의 ID는 1입니다. 총 태그 수가 10보다 크면 0에서 3 자리 숫자가 왼쪽에 추가됩니다. 예를 들어 태그 수는 000-099 입니다. 사용자는 각 레이블 ID의 해당 폴더를 생성하고 레이블이 표시된 샘플을 그에 넣어야합니다. Elevater에서 CIFAR-100 데이터 세트를 예로 들어 링크를 클릭하여 처리 된 데이터를 다운로드하십시오. 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 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 척도의 중국 클립이 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}
}