通义千问( 五 ) 图片分析

5.多模态

5.1.图片分析

5.1.1.介绍

通义千问VL(Qwen-VL)是阿里云研发的大规模视觉语言模型(Large Vision Language Model, LVLM),可以以图像、文本、检测框作为输入,并以文本和检测框作为输出,支持中文多模态对话及多图对话,并具有更好的性能,是首个支持中文开放域的通用定位模型和首个开源448分辨率的大规模视觉语言模型。

通义千问VL模型主要有以下特点:

  1. 强大的性能:在四大类多模态任务的标准英文测评中(Zero-shot Captioning/VQA/DocVQA/Grounding)上,均取得同等通用模型大小下最好效果;
  2. 多语言对话模型:天然支持英文、中文等多语言对话,端到端支持图片里中英双语的长文本识别;
  3. 多图交错对话:支持多图输入和比较,指定图片问答,多图文学创作等;
  4. 首个支持中文开放域定位的通用模型:通过中文开放域语言表达进行检测框标注;
  5. 细粒度识别和理解:相比于目前其它开源LVLM使用的224分辨率,Qwen-VL是首个开源的448分辨率的LVLM模型。更高分辨率可以提升细粒度的文字识别、文档问答和检测框标注。

升级的Qwen-VL(qwen-vl-plus/qwen-vl-max)模型现有几大特点:

  1. 大幅增强了图片中文字处理能力,帮助您有效提取、整理、总结文字信息。
  2. 增加可处理分辨率范围,各分辨率和长宽比的图都能处理,大图和长图能看清。
  3. 增强视觉推理和决策能力,适于搭建视觉Agent,让大模型Agent的想象力进一步扩展。
  4. 升级看图做题能力,拍一拍习题图发给Qwen-VL,大模型能帮用户一步步解题。

5.1.2.模型概览

用户以文本和url形式的图片形式输入包含多轮对话历史和当前指令的信息序列(messages),到返回模型生成的回复作为输出。在这一过程中,文本将被转换为语言模型可以处理的token序列。

图片将被按照图片像素转换为token序列,28*28的像素对应一个token,如果长宽不是28的整数倍,则向上取到28的整数倍计算,一张图最少包含4个token,最多包含1280个token。

模型名 计费单价 基础限流
qwen-vl-plus 0.008元 / 1,000 tokens 以下条件任何一个超出都会触发限流: 流量 ≤ 60 QPM,每分钟处理不超过60个完整的请求; Token消耗 ≤ 100,000 TPM,每分钟消耗的Token数目不超过100,000。
qwen-vl-max 0.02元 / 1,000 tokens 以下条件任何一个超出都会触发限流: 流量 ≤ 15 QPM,每分钟处理不超过15个完整的请求; Token消耗 ≤ 25,000 TPM,每分钟消耗的Token数目不超过25,000。

5.1.3.图片限制

对于输入的图片有以下限制:

  1. 图片文件大小不超过10 MB
  2. 图片总的像素数不超过 1048576,这相当于一张长宽均为 1024 的图片总像素数
  3. 单次最多支持上传10张图片。

图片支持的格式:

图片格式 Content Type 文件扩展名
BMP image/bmp .bmp
JPEG image/jpeg .jpeg, .jpg
PNG image/png .png
TIFF image/tiff .tif, .tiff
WEBP image/webp .webp

5.1.4.线上图片

java 复制代码
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.Collections;

@RestController
@RequestMapping("/tongyi")
public class AigcVlController {

    @Value("${tongyi.api-key}")
    private String apiKey;


    public  MultiModalConversationResult simpleMultiModalConversationCall(String message)
            throws ApiException, NoApiKeyException, UploadFileException {
        // 设置API密钥
        Constants.apiKey = apiKey;

        MultiModalConversation conv = new MultiModalConversation();

        MultiModalMessage userMessage = MultiModalMessage.builder()
                .role(Role.USER.getValue())
                .content(Arrays.asList(Collections.singletonMap("image", "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"),
                        Collections.singletonMap("text", message)))
                .build();

        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model(MultiModalConversation.Models.QWEN_VL_PLUS)
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result);

