当前位置: 首页 > news >正文

[CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 视觉模型篇

[CLIP-VIT-L + Qwen] 多模态大模型学习笔记 - 5

  • 前情提要
  • 源码解读(visualModel类)
    • init函数
      • 整体含义
      • 逐行解读
    • get_image_features函数(重构)
      • 整体含义
      • 逐行解读
    • main函数
      • 整体含义
      • 逐行解读

参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE

前情提要

有关多模态大模型架构中的语言模型部分(MQwen.py)的代码请看(多模态大模型源码阅读 - 1、 多模态大模型源码阅读 - 2, 多模态大模型源码阅读 - 3,多模态大模型源码阅读 - 4)
本节中将阅读视觉模型部分,即重构后的visual-encoder的源码,位于文件夹visual下的CLIP_VIT.py文件,模型选择的是clip-vit-large-patch14。

源码解读(visualModel类)

init函数

class visualModel(CLIPModel):def __init__(self, config: CLIPConfig):super().__init__(config)

整体含义

利用传入的通用配置模型参数初始化父类。

逐行解读

class visualModel(CLIPModel):def __init__(self, config: CLIPConfig):super().__init__(config)

定义一个继承CLIPModel成员变量和成员方法的visualModel类,在python3.5之后,可以对传递参数的类型进行注解,这里的CLIPModel是一个特定的自定义参数类型,用于指定传入的config参数是CLIPConfig类型,并使用传递的一般配置参数初始化父类。

get_image_features函数(重构)

    @add_start_docstrings_to_model_forward(CLIP_VISION_INPUTS_DOCSTRING)def get_image_features(self,pixel_values: Optional[torch.FloatTensor] = None,output_attentions: Optional[bool] = None,output_hidden_states: Optional[bool] = None,return_dict: Optional[bool] = None,) -> torch.FloatTensor:# Use CLIP model's config for some fields (if specified) instead of those of vision & text components.output_attentions = output_attentions if output_attentions is not None else self.config.output_attentionsoutput_hidden_states = (output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states)return_dict = return_dict if return_dict is not None else self.config.use_return_dictvision_outputs = self.vision_model(pixel_values=pixel_values,output_attentions=output_attentions,output_hidden_states=output_hidden_states,return_dict=return_dict,)pooled_output = vision_outputs.last_hidden_state  # pooled_output# print(pooled_output.shape)return pooled_output

整体含义

经典的特征提取函数,对传入的像素值进行特征提取,并用于后续进一步的处理。重构的目的在于让操作更灵活,可以使用自定义输入和直接获取池化输出。

逐行解读

    @add_start_docstrings_to_model_forward(CLIP_VISION_INPUTS_DOCSTRING)def get_image_features(self,pixel_values: Optional[torch.FloatTensor] = None,output_attentions: Optional[bool] = None,output_hidden_states: Optional[bool] = None,return_dict: Optional[bool] = None,) -> torch.FloatTensor:

这里的装饰器是为了给函数添加文档字符串,其中CLIP_VISION_INPUTS_DOCSTRING从transformers.models.clip.modeling_clip导入,这个装饰器可有可无,不必在意。
pixel_values:一个包含图像像素值的浮点数张量
其余的三个参数结尾bool值类型参数,分别代表是否输出注意力权重,是否输出每一层的隐藏层状态,返回值形式是否为字典类型。

    # Use CLIP model's config for some fields (if specified) instead of those of vision & text components.output_attentions = output_attentions if output_attentions is not None else self.config.output_attentionsoutput_hidden_states = (output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states)return_dict = return_dict if return_dict is not None else self.config.use_return_dict

这段代码主要判断是使用传入的参数还是使用配置中的默认参数,保证既可以自定义参数,也可以和配置参数保持一致。

        vision_outputs = self.vision_model(pixel_values=pixel_values,output_attentions=output_attentions,output_hidden_states=output_hidden_states,return_dict=return_dict,)

调用成员变量vision_model处理像素信息,并输出包含多个返回值的vision_outputs,传递入的参数在前文已经说明,这里不再赘述。

        pooled_output = vision_outputs.last_hidden_state  # pooled_output# print(pooled_output.shape)return pooled_output

获取最后一个时间步的隐藏层状态作为池化输出,并将其返回。这个隐藏层状态包含了模型对输入图像的压缩表示或汇总特征。

main函数

def main():modle_path = "F:/huggingface_model/clip-vit-large-patch14"model = visualModel.from_pretrained(modle_path)processor = CLIPProcessor.from_pretrained(modle_path)test_img = Image.open("D:/code/multimodal/data/000000391895.jpg")P_input = processor(images=test_img, return_tensors="pt")print(model.get_image_features(**P_input).shape)

整体含义

一个完整的测试流程,加载图像后利用processer预处理图像获得像素信息,并用视觉模型根据传入的像素信息提取图片特征。

逐行解读

def main():modle_path = "huggingface_model/clip-vit-large-patch14"model = visualModel.from_pretrained(modle_path)processor = CLIPProcessor.from_pretrained(modle_path)test_img = Image.open("D:/code/multimodal/data/000000391895.jpg")P_input = processor(images=test_img, return_tensors="pt")print(model.get_image_features(**P_input).shape)

这里的model_path可以是自己下载的文件夹,也可以直接从huggingface上加载(需要魔法),使用模型地址加载processor和model,加载测试图片后用processor获取图片像素信息,之后会重构后的模型提取池化特征输出表示。
至此,visual_model中的CLIP-VIT源码阅读完毕,有关项目中的另一个视觉模型SIGLIP模型有兴趣的童鞋可以自行阅读。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • golang(go语言)打包成带图标的 exe 可执行文件
  • WPS宏实现Sheet页拆分功能
  • 小编需复盘,写练习
  • 数采网关面临的安全挑战
  • 保研考研机试攻略:第六章——搜索(2)
  • docker映射了端口,宿主机不生效
  • 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式
  • SpringBoot集成kafka-获取生产者发送的消息(阻塞式和非阻塞式获取)
  • 1111111111
  • 微服务:网关路由和登录校验
  • 计算机视觉与视觉大模型对板书检测效果对比
  • 上线eleme项目
  • 怎么整合spring security和JWT
  • 【Unity3D小技巧】Unity3D中实现FPS数值显示功能实现
  • CSS 的了解text-rendering属性
  • 时间复杂度分析经典问题——最大子序列和
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 2019.2.20 c++ 知识梳理
  • classpath对获取配置文件的影响
  • JavaScript设计模式之工厂模式
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Mysql5.6主从复制
  • Python利用正则抓取网页内容保存到本地
  • Spring核心 Bean的高级装配
  • TCP拥塞控制
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 给github项目添加CI badge
  • 理解在java “”i=i++;”所发生的事情
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 异常机制详解
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #define 用法
  • (42)STM32——LCD显示屏实验笔记
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (动态规划)5. 最长回文子串 java解决
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)ssm高校实验室 毕业设计 800008
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)jdk与jre的区别
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 给NuGet包添加Readme
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .netcore 获取appsettings
  • .net项目IIS、VS 附加进程调试
  • .net中调用windows performance记录性能信息
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @TableId注解详细介绍 mybaits 实体类主键注解