跳到内容

Transformers Vision

Outlines 支持无缝使用视觉模型

outlines.models.transformers_visionoutlines.models.transformers 共享接口并基于其构建。

支持的任务包括:

  • 图像 + 文本 -> 文本
  • 视频 + 文本 -> 文本

示例:使用 Llava-Next 视觉模型

安装依赖:pip install torchvision pillow flash-attn

创建模型

import outlines
from transformers import LlavaNextForConditionalGeneration

model = outlines.models.transformers_vision(
    "llava-hf/llava-v1.6-mistral-7b-hf",
    model_class=LlavaNextForConditionalGeneration,
    device="cuda",
)

创建便利函数以从 URL 加载 PIL.Image

from PIL import Image
from io import BytesIO
from urllib.request import urlopen

def img_from_url(url):
    img_byte_stream = BytesIO(urlopen(url).read())
    return Image.open(img_byte_stream).convert("RGB")

描述图像

description_generator = outlines.generate.text(model)
description_generator(
    "<image> detailed description:",
    [img_from_url("https://upload.wikimedia.org/wikipedia/commons/2/25/Siam_lilacpoint.jpg")]
)

这是一张彩色照片,主角是一只拥有醒目蓝眼睛的暹罗猫。这只猫的毛色为奶油色,眼睛颜色较浅,这是暹罗猫品种的典型特征。它的特征包括细长的耳朵、细长的尾巴和醒目的毛色图案。这只猫正坐在室内环境中,可能是在猫爬架或类似的凸起平台上,平台表面覆盖着米色织物,为猫提供了舒适柔软的休息或栖息表面。猫身后墙壁的表面看起来是浅色的灰泥或石膏。

多张图像

要在提示中包含多张图像,您只需向提示添加更多 <image> 标记即可

image_urls = [
    "https://cdn1.byjus.com/wp-content/uploads/2020/08/ShapeArtboard-1-copy-3.png",  # triangle
    "https://cdn1.byjus.com/wp-content/uploads/2020/08/ShapeArtboard-1-copy-11.png",  # hexagon
]
description_generator = outlines.generate.text(model)
description_generator(
    "<image><image>What shapes are present?",
    list(map(img_from_url, image_urls)),
)

存在两种形状。一个形状是六边形,另一个形状是三角形。

图像分类

pattern = "Mercury|Venus|Earth|Mars|Saturn|Jupiter|Neptune|Uranus|Pluto"
planet_generator = outlines.generate.regex(model, pattern)

planet_generator(
    "What planet is this: <image>",
    [img_from_url("https://upload.wikimedia.org/wikipedia/commons/e/e3/Saturn_from_Cassini_Orbiter_%282004-10-06%29.jpg")]
)

土星

提取结构化图像数据

from pydantic import BaseModel
from typing import List, Optional

class ImageData(BaseModel):
    caption: str
    tags_list: List[str]
    object_list: List[str]
    is_photo: bool

image_data_generator = outlines.generate.json(model, ImageData)

image_data_generator(
    "<image> detailed JSON metadata:",
    [img_from_url("https://upload.wikimedia.org/wikipedia/commons/9/98/Aldrin_Apollo_11_original.jpg")]
)

ImageData(caption='月球上的宇航员', tags_list=['月球', '太空', 'nasa', '美国国旗'], object_list=['月球', '月球表面', '太空服', '美国国旗'], is_photo=True)

资源

选择模型

  • https://mmbench.opencompass.org.cn/leaderboard
  • https://hugging-face.cn/spaces/WildVision/vision-arena