背景说明
智谱 AI 也发布了不错的多模态图文理解大模型,详见官网介绍。
基于 CogVLM 系列模型的研究经验,智谱成功研发了 GLM-4V-Plus,集图像理解与视频理解能力于一体的多模态模型。GLM-4V-Plus 在图像和视频理解领域均展现出领先水平,稳居行业前列。
GLM-4V 系列包含 3 款模型,分别适用于不同的应用场景:
- GLM-4V-Plus:具备卓越的多模态理解能力,可同时处理最多5张图像,并支持视频内容理解,适用于复杂的多媒体分析场景。
- GLM-4V:专注于图像内容理解,能够同时解析最多5张图像,适合于需要深度图像理解的场合。
- GLM-4V-Flash(免费):专注于高效的单一图像理解,适用于快速图像解析的场景,例如实时图像分析或批量图像处理。
注意,其中 GLM-4V-Flash 是可以免费调用的,GLM-4V-Plus 则更专业,同时支持复杂的多媒体分析场景。本文档重点讲解一下图像内容理解模型。
注意,此模型明确不具备【图像生成】能力(图片生成是 CogView-3 模型),在实际使用中可能存在如下几个问题,然后寻求方案解决:
- 传入的图片格式,支持有限,比如用户iOS拍的照片可能是heic格式等不容易很好的解决;
- 传入的文件大小有限制,需要在本地机器做一下压缩才能去做,因此寻求云端现成的方案;
- base64会增大传输的流量;
- 图片缩放后,可以支持更多的处理张数减少tokens,综合节省成本。
通过接入 veImageX 服务来实现对大模型能力限制,增加前置处理,支持更多能力。
:::tip
- 图像大小上传限制为每张图像 5M 以下,且像素不超过 6000 * 6000。
- 支持 jpg、png、jpeg 的图片格式。
- GLM-4V-Flash 不支持 base64 编码。
- 视频大小仅支持 20M 以内,视频时长不超过 30s。支持的视频类型为 mp4。
:::
方案思路
组合方案
根据现有的能力,我们可以如下方式来桥接思路。
:::tip
veImageX 产品当前功能的使用限制详见注意与使用限制。
:::
类型 | 输出 | 用户原始素材输入 | |
---|---|---|---|
输出格式支持 | jpeg、png、webp等 | - 视频资源:几乎所有 ffpeg 视频格式,推荐 H.264、H.265。 | \ |
- 图像资源:几乎所有的图像格式 | \ | ||
- 在线处理:JPEG、PNG、WEBP、GIF、TIFF、BMP、ICO 、HEIC\HEIF、SVG(静图)、PSD、EPS、AVIF(静图和动图)、ASTC、APNG | \ | ||
- 离线处理:PSD、EPS、AVIF(静图)、ASTC、RAF、CR2、NEF、RW2、ARW、DNG 等 | |||
基础能力 | 支持存储、分发、图像处理 | - | |
限制体积输出 | 支持限制体积输出 | 单文件最大支持 4GB。图片文件处理支持 35MB,可扩增。 | |
分辨率支持 | 支持限制最大分辨率 | 最大 4 亿像素 | |
上传支持 | 多端 SDK | 支持 Web、Android、iOS、服务端各种 SDK 接入。 | |
上传数量 | 不限制 | 不限制 | |
计费模式 | 详见计费说明,其中图像处理计费项提供了 20TB 免费处理量。 | - |
服务端对接时序图
实施
火山引擎 veImageX配置
提前配置,获取配置信息
开通 veImageX,创建服务,获取域名 | 获取处理与样式模板 | 开通智谱 AI | |
---|---|---|---|
veImageX 控制台获取服务 ID 和域名。 | veImageX 控制台获取模板配置,如~tplv-n9b2vwdhz3-59.jpeg | BigModel 智谱 AI 大模型开放平台 创建推理点,获取 apiky | \ |
- 域名:如 imagex.75live.com | \ | ||
- ServiceID:如 n9b2vwdhz3 | |||
展开说说 ImageX 的模板
针对视频、动图类文件,输出指定时间戳的、动态分辨率、最大体积、固定格式的图像: | 针对图像类文件,输出指定分辨率、最大体积、指定格式个图片 | 针对其他源文件 | |
---|---|---|---|
关键能力:截帧/截图、分辨率、格式、压缩 | 关键能力:压缩、分辨率、格式 | 原样输出 | \ |
\ | |||
\ | |||
\ | |||
视频截帧模板: | 图像压缩模板: | 直接使用源地址: | \ |
~tplv-n9b2vwdhz3-snap-v1:resize_width :resize_height :snapshot_time :static.maxsize .jpeg | ~tplv-n9b2vwdhz3-img:resize_width :resize_height :static.maxsize .jpeg | \ | |
其中: | \ | ||
resize_width 截图的分辨率宽,按照模型要求初步设定为0,原图宽高 | ` json | \ | |
resize_height 截图分辨率的高度,暂定540 | resize_width 截图的分辨率宽,按照模型要求初步设定为0,原图宽高 | 示例地址: | \ |
snapshot_time 截取的视频的时间点;3000ms | resize_height 截图分辨率的高度,暂定540 | https://imagex.75live.com/0.05697426767288283.png | \ |
static.maxsize 输出的文件的体积不超过的最大值;500000,大约500KB | static.maxsize 输出的文件的体积不超过的最大值;500000,大约500KB | ` | \ |
jpeg:输出的图片格式 | \ | ||
\ | |||
` plain | \ | ||
示例地址: | \ | ||
https://imagex.75live.com/volcimagex.mp4~tplv-n9b2vwdhz3-snap... | ` plain | \ | |
` | 示例地址: | \ | |
https://imagex.75live.com/0.05697426767288283.png~tplv-n9b2vw... | \ | ||
` |
演示 demo 实践代码
上传图片+前置处理(支持任意资源类型上传)
官网地址:https://www.volcengine.com/docs/508/477196
# coding:utf-8
from __future__ import print_function
from volcengine.imagex.v2.imagex_service import ImagexService
import uuid
import time
from zhipuai import ZhipuAI
IMAGEX_AK = "**" # 从火山引擎控制台获取ak和sk
IMAGEX_SK = "*****"
ARK_API_KEY = "***" #从智谱https://bigmodel.cn/usercenter/proj-mgmt/apikeys 智谱控制台获取这个
'''
如下是火山引擎ImageX上传并拼接url的示例,第一步需要,pip install --user volcengine '
'''
def generate_unique_string():
# 生成一个随机的UUID
uuid_part = str(uuid.uuid4())
# 获取当前时间戳(以纳秒为单位)
timestamp = str(time.time_ns())
# 将UUID和时间戳结合起来
unique_str = f"{uuid_part}_{timestamp}"
return unique_str
if __name__ == "__main__":
imagex_service = ImagexService()
domain = "imagex.75live.com" # 域名,可在ImageX控制台获取,也可以在ImageX控制台的域名管理页面获取
Tpl = "tplv-n9b2vwdhz3-snap-v1:0:0:{}:0.jpeg" # 视频截帧模板,{}是视频截帧的时间点,单位是毫秒
imagex_service.set_ak(IMAGEX_AK)
imagex_service.set_sk(IMAGEX_SK)
params = dict()
params["ServiceId"] = "n9b2vwdhz3" # 服务id,可在ImageX控制台获取
params["SkipMeta"] = False #
params["SkipCommit"] = False
params["StoreKeys"] = generate_unique_string()+".mp4" # 存储uri,使用随机生成的字符串
# params['FileExtension'] ='jpeg'
file_paths = ["/Users/dev/aigc/pic/volcimagex.mp4"] # 本地文件的路径,可以支持任意类型,包括视频、图片等
resp = imagex_service.upload_image(params, file_paths)
if resp["Results"][0]["UriStatus"] != 2000:
raise Exception("upload failed")
image_uri = resp["Results"][0]["Uri"]
imagex_url = "https://" + domain + "/" + image_uri + "~" + Tpl # 拼接url,拼接方式为:http://domain/uri+处理模板
print("----- imagex upload and compress success-----")
# 传入时间点,构造1-5秒的截帧URL列表
imagex_urls = [imagex_url.format(i * 1000) for i in range(1, 5)]
# 构建messages列表中的image_url部分
image_urls_content = [{"type": "image_url", "image_url": {"url": url}} for url in imagex_urls[:5]]
'''
如下是调用智谱AI的方法,需要先安装或者升级 pip install --upgrade zhipuai'
'''
print("----- streaming request -----")
client = ZhipuAI(api_key=ARK_API_KEY) # 请填写您自己的APIKey
response = client.chat.completions.create(
model="glm-4v-plus", # 填写需要调用的模型名称
messages=[
{
"role": "system",
"content": "我会将一个视频每隔1s截图发给你,帮我总结出视频的主要内容,请注意这是一个视频",
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "请帮我总结视频内容",
},
*image_urls_content # 使用星号(*)操作符将列表项展开为单独的元素
],
},
]
)
print(response.choices[0].message)
上传纯图片方案并用智谱AI分析图片内容代码
# coding:utf-8
from __future__ import print_function
from volcengine.imagex.v2.imagex_service import ImagexService
import uuid
import time
from zhipuai import ZhipuAI
# 从控制台获取ak和sk
IMAGEX_AK = "****"
IMAGEX_SK = "***"
ARK_API_KEY = "***"
'''
如下是火山引擎ImageX上传并拼接url的示例,第一步需要,pip install --user volcengine '
'''
def generate_unique_string():
# 生成一个随机的UUID
uuid_part = str(uuid.uuid4())
# 获取当前时间戳(以纳秒为单位)
timestamp = str(time.time_ns())
# 将UUID和时间戳结合起来
unique_str = f"{uuid_part}_{timestamp}"
return unique_str
if __name__ == "__main__":
imagex_service = ImagexService()
domain = "imagex.75live.com" # 域名,可在ImageX控制台获取,也可以在ImageX控制台的域名管理页面获取
Tpl = "tplv-n9b2vwdhz3-img:0:540:500000.jpeg" # 图片转格式模板
imagex_service.set_ak(IMAGEX_AK)
imagex_service.set_sk(IMAGEX_SK)
params = dict()
params["ServiceId"] = "n9b2vwdhz3" # 服务id,可在ImageX控制台获取
params["SkipMeta"] = False #
params["SkipCommit"] = False
params["StoreKeys"] = generate_unique_string()+".jpg" # 存储uri,使用随机生成的字符串
# params['FileExtension'] ='jpeg'
file_paths = ["/Users/dev/aigc/pic/3.webp"] # 本地文件的路径,可以支持任意类型,包括视频、图片等
resp = imagex_service.upload_image(params, file_paths)
if resp["Results"][0]["UriStatus"] != 2000:
raise Exception("upload failed")
image_uri = resp["Results"][0]["Uri"]
imagex_url = "https://" + domain + "/" + image_uri + "~" + Tpl # 拼接url,拼接方式为:http://domain/uri+处理模板
print("----- imagex upload and compress success-----")
'''
如下是调用智谱AI的方法,需要先安装或者升级 pip install --upgrade zhipuai'
'''
print("----- streaming request -----")
client = ZhipuAI(api_key=ARK_API_KEY) # 请填写您自己的APIKey
response = client.chat.completions.create(
model="glm-4v-plus", # 填写需要调用的模型名称
messages=[
{
"role": "system",
"content": "你是智谱AI小助手,请帮我分析图像",
},
{"role": "user",
"content": [
{"type": "text", "text": "请用几个关键词解释一下这张图帮我解释一下这张图"},
{
"type": "image_url",
"image_url": {
"url": imagex_url
}
},
],
}
]
)
print(response.choices[0].message)
优缺点分析
类型 | 直调图文理解 | 巧用ImageX方案 | |
---|---|---|---|
目的 | 减少限制 | 减少模型限制、降低耗时、减少 tokens 消耗 | |
解除部分封印 | - 图片大小:建议为 500KB 左右、最大为 10MB | ImageX 前置处理: | \ |
- 格式:jpeg、webp | - 格式:支持几乎所有图片、视频与多种类型输入 | \ | |
- 图片大小:默认为 35MB,最大可为几个GB | |||
压缩方式 | 引入开源组件,自行实现压缩 | 专有图像处理服务 | |
算力 | 消耗本地算力 | 云端算力 | |
性能 | - | 相比 base64 方案,传输数据较小 | |
复杂性 | 本地调试,调试稍微方便 | 控制台配置,配置对了,不会出错; | \ |
虽然是自动化配置,但首次配置可能会出错; |
总结
通过智谱 AI,可以将一些图像处理的过程放在前置进行提前处理,同时在用户视角展示的时候可以二次预览用户需要的图像资源,这里我们借助了一些火山引擎专业做图像处理和素材托管的工具,这样可以大幅减少 tokens 的消耗;当然,如果你也可以用一些第三方的处理工具来实现。
智谱 AI 在图像识别处理、文字大模型、文生图和是方向有更多深入的研究,重点是目前智谱 AI 有不错的免费使用额度,同时,GLM-4V-Flash(免费)这个模型是免费用的。
赶快去用吧~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。