OpenAI支持的视觉能力

发布时间 2023-11-14 10:21:01作者: ryan-Z

介绍

带有视觉的 GPT-4,有时也称为 GPT-4V 或在 API 中,允许模型接收图像并回答有关它们的问题。从历史上看,语言模型系统一直受到单一输入模态(文本)的限制。对于许多用例来说,这限制了可以使用 GPT-4 等模型的领域。gpt-4-vision-preview

具有视觉功能的 GPT-4 目前可供所有通过模型和聊天完成 API 访问 GPT-4 的开发人员使用,该 API 已更新为支持图像输入。请注意,助手 API 目前不支持图像输入。gpt-4-vision-preview

请务必注意以下几点:

  • 具有视觉的 GPT-4 不是一个行为与 GPT-4 不同的模型,除了我们用于模型的系统提示之外
  • 具有视觉的 GPT-4 并不是一个在文本任务中表现更差的不同模型,因为它有视觉,它只是添加了视觉的 GPT-4
  • 具有视觉功能的 GPT-4 是该模型的一组增强功能

快速入门

可以通过两种主要方式将图像提供给模型:通过传递指向图像的链接或直接在请求中传递 base64 编码的图像。图像可以在消息中传递。目前,我们不支持第一条消息中的图像,但将来可能会更改。

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "What’s in this image?"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response.choices[0])

该模型最擅长回答有关图像中存在的内容的一般问题。虽然它确实了解图像中对象之间的关系,但它尚未优化以回答有关图像中某些对象位置的详细问题。例如,你可以根据冰箱里的东西问它汽车是什么颜色的,或者晚餐的一些想法是什么,但如果你给它看一个房间的图像,并问它椅子在哪里,它可能无法正确回答问题。

上传 base 64 编码图像

如果本地有一个图像或一组图像,则可以将它们以 base 64 编码格式传递到模型,下面是一个运行示例:

import base64
import requests

# OpenAI API Key
api_key = "YOUR_OPENAI_API_KEY"

# Function to encode the image
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

# Path to your image
image_path = "path_to_your_image.jpg"

# Getting the base64 string
base64_image = encode_image(image_path)

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {api_key}"
}

payload = {
    "model": "gpt-4-vision-preview",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": "What’s in this image?"
          },
          {
            "type": "image_url",
            "image_url": {
              "url": f"data:image/jpeg;base64,{base64_image}"
            }
          }
        ]
      }
    ],
    "max_tokens": 300
}

response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)

print(response.json())

多个图像输入

聊天完成 API 能够接收和处理 base64 编码格式或图像网址的多个图像输入。该模型将处理每张图像,并使用来自所有图像的信息来回答问题。

from openai import OpenAI

client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "What are in these images? Is there any difference between them?",
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
                    },
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)
print(response.choices[0])

在这里,模型显示了同一图像的两个副本,并且可以独立回答有关两个或每个图像的问题。

低保真或高保真图像理解

通过控制参数(具有两个选项)或 ,您可以控制模型如何处理图像并生成其文本理解。detaillowhigh

  • low将禁用“高分辨率”模型。该模型将收到低分辨率 512 x 512 版本的图像,并以 65 个代币的预算表示图像。这允许 API 返回更快的响应,并为不需要高细节的用例使用更少的输入令牌。
  • high将启用“高分辨率”模式,该模式首先允许模型查看低分辨率图像,然后根据输入图像大小将输入图像创建为 512px 正方形的详细裁剪。每个详细的作物都使用两倍的代币预算(65 个代币),总共 129 个代币。

管理映像

与 Google 助理 API 不同,聊天完成 API 不是有状态的。这意味着您必须自己管理传递给模型的消息(包括图像)。如果要多次将同一图像传递给模型,则必须在每次向 API 发出请求时传递图像。

对于长时间运行的对话,我们建议通过 URL 而不是 base64 传递图像。还可以通过提前缩小图像大小以小于预期的最大大小来改善模型的延迟。对于低分辨率模式,我们期望图像为 512 像素 x 512 像素。对于高静止模式,图像的短边应小于 768 像素,长边应小于 2,000 像素。

模型处理图像后,将从 OpenAI 服务器中删除该图像,并且不会保留。我们不会使用通过 OpenAI API 上传的数据来训练我们的模型。

