头图

背景说明

智谱 AI 也发布了不错的多模态图文理解大模型,详见官网介绍

基于 CogVLM 系列模型的研究经验,智谱成功研发了 GLM-4V-Plus,集图像理解与视频理解能力于一体的多模态模型。GLM-4V-Plus 在图像和视频理解领域均展现出领先水平,稳居行业前列。

 title=
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。
    :::

方案思路

组合方案

根据现有的能力,我们可以如下方式来桥接思路。

alt

:::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 免费处理量。-

服务端对接时序图

 title=

实施

火山引擎 veImageX配置
提前配置,获取配置信息

开通 veImageX,创建服务,获取域名获取处理与样式模板开通智谱 AI
veImageX 控制台获取服务 ID 和域名。veImageX 控制台获取模板配置,如~tplv-n9b2vwdhz3-59.jpegBigModel 智谱 AI 大模型开放平台 创建推理点,获取 apiky\
- 域名:如 imagex.75live.com\
- ServiceID:如 n9b2vwdhz3
 title= title= title=

展开说说 ImageX 的模板

针对视频、动图类文件,输出指定时间戳的、动态分辨率、最大体积、固定格式的图像:针对图像类文件,输出指定分辨率、最大体积、指定格式个图片针对其他源文件
关键能力:截帧/截图、分辨率、格式、压缩关键能力:压缩、分辨率、格式原样输出\
 title= title= title=\
 title= title= \
 title= \
视频截帧模板:图像压缩模板:直接使用源地址:\
~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截图分辨率的高度,暂定540resize_width 截图的分辨率宽,按照模型要求初步设定为0,原图宽高示例地址:\
snapshot_time截取的视频的时间点;3000msresize_height截图分辨率的高度,暂定540https://imagex.75live.com/0.05697426767288283.png\
static.maxsize输出的文件的体积不超过的最大值;500000,大约500KBstatic.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 左右、最大为 10MBImageX 前置处理:\
- 格式:jpeg、webp- 格式:支持几乎所有图片、视频与多种类型输入\
- 图片大小:默认为 35MB,最大可为几个GB
压缩方式引入开源组件,自行实现压缩专有图像处理服务
算力消耗本地算力云端算力
性能-相比 base64 方案,传输数据较小
复杂性本地调试,调试稍微方便控制台配置,配置对了,不会出错;\
虽然是自动化配置,但首次配置可能会出错;

总结

通过智谱 AI,可以将一些图像处理的过程放在前置进行提前处理,同时在用户视角展示的时候可以二次预览用户需要的图像资源,这里我们借助了一些火山引擎专业做图像处理和素材托管的工具,这样可以大幅减少 tokens 的消耗;当然,如果你也可以用一些第三方的处理工具来实现。

智谱 AI 在图像识别处理、文字大模型、文生图和是方向有更多深入的研究,重点是目前智谱 AI 有不错的免费使用额度,同时,GLM-4V-Flash(免费)这个模型是免费用的。

赶快去用吧~


七脉神剑
20 声望1 粉丝