scaling_on_scales

scaling_on_scales

为视觉模型实现多尺度特征提取的机制

S²-Wrapper是一种为视觉模型实现多尺度特征提取的机制。项目提供PyTorch实现,探讨图像尺度缩放与模型规模缩放的效果对比。S²-Wrapper已集成到LLaVA和NVIDIA VILA等多模态模型中,提升了多项视觉任务性能。项目包含使用指南和示例,便于研究人员和开发者应用。

S2-Wrapper多尺度特征提取计算机视觉深度学习模型扩展Github开源项目

S<sup>2</sup>-Wrapper

本仓库包含S<sup>2</sup>-Wrapper的Pytorch实现,这是一种简单的机制,能够在任何视觉模型上实现多尺度特征提取。

<div align="center"> <image src="assets/s2_wrapper_2.png" width="840px" /> <p></p> </div>

阅读我们的论文,了解何时在图像尺度上进行缩放比在模型规模上进行缩放更好。

何时我们不需要更大的视觉模型?<br> Baifeng Shi, Ziyang Wu, Maolin Mao, Xin Wang, Trevor Darrell<br> 加州大学伯克利分校, 微软研究院<br>

论文: https://arxiv.org/abs/2403.13043

新闻

  • [2024/07] 被ECCV 2024接收!
  • [2024/05] S<sup>2</sup>-Wrapper正式集成到NVIDIA VILA中!我们发布了带有S<sup>2</sup>的VILA-1.5-3b检查点,更多检查点正在路上!在这里查看详情。
  • [2024/04] S<sup>2</sup>-Wrapper正式集成到LLaVA中!我们发布了带有S<sup>2</sup>的LLaVA-1.5检查点。在这里试用。

待办事项

  • 添加带有S<sup>2</sup>-Wrapper的LLaVA-NeXT预训练检查点。
  • 添加带有S<sup>2</sup>-Wrapper的LLaVA-1.5预训练检查点。
  • 添加对非方形图像的支持 现在支持任何形状的图像。请在dev_any_shape分支中查看。该功能仍在测试中。
  • 添加LLaVA与S<sup>2</sup>-Wrapper结合的示例

快速入门

步骤1. 通过pip安装s2wrapper

pip install git+https://github.com/bfshi/scaling_on_scales.git

步骤2. 使用一行代码任何视觉模型上提取多尺度特征。

假设您有一个函数(可以是modelmodel.forward等)接收BxCxHxW图像并输出BxNxC特征。

例如,您有一个model(如ViT-B)通过以下方式提取特征:

feature = model(x) # 例如,x: 32*3*224*224, feature: 32*196*768

然后通过以下方式提取多尺度特征(例如,尺度为1和2):

from s2wrapper import forward as multiscale_forward mutliscale_feature = multiscale_forward(model, x, scales=[1, 2]) # x: 32*3*224*224, feature: 32*196*1536

上面我们假设输入是224x224的,s2wrapper会将其插值到448x448。如果原始448x448图像已经可用,我们可以通过从448x448图像插值而不是从224x224图像插值获得更好的性能。在这种情况下,通过以下方式提取224x224和448x448尺度的特征:

from s2wrapper import forward as multiscale_forward mutliscale_feature = multiscale_forward(model, x, scales=[0.5, 1], max_split_size=224) # x: 32*3*448*448, feature: 32*196*1536,注意我们需要设置`max_split_size=224`以将448图像分割成4个子图像。 # mutliscale_feature = multiscale_forward(model, x, img_sizes=[224, 448], max_split_size=224) # 或者,设置`img_sizes`而不是`scales`

使用方法

s2wrapper.forward( model, input, scales=None, img_sizes=None, max_split_size=None, resize_output_to_idx=0, num_prefix_token=0, output_shape='bnc', split_forward=False, )

model: 您的视觉模型或任何接收BxCxHxW图像张量并输出BxNxC特征张量的函数。

input: 输入图像张量,形状为BxCxHxW。

scales: 用于提取特征的尺度列表。例如,如果默认大小为224<sup>2</sup>scales=[1, 2]将在224<sup>2</sup>和448<sup>2</sup>尺度上提取特征。

img_sizes: 或者,您可以为每个尺度指定图像大小,而不是指定scales。例如,对于默认大小为224<sup>2</sup>img_sizes=[224, 448]将产生与scales=[1, 2]相同的结果。

max_split_size: 从大图像分割出的子图像的最大大小。对于每个尺度,图像将被分割成ceil(img_size_that_scale / max_split_size)**2个子图像。如果为None,则默认设置为input的大小。

resize_output_to_idx: 将最终特征图调整到哪个尺度。默认为scalesimg_sizes中的第一个尺度。

num_prefix_token: 特征图中的前缀标记数量。例如,如果model返回的特征图包含1个[CLS]标记和其他空间标记,设置num_prefix_token=1。默认为0。

output_shape: 输出特征的形状。需要是bnc(例如,ViT)或bchw(例如,ConvNet)。默认为bnc

split_forward: 是否在每个子图像上单独运行模型或将所有子图像批处理为单次运行。设置为True可以减少内存使用(在推理过程中,GPU内存使用量大致与单尺度相同)。默认为False

示例:带有S<sup>2</sup>-Wrapper的LLaVA

S<sup>2</sup>-Wrapper已正式集成到LLaVA中(参见这里的PR)。要使用带有S<sup>2</sup>-Wrapper的LLaVA,只需安装此仓库和最新版本的LLaVA仓库,并下载下面列出的检查点。我们已发布带有S<sup>2</sup>-Wrapper的LLaVA-1.5-7B和LLaVA-1.5-13B的检查点。