局限性

虽然具有视觉功能的 GPT-4 功能强大,可用于多种情况,但了解该模型的局限性很重要。以下是我们注意到的一些限制:

  • 医学图像:该模型不适合解释 CT 扫描等专业医学图像,不应用于医疗建议。
  • 非英语:在处理包含非拉丁字母文本(如日语或韩语)的图像时,模型可能无法发挥最佳性能。
  • 大文本:放大图像中的文本以提高可读性,但避免裁剪重要细节。
  • 旋转:模型可能会误解旋转/颠倒的文本或图像。
  • 视觉元素:模型可能难以理解颜色或样式(如实线、虚线或虚线)变化的图形或文本。
  • 空间推理:该模型难以完成需要精确空间定位的任务,例如识别国际象棋位置。
  • 准确性:在某些情况下,模型可能会生成不正确的描述或标题。
  • 图像形状:该模型在处理全景和鱼眼图像时遇到困难。
  • 元数据和调整大小:模型不处理原始文件名或元数据,并且在分析之前调整图像大小,从而影响其原始尺寸。
  • 计数:可以给出图像中对象的近似计数。
  • 验证码:出于安全原因,我们实施了一个系统来阻止提交验证码。

计算成本

图像输入以令牌计量和收费,就像文本输入一样。给定图像的令牌成本由两个因素决定:其大小和每个image_url块上的选项。所有图像每张花费 85 个代币。 首先将图像缩放以适合 2048 x 2048 正方形,保持其纵横比。然后,对它们进行缩放,使图像的最短边长 768 像素。最后,我们计算图像由多少个 512px 的正方形组成。每个方块花费 170 个代币。另外 85 个代币总是添加到最终总数中。detaildetail: lowdetail: high

以下是演示上述内容的一些示例。

  • 模式下的 1024 x 1024 方形图像需要 765 个代币detail: high
    • 1024 小于 2048,因此没有初始调整大小。
    • 最短边是 1024,因此我们将图像缩小到 768 x 768。
    • 需要 4 个 512px 的方形图块来表示图像,因此最终的代币成本为 。170 * 4 + 85 = 765
  • 模式下的 2048 x 4096 图像需要 1105 个令牌detail: high
    • 我们将图像缩小到 1024 x 2048 以适合 2048 正方形。
    • 最短边是 1024,因此我们进一步缩小到 768 x 1536。
    • 需要 6 个 512px 图块,因此最终的代币成本为 。170 * 6 + 85 = 1105
  • 大多数情况下,一张 4096 x 8192 的图像需要 85 个代币detail: low
    • 无论输入大小如何,低细节图像都是固定成本。

常见问题

我可以微调图像功能吗?gpt-4

不可以,我们目前不支持微调图像功能。gpt-4

我可以用来生成图像吗?gpt-4

不,您可以使用它来生成图像和理解图像。dall-e-3gpt-4-vision-preview

我可以上传什么类型的文件?

我们目前支持 PNG (.png)、JPEG(.jpeg 和 .jpg)、WEBP (.webp) 和非动画 GIF (.gif)。

我可以上传的图片大小有限制吗?

是的,我们将每张图片上传的图片限制为 20MB。

我可以删除我上传的图片吗?

不会,我们会在模型处理图像后自动为您删除图像。

在哪里可以了解有关 GPT-4 with Vision 注意事项的更多信息?

您可以在 GPT-4 with Vision 系统卡中找到有关我们的评估、准备和缓解工作的详细信息。

我们进一步实施了一个系统来阻止提交验证码。

GPT-4 with Vision 的速率限制如何工作?

我们在令牌级别处理图像,因此我们处理的每个图像都计入每分钟令牌数 (TPM) 限制。有关用于确定每个图像的令牌计数的公式的详细信息,请参阅计算成本部分。

GPT-4 with Vision 能理解图像元数据吗?

否,模型不接收图像元数据。

如果我的图像不清晰会怎样?

如果图像模棱两可或不清晰,模型将尽最大努力对其进行解释。但是,结果可能不太准确。一个好的经验法则是,如果普通人无法以低/高分辨率模式使用的分辨率看到图像中的信息,那么模型也无法看到。