(2024,IXC2-4KHD,LVLM,动态图像分割,高分辨率图像处理)InternLM-XComposer2-4KHD

InternLM-XComposer2-4KHD: A Pioneering Large Vision-Language Model Handling Resolutions from 336 Pixels to 4K HD

公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群)

目录

0. 摘要

3. 方法

3.1 模型架构

3.2 高分辨率输入

3.3 预训练

3.4 4KHD 监督微调

4. 实验


0. 摘要

大型视觉-语言模型(Large Vision-Language Model,LVLM)领域取得了显著的进展,但由于分辨率有限,对细粒度视觉内容的理解受到了挑战。最近的努力旨在提高 LVLM 的高分辨率理解能力,但它们仍然受到了约 1500×1500 像素的限制,并且受到了相对狭窄的分辨率范围的限制。本文介绍了 InternLMXComposer2-4KHD,这是对提高 LVLM 分辨率能力的突破性探索,将 LVLM 分辨率能力提升到 4K HD(3840×1600)甚至更高。与此同时,考虑到超高分辨率可能并非在所有场景中都是必要的,它支持从 336 像素到 4K 标准的广泛分辨率范围,显著扩大了其适用范围。具体来说,本研究通过引入一种新的扩展来推进补丁划分范式:动态分辨率与自动补丁配置。它保持了训练图像的宽高比,同时根据预训练的 ViT(336×336)自动变化补丁数量并配置布局,从而实现了从 336 像素到 4K 标准的动态训练分辨率。我们的研究表明,将训练分辨率扩展到 4K HD 可以持续提升性能,而不会达到改进的上限。InternLM-XComposer2-4KHD 在 16 项基准测试中表现出出色的能力,在其中 10 项中与甚至超过了 GPT-4V 和 Gemini Pro。

项目页面:https://github.com/InternLM/InternLM-XComposer

3. 方法

3.1 模型架构

InternLM-XComposer2-4KHD 的模型架构主要遵循 InternLM-XComposer2 的设计(以下简称为 XComposer2),包括一个轻量级的视觉编码器 OpenAI ViT-Large/14、大型语言模型 InternLM2-7B 和 Partial LoRA 用于有效的对齐。我们建议读者参考 XComposer2 论文以获取更多细节。

(2024,MLLM,视觉语言模型,用于模态对齐的部分 LoRA)InternLM-XComposer2

3.2 高分辨率输入

动态图像分割(Dynamic Image Partition)。对于处理高分辨率图像,特别是具有不同宽高比的图像,将静态输入图像大小视为固定不变的方法既不高效也不有效。为了克服这一限制,我们引入了一种动态图像分割方法,如图 4 所示。我们的方法在保持原始图像宽高比完整性的同时,策略性地将图像分割成较小的补丁(patch)。

给定最大分割数 H,尺寸为 [h,w] 的图像 x 被调整大小并填充到尺寸为 [ph × 336, pw × 336] 的新图像 ˆx。此过程受以下约束条件的限制:

这里的 pw 和 ph 分别表示每行和每列的补丁数。然后我们将 ˆx 分成 ph × pw 个不重叠的补丁。每个补丁是一个尺寸为 336×336 的小图像,我们将这些补丁视为 ViT 的单独输入。 接下来,我们使用 'HD-H' 表示具有 H 补丁约束的高分辨率设置。例如,'HD-9' 允许最多 9 个补丁,包括一系列分辨率,如 1008×1008、672×1344、336×3024 等。

全局-局部格式。对于每个输入图像,我们向模型展示两种视图。第一种是全局视图,在此视图中,图像被调整为固定大小(在我们的情况下为 336×336)。这提供了对图像的宏观理解。根据经验,我们发现这对于 LVLM 正确理解图像至关重要。第二种视图是局部视图。我们使用先前提到的动态图像分割策略将图像分割成补丁,并从每个补丁中提取特征。在特征提取后,将这些补丁重新组合成一个大的特征图。然后,在一个简单的 token 合并过程后,对特征图进行扁平化处理,得到最终的局部特征。

图像 2D 结构换行指示符。鉴于图像具有 2D 结构且图像比例是动态的,每行的标记数可能在不同图像之间变化。这种变化可能会让 LVLM 感到困惑,使其难以确定哪些标记属于图像的同一行,哪些属于下一行。这种混淆可能会妨碍 LVLM 理解图像的 2D 结构,而这对于理解文档、图表和表格等结构化图像内容至关重要。为了解决这个问题,我们在扁平化之前在每行图像特征的末尾引入了一个可学习的换行('\n')标记。最后,我们将全局和局部视图连接起来,在它们之间插入一个特殊的 'separate' 标记以区分这两种视图。  

3.3 预训练

