
Hugging Face Transformers 中的 CLIP 模型從零實現圖像-文本跨模態相似度與零樣本分類【免費下載鏈接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.項目地址: https://gitcode.com/GitHub_Trending/tra/transformersCLIPContrastive Language-Image Pre-Training是 OpenAI 提出的多模態視覺-語言模型通過在海量圖像、文本配對數據上聯合訓練將視覺與文本特征投影到同一向量空間從而無需針對任務微調即可實現圖像-文本相似度計算與零樣本圖像分類。本文以當前倉庫docs/source/ja/model_doc/clip.md為骨架結合src/transformers/models/clip/下的完整源碼實現系統講解 CLIP 的架構原理、配置體系、Tokenizer/ImageProcessor/Processor 配套組件并給出可直接運行的實戰示例與微調指引。CLIP 是什么從固定類別監督到自然語言監督傳統計算機視覺系統通常針對一組預先定義好的物體類別進行訓練這種受限的監督形式需要為每一個新的視覺概念額外標注數據限制了模型的通用性與易用性。CLIP 的核心思路是直接從關于圖像的原始文本中學習從而獲得更廣泛的監督來源。論文Learning Transferable Visual Models From Natural Language Supervision發布于 2021-02-26證明僅通過預測哪段描述對應哪張圖這一簡單的預訓練任務就能從互聯網收集的數以億計的圖像、文本配對數據中高效、可擴展地學習 SOTA 級圖像表征。預訓練完成后可以使用自然語言去引用或描述學到的視覺概念實現模型到下游任務的零樣本遷移。作者在 30 多個既有計算機視覺數據集上進行了基準測試覆蓋 OCR、視頻動作識別、地理位置定位以及多種細粒度物體分類等任務發現模型大多能輕松遷移且在很多任務上無需數據集專屬訓練即可與完全監督的基線競爭——例如在 ImageNet 零樣本上達到與原始 ResNet-50 相當的準確率卻無需使用其 128 萬條訓練樣本。在 Transformers 倉庫中CLIP 的實現位于 src/transformers/models/clip/ 目錄包含配置configuration_clip.py、模型modeling_clip.py、圖像處理器image_processing_clip.py、image_processing_pil_clip.py、處理器processing_clip.py、分詞器tokenization_clip.py以及原始權重轉換腳本convert_clip_original_pytorch_to_hf.py。架構原理雙編碼器 共享投影空間CLIP 是一個多模態視覺-語言模型可以用于圖像-文本相似度計算與零樣本圖像分類。其整體結構由兩部分組成圖像編碼器使用 ViT 風格的 Transformer 獲取視覺特征文本編碼器使用因果語言模型類似 GPT獲取文本特征。兩條分支的最終特征被投影到維度相同的潛在空間中投影后的圖像特征與文本特征之間的點積即作為兩者的相似度得分。這一相似度計算邏輯在 modeling_clip.py 的CLIPModel.forward中實現# normalized features image_embeds image_embeds / _get_vector_norm(image_embeds) text_embeds text_embeds / _get_vector_norm(text_embeds) # cosine similarity as logits logits_per_text torch.matmul(text_embeds, image_embeds.t().to(text_embeds.device)) logits_per_text logits_per_text * self.logit_scale.exp().to(text_embeds.device) logits_per_image logits_per_text.t()即先對圖像、文本嵌入做 L2 歸一化再計算余弦相似度矩陣最后乘上可學習的logit_scale的指數logit_scale的初始值由配置項logit_scale_init_value控制默認為 2.6592。若開啟return_lossTrue還會基于該相似度矩陣計算對稱的對比損失詳見 contrastive_loss 與 image_text_contrastive_loss。圖像分支的細節Patch 化與 [CLS] 標記為了把圖像送入 Transformer 編碼器每張圖像先被切分成一系列固定大小、互不重疊的 Patch每個 Patch 被線性嵌入Patch 化與線性投影由CLIPEmbeddings.patch_embedding完成Conv2d卷積實現輸出形狀為[batch, seq_len, hidden_size]隨后拼接一個可學習的[CLS]類標記class_embedding作為整張圖的全局表示再加上絕對位置編碼position_embedding把得到的向量序列送入標準 Transformer 編碼器。以上邏輯可在 modeling_clip.py 的CLIPEmbeddings.forward中看到。此外該實現還提供了interpolate_pos_encoding能力modeling_clip.py當輸入圖像分辨率與預訓練尺寸不同時可以通過雙三次插值bicubic調整位置編碼從而在更高分辨率圖像上使用模型調用時需傳入interpolate_pos_encodingTrue。文本分支與模型裝配CLIPModel.__init__modeling_clip.py將兩分支裝配在一起self.text_model CLIPTextModel._from_config(text_config) self.vision_model CLIPVisionModel._from_config(vision_config) self.visual_projection nn.Linear(self.vision_embed_dim, self.projection_dim, biasFalse) self.text_projection nn.Linear(self.text_embed_dim, self.projection_dim, biasFalse) self.logit_scale nn.Parameter(torch.tensor(self.config.logit_scale_init_value))其中兩個nn.Linear投影層均不帶 bias將各自編碼器的隱藏維度統一映射到projection_dim默認 512維的共享空間中。get_text_features與get_image_features兩個方法則分別返回經過投影后的文本/圖像嵌入modeling_clip.py適合直接用于向量檢索等場景。快速上手計算圖像-文本相似度得分使用 [CLIPProcessor] 包裝 [CLIPImageProcessor] 與 [CLIPTokenizer] 于同一實例可以同時完成文本編碼與圖像預處理。下面的例子展示了如何用 [CLIPProcessor] 與 [CLIPModel] 獲取圖像-文本相似度得分與關聯文檔示例一致 from PIL import Image import requests from transformers import CLIPProcessor, CLIPModel model CLIPModel.from_pretrained(openai/clip-vit-base-patch32) processor CLIPProcessor.from_pretrained(openai/clip-vit-base-patch32) url http://images.cocodataset.org/val2017/000000039769.jpg image Image.open(requests.get(url, streamTrue).raw) inputs processor(text[a photo of a cat, a photo of a dog], imagesimage, return_tensorspt, paddingTrue) outputs model(**inputs) logits_per_image outputs.logits_per_image # this is the image-text similarity score probs logits_per_image.softmax(dim1) # we can take the softmax to get the label probabilities使用 Pipeline 與 AutoModel 的兩種寫法除了顯式實例化CLIPModel/CLIPProcessor還可以借助更高層的封裝。例如使用pipeline直接做零樣本圖像分類from transformers import pipeline clip pipeline( taskzero-shot-image-classification, modelopenai/clip-vit-base-patch32, device0 ) labels [a photo of a cat, a photo of a dog, a photo of a car] clip(http://images.cocodataset.org/val2017/000000039769.jpg, candidate_labelslabels)或者使用AutoModelAutoProcessor并配合 SDPA 注意力實現與自動設備映射import requests from PIL import Image from transformers import AutoModel, AutoProcessor model AutoModel.from_pretrained(openai/clip-vit-base-patch32, attn_implementationsdpa, device_mapauto) processor AutoProcessor.from_pretrained(openai/clip-vit-base-patch32) url http://images.cocodataset.org/val2017/000000039769.jpg image Image.open(requests.get(url, streamTrue).raw) labels [a photo of a cat, a photo of a dog, a photo of a car] inputs processor(textlabels, imagesimage, return_tensorspt, paddingTrue).to(model.device) outputs model(**inputs) logits_per_image outputs.logits_per_image probs logits_per_image.softmax(dim1) most_likely_idx probs.argmax(dim1).item() most_likely_label labels[most_likely_idx] print(fMost likely label: {most_likely_label} with probability: {probs[0][most_likely_idx].item():.3f})CLIPModel.forward返回的 [CLIPOutput]定義于 modeling_clip.py包含如下字段字段含義loss對比損失僅在return_lossTrue時返回logits_per_image形狀(image_batch_size, text_batch_size)圖像-文本相似度得分logits_per_text形狀(text_batch_size, image_batch_size)文本-圖像相似度得分text_embeds經投影層得到的文本嵌入image_embeds經投影層得到的圖像嵌入text_model_output文本編碼器的完整輸出vision_model_output圖像編碼器的完整輸出配置體系CLIPConfig、CLIPTextConfig 與 CLIPVisionConfigCLIP 由三個配置類構成均定義于 configuration_clip.py。CLIPTextConfig文本編碼器配置CLIPTextConfig用于初始化文本分支默認參數對應openai/clip-vit-base-patch32風格參數默認值說明vocab_size49408詞表大小hidden_size512隱藏層維度intermediate_size2048FFN 中間層維度projection_dim512投影到共享空間的維度num_hidden_layers12Transformer 層數num_attention_heads8注意力頭數max_position_embeddings77最大序列長度hidden_actquick_gelu激活函數CLIP 使用 QuickGELUlayer_norm_eps1e-5LayerNorm epsilonattention_dropout0.0注意力 dropoutinitializer_range0.02權重初始化范圍pad_token_id/bos_token_id/eos_token_id1 / 49406 / 49407特殊 token id該配置通過strict裝飾器啟用架構校驗validate_architecture會檢查hidden_size是否能被num_attention_heads整除否則拋出ValueErrorconfiguration_clip.py。CLIPVisionConfig圖像編碼器配置CLIPVisionConfig用于初始化圖像分支參數默認值說明hidden_size768隱藏層維度intermediate_size3072FFN 中間層維度projection_dim512投影到共享空間的維度num_hidden_layers12Transformer 層數num_attention_heads12注意力頭數num_channels3輸入圖像通道數RGBimage_size224輸入圖像尺寸patch_size32Patch 尺寸hidden_actquick_gelu激活函數layer_norm_eps1e-5LayerNorm epsilonattention_dropout0.0注意力 dropoutinitializer_range0.02權重初始化范圍image_size與patch_size在當前倉庫實現中支持int | list | tuple類型從而允許非方形的輸入配置。CLIPConfig雙分支總配置CLIPConfig通過sub_configs {text_config: CLIPTextConfig, vision_config: CLIPVisionConfig}聚合兩個子配置并額外提供text_config用于初始化CLIPTextConfig的字典或實例vision_config用于初始化CLIPVisionConfig的字典或實例projection_dim投影維度默認 512logit_scale_init_valuelogit_scale的初始值默認 2.6592與原始 CLIP 實現一致initializer_factor初始化因子默認 1.0。其__post_init__還兼容了歷史參數text_config_dict/vision_config_dict當新舊參數同時出現且取值不一致時以字典參數為準并打印提示日志configuration_clip.py。從兩個子配置構建總配置的方式如下 from transformers import CLIPTextConfig, CLIPVisionConfig, CLIPConfig config_text CLIPTextConfig() config_vision CLIPVisionConfig() config CLIPConfig(text_configconfig_text, vision_configconfig_vision)預處理鏈路CLIPTokenizer、CLIPImageProcessor 與 CLIPProcessorCLIPTokenizer / CLIPTokenizerFastCLIPTokenizer基于 HuggingFace tokenizers 庫的byte-level BPE實現特殊 tokenbos_token|startoftext|、eos_token|endoftext|、pad_token|endoftext|、unk_token|endoftext|歸一化流程NFCUnicode 規范化 → 將空白替換為單個空格 → 轉小寫normalizers.Sequence([NFC, Replace(r\s, ), Lowercase])預分詞采用基于正則的 Split 策略詞尾使用/w后綴標記model_input_names [input_ids, attention_mask]可直接配合paddingTrue完成批內對齊。由于默認max_position_embeddings77文本序列超過 77 個 token 時會被截斷——這也是 CLIP 文本分支序列長度上限的來源超出會觸發 CLIPTextEmbeddings.forward 中的長度校驗。CLIPTokenizerFast則提供基于 Rust tokenizers 的快速版本二者的get_special_tokens_mask、save_vocabulary等方法在文檔中均有 autodoc 條目。CLIPImageProcessor / CLIPImageProcessorFastCLIPImageProcessor負責圖像的縮放resize/rescale與歸一化默認配置為resample雙三次插值BICUBICsize{shortest_edge: 224}按最短邊縮放到 224保持寬高比crop_size{height: 224, width: 224}中心裁剪到 224×224do_resizeTrue、do_rescaleTrue、do_normalizeTrueimage_mean/image_std采用 OpenAI 官方 CLIP 的均值與標準差OPENAI_CLIP_MEAN/OPENAI_CLIP_STD。同時支持use_square_size參數傳入后會把size改為{height: 224, width: 224}形式見 image_processing_clip.py。preprocess方法即按resize → rescale → normalize → 返回 tensor的鏈路處理輸入。CLIPImageProcessorFast以及倉庫中新增的CLIPImageProcessorPil見英文文檔docs/source/en/model_doc/clip.md的 autodoc 條目提供基于 torchvision 后端的加速實現。CLIPProcessorCLIPProcessor繼承自ProcessorMixin構造函數接收image_processor與tokenizer兩個組件class CLIPProcessor(ProcessorMixin): def __init__(self, image_processorNone, tokenizerNone, **kwargs): super().__init__(image_processor, tokenizer)調用processor(text..., images..., return_tensorspt, paddingTrue)時它會將文本分詞結果與圖像預處理結果打包為模型可直接消費的input_ids、attention_mask、pixel_values。模型類族一覽關聯文檔通過 autodoc 暴露了以下模型類均實現在 modeling_clip.pyCLIPModel完整雙塔模型提供forward返回CLIPOutput、get_text_features、get_image_featuresmodeling_clip.pyCLIPTextModel僅文本編碼器帶池化forward返回BaseModelOutputWithPoolingCLIPTextModelWithProjection文本編碼器 文本投影層forward返回text_embedsmodeling_clip.pyCLIPVisionModel僅圖像編碼器帶池化CLIPVisionModelWithProjection圖像編碼器 視覺投影層forward返回image_embedsmodeling_clip.py。其中CLIPTextModelWithProjection與CLIPVisionModelWithProjection特別適合直接產出同一空間下的嵌入向量用于圖像檢索、語義搜索等下游任務 import torch from transformers import AutoTokenizer, CLIPTextModelWithProjection model CLIPTextModelWithProjection.from_pretrained(openai/clip-vit-base-patch32) tokenizer AutoTokenizer.from_pretrained(openai/clip-vit-base-patch32) inputs tokenizer([a photo of a cat, a photo of a dog], paddingTrue, return_tensorspt) with torch.inference_mode(): ... outputs model(**inputs) text_embeds outputs.text_embeds圖像側同理使用CLIPVisionModelWithProjectionAutoProcessor即可得到outputs.image_embeds。在推理階段建議包裹torch.inference_mode()以節省顯存與加速。微調與擴展資源倉庫內提供了完整的 CLIP 微調腳本examples/pytorch/contrastive-image-text/run_clip.py支持從預訓練的圖像/文本編碼器繼續訓練例如使用 COCO 數據集進行圖文對比訓練。腳本以 Hugging FaceTrainer為骨架關鍵參數包括--model_name_or_path預訓練模型或配置路徑例如./clip-roberta見 README.md--config_name/--tokenizer_name當與模型名不一致時單獨指定配置與分詞器run_clip.py--push_to_hub訓練結束后將模型推送到 Hubrun_clip.py。圍繞 CLIP 的典型進階用法還包括圖像檢索用預訓練 CLIP 計算查詢文本與候選圖像庫的相似度并按得分排序可進一步計算 MRR平均倒數排名評估檢索質量多語言圖文對齊使用多語言 CLIP 變體將不同語言的文本與圖像映射到同一向量空間可解釋性分析可視化輸入 token 與圖像區域segment之間的相似性觀察模型關注哪些圖文對應關系遙感衛星圖文微調在領域數據集如 RSICD上微調 CLIP 并對比不同數據增強策略對性能的影響。小結CLIP 在 Transformers 倉庫中的實現完整覆蓋了配置 → 預處理 → 雙塔編碼 → 對比學習 → 下游遷移的整條鏈路CLIPConfig/CLIPTextConfig/CLIPVisionConfig管理雙分支超參CLIPTokenizer與CLIPImageProcessor分別負責文本與圖像預處理CLIPProcessor將二者合一而CLIPModel及四個派生模型類覆蓋了相似度計算、特征提取與零樣本分類的全部使用場景。閱讀 modeling_clip.py 與 configuration_clip.py 的源碼可以進一步理解歸一化點積、logit_scale縮放與對稱對比損失的實現細節配合 run_clip.py 訓練腳本即可在自有圖文數據集上復現并擴展這一范式。【免費下載鏈接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.項目地址: https://gitcode.com/GitHub_Trending/tra/transformers創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考