完整指南:使用vit_base_patch32_clip_384.openai_ft_in12k_in1k生成图像嵌入向量的3种方法
【免费下载链接】vit_base_patch32_clip_384.openai_ft_in12k_in1k项目地址: https://ai.gitcode.com/hf_mirrors/timm/vit_base_patch32_clip_384.openai_ft_in12k_in1k
vit_base_patch32_clip_384.openai_ft_in12k_in1k是一个基于Vision Transformer(ViT)架构的图像分类模型,由OpenAI使用CLIP在WIT-400M图像文本对上预训练,然后在ImageNet-12k和ImageNet-1k数据集上进行微调。该模型不仅可用于图像分类,还能高效生成图像嵌入向量,助力各种计算机视觉任务。
模型基础信息
核心参数
- 模型类型:图像分类/特征骨干网络
- 参数量:88.3M
- 图像尺寸:384×384
- 特征维度:768(通过config.json可知num_features为768)
- 预训练数据集:WIT-400M、ImageNet-12k
方法一:移除分类头获取嵌入向量
这种方法通过设置num_classes=0来移除模型的分类层,直接输出特征向量。
from urllib.request import urlopen from PIL import Image import timm # 加载图像 img = Image.open(urlopen( 'https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/beignets-task-guide.png' )) # 创建模型,设置num_classes=0移除分类器 model = timm.create_model( 'vit_base_patch32_clip_384.openai_ft_in12k_in1k', pretrained=True, num_classes=0, # 关键参数:移除分类头 ) model = model.eval() # 获取模型特定的图像变换 data_config = timm.data.resolve_model_data_config(model) transforms = timm.data.create_transform(**data_config, is_training=False) # 生成嵌入向量 output = model(transforms(img).unsqueeze(0)) # 输出形状为 (batch_size, num_features) print(f"嵌入向量维度: {output.shape}") # 应输出 (1, 768)方法二:使用forward_features获取中间特征
通过调用模型的forward_features方法,可以获取未经池化的中间特征,适用于需要更细粒度特征的场景。
from urllib.request import urlopen from PIL import Image import timm # 加载图像 img = Image.open(urlopen( 'https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/beignets-task-guide.png' )) # 创建模型(无需移除分类头) model = timm.create_model( 'vit_base_patch32_clip_384.openai_ft_in12k_in1k', pretrained=True, ) model = model.eval() # 获取图像变换 data_config = timm.data.resolve_model_data_config(model) transforms = timm.data.create_transform(**data_config, is_training=False) # 获取中间特征(未池化) output = model.forward_features(transforms(img).unsqueeze(0)) print(f"未池化特征维度: {output.shape}") # 输出 (1, 145, 768) # 进一步处理为最终嵌入向量 output = model.forward_head(output, pre_logits=True) print(f"最终嵌入向量维度: {output.shape}") # 输出 (1, 768)方法三:结合Hugging Face Transformers库使用
如果你熟悉Transformers库,也可以通过该库加载模型并生成嵌入向量(需确保已安装transformers库)。
from urllib.request import urlopen from PIL import Image from transformers import ViTImageProcessor, ViTModel # 加载图像处理器和模型 processor = ViTImageProcessor.from_pretrained('hf_mirrors/timm/vit_base_patch32_clip_384.openai_ft_in12k_in1k') model = ViTModel.from_pretrained('hf_mirrors/timm/vit_base_patch32_clip_384.openai_ft_in12k_in1k') # 加载并预处理图像 img = Image.open(urlopen( 'https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/beignets-task-guide.png' )) inputs = processor(images=img, return_tensors="pt") # 生成嵌入向量 with torch.no_grad(): outputs = model(**inputs) # 获取[CLS] token对应的特征作为嵌入向量 embedding = outputs.last_hidden_state[:, 0, :] print(f"嵌入向量维度: {embedding.shape}") # 输出 (1, 768)模型应用场景
生成的图像嵌入向量可广泛应用于:
- 图像检索:通过比较嵌入向量相似度实现相似图像搜索
- 零样本分类:结合文本嵌入进行跨模态分类
- 特征提取:作为其他下游任务的输入特征
- 迁移学习:在小数据集上进行微调以提高性能
注意事项
- 图像预处理:必须使用模型特定的预处理参数(可通过
data_config获取),包括归一化均值([0.48145466, 0.4578275, 0.40821073])和标准差([0.26862954, 0.26130258, 0.27577711]) - 模型加载:确保使用
pretrained=True加载预训练权重 - 性能优化:推理时使用
model.eval()和torch.no_grad()提高速度并减少内存占用
总结
vit_base_patch32_clip_384.openai_ft_in12k_in1k提供了灵活多样的图像嵌入向量生成方法,无论是通过timm库的简洁API,还是结合Transformers库的丰富功能,都能轻松获取高质量的图像特征。这些嵌入向量为计算机视觉任务提供了强大的基础,帮助开发者快速构建各类应用。
要开始使用该模型,可通过以下命令克隆仓库:
git clone https://gitcode.com/hf_mirrors/timm/vit_base_patch32_clip_384.openai_ft_in12k_in1k【免费下载链接】vit_base_patch32_clip_384.openai_ft_in12k_in1k项目地址: https://ai.gitcode.com/hf_mirrors/timm/vit_base_patch32_clip_384.openai_ft_in12k_in1k
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考