第九节 基于huggingface加载openai/clip-vit-large-patch14-336视觉模型demo

这篇博客介绍了如何利用huggingface库加载和使用openai/clip-vit-large-patch14-336视觉模型,包括模型加载、梯度更新、图像预处理、模型推理的步骤,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


引言

本文介绍如何使用huggingface加载视觉模型openai/clip-vit-large-patch14-336,我之所以记录此方法源于现有大模型基本采用huggingface库来加载视觉模型和大语言模型,我也是在做LLaVA模型等模型。基于此,本节将介绍如何huggingface如何加载vit视觉模型。

一、模型加载

使用huggingface模型加载是非常简单,其代码如下:

from transformers import CLIPVisionModel, CLIPImageProcessor


if __name__ == '__main__':
    vit_path='D:/clip-vit-large-patch14-336'
    img_path='dogs.jpg'

    image_processor = CLIPImageProcessor.from_pretrained(vit_path)  # 加载图像预处理
    vision_tower = CLIPVisionModel.from_pretrained(vit_path)  # 加载图像模型
    vision_tower.requires_grad_(False)  # 模型冻结

    for name, param in vision_tower.named_parameters():
        print(name, param.requires_grad)

二、huggingface梯度更新使用

一般视觉模型需要冻结,使用lora训练,那么我们需要如何关闭视觉模型梯度。为此,我继续探讨梯度设置方法,其代码如下:

    vision_tower.requires_grad_(False)  # 模型冻结

    for name, param in vision_tower.named_parameters():
        print(name, param.requires_grad)

以上代码第一句话是视觉模型梯度冻结方法,下面2句是验证梯度是否冻结。如果设置’‘vision_tower.requires_grad_(False)’'表示冻结梯度,如果不设置表示需要梯度传播。我将不在介绍了,若你想详细了解,只要执行以上
代码便可知晓。

三、图像处理

在输入模型前,我们需要对图像进行预处理,然huggingface也很人性的自带了对应视觉模型的图像处理,我们只需使用PIL实现图像处理,其代码如下:

    image = Image.open(img_path).convert('RGB')  # PIL读取图像
    def expand2square(pil_img, background_color):
        width, height = pil_img.size  # 获得图像宽高
        if width == height:  # 相等直接返回不用重搞
            return pil_img
        elif width > height:  # w大构建w尺寸图
            result = Image.new(pil_img.mode, (width, width), background_color)
            result.paste(pil_img, (0, (width - height) // 2))  # w最大,以坐标x=0,y=(width - height) // 2位置粘贴原图
            return result
        else:
            result = Image.new(pil_img.mode, (height, height), background_color)
            result.paste(pil_img, ((height - width) // 2, 0))
            return result


    image = expand2square(image, tuple(int(x * 255) for x in image_processor.image_mean))
    image = image_processor.preprocess(image, return_tensors='pt')['pixel_values'][0]

四、模型推理

最后就是模型推理,其代码如下:

    image_forward_out = vision_tower(image.unsqueeze(0),    output_hidden_states=True)

    feature = image_forward_out['last_hidden_state']

    print(feature.shape)

但是,我想说输出包含很多内容,其中hidden_states有25个列表,表示每个block输出结果,而hidden_states的最后一层与last_hidden_states值相同,结果分别如下图:

在这里插入图片描述

hidden_states与last_hidden_states对比如下:
在这里插入图片描述

五、整体代码

from transformers import CLIPVisionModel, CLIPImageProcessor

from PIL import Image


if __name__ == '__main__':
    vit_path='E:/clip-vit-large-patch14-336'
    img_path='dogs.jpg'

    image_processor = CLIPImageProcessor.from_pretrained(vit_path)  # 加载图像预处理
    vision_tower = CLIPVisionModel.from_pretrained(vit_path)  # 加载图像模型
    vision_tower.requires_grad_(False)  # 模型冻结

    for name, param in vision_tower.named_parameters():
        print(name, param.requires_grad)

    image = Image.open(img_path).convert('RGB')  # PIL读取图像

    def expand2square(pil_img, background_color):
        width, height = pil_img.size  # 获得图像宽高
        if width == height:  # 相等直接返回不用重搞
            return pil_img
        elif width > height:  # w大构建w尺寸图
            result = Image.new(pil_img.mode, (width, width), background_color)
            result.paste(pil_img, (0, (width - height) // 2))  # w最大,以坐标x=0,y=(width - height) // 2位置粘贴原图
            return result
        else:
            result = Image.new(pil_img.mode, (height, height), background_color)
            result.paste(pil_img, ((height - width) // 2, 0))
            return result


    image = expand2square(image, tuple(int(x * 255) for x in image_processor.image_mean))
    image = image_processor.preprocess(image, return_tensors='pt')['pixel_values'][0]

    image_forward_out = vision_tower(image.unsqueeze(0),    output_hidden_states=True)

    feature = image_forward_out['last_hidden_state']

    print(feature.shape)

总结

本文是一个huggingface加载视觉模型的方法,另一个重点是梯度冻结。然而,我只代表VIT模型是如此使用,其它模型还未验证,不做任何说明。

### 解决方案概述 当遇到 `openai/clip-vit-large-patch14` 加载失败的问题时,通常是因为缺少必要的预训练权重文件或依赖项配置不正确。以下是针对该问题的具体解决方案[^2]。 #### 方法一:手动下载并缓存模型文件 如果自动加载器无法获取到所需的模型资源,则可以选择手动下载这些资源,并将其放置于本地缓存目录下: 1. 访问 Hugging Face 官方页面上的 [CLIP ViT-Large-Patch14](https://huggingface.co/openai/clip-vit-large-patch14/tree/main),找到对应的 PyTorch 权重文件和其他必要组件; 2. 下载所有必需的 `.bin`, `.json` 文件以及任何其他相关联的数据集描述符; 3. 将上述文件复制至 Python 环境中的 transformers 库默认使用的缓存路径内,默认情况下位于用户主目录下的 `.cache/huggingface/transformers/models--openai--clip-vit-large-patch14/snapshots/<commit_id>/` 中; 通过这种方式绕过了网络请求过程中的潜在障碍,从而提高了成功加载的可能性。 ```bash mkdir -p ~/.cache/huggingface/transformers/models--openai--clip-vit-large-patch14/snapshots/ cd ~/.cache/huggingface/transformers/models--openai--clip-vit-large-patch14/snapshots/ wget https://cdn.huggingface.co/openai/clip-vit-large-patch14/pytorch_model.bin ``` #### 方法二:更新环境变量设置 另一种可能的原因在于某些特定版本之间的兼容性差异所引起的冲突。此时可以通过调整环境变量来尝试解决问题: - 设置 `TRANSFORMERS_OFFLINE=1` 可以强制使用离线模式,在这种状态下只会查找已经存在于本地磁盘上的模型实例而不试图连接互联网; - 或者指定确切的目标提交哈希值作为参数传递给 Tokenizer 和 Model 的初始化函数调用,以此确保获得完全匹配的一致副本。 ```python import os os.environ["TRANSFORMERS_OFFLINE"] = "1" from transformers import CLIPProcessor, CLIPTokenizer, CLIPModel processor = CLIPProcessor.from_pretrained("openai/clip-vit-large-patch14", revision="main") model = CLIPModel.from_pretrained("openai/clip-vit-large-patch14", revision="main") tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14", revision="main") ``` 以上两种方式均有助于克服因网络状况不佳或其他因素造成的加载难题。对于大多数情况而言,采用其中任意一种策略都应能有效缓解乃至彻底消除此类异常现象的发生概率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangjunjun-owen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值