图像理解
大模型具有图像理解能力,可以同时接受图像和文本两种模态的信息输入。使用此类模型,不再局限于单一的文本输入模态,模型可以分析您传入的图像并理解图像与文本之间的关系进行回答,可用于OCR、图像分类、目标检测等任务中。本文档介绍了图像理解模型的使用方法。
快速开始
您可以通过两种方式将图像传入模型:图像 URL 和 Base64 编码。与文本信息相同,图像信息也需要使用用户角色进行输入,即"role": "user"
。以下是使用图像理解模型的简单调用示例。
图像 URL 输入
curl --location 'https://qianfan.baidubce.com/v2/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer bce-v3/ALTAK-*********/614fb**********' \
--data '{
"model": "deepseek-vl2",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What is in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "https://testimage.bj.bcebos.com/Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
}
}
]
}
],
"max_tokens": 300
}'
Base 64 编码输入
如果您需要上传本地图像,可以将图像转成 Base 64 编码后输入。以下是一个兼容 OpenAI 接口规范的示例。
import base64
from openai import OpenAI
client = OpenAI(
api_key="your-api_key",
base_url="https://qianfan.baidubce.com/v2"
)
# 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="deepseek-vl2",
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 支持接受、处理多个图像输入,其中每个图片都可以通过 URL 或 Base 64 编码输入。模型会处理每个图像,根据传入的所有图像信息进行回答。
请注意:图片数量受模型图文总 Token 上限(即最大输入)的限制,所有图片的总 Token 数必须小于模型的最大输入。
curl --location 'https://qianfan.baidubce.com/v2/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer bce-v3/ALTAK-*********/614fb**********' \
--data '{
"model": "deepseek-vl2",
"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://testimage.bj.bcebos.com/Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
}
},
{
"type": "image_url",
"image_url": {
"url": "https://testimage.bj.bcebos.com/Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
}
}
]
}
],
"max_tokens": 300
}'
以上示例展示了向模型输入两张图像,模型可以根据这两张图像一起回答问题,也可以分别对每张图像进行回答。
使用说明
API 每一次调用都是无状态的,您需要自行管理传入给模型的信息。如果需要模型多次理解同一张图像,请在每次请求时都传入该图。
图像格式
模型支持的图像格式如下,请根据实际的图像格式,匹配输入的文件后缀。当您传入本地图像时,请将代码中的image/{format}
设置为对应的 Content Type值。
图片格式 | 文件扩展名 | Content Type |
---|---|---|
JPEG | .jpg, .jpeg | image/jpeg |
PNG | .png | image/png |
图像输入方式
您可以通过两种方式将图像传入模型:图像 URL 和 Base64 编码。对于长时间运行的对话,建议通过 URL 进行输入。
- 当您使用图像 URL 时,需要确保图像 URL 可被访问。
- 当您使用图像 Base 64 编码时,需要注意原图大小不超过10MB。
图像大小限制
模型在进行图像理解前会对图像进行缩放等预处理,不同模型对单张图像的像素总数量有不同的限制,详情请参考图像token计算。但请注意单个图像的大小不超过10MB。
指定图像理解的深度
部分模型支持指定图像理解的深度,如 ERNIE 4.5。
您可以通过设置detail
参数来指定模型在理解图像时的细节程度,支持设置low
,high
,auto
三个参数选项。请将该参数放在 image_url
后,例如:
"image_url": {
"url": "https://testimage.bj.bcebos.com/Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
"detail": "high",
},
对于目前已支持指定深度的模型,当您不指定detail
或指定为 high
和auto
时,模型会采用 “高分辨率” 模式,而指定为 low
时会采用 “低分辨率” 模式。
"detail": "low"
:模型会采用 “低分辨率” 模式,可以节约 tokens 消耗量、提升处理速度。"detail": "high"
:模型会采用 “高分辨率” 模式,理解图像中更多的细节,同时将消耗更多的 tokens,降低处理的速度。"detail": "auto"
:当您不指定或指定为auto
时,模型会采用 “高分辨率” 模式。
图像 token 计算
与文本相同,模型会将图像输入转化为 tokens,并与文本信息一同作为模型输入的上下文信息进行计量计费。不同模型对图像 tokens 的转化方式不同,以下为千帆当前支持的图像理解模型图像 tokens 计算规则。您也可以使用千帆 token 计算器来估算对应输入的 token 数量。
Ernie 4.5
Ernie 系列模型在处理图片时,每448*448
像素对应 64 个token。对于每张图片,模型会处理成global_view
和local_view
两部分。global_view
将原图片统一resize 成448*448
像素大小,local_view
会将图片划分成若干448*448
的切片,即(h*448) * (w * 448)
,中间会增加额外token来衔接。由于该模型支持指定图像理解的深度,
- 当未指定
detail
或指定为high
和auto
时,16 <= h*w <= 36
- 当未指定
detail
指定为low
时,4 <= h*w <= 9
缩放的长宽h * w
按如下规则选择:
h
和w
均为整数,按设定的detail
参数满足对应约束,按照(h, w)
组合遍历;- 对于每个
(h, w)
组合,计算缩放后的图像长宽比与目标长宽比的差异,选取最接近的作为最佳缩放尺寸。 token消耗按照如下公式计算:
token 总数 = (h*w + 1) * 64 + h*w + 9
DeepSeek VL2 系列
- 当传入的图片数量 >= 3 时,DeepSeek VL2 系列模型将图片resize 成
384*384
尺寸,每张图片消耗 421 tokens; - 当传入的图片数量 <= 2 时,DeepSeek VL2 系列模型将按以下规则进行切片:
对于每张图片,模型会处理成
global_view
和local_view
两部分。global_view
将原图片统一resize 成384*384
像素大小,local_view
会将图片划分成若干384*384
的切片。图片中间会根据宽度增加额外token来衔接。
a. 图片长、宽 < 384 时,模型将图片 resize 成384*384
尺寸,消耗 421 tokens
b. 图片长或宽>=384 时,根据长宽比例,将图片 resize 成长宽均为 384 的倍数, 即(h*384) * (w * 384)
, 且1 <= h*w <=9
。
-
缩放的长宽
h * w
按如下规则选择:h
和w
均为整数,在满足1 <= h*w <=9
约束下,按照(h, w)
组合遍历;- 将图片 resize 成
(h*384, w*384)
像素时,和原图片的像素比较,取新图片像素和原图片像素的最小值作为有效像素值,取原图片像素值与有效像素值之差作为无效像素值。如果有效像素值超过之前判定的有效像素值,或者当有效像素值和之前持平,但是无效像素值更小时,选择当前(h*384, w*384)
组合。
- token消耗按照如下公式计算:
token 总数 = (h*w + 1) * 196 + (w+1) * 14 + 1
通义千问 VL 系列
通义千问 VL 模型在处理图片时,每28*28
像素对应一个token,一张图最少需要4个 token,最多包含1280个 token,超出会对图像进行缩放。
模型最高支持像素是 28*28*1280 = 1003520
,最低支持像素是 28*28*4=3136
首先计算图片像素:
- 如果在最小像素和最大像素区间内,将长宽按照28的倍数四舍五入取整
(h * 28) * (w * 28)
,消耗token = h*w +2
- 如果不在最小像素和最大像素区间内,等比缩放至像素区间
(3136,1003520)
,并保证长宽均为28
整数倍得到缩放后的图片(h * 28) * (w * 28),
消耗token = h*w +2
InternVL系列
InternVL 最低处理像素为 448*448
,最高为 12*448*448
。模型根据图片的长宽比例, resize 成长宽均为448*448
像素大小,即(h * 448) * (w * 448)
,且 1 <= h * w <=12
。
-
缩放的长宽
h * w
按照如下规则选择:h
和w
均为整数,在满足1 <= h * w <= 12
约束下,按照h * w
从小到大的组合遍历;- 对于当前
(h, w)
组合,如果原始图片长宽比例更接近h / w
,那么选择该(h, w)
组合; - 对于 数值更大但是比例相同 的
(h, w)
组合,如果原始图片像素大于0.5 * h * w * 448 * 448
,那么选择数值更大的(h, w)
组合。
-
token消耗按照如下规则:
- 如果
h * w = 1
,那么消耗256 tokens
; - 如果
h * w > 1
,按448 * 448
滑动窗口,每个窗口均额外消耗256 token
,一共消耗(h * w + 1) * 256 tokens
。
- 如果