【API】免费调用Qwen-vl2对图像打标

首次调用通义千问API_大模型服务平台百炼(Model Studio)-阿里云帮助中心icon-default.png?t=O83Ahttps://help.aliyun.com/zh/model-studio/getting-started/first-api-call-to-qwen?spm=a2c4g.11186623.help-menu-2400256.d_0_1_0.8c693048HxtUzZ&scm=20140722.H_2840915._.OR_help-T_cn~zh-V_1

一、开通账号

  1. 注册账号:如果没有阿里云账号,您需要先注册阿里云账号。

  2. 开通百炼:前往百炼控制台,如果页面顶部显示以下消息,您需要开通百炼的模型服务,以获得免费额度。如果未显示该消息,则表示您已经开通。

    image

  3. 获取API Key:在控制台的右上角选择API-KEY,然后创建API Key用于通过API调用大模型。

    image

二、配置环境

2.1 linux系统配置API Key到环境变量

(也可跳过,直接输入,复制代码过程中不安全)

echo "export DASHSCOPE_API_KEY='YOUR_DASHSCOPE_API_KEY'" >> ~/.bashrc

执行以下命令,使变更生效。

source ~/.bashrc

重新打开一个终端窗口,运行以下命令检查环境变量是否生效。

echo $DASHSCOPE_API_KEY

2.2 windows系统cmd添加

添加永久性环境变量

如果您希望API Key环境变量在当前用户的所有新会话中生效,可以按如下操作。

  1. 在CMD中运行以下命令。

    # 用您的 DashScope API Key 代替 YOUR_DASHSCOPE_API_KEY
    setx DASHSCOPE_API_KEY "YOUR_DASHSCOPE_API_KEY"
  2. 打开一个新的CMD窗口。

  3. 在新的CMD窗口运行以下命令,检查环境变量是否生效。

    echo %DASHSCOPE_API_KEY%

2.3  安装 依赖 (之前需要安装python)

pip3 install -U openai
# pip3 install -U dashscope

三、测试代码 (可对一个文件夹图片打标)

3.1 文字智能助手 (官方hello-world)

import os
from openai import OpenAI

try:
    client = OpenAI(
        # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
        # api_key="sk-xxx"
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )

    completion = client.chat.completions.create(
        model="qwen-plus",  # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
        messages=[
            {'role': 'system', 'content': 'You are a helpful assistant.'},
            {'role': 'user', 'content': '你是谁?'}
            ]
    )
    print(completion.choices[0].message.content)
except Exception as e:
    print(f"错误信息:{e}")
    print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")

3.2  上传本地图片并进行打标 (记得改文件类型)

from openai import OpenAI
import os
import base64


#  base 64 编码格式
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")


input_image_path = r"C:\Users\admin\Downloads\anytext.png"
base64_image = encode_image(input_image_path)
client = OpenAI(
    # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen-vl-max-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    # 需要注意,传入BASE64,图像格式(即image/{format})需要与支持的图片列表中的Content Type保持一致。"f"是字符串格式化的方法。
                    # PNG图像:  f"data:image/png;base64,{base64_image}"
                    # JPEG图像: f"data:image/jpeg;base64,{base64_image}"
                    # WEBP图像: f"data:image/webp;base64,{base64_image}"
                    "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, 
                },
                {"type": "text", "text": "描述这张图片,分别用中文,英文2种方式"},
            ],
        }
    ],
)
print(completion.choices[0].message.content)

3.2.1 本地的图片与运行结果结果

3.3  上传一张图片or 对一个文件夹打标,将图片打标后保存到txt

    one_img_qwenvl_2_txt(input_image_path)    # 单张图片
    dir_img_qwenvl_2_txt(r"D:\code\test")           # 处理文件夹

其中,下面代码可有针对性指导打标结果,可以输出制定格式

 {"type": "text", "text": "详细描述这张图片。分别用中文,英文2种方式描述,中文和英文间,用\n隔开"},

from openai import OpenAI
import os
import base64
import time

#  base 64 编码格式
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")



