Descripción china | Inglés
ModelsCope | Demo | Paper | Blog
Este proyecto es una versión china del modelo de clip y utiliza datos chinos a gran escala para capacitación (~ 200 millones de pares gráficos y de texto), con el objetivo de ayudar a los usuarios a realizar rápidamente tareas como las características gráficas y de texto y el cálculo de similitud, recuperación intermodal y clasificación de imágenes de muestras cero en el campo chino. El código de este proyecto se basa en el proyecto Open_CLIP y está optimizado para los datos de campo chinos y para lograr mejores resultados en los datos chinos. Este proyecto proporciona API, código de capacitación y código de prueba, y los detalles se describirán en detalle a continuación.
El clip chino se abre actualmente a 5 escalas diferentes, y su información del modelo y los métodos de descarga se muestran en la siguiente tabla:
| Tamaño del modelo | Enlace de descarga | Cantidad de parámetros | Esqueleto del lado visual | Cantidad del parámetro del lado visual | Esqueleto del lado del texto | Cantidad del parámetro del lado del texto | Resolución |
|---|---|---|---|---|---|---|---|
| CN-Clip RN50 | Descargar | 77m | Resnet50 | 38m | RBT3 | 39m | 224 |
| CN-Clip Vit-B/16 | Descargar | 188m | Vit-b/16 | 86m | Roberta-wwm-base | 102m | 224 |
| CN-Clip Vit-L/14 | Descargar | 406m | Vit-L/14 | 304m | Roberta-wwm-base | 102m | 224 |
| CN-Clip Vit-L/14@336px | Descargar | 407m | Vit-L/14 | 304m | Roberta-wwm-base | 102m | 336 |
| CN-Clip Vit-H/14 | Descargar | 958m | Vit-H/14 | 632m | Roberta-WWM-Large | 326m | 224 |
Para la tarea de recuperación gráfica y de texto, realizamos experimentos de disparo cero y Finetune en la recuperación de Muge, Flickr30K-CN y Coco-CN. Para la clasificación de la muestra de la imagen cero, realizamos experimentos en 10 conjuntos de datos de Elevater. Los resultados experimentales se muestran en la tabla a continuación. Debido a las limitaciones de espacio, aquí damos los resultados del modelo de escala óptimo del modelo de referencia y el clip chino. Para obtener indicadores de resultados detallados de cada escala del clip chino, consulte Results.md para más detalles.
Recuperación de texto a imagen de Muge (conjunto de validación oficial) :
| Configuración | Cero | Afinar | ||||||
|---|---|---|---|---|---|---|---|---|
| Métrico | R@1 | R@5 | R@10 | SEÑOR | R@1 | R@5 | R@10 | SEÑOR |
| 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 |
| Clip de CN | 63.0 | 84.1 | 89.2 | 78.8 | 68.9 | 88.7 | 93.1 | 83.6 |
Recuperación Flickr30K-CN (conjunto de pruebas oficiales) :
| Tarea | Texto a imagen | Imagen a texto | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Configuración | Cero | Afinar | Cero | Afinar | ||||||||
| Métrico | 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 |
| Clip de 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 |
Recuperación de Coco-CN (conjunto de pruebas oficiales) :
| Tarea | Texto a imagen | Imagen a texto | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Configuración | Cero | Afinar | Cero | Afinar | ||||||||
| Métrico | 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 |
| Clip de 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 |
Clasificación de imagen de disparo cero :
| Tarea | Cifar10 | Cifar100 | Dtd | Eurosat | Fero | FGVC | Gatito | Mnista | ordenador personal | Vocero |
|---|---|---|---|---|---|---|---|---|---|---|
| Git | 88.5 | 61.1 | 42.9 | 43.4 | 41.4 | 6.7 | 22.1 | 68.9 | 50.0 | 80.2 |
| ALINEAR | 94.9 | 76.8 | 66.1 | 52.1 | 50.8 | 25.0 | 41.2 | 74.0 | 55.2 | 83.0 |
| ACORTAR | 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 | - | - | - | - | - | - |
| Clip de CN | 96.0 | 79.7 | 51.2 | 52.0 | 55.1 | 26.2 | 49.9 | 79.4 | 63.5 | 84.9 |
Antes de comenzar este proyecto, debe verificar si se cumplen los siguientes requisitos de configuración ambiental:
Ejecute el siguiente comando para instalar las bibliotecas de tres partes necesarias para este proyecto.
pip install -r requirements.txtAquí hay un ejemplo de código simple para ilustrar cómo usar la API de clip china. Antes de comenzar a usar, instale CN_CLIP:
# 通过pip安装
pip install cn_clip
# 或者从源代码安装
cd Chinese-CLIP
pip install -e .Una vez que la instalación sea exitosa, puede llamar fácilmente a la API a través de los siguientes métodos, pasar en la imagen especificada (ejemplo) y texto, extraer el vector de características gráficas y calcular la similitud:
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]]También hemos preparado un soporte relevante para implementar modelos ONNX y Tensorrt. Para más detalles, consulte la implementación.md.
Si no está satisfecho con solo usar la API, continúe leyendo este documento para aprender a usar nuestro proyecto para capacitación y prueba de modelos de clips.
Los siguientes incluirán tutoriales de recuperación intermodal (incluyendo Finetune e Inferencias, cálculo KNN, etc.) y tutoriales de clasificación de imágenes de muestras cero.
Después de descargar este proyecto, cree una nueva carpeta ${DATAPATH} para almacenar el conjunto de datos, CKPT previamente entrenado y el registro de modelos generado por Finetune. La estructura del directorio de espacio de trabajo recomendado es la siguiente:
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/
└── .../ # 更多自定义数据集...
Aquí proporcionamos el método de descarga de los parámetros del modelo previamente capacitados, así como el proceso de datos de preprocesamiento antes de Finetune.
Consulte la sección anterior de la escala de modelo y el enlace de descarga para descargar el modelo CKPT correspondiente. Se recomienda almacenar el archivo CKPT descargado en ${DATAPATH}/pretrained_weights/ .
Para adaptarse al código de clip chino y garantizar la eficiencia del procesamiento de datos y la lectura, recomendamos que los conjuntos de datos de gráficos y texto utilizados para la capacitación y la evaluación se organicen en los siguientes métodos:
${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
donde ${dataset_name} se refiere al nombre del conjunto de datos (como Muge)
Para garantizar la eficiencia del procesamiento de archivos, no almacenamos imágenes en grandes cantidades de archivos pequeños, sino que almacenamos imágenes de capacitación/verificación/prueba en Base64 en el archivo ${split}_imgs.tsv respectivamente. Cada línea del archivo representa una imagen, que incluye la ID de imagen (Tipo int) y la base de imagen64, separada por TAB, y el formato es el siguiente:
1000002 /9j/4AAQSkZJ...YQj7314oA//2Q==
La forma de convertir el archivo de imagen original a base64 es muy simple, ejecute el siguiente código de 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 La información de texto y la relación coincidente entre el gráfico y los pares de texto se guardan en el archivo ${split}_texts.jsonl . Cada línea del archivo es una línea de JSON, el formato es el siguiente:
{"text_id": 8428, "text": "高级感托特包斜挎", "image_ids": [1076345, 517602]}
Para el conjunto de pruebas, solo hay texto y no conozco la relación coincidente entre la imagen y los pares de texto, el campo image_ids de cada línea se puede procesar como una lista vacía, es decir, "image_ids": [] .
Finalmente, también necesitamos serializar los archivos TSV y JSONL juntos y convertirlos en archivos de base de datos LMDB indexados por memoria para facilitar la lectura aleatoria durante la capacitación.
python cn_clip/preprocess/build_lmdb_dataset.py
--data_dir ${DATAPATH}/datasets/${dataset_name}
--splits train,valid,test
Por ejemplo, para el conjunto de datos Muge, ${dataset_name} se establece en Muge, y --splits especifica la división del conjunto de datos que debe convertirse, separada por comas sin espacios. Después de la conversión, los siguientes archivos serializados LMDB se agregarán a la carpeta del conjunto de datos.
${DATAPATH}
└── datasets/
└── ${dataset_name}/
└── lmdb/
├── train
│ ├── imgs
│ └── pairs
├── valid
└── test
Para reducir la dificultad de comenzar, también proporcionamos el paquete de compresión de datos Muge Data (enlace de descarga) y FlickR30K-CN (enlace de descarga) según los pasos anteriores. Simplemente descargue y descomprima y colóquelo en ${DATAPATH}/datasets/ . Si se requieren datos de COCO-CN, contáctenos por correo electrónico después de solicitar el permiso del autor original.
Aquí presentamos los pasos de capacitación para facilitar a otros usuarios que comprendan los detalles del modelo y usen el modelo de clip pre-capacitado chino que proporcionamos para Finetune. Basado en los dos conjuntos de datos de búsqueda aguas abajo de Muge y Flickr30k-CN, proporcionamos scripts de muestra de capacitación run_scripts/muge_finetune_vit-b-16_rbt-base.sh y run_scripts/flickr30k_finetune_vit-b-16_rbt-base.sh . Ejecución de scripts admite tanto una sola máquina (tarjetas individuales o múltiples) como de entrenamiento distribuido con múltiples máquinas. Antes de ejecutar, complete las configuraciones relacionadas distribuidas de acuerdo con las pautas y comentarios al comienzo del script, y luego ejecute los siguientes comandos para comenzar la capacitación (ejecute comandos en cada máquina para capacitación multimachinada). Para la memoria de video insuficiente, puede considerar activar la estrategia de recalculación en el elemento de configuración. Los archivos de registro y modelo CKPT generados por capacitación se guardarán automáticamente en el directorio especificado por el usuario:
cd Chinese-CLIP/
bash run_scripts/muge_finetune_vit-b-16_rbt-base.sh ${DATAPATH}Los elementos de configuración de capacitación relacionados incluyen:
WORKER_CNT : el número de máquinas capacitadasGPUS_PER_NODE : Número de GPU en cada máquinatrain-data : el directorio LMDB de datos de capacitación, consulte anteriormente para el proceso de preprocesamiento para preparar archivos de datos LMDB.val-data : verifique el directorio de datos LMDB. Cuando se especifica como ninguno, la verificación durante el entrenamiento no se realizará.num-workers : El número de procesos en el procesamiento de datos del conjunto de datos de capacitación (DataLoader), el valor predeterminado es 4.valid-num-workers : El número de procesos para el procesamiento de datos del conjunto de verificación (dataLoader) (si se realiza la validación), el valor predeterminado es 1.vision-model : especifique la columna vertebral visual, seleccione de ["ViT-B-16", "ViT-L-14", "ViT-L-14-336", "ViT-H-14", "RN50"] .text-model : especifique la columna vertebral de texto, seleccione de ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"] .context-length : longitud de secuencia de entrada de texto.warmup : Pasos de calentamiento.batch-size : tamaño por lotes de una sola tarjeta durante el entrenamiento. (Asegúrese训练样本总数> batch-size * GPU数, que cumple con al menos 1 lote de entrenamiento)lr : tasa de aprendizaje.wd : Decadencia de peso.max-steps : el número de pasos de entrenamiento y el número de rondas de entrenamiento también se pueden especificar a través de max-epochs .freeze-vision : si congelar la columna vertebral visual.use-augment : si se debe usar autoaugment para mejorar los datos de la imagen.valid-batch-size : tamaño por lotes independiente durante la verificación. (Asegúrese de que验证集样本总数> batch-size * GPU数, que satisface al menos 1 lote de verificación)valid-step-interval y valid-epoch-interval : verificar la frecuencia de paso/época. Si se especifica como -1, la verificación no se realizará durante el entrenamiento.grad-checkpointing : Use la estrategia de recalculación para no ahorrar resultados intermedios durante el proceso de avance, a cambio de menos gastos generales de memoria en el tiempo de entrenamiento, lo que es adecuado para la memoria insuficiente. (Parámetro store_true , solo agregue --grad-checkpointing al script, actualmente se requiere pytorch> 1.8.0)mask-ratio : Refiriéndose a la estrategia FLIP, se puede especificar una máscara aleatoria a una cierta proporción de parches de imagen durante Finetune para reducir la sobrecarga de la memoria y acelerar el entrenamiento. El valor predeterminado es 0.0, lo que significa que esta política no está activada.use-flash-attention : el uso de flashatent puede acelerar significativamente el proceso de finetune del clip chino y reducir el uso de la memoria sin afectar el efecto. (Parámetro store_true . Después de configurar el entorno, agregar --use-flash-attention al script. Consulte Flash_Attention.md para más detalles)accum-freq : La frecuencia de acumulación de gradiente es 1 por defecto. Cuando se especifica como un entero mayor que 1, la acumulación de gradiente de aprendizaje comparativo está habilitado para simular un tamaño de lote más grande. Si el tamaño de lote de una sola tarjeta es m , el tamaño total de lotes es accum_freq * m * GPU数.gather-with-grad : si realizar funciones recolectar con gradientes completos durante la capacitación distribuida, se apaga de forma predeterminada.name : Especifique la ruta de salida. El registro de hiperparameter, el registro de entrenamiento y la salida CKPT se almacenarán en ${DATAPATH}/experiments/${name}/ .save-step-frequency y save-epoch-frequency : el intervalo entre los pasos o las rondas de CKPT.report-training-batch-acc : si el registro informa la precisión del gráfico de capacitación a texto y texto al lote gráfico.resume : el camino para leer por peso. El script de muestra especifica como una ruta CKPT previamente capacitada, o se puede especificar como la ruta Finetune CKPT del usuario para la capacitación continua.reset-data-offset : si continuar ejecutando desde el punto de interrupción de datos anterior. Si el tamaño de lote o el número de tarjeta GPU excede el parámetro, se recomienda encender esta opción.reset-optimizer : si se debe usar el estado optimizador. Después del entrenamiento, el registro existirá automáticamente ${DATAPATH}/experiments/${name}/out_${timestamp}.log . El formato de registro de entrenamiento es el siguiente:
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
El formato de registro de verificación es el siguiente:
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
Nota : La comparación de la convergencia de capacitación y la estabilidad del aprendizaje se correlacionan con el tamaño total del lote. Si usa un tamaño por lotes más pequeño (en comparación con la configuración predeterminada de 128 por GPU * 8 GPU), se recomienda utilizar una tasa de aprendizaje más pequeña. Recomendamos usar más GPU y tamaño por lotes más grande para obtener mejores resultados.
Proporcionamos el proceso de extracción de características y evaluación de tareas de recuperación gráfica, que es el siguiente:
Actualmente, este código admite el uso de una sola tarjeta GPU para la extracción de características gráficas, consulte el siguiente comando. También brindamos soporte para la implementación de modelos ONNX y Tensorrt para acelerar la inferencia de características, ver implementment.md para más detalles.
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 Las características gráficas de salida se guardarán en el directorio ${DATAPATH}/datasets/${dataset_name} de forma predeterminada, y las características de la imagen se guardan en el archivo ${split}_imgs.img_feat.jsonl . Cada línea almacena las características de una imagen en JSON, y el formato es el siguiente:
{"image_id": 1000002, "feature": [0.0198, ..., -0.017, 0.0248]}
Las características de texto se guardan en ${split}_texts.txt_feat.jsonl , con el formato de la siguiente manera:
{"text_id": 248816, "feature": [0.1314, ..., 0.0018, -0.0002]}
Para los conjuntos de datos de búsqueda académica a pequeña escala, proporcionamos una implementación de búsqueda KNN simple para facilitar el cálculo de los resultados de recuperación de Top-K para la búsqueda de texto a gráfico y gráfico a texto (consejos: si desea construir una demostración de búsqueda en el proyecto, se recomienda producir gráficos y características de texto basadas en el modelo de clip chino y combinar el clip de ingeniería de origen abierto, el clip-Retrieval para construir servicios front-end.)
Para la búsqueda de texto a imagen (imágenes relacionadas con el retiro de texto), ejecute el siguiente comando:
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 "El resultado se guarda en el archivo JSONL especificado. Cada línea representa la ID de imagen de Top-K de un retiro de texto, y el formato es el siguiente:
{ "text_id" : 153915 , "image_ids" : [ 5791244 , 1009692167 , 7454547004 , 3564007203 , 38130571 , 2525270674 , 2195419145 , 2503091968 , 4966265765 , 3690431163 ]}Para la búsqueda de imagen a texto (texto relacionado con el recuerdo de la imagen), de manera similar, ejecute el siguiente comando:
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 "Cada línea de resultados de salida representa la ID de texto Top-K de un retiro de imagen, y el formato es el siguiente:
{ "image_id" : 977856234 , "text_ids" : [ 156914 , 157914 , 158914 , 155914 , 156179 , 158907 , 157179 , 154179 , 154914 , 154723 ]}Proporcionamos el script de evaluación para calcular el retiro@1/5/10 de la tarea de búsqueda, y damos el retiro medio (el promedio de recuperación@1/5/10). Ejecute el siguiente comando para obtener el puntaje:
Para la búsqueda de texto a imagen, ejecute el comando:
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.jsonPara la búsqueda de imagen a texto, ejecute primero el siguiente comando para convertir el archivo jsonl marcado con el formato de imagen a texto en imagen a texto:
python cn_clip/eval/transform_ir_annotation_to_tr.py
--input ${DATAPATH} /datasets/ ${dataset_name} / ${split} _texts.jsonlDespués de completar, ejecute el comando:
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.jsonEl formato del resultado impreso será el siguiente:
{ "success" : true , "score" : 85.67 , "scoreJson" : { "score" : 85.67 , "mean_recall" : 85.67 , "r1" : 71.2 , "r5" : 90.5 , "r10" : 95.3 }}Con respecto al proceso de capacitación y prueba de recuperación intermodal, tomamos el conjunto de datos de búsqueda de Muge (gráficos multimodales de comercio electrónico y desafío de texto) como ejemplo, y también proporciona un cuaderno Jupyter (enlace de descarga) que incluye todos los procesos anteriores y se puede ejecutar. Todos son bienvenidos a practicarlo.
Esta sección introduce cómo usar el clip chino para implementar la clasificación de imágenes de muestras cero, tomando el conjunto de datos en Benchmark Elevater como ejemplo. Elevater es un conjunto de evaluación compuesto por múltiples conjuntos de datos clasificados conocidos (incluidos CIFAR-10, CIFAR-100, MNIST, etc.) para evaluar el efecto de muestra cero del modelo en estos conjuntos de datos. En nuestro experimento, preparamos una versión china del propt, las etiquetas de categoría e imágenes originales para cada conjunto de datos. Consulte el documento de datos para obtener detalles para esto para probar el modelo de clip chino. Para obtener más detalles sobre este punto de referencia, haga clic en el enlace. También puede consultar el proceso que proporcionamos para preparar datos y probarlos en su propio conjunto de datos de clasificación china.
Primero prepare los datos en el siguiente formato. Dado que la clasificación de imagen de muestras cero solo requiere pruebas, solo necesita preparar el conjunto de pruebas y los parámetros del modelo previamente capacitado, y almacenarlos bajo ${DATAPATH} especificados por el usuario de acuerdo con la siguiente estructura del directorio:
${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
└── ...
...
El conjunto de pruebas asegura que los datos en la carpeta de prueba se dividan de acuerdo con la ID correspondiente a la etiqueta, y asegura que el ID esté en orden de diccionario (múltiples dígitos superiores a 10 deben complementarse con ceros a la label.zfill(3) izquierda. label_cn.txt es una etiqueta de datos con un nombre de etiqueta por línea, como se muestra a continuación:
手风琴
飞机
锚
...
La ID de la etiqueta correspondiente a la etiqueta de cada línea es行号-1 , como la ID de la etiqueta de la primera línea es 0, y la ID de la etiqueta de la segunda línea es 1. Si el número total de etiquetas es mayor de 10, entonces se agregará cero a tres dígitos a la izquierda, por ejemplo, el número de etiquetas es 100, y el ID de etiqueta será 000-099 . El usuario necesita generar la carpeta correspondiente para cada ID de etiqueta y poner la muestra marcada con la etiqueta en ella. Tomamos el conjunto de datos CIFAR-100 en Elevater como ejemplo, haga clic en el enlace para descargar los datos procesados. Si desea probar el clip chino en otros conjuntos de datos contenidos en Elevater, consulte nuestra documentación de datos.
Hemos preparado el script de predicción, consulte run_scripts/zeroshot_eval.sh . Un ejemplo de ejecutar un comando es el siguiente:
bash run_scripts/zeroshot_eval.sh 0
${DATAPATH} ${dataset_name}
${vision_model} ${text_model}
${ckpt_path} ${index_file}Los significados de cada parámetro son:
0 es la ID de GPUDATAPATH Consulte la sección de preparación anterior, ingrese la ruta correspondiente de acuerdo con la ubicación real.dataset_name Consulte la sección de preparación anterior e ingrese el nombre del directorio del conjunto de datos para la evaluación, como cifar-100vision_model es el tipo de modelo especificado, y las opciones incluyen ["ViT-B-32", "ViT-B-16", "ViT-L-14", "ViT-L-14-336", "RN50", "ViT-H-14"]text_model incluye ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"]ckpt_path es la ruta completa de CKPT previamente entrenadaindex_file (opcional, solo se debe especificar la evaluación oficial del sitio web de Elevater), consulte el documento de datos Por ejemplo, si usa el modelo previamente capacitado de escala VIT-B/16 para evaluar CIFAR-100, entonces se ejecuta ( ${DATAPATH} debe reemplazarse de acuerdo con las condiciones reales):
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.ptDevolver el resultado imprimirá la precisión de TOP-1.
Result:
zeroshot-top1: 0.6444
En CIFAR-100, se debe esperar que el clip chino de la escala VIT-B/16 alcance el 64.4%. Para obtener más detalles, consulte Results.md para obtener detalles sobre nuestros resultados de clasificación de muestras cero para otras escalas y otros conjuntos de datos.
Al mismo tiempo, el programa también guardará un archivo JSON para enviar el Elevater oficial. El contenido del archivo JSON es el siguiente:
{ "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)] " } Estos incluyen la información meta del nombre del modelo model_name , el nombre del conjunto de datos dataset_name , la cantidad total de parámetros num_params , la cantidad de parámetros de la torre visual num_visual_params y otros modelos, así como el resultado de salida del modelo, es decir, el tensor de probabilidad de predicción del modelo y el tamaño es [1, 样本数, 标签个数] .
Basado en nuestra API de extracción de características integrada en Huggingface Transformers, proporcionamos una demostración (API de inferencia alojada) que simplemente puede probar la clasificación de imágenes de muestras cero en línea en Huggingface Model Hub. Vea los enlaces de demostración para cada escala de modelo a continuación. ¡Bienvenido a probarlo!
Si crees que este proyecto es útil, espero que puedas darnos una estrella y compartirla con los usuarios que te rodean. Bienvenido a la cita laboral relevante, ¡gracias por su apoyo!
@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}
}