Project Icon

scaling_on_scales

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

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

S2-Wrapper

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

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

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

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

新闻

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

待办事项

  • 添加带有S2-Wrapper的LLaVA-NeXT预训练检查点。
  • 添加带有S2-Wrapper的LLaVA-1.5预训练检查点。
  • 添加对非方形图像的支持 现在支持任何形状的图像。请在dev_any_shape分支中查看。该功能仍在测试中。
  • 添加LLaVA与S2-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: 用于提取特征的尺度列表。例如,如果默认大小为2242scales=[1, 2]将在2242和4482尺度上提取特征。

img_sizes: 或者,您可以为每个尺度指定图像大小,而不是指定scales。例如,对于默认大小为2242img_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

示例:带有S2-Wrapper的LLaVA

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

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

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

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

示例:带有S2-Wrapper的NVIDIA VILA

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

目前,我们已发布了带有S2-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的原始仓库获取检查点以及关于训练、评估和部署的指导。

示例:使用S2-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}
}
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

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

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号