LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程
欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/144304351
免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。
LLaVA-CoT,是 思维链(Chain-of-Thought, CoT) 的视觉语言模型,通过自主的多阶段推理,提升系统化和结构化推理能力,实现深度思考,包含总结摘要(SUMMARY)、视觉解释(CAPTION)、逻辑推理(REASONING)、结论生成(CONCLUSION) 等 4 个阶段,提出 推理时阶段级束搜索(Inference-Time Stage-Level Beam Search) 方法,以实现有效的推理时扩展,结果表明在多模态推理基准测试中,超越基础模型和其他更大、甚至是闭源的模型。
Paper: LLaVA-CoT: Let Vision Language Models Reason Step-by-Step
GitHub: https://github.com/PKU-YuanGroup/LLaVA-CoT
git clone https://github.com/PKU-YuanGroup/LLaVA-CoT.git
准备模型(Llama-3.2V-11B-cot
)与训练数据(LLaVA-CoT-100k
),以及参考模型(Llama-3.2-11B-Vision-Instruct
):
Llama-3.2V-11B-cot
,40GLLaVA-CoT-100k
,159GLlama-3.2-11B-Vision-Instruct
,40G
cd [your path]/huggingface/# LLaVA-CoT 模型与数据
huggingface-cli download --token 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 Xkev/Llama-3.2V-11B-cot --local-dir Xkev/Llama-3.2V-11B-cot
huggingface-cli download --repo-type dataset --token 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 Xkev/LLaVA-CoT-100k --local-dir Xkev/LLaVA-CoT-100k# HuggingFace 需要权限
# huggingface-cli download --token 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 meta-llama/Llama-3.2-11B-Vision-Instruct --local-dir meta-llama/Llama-3.2-11B-Vision-Instruct
# ModelScope 模型
modelscope download --model fireicewolf/Llama-3.2-11B-Vision-Instruct --local_dir meta-llama/Llama-3.2-11B-Vision-Instruct
Meta 的 Llama-3.2-11B-Vision-Instruct 需要权限,建议下载 ModelScope 版本,即 fireicewolf/Llama-3.2-11B-Vision-Instruct
训练数据处理,参考 HuggingFace - Xkev/LLaVA-CoT-100k:
cat image.zip.part-* > image.zip # 速度较慢
unzip image.zip
训练集样式:
{"id": "f2813de1-767c-4e27-8ba8-e04fd383209d","image": "sqa/train/20839/image.png","conversations": [{"from": "human","value": "Which country is highlighted?\nContext: N/A\nOptions: (A) Solomon Islands (B) Nauru (C) Vanuatu (D) Fiji"}, {"from": "gpt","value": "<SUMMARY> I will determine the highlighted country by examining its location on the map and comparing it with the given options. I will then conclude if this country has any territorial disputes based on the supplied context. </SUMMARY>\n\n<CAPTION> The image depicts a map highlighting a country in the South Pacific region. The highlighted area is in a boxed section between Australia and New Zealand, directly addressing the region known to include several Pacific island countries. </CAPTION>\n\n<REASONING> The highlighted country is within the Pacific Islands region. Based on its position relative to neighboring larger landmasses like Australia and nearby countries such as Papua New Guinea and New Zealand, the highlighted country aligns with the location of Vanuatu. According to the context, Vanuatu has a territorial dispute over Matthew and Hunter Islands, claimed by both Vanuatu and France. Therefore, the presence of a dashed box labeled \"Disputed island\" suggests the inclusion of this dispute in the overview of the country's territories. </REASONING>\n\n<CONCLUSION> The answer is C. </CONCLUSION>"}]
}
即:
我将通过检查地图上的位置并与给定选项进行比较来确定高亮显示的国家。然后,我将根据提供的上下文得出这个国家是否有任何领土争端的结论。 图片显示了一张地图,高亮显示了南太平洋地区的一个国家。高亮区域位于澳大利亚和新西兰之间的一个框选部分,直接指向已知包含几个太平洋岛国的地区。 高亮显示的国家位于太平洋岛屿地区。根据其相对于邻近较大的陆地如澳大利亚和附近国家如巴布亚新几内亚及新西兰的位置,高亮显示的国家与瓦努阿图的位置相符。根据上下文,瓦努阿图对马修岛和亨特岛有领土争端,这两个岛屿由瓦努阿图和法国声称拥有。因此,标有“有争议的岛屿”的虚线框的存在表明将这一争端包含在国家领土的概览中。 答案是C。
测试模型,参考 使用 LLaMA-Factory 微调大模型 环境配置与训练推理:
cd [your path]/llm/LLaMA-Factory
conda activate llama_factoryunset https_proxy http_proxy# export GRADIO_ANALYTICS_ENABLED=False # 必须添加,否则报错
CUDA_VISIBLE_DEVICES=0 GRADIO_ANALYTICS_ENABLED=False API_PORT=7861 llamafactory-cli webchat \
--model_name_or_path [your path]/huggingface/Xkev/Llama-3.2V-11B-cot \
--template mllama# export GRADIO_ANALYTICS_ENABLED=False # 必须添加,否则报错
CUDA_VISIBLE_DEVICES=1 GRADIO_ANALYTICS_ENABLED=False API_PORT=7862 llamafactory-cli webchat \
--model_name_or_path [your path]/huggingface/meta-llama/Llama-3.2-11B-Vision-Instruct \
--template mllama
注意:两个模型,不能同时启动,需要分别启动。
LLaVA-CoT 能够生成 4 个不同的阶段:总结(SUMMARY)、描述(CAPTION)、推理(REASONING)、结论(CONCLUSION),即
- 总结(SUMMARY):模型对即将执行的任务进行简要概述。
- 描述(CAPTION):对图像中相关部分的描述(如果存在),重点介绍与问题相关的元素。
- 推理(REASONING):详细的分析,在此过程中,模型系统地考虑问题。
- 结论(CONCLUSION):简洁的答案总结,基于之前的推理提供最终答复。
LLaMA-Factory 的 ChatBot:
比较 LLaVA-CoT
与 Llama-Vision-Instruct
的输出差异,注意,默认模型,都没有使用 阶段级的束搜索(stage-level beam search),即只有1次推理:
LLaVA-CoT
:通过 SUMMARY(总结) - CAPTION(描述) - REASONING(推理) - CONCLUSION(结论) 等 4 步进行。Llama-Vision-Instruct
:通过直接推理流程。
LLaVA-CoT
如下:
I will analyze the image by focusing on the elements and composition to provide an accurate description that matches the standard answer. 我将分析图像,通过关注图像中的元素和构图,来提供准确的描述,以匹配标准答案。 The image features a person wearing a white shirt and a white face mask. They are sitting on a stool with a pink cushion. Their feet are adorned with white shoes featuring a decorative pattern. Next to them is a green stool, and a circular object is visible in the foreground. The scene is set against a white wall, creating a minimalist and modern aesthetic. 在图片中,人物穿着白色衬衫和白色罩衫。他们坐在带有粉色垫子的凳子上。他们的脚上穿着带有装饰图案的白色鞋子。在他们旁边是一个绿色的凳子,前景中可以看到一个圆形物体。场景设置在白色墙壁前,营造出简约而现代的美感。To describe the image, I will note the clothing and accessories, such as the white shirt, face mask, and shoes. I will also observe the seating arrangement, mentioning the stools and their colors. Additionally, I will describe the surrounding objects and the overall setting to capture the essence of the scene.
为了描述这张图片,我将注意服装和配饰,比如白色衬衫、罩衫和鞋子。我还将观察座位安排,提及凳子及其颜色。此外,我将描述周围的物体和整体环境,以捕捉场景的精髓。The image captures a serene moment in a minimalist, modern setting. A person, dressed in a crisp white shirt and a white face mask, is seated on a stool with a pink cushion. Their feet, clad in white shoes with a decorative pattern, rest on the ground. The person’s head is tilted back, and their arms are crossed over their chest, adding a sense of relaxation to the scene. The stool they sit on is green, providing a pop of color against the otherwise monochrome backdrop. A circular object, possibly a table or a decoration, sits in the foreground, adding depth to the image. The background is a stark white wall, devoid of any distractions, allowing the viewer’s focus to remain on the person and their surroundings. The overall composition of the image suggests a moment of quiet contemplation in a simple yet elegant environment.
图片捕捉了一个简约现代环境中的宁静时刻。一个穿着整洁白色衬衫和白色罩衫的人,坐在带有粉色垫子的凳子上。他们的脚上穿着带有装饰图案的白色鞋子,放在地上。这个人的头向后仰,双臂交叉在胸前,为场景增添了一种放松的感觉。他们坐的凳子是绿色的,在其他单色背景中提供了一抹色彩。一个圆形物体,可能是桌子或装饰品,位于前景,为图片增加了深度。背景是一面纯白色的墙壁,没有任何干扰,使观众的注意力保持在人物及其周围环境上。图片的整体构图暗示了一个在简单而优雅的环境中的沉思时刻。
Llama-Vision-Instruct
如下:
This image presents a close-up view of a woman’s legs and feet, dressed in a crisp white outfit and striking white high-heeled shoes with intricate white embellishments. She is seated on a stool, with her legs bent at the knees and her feet crossed at the ankles, as she leans back against the stool with her arms tucked behind her.
这张图片展示了一位女性的腿部和脚部的特写视角,她穿着一套清爽的白色服装,搭配着引人注目的白色高跟鞋,鞋子上装饰着复杂的白色装饰。她坐在一个凳子上,双腿在膝盖处弯曲,双脚在脚踝处交叉,同时她向后靠在凳子上,双臂藏在身后。The stool features a soft pink cushion and a light-colored wooden frame, situated in front of a mint green stool. The room’s white walls and shiny white floor provide a clean and minimalist backdrop, while the sunlight streaming through the window casts a warm glow on the scene.
凳子上有一个柔软的粉色垫子和一个浅色的木制框架,位于一个薄荷绿色的凳子前面。房间的白色墙壁和闪亮的白色地板提供了一个干净且简约的背景,而透过窗户照射进来的阳光为场景增添了温暖的光辉。
HuggingFace的在线测试网站:Llama-3.2V-11B-cot
LLaVA-COT 使用阶段级束搜索方法,在每个阶段(即总结、描述、推理、结论)中,生成多个候选结果,选择(使用LLM选择),其中最优的一个来继续生成过程,即,推理时阶段级的束搜索(Inference-Time Stage-Level Beam Search) 方法 ,需要集成至 VLMEvalKit 使用,源码如下:
def judge(self, image, prompt, outputs, type="summary")
即 Judge 函数,也是通过大模型进行处理。
# 定义一个函数,用于生成内部阶段的文本输出
def generate_inner_stage_beam(self, message, dataset=None):# 将传入的消息转换为提示和图片路径prompt, image_path = self.message_to_promptimg(message, dataset=dataset)# 打开图片文件image = Image.open(image_path)# 创建一个包含用户角色和内容的消息列表,内容中包含图片和文本messages = [{'role': 'user', 'content': [{'type': 'image'},{'type': 'text', 'text': prompt}]}]# 应用聊天模板并添加生成提示input_text = self.processor.apply_chat_template(messages, add_generation_prompt=True)# 将图片和文本输入处理成模型需要的格式,并转移到指定的设备(如GPU)inputs = self.processor(image, input_text, return_tensors='pt').to(self.device)# 如果不使用自定义提示,则根据不同的数据集类型设置最大新令牌数if not self.use_custom_prompt(dataset):if DATASET_TYPE(dataset) == 'MCQ' or DATASET_TYPE(dataset) == 'Y/N':self.kwargs['max_new_tokens'] = 2048else:self.kwargs['max_new_tokens'] = 2048# 定义不同的阶段和对应的结束标记stages = ['<SUMMARY>', '<CAPTION>', '<REASONING>', '<CONCLUSION>']end_markers = ['</SUMMARY>', '</CAPTION>', '</REASONING>', '</CONCLUSION>']# 获取输入ID的初始长度initial_length = len(inputs['input_ids'][0])# 深拷贝输入IDinput_ids = copy.deepcopy(inputs['input_ids'])# 遍历每个阶段和结束标记for stage, end_marker in zip(stages, end_markers):# 定义停止条件,当生成的文本包含结束标记时停止stop_criteria = StoppingCriteriaList([StopOnStrings([end_marker], self.processor.tokenizer)])# 初始化候选生成文本列表candidates = []# 生成10个候选文本for _ in range(10): generation_kwargs = self.kwargs.copy()generation_kwargs.update({'stopping_criteria': stop_criteria})# 将图片和当前输入ID处理成模型需要的格式,并转移到指定的设备inputs = self.processor(image, input_ids, return_tensors='pt').to(self.device)# 使用模型生成文本output = self.model.generate(**inputs, **generation_kwargs)# 获取新生成的IDnew_generated_ids = output[0]# 解码生成的文本generated_text = self.processor.tokenizer.decode(new_generated_ids[initial_length:], skip_special_tokens=True)# 将生成的ID和文本添加到候选列表candidates.append({'input_ids': new_generated_ids.unsqueeze(0),'generated_text': generated_text,})# 通过比较和选择,从候选列表中选择最佳的文本while(len(candidates) > 1):# 随机选择两个候选文本candidate1 = candidates.pop(np.random.randint(len(candidates)))candidate2 = candidates.pop(np.random.randint(len(candidates)))outputs = [candidate1['generated_text'], candidate2['generated_text']]# 根据阶段类型和图片、提示、输出文本,选择最佳文本best_index = self.judge(image, prompt, outputs, type=stage[1:-1].lower())if best_index == 0:candidates.append(candidate1)else:candidates.append(candidate2)# 更新输入ID为最佳候选的IDinput_ids = candidates[0]['input_ids']# 解码最终的输出文本final_output = self.processor.tokenizer.decode(input_ids[0][initial_length:], skip_special_tokens=True)# 返回最终输出的文本return final_output
参考:
- 视频工具:视频下载、视频帧、视频去水印
- GitHub - how to use the inference_demo.py
- GitHub - Meta-Llama/llama-recipes
- GitHub - open-compass/VLMEvalKit
相关文章:

LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144304351 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 LLaVA-…...

Ansible的yum和saltstack的哪个功能相似
Ansible的yum和saltstack的哪个功能相似 在 Ansible 和 SaltStack 中,Ansible 的 yum 模块 和 SaltStack 的 pkg 模块 功能相似。它们都用于管理软件包,支持安装、升级、删除和查询等操作。 Ansible 的 yum 模块 用途: 专门用于基于 Red Hat …...
paimon0.9记录
启动paimon -- 本地模式演示 bin/start-cluster.sh-- 启动sqlclient bin/sql-client.sh示例 -- 创建catalog,每次都要创建,创建一个已经存在的catalog相当于使用 CREATE CATALOG fs_catalog WITH (typepaimon,warehousefile:/data/soft/paimon/catalog…...
Java 中 List 接口的学习笔记
1. 什么是 List? 在 Java 中,List 是一个接口,属于 Java Collections Framework。它表示一个有序的集合,可以包含重复元素。List 接口允许通过索引访问元素,提供了多种实现方式,如 ArrayList 和 LinkedLis…...

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画
图片相册这种动画效果也很常见,在我们的网站上。鼠标滑入放大图片,滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】,里面有大量的css3动画效果制作原生知识分析&…...
LVGL9 定时器模块
文章目录 前言定时器系统概述特点 定时器的创建函数:lv_timer_create函数:lv_timer_create_basic 定时器的控制函数:lv_timer_ready函数:lv_timer_reset 定时器的参数设置函数:lv_timer_set_cb函数:lv_time…...

Qt学习笔记第51到60讲
第51讲 记事本实现打开功能 回到第24个功能文件Notepad,给UI中的各个控件添加槽函数。 ①开始按钮 void Widget::on_btnOpen_clicked() {QString fileNameQFileDialog::getOpenFileName(this,tr("Open File"),"E:\\6_Qt Projects\\24_Notepad\\fi…...

网页设计--axios作业
根据以下mock地址中的json数据,使用axios异步方式获取并显示在页面中。 https://apifoxmock.com/m1/3761592-3393136-default/peotfindAll?apifoxApiId171582689 {"code": 1,"msg": "success","data": [{"id": …...
SpringBoot 整合 Avro 与 Kafka 详解
SpringBoot 整合 Avro 与 Kafka 详解 在大数据处理和实时数据流场景中,Apache Kafka 和 Apache Avro 是两个非常重要的工具。Kafka 作为一个分布式流处理平台,能够高效地处理大量数据,而 Avro 则是一个用于序列化数据的紧凑、快速的二进制数…...

若依 ruoyi VUE el-select 直接获取 选择option 的 label和value
1、最新在研究若依这个项目,我使用的是前后端分离的方案,RuoYi-Vue-fast(后端) RuoYi-Vue-->ruoyi-ui(前端)。RuoYi-Vue-fast是单应用版本没有区分那么多的modules 自己开发起来很方便,这个项目运行起来很方便,但是需要自定义的…...

大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

修改MySQL存储路径
1.查看原路径 show variables like ‘%datadir%’; 2.停止MYSQL 以管理员身份运行命令提示符 net stop MySQL84 在服务中直接停止MySQL 3.编辑配置文件 可能会遇到无权限修改,可以先修改my.ini的权限。可以通过:右键my.ini → 属性 → 安全→ 编辑 …...

Git常用的命令【提交与回退】
git分布式版本控制系统 (SVN集中式版本控制系统)之间的对比 git有本地仓库和远程仓库,不同的开发人员可以分别提交自己的本地仓库并维护代码的版本控制。 然后多个人员在本地仓库协作的代码,可以提交到远程仓库中做整合。 git本…...

详解:HTTP/HTTPS协议
HTTP协议 一.HTTP是什么 HTTP,全称超文本传输协议,是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP往往是基于传输层TCP协议实现的,采用的一问一答的模式,即发一个请求,返回一个响应。 Q:什…...

0.96寸OLED---STM32
一、简介 OLED:有机发光二极管 OLED显示屏:性能优异的新型显示屏,具有功耗低(相比LCD不需要背光源,每一个节点当度发光)、响应速度快、宽视角(自发光,从任何视角看都比较清晰&…...

保姆级教学 uniapp绘制二维码海报并保存至相册,真机正常展示图片二维码
一、获取二维码 uni.request({url: https://api.weixin.qq.com/wxa/getwxacode?access_token${getStorage("token")},responseType: "arraybuffer",method: "POST",data: {path: "/pages/index/index"},success(res) {// 转换为 Uint…...
常用Vim操作
vimrc配置 ctags -R * 生成tags文件 set number set ts4 set sw4 set autoindent set cindent set tag~/tmp/log/help/tags 自动补全: ctrln:自动补全 输入: a:从当前文字后插入i:从当前文字前插入s: 删除当前字…...

【C#】NET 9中LINQ的新特性-CountBy
前言 在 .NET 中,使用 LINQ 对元素进行分组并计算它们的出现次数时,需要通过两个步步骤。首先,使用 GroupBy方法根据特定键对元素进行分类。然后,再计算每个组元素包含个数。而随着 .NET 9 版本发布,引入了一些新特性。其中 LINQ 引入了一种新的方法 CountBy,本文一起来了…...

Trimble X9三维激光扫描仪高效应对化工厂复杂管道扫描测绘挑战【沪敖3D】
化工安全关系到国计民生,近年来随着化工厂数字化改革不断推进,数字工厂逐步成为工厂安全管理的重要手段。而化工管道作为工厂设施的重要组成部分,由于其数量多、种类繁杂,一直是企业管理的重点和难点。 传统的化工管廊往往缺乏详…...

【数据结构】文件和外部排序
外部排序 外存信息的存取 计算基本存储方式 内部存储(主存):断电后数据会丢失,访问速度快,成本高容量通常较小外部存储(辅存):断电后数据不会丢失,访问速度较慢&#x…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...