在预训练阶段,LLM 被冻结,而视觉编码器和 Partial LoRA 被微调以将视觉 token 与 LLM 对齐。预训练数据主要遵循 XComposer2 中的设计,考虑了三个目标:1)一般语义对齐,2)世界知识对齐,3)视觉能力增强。在本文中,我们专注于高分辨率和结构化图像理解。因此,我们收集了更多相关数据以增强这一特定能力。如表 1 所示,我们利用了一个多样的 OCR 数据集来实现这个目标。

在实践中,我们使用 OpenAI CLIP ViT-L-14-336 作为视觉编码器。与 XComposer2 不同,我们保持 ViT 的分辨率为 336×336,并增加输入分辨率以增加更多的补丁。对于动态图像分割策略,我们使用 'HD-25'。对于每个图像或补丁,通过简单的合并操作将图像 token 数量减少到原来的 1/4。我们将附近的 4 个 token 通过通道维度合并成一个新的 token,然后通过 MLP 将其与 LLM 对齐。'separate' 和 '\n' 标记是随机初始化的。对于 Partial LoRA,我们为 LLRM 解码器块中的所有线性层设置了秩为 256。我们的训练过程使用 batch 大小为 4096,并跨越 2 个 epochs。学习率在前 1% 的训练步骤中线性增加到 2 × 10^(-4)。在此之后,根据余弦衰减策略将其减少到 0。为了保留视觉编码器的预先存在的知识,我们应用了一种逐层学习率(layer-wise learning rate,LLDR)衰减策略,衰减因子设置为 0.90。

3.4 4KHD 监督微调

在预训练之后,我们增强模型的理解高分辨率图像和解决各种挑战。与先前的感知任务(例如 VQAv2、GQA)不同,这些任务通常根据图像中显著的对象来回答问题。OCR 相关任务依赖于对高分辨率图像中文本的详细理解。例如,在 InfoVQA 中,50% 的图像中较长边的长度超过了 2000 像素。低分辨率的输入可能会扭曲密集的文本信息,导致模型在理解上失败。然而,我们观察到了上述感知任务中的分辨率饱和问题,其中分辨率的影响变得可以忽略不计。

为了解决这个问题,我们引入了一种混合分辨率训练策略以实现更高效的训练。对于需要高分辨率的任务,在训练期间我们使用 'HD-55' 设置。这允许输入 4K(3840×1600)图像而不需要额外的图像压缩。这些任务在表 2 中被称为 HD-OCR QA 任务。对于其他任务,我们实现了动态分辨率策略。图像被调整大小以在其原始大小和由 'HD25' 设置指定的大小之间。这种动态方法增强了 LVLM 对输入分辨率差异的稳健性,从而使 LVLM 在推理期间能够利用更大的分辨率。例如,当 LVLM 在 'HD25' 设置下训练时,我们观察到使用 'HD30' 设置在大多数 OCR 相关任务上产生更好的结果。

在实践中,我们联合训练所有组件,batch 大小为 2048,跨越 3500 个步骤。我们以加权的方式对来自多个来源的数据进行抽样,权重基于每个来源的数据量。由于 'HD-55' 具有 'HD-25' 的双倍的图像 token 数量,我们调整了数据加载器以为它们启用不同的 batch 大小,并相应地调整它们的权重。最大学习率设置为 5×10^-5,并且每个组件都有自己独特的学习策略。对于视觉编码器,我们将 LLDR 设置为 0.9,这与预训练策略一致。对于 LLM,我们采用固定的学习率缩放因子为 0.2。这会减缓 LLM 的更新速度,实现保留其原始能力和与视觉知识对齐之间的平衡。 

4. 实验

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/542845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序算法之快速排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性快速排序O( N N N log ⁡ 2 N \log_{2}N log2​N)O( N N N log ⁡ 2 N \log_{2}N log2​N)O(n^2)O( log ⁡ 2 N \log_{2}N log2​N)In-place不稳定 稳…

llamafactory:unified efficient fine-tuning of 100+ lanuage models

1.introduction llamafactory由三个主要模块组成,Model Loader,Data Worker,Trainer。 2.Efficient fine-tuning techniques 2.1 Efficient Optimization 冻结微调:冻结大部分参数,同时只在一小部分解码器层中微调剩…

算法1: 素数个数统计

