视觉

了解如何使用视觉功能来理解图像。

许多 OpenAI 模型具有视觉功能,这意味着模型可以接收图像并回答有关图像的问题。从历史上看,语言模型系统一直受到采用单一输入模态 text 的限制。source

快速入门

图像主要通过两种方式提供给模型:传递指向图像的链接,或者直接在请求中传递 base64 编码的图像。图像可以在user消息。source

这张图片里有什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4o-mini",
  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])

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

在探索视觉理解可以应用于哪些用例时,请务必牢记模型的局限性source

上传 Base64 编码的图片

如果你在本地有一个图像或一组图像,你可以以 base 64 编码格式将它们传递给模型,下面是一个实际示例:source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import base64
from openai import OpenAI

client = OpenAI()

# 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)

response = client.chat.completions.create(
  model="gpt-4o-mini",
  messages=[
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "What is in this image?",
        },
        {
          "type": "image_url",
          "image_url": {
            "url":  f"data:image/jpeg;base64,{base64_image}"
          },
        },
      ],
    }
  ],
)

print(response.choices[0])

多个图像输入

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

多个图像输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from openai import OpenAI

client = OpenAI()
response = client.chat.completions.create(
  model="gpt-4o-mini",
  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])

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

低保真或高保真图像理解

通过控制detail参数,该参数有三个选项,low,highauto中,您可以控制模型处理图像和生成其文本理解的方式。默认情况下,模型将使用auto设置,它将查看图像输入大小并决定是否应使用lowhigh设置。source

  • low将启用 “Low Res” 模式。该模型将收到 512 像素 x 512 像素的低分辨率图像版本,并以 85 个令牌的预算表示图像。这允许 API 返回更快的响应,并为不需要高细节的使用案例消耗更少的输入令牌。
  • high将启用“高分辨率”模式,该模式首先允许模型首先看到低分辨率图像(使用 85 个标记),然后使用 170 个标记为每个 512 像素 x 512 像素的图块创建详细的裁剪。
选择详细程度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4o-mini",
  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",
            "detail": "high"
          },
        },
      ],
    }
  ],
  max_tokens=300,
)

print(response.choices[0].message.content)

管理镜像

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

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

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

局限性

虽然具有视觉功能的 GPT-4 功能强大并且可以在许多情况下使用,但了解该模型的局限性很重要。以下是我们了解的一些限制:source

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

计算成本

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

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

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

常见问题

我是否可以在gpt-4?

否,我们不支持微调gpt-4此时。source

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

不,您可以使用dall-e-3生成图像,并使用gpt-4o,gpt-4o-minigpt-4-turbo理解图像。source

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

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

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

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

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

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

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

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

我们进一步实施了一个系统来阻止 CAPTCHA 的提交。source

带有 Vision 的 GPT-4 的速率限制如何运作?

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

带有 Vision 的 GPT-4 可以理解图像元数据吗?

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

如果我的图像不清晰,会发生什么情况?

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