作者:林夕,华为诺亚方舟实验室·算法工程师,多模态大模型算法研究
介绍
GPT-4 with Vision(有时在 API 中称为 GPT-4V[1] 或 gpt-4-vision-preview
)允许模型接收图像并回答有关图像的问题。从历史上看,语言模型系统受到单一输入模式(文本)的限制。对于许多用例来说,这限制了 GPT-4 等模型的使用领域。
目前,所有能够通过 gpt-4-vision-preview
模型和聊天完成 API 访问 GPT-4[2] 的开发人员都可以使用具有视觉功能的 GPT-4,该 API 已更新为支持图像输入。请注意,Assistants API[3] 目前不支持图像输入。
重要的是要注意以下几点:
•带视觉的 GPT-4 模型的行为与 GPT-4 没有什么不同,除了我们用于模型的系统提示之外•具有视觉功能的 GPT-4 并不是一个在文本任务上表现较差的不同模型,因为它具有视觉功能,它只是添加了视觉功能的 GPT-4•具有视觉功能的 GPT-4 是模型的一组增强功能
快速开始
可以通过两种主要方式向模型提供图像:传递图像的链接或直接在请求中传递 base64 编码的图像。图像可以在 user
、 system
和 assistant
消息中传递。目前,我们不支持第一条 system
消息中的图像,但将来可能会改变。
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": "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])
该模型最擅长回答有关图像中存在的内容的一般问题。虽然它确实理解图像中对象之间的关系,但尚未优化以回答有关图像中某些对象位置的详细问题。例如,您可以询问它汽车是什么颜色,或者根据冰箱里的东西提出一些关于晚餐的想法,但如果您向它展示房间的图像并询问它椅子在哪里,它可能不会回答问题正确。
当您探索视觉理解可以应用于哪些用例时,请务必牢记模型的局限性。
用视觉理解视频。[4]
上传 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())
多图像输入
Chat Completions API 能够接收并处理采用 Base64 编码格式或图像 URL 形式的多个图像输入。该模型将处理每张图像并使用所有图像的信息来回答问题。
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4-vision-preview",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_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": "text",
"text": "What’s in these images? Is there any difference between them?",
},
{
"type": "image_url",
"image_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
参数(有两个选项 low
或 high
),您可以控制模型如何处理图像并生成其文本理解。
•low
将禁用“高分辨率”模型。该模型将收到图像的低分辨率 $512 times 512$ 版本,并以 65 个token的表示该图像。这使得 API 能够返回更快的响应,并在不需要高细节的用例中消耗更少的输入令牌。•high
将启用“高分辨率”模式,该模式首先允许模型查看低分辨率图像,然后根据输入图像大小将输入图像创建为 512 像素正方形的详细裁剪。每个详细作物使用两倍的代币预算(65 个代币),总共 129 个代币。
管理图像
与助手 API 不同,聊天完成 API 没有状态。这意味着您必须自己管理传递给模型的消息(包括图像)。如果您想多次将相同的图像传递给模型,则每次向 API 发出请求时都必须传递该图像。
对于长时间运行的对话,我们建议通过 URL 而不是 base64 传递图像。还可以通过提前将图像尺寸缩小到小于预期的最大尺寸来改善模型的延迟。对于低分辨率模式,我们预计图像尺寸为 512 像素 x 512 像素。对于高休息模式,图像的短边应小于 768 像素,长边应小于 2,000 像素。
图像经过模型处理后,将从 OpenAI 服务器中删除且不会保留。我们不使用通过 OpenAI API 上传的数据来训练我们的模型。[5]
局限性
虽然具有视觉功能的 GPT-4 功能强大并且可以在许多情况下使用,但了解该模型的局限性也很重要。以下是我们意识到的一些限制:
•医学图像:该模型不适合解释 CT 扫描等专业医学图像,也不应用于提供医疗建议。•非英语:在处理包含非拉丁字母文本(例如日语或韩语)的图像时,模型可能无法获得最佳性能。•大文本:放大图像中的文本以提高可读性,但避免裁剪重要细节。•旋转:模型可能会误解旋转/颠倒的文本或图像。•视觉元素:模型可能难以理解颜色或样式(如实线、虚线或点线)变化的图形或文本。•空间推理:该模型难以完成需要精确空间定位的任务,例如识别国际象棋位置。•准确性:在某些情况下,模型可能会生成不正确的描述或标题。•图像形状:模型难以处理全景和鱼眼图像。•元数据和调整大小:模型不处理原始文件名或元数据,图像在分析之前会调整大小,从而影响其原始尺寸。•计数:可以给出图像中对象的近似计数。•验证码:出于安全原因,我们实施了一个系统来阻止验证码的提交。
计算成本
与文本输入一样,图像输入以token计量和收费。给定图像的token成本由两个因素决定:图像的大小以及每个 image_url 块上的 detail
选项。所有带有 detail: low
的图像每张花费 85 个token。 detail: high
图像首先缩放以适合 2048 x 2048 的正方形,并保持其纵横比。然后,对它们进行缩放,使图像的最短边长为 768 像素。最后,我们计算图像由多少个 512px 的正方形组成。每个方格花费 170 个token。另外 85 个token始终会添加到最终总数中。
以下是一些演示上述内容的示例。
•detail: high
模式下的 1024 x 1024 方形图像需要 765 个token。•1024 小于 2048,因此没有初始调整大小。•最短边是 1024,因此我们将图像缩小到 768 x 768。•需要 4 512px 方形图块来表示图像,因此最终的令牌成本为 170 * 4 + 85 = 765
。•detail: high
模式下的 2048 x 4096 图像需要 1105 个代币。•我们将图像缩小到 1024 x 2048 以适合 2048 的正方形。•最短边是 1024,因此我们进一步缩小到 768 x 1536。•需要 6 512px 图块,因此最终的代币成本为 170 * 6 + 85 = 1105
。•detail: low
中的 4096 x 8192 图像最多花费 85 个令牌。•无论输入大小如何,低细节图像都是固定成本。
FAQ
1.Can I fine-tune the image capabilities in gpt-4
?我可以微调 gpt-4
中的图像功能吗?[6]
不,我们目前不支持微调 gpt-4
的图像功能。
2.Can I use gpt-4
to generate images?我可以使用 gpt-4
生成图像吗?[7]
不,您可以使用 dall-e-3
生成图像并使用 gpt-4-vision-preview
来理解图像。
3.What type of files can I upload?我可以上传什么类型的文件?[8]
我们目前支持 PNG (.png)、JPEG(.jpeg 和 .jpg)、WEBP (.webp) 和非动画 GIF (.gif)。
4.Is there a limit to the size of the image I can upload?我可以上传的图片大小有限制吗?[9]
是的,我们将图像上传限制为每张图像 20MB。
5.Where can I learn more about the considerations of GPT-4 with Vision?在哪里可以了解有关 GPT-4 with Vision 的注意事项的更多信息?[10]
您可以在 GPT-4 with Vision system card[11]中找到有关我们的评估、准备和缓解工作的详细信息。我们进一步实施了一个系统来阻止验证码的提交。
6.How do rate limits for GPT-4 with Vision work?GPT-4 with Vision 的速率限制如何运作?[12]
我们在令牌级别处理图像,因此我们处理的每个图像都会计入您的每分钟令牌 (TPM) 限制。有关用于确定每个图像的标记计数的公式的详细信息,请参阅计算成本部分。
7.Can GPT-4 with Vision understand image metadata?带有 Vision 的 GPT-4 可以理解图像元数据吗?[13]
不,模型不接收图像元数据。
8.What happens if my image is unclear?如果我的图像不清楚怎么办?[14]
如果图像不明确或不清楚,模型将尽力解释它。然而,结果可能不太准确。一个好的经验法则是,如果普通人无法以低/高分辨率模式下使用的分辨率看到图像中的信息,那么模型也看不到。
问题与讨论
以下均为个人根据一些已经公开的材料做出的一些猜想,欢迎友善讨论,不喜勿喷。
1.大家最关心的一个问题,GPT4V是不是一个单模型,或者是否外挂了其他的插件(例如OCR)。
先放观点,GPT4Vison 开放出来的API[6]和GPT4 report[2] 里面汇报的性能是单模型。但是GPT4V的网页版,是一个产品,从安全层面,有可能会有后处理,也就是加了外挂工具,如GPT4V system card[5]中 2.4.2 Additional Mitigations for High-Risk Areas 所提到的,增加了OCR处理。
首先,目前开源和闭源的方案都已经做到了很好地性能,接近甚至超过GPT4V的性能。所以确定性的是靠一个单独的端到端的模型,是可以做到GPT4V目前呈现出来的性能的。如图所示Kosmos2.5[1],在某些数据集的OCR识别精度,已经超过了商用OCR模型。Commercial OCR是google cloud的OCR api。
第二点,在GPT-4的report[2] 里面汇报了几个文档(大量文字)QA的性能:
这里有明确提到pixel-only。 GPT-4V report[2] 里面汇报的性能大概率(90%以上)是单模型的性能。但是GPT-4V网页端是一个产品,
目前google reserach已经发布的PaLI-x[3], PaLI-3[4] 在没有OCR的情况下也已经做到了近似的性能。这里同样支撑一个观点,现有的单模型在benchmark评测的角度是能做到GPT4V的性能。
第三点:GPT-4V的system card[5]里面明确说到,在安全性层面,为了确保图片输入不能躲过GPT4-V的安全措施,GPT4-V利用了OCR工具对其进行处理。
这段话从侧面反映出,GPT-4V 未经过外挂 OCR 工具进行文本识别。如果 GPT-4V 采用了外挂 OCR 模型,技术报告中无需再提OCR。
这里面的一个问题,如果是对每张图进行扫描的话,那不就相当于加了一个OCR。这里一种可能的做法是,GPT对模型的输出进行一个检测,检测到和”图片中文字“相关的请求的时候,再去触发OCR,也就是只负责管理好输出就好了。
第四点:GPT-4V已经开放了API[6] ,并且给出了token计算成本的方式,从常理上来看,开放了API不太可能是外挂了一个OCR的东西。
2.第二关心的问题,GPT4-V是个什么结构。
同样,先放观点,之前大家猜测是一个类似flamingo[7]的结构,目前来看可能性极大。接下来给一些模型可能的细节。
1.GPT4-V输入图像是512,用65个token来表征,一个是类似class token,另外64个token来表征图像。从当前的数据来看,有vision encoder的话,用的也不是CLIP[8] 训练的vision encoder,因为patch的尺寸对不上。几种可能的结构:-ViT的patch size是64:1.然后经过vision encoder后,直接拼接。2.也有可能采用fuyu[12] 的结构,取消了ViT,直接拼接,这种结构偏激进,大概率不可能。-ViT的patch size不是64:这种可能性更大一些,大概率是32的patch size
1.Flamingo的那种结构,而Flamingo同样是用了64个query,这里是符合的。2.LLaVA的那种结构,没有resampler进行token缩减,无法适应不同的分辨率,结构上来看有些出入。2.GPT4-V为什么Crop之前用65个token来来表征,crop之后的图像用129个token来表征。两种可能:- 训练了两个Vision encoder,分别用于coarse grain和fine grained的信息抽取。如果是采用了两个不同的vision encoder,部署会是个问题。- 采用两个resampler,分别用于细节丰富和细节稀疏的两种情况,这里可能性更大,结构上也更说的过去。3.另一个问题是处理高分辨率的形式。从文档来看,GPT4-V对高分辨率的图做crop,crop成512512再输给模型。从token的计算方式来看,应该是直接不重叠的滑窗crop,没有使用模型来做crop。如果是Crop的话,存在一个问题,不同的切块之间的联系是如何建立的呢。一种方式是采用Ureader[10] 的那种形式。对切块后的不同crop分配一个position embedding。
目前想到这些,欢迎补充。
References
[1]
GPT-4V: https://openai.com/research/gpt-4v-system-card
[2]
API 访问 GPT-4: https://help.openai.com/en/articles/7102672-how-can-i-access-gpt-4
[3]
Assistants API: https://platform.openai.com/docs/api-reference/assistants
[4]
用视觉理解视频。: https://cookbook.openai.com/examples/gpt_with_vision_for_video_understanding
[5]
我们不使用通过 OpenAI API 上传的数据来训练我们的模型。: https://openai.com/enterprise-privacy
[6]
Can I fine-tune the image capabilities in gpt-4
?我可以微调 gpt-4
中的图像功能吗?: https://platform.openai.com/docs/guides/vision/can-i-fine-tune-the-image-capabilities-in-gpt-4
[7]
Can I use gpt-4
to generate images?我可以使用 gpt-4
生成图像吗?: https://platform.openai.com/docs/guides/vision/can-i-use-gpt-4-to-generate-images
[8]
What type of files can I upload?我可以上传什么类型的文件?: https://platform.openai.com/docs/guides/vision/what-type-of-files-can-i-upload
[9]
Is there a limit to the size of the image I can upload?我可以上传的图片大小有限制吗?: https://platform.openai.com/docs/guides/vision/is-there-a-limit-to-the-size-of-the-image-i-can-upload
[10]
Where can I learn more about the considerations of GPT-4 with Vision?在哪里可以了解有关 GPT-4 with Vision 的注意事项的更多信息?: https://platform.openai.com/docs/guides/vision/where-can-i-learn-more-about-the-considerations-of-gpt-4-with-vision
[11]
GPT-4 with Vision system card: https://openai.com/contributions/gpt-4v
[12]
How do rate limits for GPT-4 with Vision work?GPT-4 with Vision 的速率限制如何运作?: https://platform.openai.com/docs/guides/vision/how-do-rate-limits-for-gpt-4-with-vision-work
[13]
Can GPT-4 with Vision understand image metadata?带有 Vision 的 GPT-4 可以理解图像元数据吗?: https://platform.openai.com/docs/guides/vision/can-gpt-4-with-vision-understand-image-metadata
[14]
What happens if my image is unclear?如果我的图像不清楚怎么办?: https://platform.openai.com/docs/guides/vision/what-happens-if-my-image-is-unclear