统计n以内的素数个数 素数:只能被1和自身整除的自然数,0和1除外; 举例: 输入:100 输出:25 import java.util.*; class Test1{public static void main(String[] args){int a 100; //输入数字//…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 格式化输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字…

Linux/October

October Enumeration Nmap 扫描发现对外开放了22和80端口,使用nmap详细扫描这两个端口 ┌──(kali㉿kali)-[~/vegetable/HTB/October] └─$ nmap -sC -sV -p 22,80 -oA nmap 10.10.10.16 Starting Nmap 7.…

SLA——让你的信息更安全

在单一的静态密码登录验证机制下,非法入侵者若窃听到Windows桌面登录账号的用户名和密码,便可通过合法权限访问内部系统,此时企业信息安全将面临严峻挑战。 企业为了防止账号信息泄露,通常会强制要求员工定期更换登录密码&#x…

java下载网络上的文件、图片保存到本地 FileUtils

java下载网络上的文件、图片保存到本地 FileUtils 1. 引入FileUtils依赖2. 实现代码3. 输出结果 1. 引入FileUtils依赖 <!--FileUtils依赖--> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency><groupId>commons-io&l…

Linux文本编辑器vim使用和分析—6

目录 1.对vim的简单理解&#xff1a; 2.看待vim的视角&#xff1a; 3.命令模式&#xff1a; 3.1vim被打开后默认的模式&#xff1a; 3.2命令模式切换插入模式&#xff1a; 3.3其他模式回到命令模式&#xff1a; 3.4光标定位&#xff1a; 4.插入模式(编辑模式)&#xff1…

【从浅学到熟知Linux】程序地址空间分布与进程地址空间详谈(含虚拟地址到物理地址的映射)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 程序地址空间概览进程地址空间 程序地址空间概览 我们在执行一个C语言程序时&#xff0c;它包含代码、变量…

【Canvas与艺术】绘制灰白黑鱼鳞纹“Premium Quality”标志

【关键点】 环状鱼鳞纹的制作 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>灰白黑鱼鳞纹Premium Quality标志&…

Linux ARM平台开发系列讲解(QEMU篇) 1.2 新添加一个Linux kernel设备树

1. 概述 上一章节我们利用QEMU成功启动了Linux kernel,但是细心的小伙伴就会发现,我们用默认的defconfig是没有找到设备树源文件的,但是又发现kernel启动时候它使用了设备树riscv-virtio,qemu,这是因为qemu用了一个默认的设备树文件,该章节呢我们就把这个默认的设备树文件…

12-LINUX--进程间的通信

进程间通信&#xff1a;采用IPC机制&#xff08;进程间的用户空间相互独立&#xff0c;内核空间共享&#xff09;&#xff0c;有管道&#xff0c;信号量&#xff0c;共享内存&#xff0c;消息队列&#xff0c;套接字。 一.管道 管道可以用来在两个进程之间传递数据&#xff0c…

Java8 收集Stream流中的结果

目录 Stream流中的结果到集合中 Stream流中的结果到数组中 对流中数据进行聚合计算 1. 获取最大值 2. 获取最小值 3. 求总和 4. 平均值 5. 统计数量 对流中数据进行分组 对流中数据进行多级分组 对流中数据进行分区 对流中数据进行拼接 Stream流中的结果到集合中 …

Facebook广告投放数据API对接流程

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、需求背景 App在Facebook、Google等巨头进行广告投放&#xff0c;想要拿到实时广告投放效果数据&#xff0c;如曝光、点击、花费、触…

mybatis(5)参数处理+语句查询

参数处理&#xff0b;语句查询 1、简单单个参数2、Map参数3、实体类参数4、多参数5、Param注解6、语句查询6.1 返回一个实体类对象6.2 返回多个实体类对象 List<>6.3 返回一个Map对象6.4 返回多个Map对象 List<Map>6.5 返回一个大Map6.6 结果映射6.6.1 使用resultM…

流氓软件清理绝杀全家桶

下载地址&#xff1a;流氓软件清理绝杀全家桶.zip 网上仍有不少软件中携带流氓软件&#xff0c;甚至某些所谓的大厂出品的工具中也会有一些捆绑&#xff01; 对于玩机经验不太丰富的小白来说&#xff0c;也许一不小心&#xff0c;桌面就会被某些流氓软件搞得乌烟瘴气&#xf…

【每日刷题】技巧合集-LC136、LC169

1. LC136.只出现一次的数字 题目链接 解法一&#xff1a; 先给数字排序&#xff0c;如果num[i]与nums[i-1]或nums[i1]都不一致&#xff0c;则返回nums[i]。 class Solution {public int singleNumber(int[] nums) {if (nums.length 1){return nums[0];}Arrays.sort(nums);fo…

RabbitMQ消息模型之Work消息模型

Work消息模型 * work模型&#xff1a; * 多个消费者消费同一个队列中的消息&#xff0c;每个消费者获取到的消息唯一&#xff0c;且只能消费一次 * 作用&#xff1a;提高消息的消费速度&#xff0c;避免消息的堆积 * 默认采用轮询的方式分发消息 * 如果某…

多张固定宽度元素,随着屏幕尺寸变化自动换行

背景&#xff1a;多张固定宽度元素&#xff0c;随着屏幕尺寸变化自动换行实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevic…

加速Python循环的12种方法,最高可以提速900倍

在本文中&#xff0c;我将介绍一些简单的方法&#xff0c;可以将Python for循环的速度提高1.3到900倍。 Python内建的一个常用功能是timeit模块。下面几节中我们将使用它来度量循环的当前性能和改进后的性能。 对于每种方法&#xff0c;我们通过运行测试来建立基线&#xff0…