视觉

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

介绍

GPT-4o 和 GPT-4 Turbo 都具有视觉功能,可以接受图像并回答有关其内容的问题。历史上,语言模型系统仅限于接受单个输入模态,即文本。

快速启动

图像可以通过两种主要方式提供给模型:传递图像的链接或将基础64编码的图像直接包含在请求中。图像可以在 usersystemassistant 消息中提供。目前,我们不支持在第一个 system 消息中使用图像,但这可能在将来发生变化。

什么是这个图片?

from openai import OpenAI

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

模型最擅长回答关于图像中存在什么内容的一般性问题。虽然模型理解图像中物体之间的关系,但它尚未优化于回答有关特定物体在图像中的位置的详细问题。例如,您可以询问车辆的颜色或根据冰箱中的食材提供晚餐想法,但如果您向模型显示一张房间的图片并询问椅子的位置,它可能无法正确回答。

在探索可以将视觉理解应用到的用例时,请务必牢记模型的限制。

Video understanding with vision

了解如何使用 GPT-4 with Vision 来理解视频。

上传基本64编码图像

如果您在本地具有一组图像,则可以将其作为基础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-4o",
  "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 可以接受和处理多个图像输入,无论是作为基础64编码的格式还是作为图像 URL。模型将处理每个图像并使用所有图像的信息来回答问题。

多个图像输入

from openai import OpenAI

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

在此示例中,模型被显示了两个相同的图像,并且可以独立回答有关每个图像或两个图像的问题。

低保真或高保真图像理解

通过控制 detail 参数,您可以控制模型如何处理图像并生成其文本理解。detail 参数有三个选项:lowhighauto。默认情况下,模型将使用 auto 设置,该设置将查看图像输入的大小并决定是使用 low 还是 high 设置。

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

选择细节级别

from openai import OpenAI

client = OpenAI()
response = client.chat.completions.create(
  model="gpt-4o",
  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 发出请求时传递该图像。

对于长时间运行的对话,我们建议通过 URL 传递图像,而不是使用 base64。可以通过将图像的大小降低到低于其预期最大大小来提高模型的延迟。对于低分辨率模式,我们预期使用 512px x 512px 的图像。对于高分辨率模式,图像的短边应小于 768px,长边应小于 2,000px。

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

局限性

虽然 GPT-4 with Vision 强大且可用于许多情况,但了解模型的限制非常重要。以下是我们了解到的一些限制:

  • 医学图像:该模型不适合解释特殊的医学图像,例如 CT 扫描,并且不应用于医学建议。
  • 非英语:当处理带有非拉丁字母表的文本的图像时,模型可能无法正常运行,例如日本语或韩语。
  • 小型文本:在图像中放大文本以提高可读性,但请避免裁剪重要的细节。
  • 旋转:模型可能错误解释旋转或倒置的文本或图像。
  • 视觉元素:模型可能难以理解图表或文本,其中颜色或样式(例如实线、虚线或点划线)有所不同。
  • 空间推理:模型在执行需要精确空间定位的任务时可能会遇到困难,例如识别棋盘上的位置。
  • 准确性:模型可能在某些情况下生成不正确的描述或标题。
  • 图像形状:模型在处理全景或鱼眼图像时可能会遇到困难。
  • 元数据和调整大小:模型不会处理原始文件名或元数据,并且在分析之前会调整图像的大小,从而影响其原始尺寸。
  • 计数:可能会给出大致的对象计数。
  • CAPTCHA:为了安全起见,我们已经实施了一个系统来阻止提交 CAPTCHA。

计算成本

图像输入是按令牌计费的,就像文本输入一样。图像的令牌成本取决于其大小和每个 image_url 块上的 detail 选项。所有 detail: low 图像的成本为 85 个令牌。detail: high 图像首先会缩放以适合 2048 x 2048 的正方形,同时保留其纵横比。然后,它们会缩放到其最短边的长度为 768px。最后,我们计算图像所需的 512px 正方形的数量。每个正方形的成本为 170 个令牌。另外,总成本中还会添加 85 个令牌

以下是一些说明上述内容的示例:

  • 一个 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 的图像功能。

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

不能,您可以使用 dall-e-3 生成图像,使用 gpt-4ogpt-4-turbo 理解图像。

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

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

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

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

我可以删除已上传的图像吗?

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

где可以了解有关 GPT-4 with Vision 的注意事项?

您可以在 GPT-4 with Vision 系统卡中了解我们的评估、准备和缓解措施的细节。

我们已经实施了一个系统来阻止提交 CAPTCHA。

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

我们在令牌级别处理图像,因此我们处理的每个图像都计入您的每分钟令牌 (TPM) 限制。请参阅“计算成本”部分,了解用于确定每个图像的令牌计数的公式。

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

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

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

如果图像模糊或不清晰,模型会尽力解释它。但是,结果可能不那么准确。一个好的经验法则是,如果在低分辨率/高分辨率模式中使用的分辨率下,平均人无法在图像中看到信息,则模型也无法这样做。

Was this page helpful?