def img2text(input_image_path):
    img_type=input_image_path.rsplit('.')[1]  # 从右边的第一个‘.’分割一次, “xxxx/xx.png”=["xxxx/xx/xx.","png" ],所以取第2个元素
    print('img_type:',img_type)
    base64_image = encode_image(input_image_path)
    client = OpenAI(
        # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
        api_key=os.getenv('DASHSCOPE_API_KEY'),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
    completion = client.chat.completions.create(
        model="qwen-vl-max-latest",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image_url",
                        # 需要注意,传入BASE64,图像格式(即image/{format})需要与支持的图片列表中的Content Type保持一致。"f"是字符串格式化的方法。
                        # PNG图像:  f"data:image/png;base64,{base64_image}"
                        # JPEG图像: f"data:image/jpeg;base64,{base64_image}"
                        # WEBP图像: f"data:image/webp;base64,{base64_image}"
                        "image_url": {"url": f"data:image/{img_type};base64,{base64_image}"}, 
                    },
                    {"type": "text", "text": "详细描述这张图片。分别用中文,英文2种方式描述,中文和英文间,用\n隔开"},
                ],
            }
        ],
    )
    content=completion.choices[0].message.content
    print(content)
    return content



def write_txt(content,name,out_dir='./'):
    with open(f'{out_dir}/{name}.txt', 'w') as f:
        f.write(content)


def one_img_qwenvl_2_txt(input_image_path):
    t1=time.time()
    img_dir=os.path.dirname(input_image_path)
    content=img2text(input_image_path)
    name=os.path.basename(input_image_path).rsplit('.')[0]  # 取文件名,去掉后缀
    # print('img_dir:file_name',img_dir,name)
    cn_text,en_text=content.split('\n') # 根据输出结果进行解析
    write_txt(en_text,name,img_dir)
    print(f'img {name} cost time:',round(time.time()-t1,2),"秒")
    return cn_text,en_text


def dir_img_qwenvl_2_txt(img_dir):
    img_list=[  file for file in os.listdir(img_dir)  if  file.endswith((".jpg", ".png", ".jpeg", ".webp"))]
    t0=time.time()
    for img_file in img_list:
        
        # print('img_file',img_file)
        input_image_path=os.path.join(img_dir,img_file)
        cn_text,en_text=one_img_qwenvl_2_txt(input_image_path)  
        
    print('Dir cost time:',round(time.time()-t0,2),"秒")



if __name__ == '__main__':
    input_image_path = r"D:\code\0train\feij.png"
    one_img_qwenvl_2_txt(input_image_path)  # 单张图片
    dir_img_qwenvl_2_txt(r"D:\code\test")  # 处理文件夹
        
    


    

3.3.1  对文件夹打标结果

log

### Qwen VL 模型架构介绍 #### 多模态输入处理机制 Qwen VL 设计用于接收并处理多种类型的输入数据,特别是本和图像两种主要形式的数据。对于每种类型的数据,模型都配备了专门的编码器来提取特征向量表示[^1]。 #### 编码器结构 针对本部分,采用基于Transformer的语言模型作为编码组件;而对于图像,则利用改进版的卷积神经网络(Convolutional Neural Network, CNN),或者是更先进的视觉变换器(Vision Transformer, ViT)[^2]。这些编码模块能够分别捕捉各自领域内的复杂模式,并将其转换成高维空间中的稠密向量表达。 #### 跨模态融合层 为了实现对不同来源信息的有效整合,在两个独立编码之后设置了跨模态交互单元(Cross-modal Interaction Unit, CIU)。CIU通过特定算法使得来自本域和片域的信息可以在共同的空间里相互作用,从而形成更加丰富的联合表征。 #### 解码与输出预测 最后阶段涉及解码过程以及最终的任务导向型输出成。依据具体应用场景需求——比如检索、描述成或是答系统等——该框架可以灵活调整其末端组件的设计思路,以适应多样化的下游任务要求。 ```python # 这是一个简化版本的概念示意代码,实际应用中会更为复杂 class CrossModalInteractionUnit(nn.Module): def __init__(self, input_dim_text, input_dim_image, hidden_size): super().__init__() self.fc_text = nn.Linear(input_dim_text, hidden_size) self.fc_image = nn.Linear(input_dim_image, hidden_size) def forward(self, text_features, image_features): transformed_text = F.relu(self.fc_text(text_features)) transformed_image = F.relu(self.fc_image(image_features)) # 假设这里有一个简单的相加操作来进行初步的跨模态融合 fused_representation = torch.add(transformed_text, transformed_image) return fused_representation ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曾小蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值