        return result;
    }


    @RequestMapping("/aigc/vl")
    public String callBase(@RequestParam(value = "message", required = false, defaultValue = "这是什么?") String message) throws NoApiKeyException, InputRequiredException {

        try {
            MultiModalConversationResult result = simpleMultiModalConversationCall(message);
            return result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text").toString();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        return null;
    }
}
5.1.4.1.测试
text 复制代码
GET http://localhost:8081/tongyi/aigc/vl

HTTP/1.1 200 

这张图片显示了一位女士和她的狗在海滩上。她们似乎正在享受彼此的陪伴,狗狗坐在沙滩上伸出爪子与女士握手或互动。背景是美丽的日落景色,海浪轻轻拍打着海岸线。

请注意,我提供的描述基于图像中可见的内容,并不包括任何超出视觉信息之外的推测性解释。如果您需要更多关于场景、物体或其他细节的信息,请告诉我!

5.1.5.本地图片

可以通过本地文件进行接口调用。在传入文件路径时,请根据您所使用的系统和文件的路径进行调整,详情如下表所示。

系统 传入的文件路径 示例
Linux或macOS系统 file://{文件的绝对路径} file:///home/images/test.png
Windows系统 file:///{文件的绝对路径} file:///D:/images/test.png

代码案例

java 复制代码
import com.alibaba.dashscope.aigc.multimodalconversation.*;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.HashMap;

@RestController
@RequestMapping("/tongyi")
public class AigcVlLocalController {

    @Value("${tongyi.api-key}")
    private String apiKey;


    public MultiModalConversationResult callWithLocalFile(String message)
            throws ApiException, NoApiKeyException, UploadFileException {
        // 设置API密钥
        Constants.apiKey = apiKey;

        String localFilePath1 = "file:///D:/upload/图片1.png";
        String localFilePath2 = "file:///D:/upload/图片2.png";
        // 创建会话
        MultiModalConversation conv = new MultiModalConversation();

        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        new HashMap<String, Object>(){{ put("image", localFilePath1); } },
                        new HashMap<String, Object>(){{ put("image", localFilePath2); } },
                        new HashMap<String, Object>(){{ put("text", message); } } )
                )
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model(MultiModalConversation.Models.QWEN_VL_PLUS)
                .message(userMessage)
                .build();

        MultiModalConversationResult result = conv.call(param);

        return result;
    }


    @RequestMapping("/aigc/local")
    public String callBase(@RequestParam(value = "message", required = false, defaultValue = "这是什么?") String message) throws NoApiKeyException, InputRequiredException {

        try {
            MultiModalConversationResult result = callWithLocalFile(message);
            return result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text").toString();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        return null;
    }
}
5.1.5.1.测试
text 复制代码
###
GET http://localhost:8081/tongyi/aigc/local?message=10分满分,两张图片的相似度你给几分
    
    
    
###
GET http://localhost:8081/tongyi/aigc/local?message=提取第一张图片上的文字
相关推荐
SimonLiu0092 小时前
[AI]30分钟用cursor开发一个chrome插件
chrome·ai·ai编程
伯牙碎琴3 小时前
智能体实战(需求分析助手)二、需求分析助手第一版实现(支持需求提取、整理、痛点分析、需求分类、优先级分析、需求文档生成等功能)
ai·大模型·agent·需求分析·智能体
卓琢19 小时前
2024 年 IA 技术大爆发深度解析
深度学习·ai·论文笔记
zaim11 天前
计算机的错误计算(一百八十七)
人工智能·ai·大模型·llm·错误·正弦/sin·误差/error
凳子花❀1 天前
市场常见AI芯片总结
ai·gpu
豌豆花下猫2 天前
Python 潮流周刊#82:美国 CIA 如何使用 Python?(摘要)
后端·python·ai
爱学习的小道长2 天前
Python langchain ReAct 使用范例
python·ai·langchain
zaim12 天前
计算机的错误计算(一百八十六)
人工智能·python·ai·大模型·llm·误差·decimal
数据运营新视界2 天前
可编辑46PPT | AI+智能中台企业架构设计_重新定义制造
大数据·ai
轻流Qingflow2 天前
数字化制造新生态:共话无代码+AI落地实践
人工智能·低代码·ai·轻流