模型大小计划检查点VQAv2VizWizTextVQAMMMU-valMathVistaMM-BenchSEEDMM-Vet
LLaVA-1.57Bfull_ft-1eliuhaotian/llava-v1.5-7b78.550.058.236.225.264.365.731.1
LLaVA-1.57Blora-1eliuhaotian/llava-v1.5-7b-lora79.147.858.2--66.1-30.2
LLaVA-1.5-S27Blora-1ebfshi/llava-v1.5-7b-s2-lora80.050.161.037.725.366.267.932.4
LLaVA-1.513Bfull_ft-1eliuhaotian/llava-v1.5-13b80.053.661.336.427.667.768.236.1
LLaVA-1.513Blora-1eliuhaotian/llava-v1.5-13b-lora80.058.960.2--68.5-38.3
LLaVA-1.5-S213Blora-1ebfshi/llava-v1.5-13b-s2-lora80.956.063.137.427.867.968.936.4

使用LLaVA-1.5-S2进行模型推理的示例脚本:

python3 -m llava.eval.run_llava \ --model-path bfshi/llava-v1.5-7b-s2-lora \ --model-base lmsys/vicuna-7b-v1.5 \ --image-file <image> \ --query <query> \ --conv-mode vicuna_v1

训练。要训练带有S<sup>2</sup>-Wrapper的LLaVA,由于当前的LLaVA仓库仅支持使用S<sup>2</sup>进行评估,请额外应用这里的更改到您的LLaVA仓库,然后就可以开始了!

训练配置应与训练常规LLaVA 不使用 anyres相同(即image_aspect_ratio="resize"mm_patch_merge_type="flat"),除了两个新的模型配置:

  • s2=True。这会启用S<sup>2</sup>的使用。
  • s2_scales="336,672,1008"。这指定了S<sup>2</sup>将在哪些图像尺度上提取特征。

示例:带有S<sup>2</sup>-Wrapper的NVIDIA VILA

S<sup>2</sup>-Wrapper已正式集成到NVIDIA VILA中。VILA是一个多模态LLM,支持多图像理解和视频理解,在多个基准测试上取得了出色的结果(例如,在MMMU上在所有开源模型中排名第一)。VILA有几种模型大小:3B、8B、13B和40B,每种还有一个量化版本(AWQ)。

目前,我们已发布了带有S<sup>2</sup>-Wrapper的VILA-3B检查点,这是您在边缘设备上运行MLLM的首选。其他模型大小的检查点正在路上!同时,欢迎在这里查看更多详情。

$~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$精度VQAv2GQAVizWizSQA-IVQA-TPOPEMMEMMBMMB-CNSEEDSEED-IMMMU (验证)MMMU (测试)llava-benchMM-Vet平均值
VILA1.5-3Bfp1680.461.553.569.060.485.91442.4463.452.760.967.933.330.875.935.460.2
VILA1.5-3B-S2fp1679.861.461.369.663.485.31431.6562.852.260.066.432.831.376.738.660.9
VILA1.5-3B-AWQint480.061.153.867.860.485.91437.3463.351.459.866.632.731.175.037.359.9
VILA1.5-3B-S2-AWQint479.461.362.369.263.085.81417.0661.651.559.165.733.430.477.136.760.5

请参考VILA的原始仓库获取检查点以及关于训练、评估和部署的指导。

示例:使用S<sup>2</sup>-Wrapper的HuggingFace CLIP

使用HuggingFace CLIP视觉模型进行常规特征提取(参考:官方示例):

from PIL import Image import requests from transformers import AutoProcessor, CLIPVisionModel model = CLIPVisionModel.from_pretrained("openai/clip-vit-base-patch32") processor = AutoProcessor.from_pretrained("openai/clip-vit-base-patch32") url = "http://images.cocodataset.org/val2017/000000039769.jpg" image = Image.open(requests.get(url, stream=True).raw) inputs = processor(images=image, return_tensors="pt").pixel_values # model.forward返回一个包含"last_hidden_state"的对象,这就是我们需要的特征图 outputs = model(inputs).last_hidden_state print(outputs.shape) # 1*50*768

将其改为多尺度:

from PIL import Image import requests from transformers import AutoProcessor, CLIPVisionModel model = CLIPVisionModel.from_pretrained("openai/clip-vit-base-patch32") processor = AutoProcessor.from_pretrained("openai/clip-vit-base-patch32") url = "http://images.cocodataset.org/val2017/000000039769.jpg" image = Image.open(requests.get(url, stream=True).raw) inputs = processor(images=image, return_tensors="pt").pixel_values # 将特征提取过程封装成一个单独的函数,该函数 # 接受图像张量作为输入并输出特征张量 def forward_features(inputs): return model(inputs).last_hidden_state # 使用scales=[1, 2]提取特征。注意输出有一个[CLS]标记 # 所以设置num_prefix_token=1。 outputs = multiscale_forward(forward_feature, inputs, scales=[1, 2], num_prefix_token=1) print(outputs.shape) # 1*50*1536

引用

@article{shi2024we,
  title={When Do We Not Need Larger Vision Models?},
  author={Shi, Baifeng and Wu, Ziyang and Mao, Maolin and Wang, Xin and Darrell, Trevor},
  journal={arXiv preprint arXiv:2403.13043},
  year={2024}
}

编辑推荐精选

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

堆友

堆友

多风格AI绘画神器

堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。

图像生成AI工具AI反应堆AI工具箱AI绘画GOAI艺术字堆友相机AI图像热门
码上飞

码上飞

零代码AI应用开发平台

零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

下拉加载更多