视觉
学习怎样使用视觉能力理解图片
1. 介绍
GPT-4o和GPT-4 Turbo两个模型都拥有视觉能力,这意味着模型可以接收图片并回答关于图片的问题。从历史上看,语言模型系统被限制采用单一的文本输入方式。
2. 快速开始
模型使用图片主要有2种方式;直接在请求中传递一个图片的链接或base64位编码的图片。通过user,system和assitant消息传递图片。当前不支持图片在第一个system消息中。
python
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])
模型最擅长回答图片里有什么的普通问题。虽然它能理解图片中两个物体的关系,但还没有优化到回答关于在图片中确定的物体的位置细节问题。例如:你可以问这个汽车是什么颜色或基于你的冰箱的食物可以做什么样的晚餐。但如果你展示一个房间的图片,并问椅子在哪?可能不能正确的回答。
当你探索什么样的案例能应用视觉理解时,切记模型能力的限制非常重要
3. 上传base64编码图片
如果你本地有1个或多个图片,你可以使用base64的格式传给模型,以下是操作的例子:
python
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())
4. 多图片输入
Chat Completions API 有能力接收和处理base64格式的多张图片或图片的URL.模型会处理每一张图片并使用它们所有的信息来回答问题。
python
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])
这是展示模型两张同一个图片并回答关于这两张图片或独立回答每一张图片的问题。
5. 低或高保真图片理解
对于控制细节参数有3个选项:low high auto,你可以完全控制模型处理图片,从而生成理解文本。模型默认使用参数auto,设置需根据输入图片的大小来确定使用low 或 high
- low 将开启'low res'模式,模型将接收一个512x512大小的图片,代表图片将消耗65tokens。这将使模型更快的返回响应并消耗较少的tokens,前提是你的案例不需要很高的细节处理
- high 将开启'high res'模式,模型首先使用low res处理图片,然后基于输入图片的大小创建512px的正方形的细节剪切图片。每一个剪切的图片将消耗2倍的tokens,总数大约有129tokens
python
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)
6. 管理图片
Chat Completions API不像Assistants API,它是无状态的。这就意味着你必须自己管理传递给模型的消息(包括图片)。如果你要传递给模型一个图片多次,那每一次请求模型的API你都必须传递这个图片。
对于较长的会话,我们建议图片的传递方式通过URL而不是base64,如果图片大小比允许的最大值越小,那么在开始下载时就能减少模型的延时。对于low res模型,我们期望512x512大小的图片。对于high res,则图片最短的一边要小于768px,最长的一边要小于2000px
在模型处理完图片后,我们会将其删除。不会作为OpenAI的训练数据
7. 限制
虽然ChatGPT4的视觉能力很强并能被使用到很场景下,对于了解模型的限制也是非常重要的。下边是我们知道的一些限制:
- 医学影像: 模型不适合翻译特殊的医学影像如:CT扫描,并不能作为医学的建议
- 非英文: 当模型处理非拉丁字母的图片时,表现还不够最优,像日文或韩文
- 小文本:放大图片的文本可以改善可读性,但避免剪掉重要细节信息
- 旋转:模型不能翻译旋转或上下颠倒的图片或文字
- 可视化元素:模型很难理解图片或文字中的颜色和样式,如实线、横虚线、点虚线的变化
- 空间推理: 模型很难处理需要准确定位的任务,如象棋的位置
- 准确率:模型在某个场景下可能产生不正确的描述或标注
- 图片形状:模型很难处理全景图和鱼眼图
- 元数据和缩放:模型不能使用原始名或元数据,图片在分析之前要进行缩放调整,将改其原始维度大小
- 计数:只能给出图片中大概的物体数量
- 验证码:为了安全,我们在系统中实现了阻止批量提交的验证码功能
8. 计算成本
图片的输入用tokens进行计量和收费,和文本输入一样。传递的图片的token的花费由两个因素决定:每个图片URL块的大小和细节选项。所有的图片都使用detail:low,每个图片会消耗85tokens,detail:high图片首先缩放至适合2048x2048的正方形,保持它们的长宽比。然后,缩放图片最短的边至768px,最终,我们计算图片包含多少个512px的正方形,每个正方形将消耗170tokens,另外85个tokens也被添加到最终总数中。
这里有一些例子来说明上述问题。
-
一个1024 × 1024的正方形图像细节:高模式花费765个令牌
- 1024小于2048,所以没有初始大小调整。
- 最短的边是1024,所以我们将图像缩小到768 x 768。
- 需要4个512px的正方形块来表示图像,因此最终的令牌成本为170 * 4 + 85 = 765。
-
一个2048 x 4096的图像细节:高模式花费1105个令牌
- 我们将图像缩小到1024 x 2048,以适应2048的正方形。
- 最短的边是1024,所以我们进一步缩小到768 x 1536。
- 需要6个512px的贴图,所以最终的令牌成本是170 * 6 + 85 = 1105
-
4096 x 8192的detail:low 最便宜的是85个令牌
- 无论输入大小如何,低细节图像都是固定成本。