language:
- 英文
- 韩文
license: cc-by-nc-4.0
tags:
- 多模态
- 对话式
- ncsoft
- varco
base_model:
- Qwen/Qwen2.5-14B-Instruct
- google/siglip-so400m-patch14-384
library_name: transformers
pipeline_tag: 图像文本到文本
VARCO-VISION-14B
关于模型
VARCO-VISION-14B 是一款强大的英韩视觉语言模型(VLM)。VARCO-VISION的训练流程分为四个阶段:特征对齐预训练、基础监督微调、高级监督微调和偏好优化。在多模态和纯文本基准测试中,VARCO-VISION-14B不仅超越了同规模的其他模型,还达到了与专有模型相当的分数。该模型目前接受单张图像和文本作为输入,生成输出文本。它支持定位、引用以及OCR(光学字符识别)。
使用方式
直接使用
要加载VARCO-VISION-14B,首先克隆并安装LLaVA-NeXT:
git clone https://github.com/LLaVA-VL/LLaVA-NeXT
cd LLaVA-NeXT
pip install -e ".[train]"
安装LLaVA-NeXT后,您可以使用以下代码加载VARCO-VISION-14B:
import torch
from transformers import AutoTokenizer
from llava.model.language_model.llava_qwen import LlavaQwenForCausalLM
from llava.mm_utils import tokenizer_image_token, process_images
model_name = "NCSOFT/VARCO-VISION-14B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = LlavaQwenForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
attn_implementation="flash_attention_2",
low_cpu_mem_usage=True,
device_map="auto"
)
vision_tower = model.get_vision_tower()
image_processor = vision_tower.image_processor
准备一张图像和一段文本输入。您需要预处理图像并对文本进行标记化。将处理后的输入传递给模型以生成预测。
import requests
from PIL import Image
conversation = [
{
"role": "user",
"content": [
{"type": "text", "text": "描述这张图片。"},
{"type": "image"},
],
},
]
prompt = tokenizer.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False)
IMAGE_TOKEN_INDEX = -200
EOS_TOKEN = "<|im_end|>"
input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt")
input_ids = input_ids.unsqueeze(0).to(model.device)
image_url = "http://images.cocodataset.org/val2017/000000039769.jpg"
raw_image = Image.open(requests.get(image_url, stream=True).raw)
image_tensors = process_images([raw_image], image_processor, model.config)
image_tensors = [image_tensor.half().to(model.device) for image_tensor in image_tensors]
image_sizes = [raw_image.size]
with torch.inference_mode():
output_ids = model.generate(
input_ids,
images=image_tensors,
image_sizes=image_sizes,
do_sample=False,
max_new_tokens=1024,
use_cache=True,
)
outputs = tokenizer.batch_decode(output_ids)[0]
if outputs.endswith(EOS_TOKEN):
outputs = outputs[: -len(EOS_TOKEN)]
outputs = outputs.strip()
print(outputs)
特殊功能
如果问题基于边界框或需要边界框作为输出,请在输入文本中包含特殊标记。
以下特殊标记用于定义模型的具体任务、输入和输出:
<gro>
:表示模型的响应应包含边界框信息。
<ocr>
:指定OCR任务以识别图像中的文本。
<char>
和</char>
:用于标记文本短语。
<obj>
和</obj>
:用于指示对象。
<bbox>
和</bbox>
:用于表示边界框。
<delim>
:表示单个对象或文本的多个位置点。
定位
定位是指模型需要识别图像中的特定位置以提供适当答案的任务。要执行定位,请在问题前添加特殊标记<gro>
。
conversation = [
{
"role": "user",
"content": [
{"type": "text", "text": "<gro>\n详细描述这张图片。"},
{"type": "image"},
],
},
]
预期输出示例:
图片中显示了<obj>两只猫</obj><bbox>0.521, 0.049, 0.997, 0.783<delim>0.016, 0.108, 0.512, 0.99</bbox>躺在<obj>一条粉色毯子</obj><bbox>0.002, 0.231, 0.999, 0.999</bbox>上。左边的猫侧躺着,头靠在毯子上,身体伸展。右边的猫仰躺着,爪子伸展,头转向一侧。两只猫看起来都很放松和舒适。毯子附近还有<obj>两个遥控器</obj><bbox>0.039, 0.138, 0.283, 0.257<delim>0.508, 0.166, 0.581, 0.295</bbox>,分别放在猫的两侧。
引用
VARCO-VISION-14B可以使用边界框处理位置特定的问题。要执行引用任务,请在对话中包含感兴趣的对象,用<obj>
和</obj>
标签标记,并用<bbox>
和</bbox>
标签指定其位置。这使模型能够理解上下文并专注于指定位置的对象。边界框以(x1, y1, x2, y2)的形式表示,前两个值表示边界框的左上位置,后两个值表示右下位置。
conversation = [
{
"role": "user",
"content": [
{
"type": "text",
"text": "<obj>这个东西</obj><bbox>0.039, 0.138, 0.283, 0.257</bbox>怎么用?",
},
{"type": "image"},
],
},
]
预期输出示例:
**这个东西**是遥控器,主要用于远程操作电视或其他电子设备。按下按钮可以执行频道切换、音量调节、电源开关等功能。遥控器的按钮通常包括数字、菜单、设置、播放/暂停等功能,用户可以通过这些按钮轻松控制设备。
OCR
要执行光学字符识别(OCR),请使用<ocr>
标记。
image_file = "./assets/ocr_1.png"
raw_image = Image.open(image_file)
conversation = [
{
"role": "user",
"content": [
{"type": "text", "text": "<ocr>"},
{"type": "image"},
],
},
]
预期输出示例:
<char>백범로</char><bbox>0.172, 0.265, 0.328, 0.34</bbox>
<char>124번길</char><bbox>0.349, 0.265, 0.512, 0.34</bbox>
<char>Baekbeom-ro</char><bbox>0.171, 0.335, 0.432, 0.391</bbox>
<char>124</char><bbox>0.444, 0.34, 0.508, 0.391</bbox>
<char>만수주공아파트</char><bbox>0.109, 0.528, 0.335, 0.594</bbox>
<char>시흥</char><bbox>0.443, 0.516, 0.522, 0.578</bbox>
<char>시청</char><bbox>0.711, 0.521, 0.811, 0.594</bbox>
<char>Mansu</char><bbox>0.103, 0.601, 0.181, 0.647</bbox>
<char>Jugong</char><bbox>0.186, 0.601, 0.273, 0.658</bbox>
<char>Apt</char><bbox>0.281, 0.601, 0.327, 0.651</bbox>
<char>42</char><bbox>0.377, 0.601, 0.416, 0.647</bbox>
<char>Shieung</char><bbox>0.445, 0.578, 0.53, 0.623</bbox>
<char>인천대공원</char><bbox>0.431, 0.623, 0.609, 0.684</bbox>
<char>모래내시장역</char><bbox>0.651, 0.591, 0.873, 0.664</bbox>
<char>IncheonGrand</char><bbox>0.433, 0.684, 0.561, 0.723</bbox>
<char>Park</char><bbox>0.564, 0.684, 0.611, 0.723</bbox>
引用模型
如果您在研究中使用了VARCO-VISION-14B,请引用以下内容:
@misc{ju2024varcovisionexpandingfrontierskorean,
title={VARCO-VISION: Expanding Frontiers in Korean Vision-Language Models},
author={Jeongho Ju and Daeyoung Kim and SunYoung Park and Youngjune Kim},
year={2024},
eprint={2411.19103},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2411.19103},
}