ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Hugging Face Transformers 中的 CLIP 模型:从零实现图像-文本跨模态相似度与零样本分类

Hugging Face Transformers 中的 CLIP 模型:从零实现图像-文本跨模态相似度与零样本分类 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),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表