当前位置: 首页 > news >正文

qwen2.5-vl:阿里开源超强多模态大模型(包含使用方法、微调方法介绍)

1.简介

在 Qwen2-VL 发布后的五个月里,众多开发者基于该视觉语言模型开发了新的模型,并向 Qwen 团队提供了极具价值的反馈。在此期间,Qwen 团队始终致力于打造更具实用性的视觉语言模型。今天,Qwen 家族的最新成员——Qwen2.5-VL正式登场。

主要增强功能

  • 直观地理解事物: Qwen2.5-VL 不仅能熟练识别花、鸟、鱼和昆虫等常见物体,还能高度分析文本、图表、图标、图形和图像中的布局。
  • 具有代理功能: Qwen2.5-VL 可直接扮演视觉代理,能够推理和动态指挥工具,既能在电脑上使用,也能在手机上使用。
  • 理解长视频并捕捉事件: Qwen2.5-VL可以理解1小时以上的视频,这次又增加了通过精确定位相关视频片段来捕捉事件的能力。
  • 不同格式的可视化定位能力: Qwen2.5-VL 可通过生成边框或点来精确定位图像中的对象,并能为坐标和属性提供稳定的 JSON 输出。
  • 生成结构化输出:用于扫描发票、表格、表格等数据。Qwen2.5-VL 支持对其内容进行结构化输出,有利于金融、商业等领域的使用。

相较上一代模型架构更新

  • 动态分辨率和帧速率训练,促进视频理解:通过采用动态 FPS 采样,qwen团队将动态分辨率扩展到了时间维度,使模型能够理解各种采样率的视频。相应地,qwen团队在时间维度上对 mRoPE 进行了更新,增加了 ID 和绝对时间对齐,使模型能够学习时间顺序和速度,最终获得精确定位特定时刻的能力。
  • 精简高效的视觉编码器:qwen团队通过在 ViT 中战略性地实施窗口关注,提高了训练和推理速度。通过 SwiGLU 和 RMSNorm 进一步优化了 ViT 架构,使其与 Qwen2.5 LLM 的结构保持一致。

Qwen2.5-vl有三个模型,参数分别为 30、70 和 720 亿。此版本包含经过指令调整的 7B Qwen2.5-VL 模型。

-

模型权重地址(魔搭社区):魔搭社区

模型权重地址(huggingface):https://huggingface.co/collections/Qwen/qwen25-vl-6795ffac22b334a837c0f9a5

官方博客:Qwen2.5 VL! Qwen2.5 VL! Qwen2.5 VL! | Qwen

github地址:https://github.com/QwenLM/Qwen2.5-VL

体验地址:Qwen Chat

    -

    -

    2.效果

    Qwen团队将Qwen2.5-vl模型与 SOTA 模型以及类似模型规模的最佳模型进行了评估。就旗舰模型 Qwen2.5-VL-72B-Instruct 而言,它在一系列涵盖领域和任务的基准测试中取得了极具竞争力的性能,其中包括大学难题、数学、文档理解、一般问题解答、数学、视频理解和视觉代理。值得注意的是,Qwen2.5-VL 在理解文档和图表方面具有显著优势,而且无需针对特定任务进行微调,就能扮演视觉代理的角色。

    在小型模型方面,Qwen2.5-VL-7B-Instruct 在多项任务中的表现优于 GPT-4o-mini,而作为边缘人工智能解决方案的 Qwen2.5-VL-3B 甚至优于之前版本 Qwen2-VL 的 7B 模型。

    全球图像识别

    Qwen2.5-VL大幅增强了通用图像识别能力,将图像类别扩展到超多。不仅包括植物、动物、名山大川的地标,还包括电影和电视剧中的 IP 以及各种产品。

    精确的目标定位

    Qwen2.5-VL 利用边界框和基于点的表示法进行定位,从而实现分层定位和标准化 JSON 输出。这种增强的定位能力为可视化推理奠定了基础。

    -

    增强文本识别和理解能力

    Qwen2.5-VL将OCR识别能力提升到了一个新的水平,增强了多场景、多语言、多方向的文本识别和文本本地化性能。此外,Qwen2.5-VL 在信息提取方面也有大幅提升,以满足资质审查和金融业务等领域日益增长的数字化和智能化需求。

    -

    -

    强大的文档解析功能

    Qwen2.5-VL 设计了一种名为 QwenVL HTML 格式的独特文档解析格式,可提取基于 HTML 的布局信息。QwenVL HTML 可以在各种场景下执行文档解析,如杂志、研究论文、网页甚至手机截图。

    -

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>淘宝许愿淘彩头分25亿</title><style>body {background-color: #4a0d6e;margin: 0;padding: 0;font-family: Arial, sans-serif;color: white;text-align: center;}.header {display: flex;justify-content: space-between;align-items: center;padding: 10px;}.header h1 {margin: 0;color: gold;}.content {padding: 20px;}.wish-options {display: flex;justify-content: center;gap: 10px;margin-top: 20px;}.wish-option {width: 100px;height: 200px;border-radius: 10px;padding: 10px;box-sizing: border-box;cursor: pointer;}.selected {background-color: gold;}.unselected {background-color: purple;}.footer {margin-top: 20px;}.button {background-color: gold;border: none;padding: 10px 20px;border-radius: 5px;cursor: pointer;}</style>
    </head>
    <body><div class="header"><div><img src="back_arrow.png" alt="Back"></div><h1>淘宝·许愿淘彩头分25亿</h1><div><img src="more_options.png" alt="More Options"></div></div><div class="content"><p>许下新年心愿得红包</p><img src="golden_lantern.png" alt="Golden Lantern"><div class="wish-options"><div class="wish-option selected">福寿康宁</div><div class="wish-option unselected">我想免费周游世界</div><div class="wish-option unselected">追随自己的热情</div></div><div class="footer"><button class="button">换一批 | 定制心愿</button><p>许下你的定制心愿,更灵验哦</p><button class="button">许愿拿红包 🎉</button></div></div>
    </body>
    </html>
    

    增强视频理解能力

    Qwen2.5-VL 的视频理解能力得到了全面升级。在时间处理方面,Qwen团队引入了动态帧频(FPS)训练和绝对时间编码技术。因此,该模型不仅能支持以小时为单位的超长视频理解,还能实现二级事件定位。它能够准确理解长达数小时的超长视频内容,搜索视频中的特定事件,并总结不同时间段的关键点。这样,用户就能快速高效地提取视频中的关键信息。

    -

    -

    -

    3.使用方法

    环境安装

    Qwen2.5-VL 的代码已收录在最新的transformers中,建议使用命令从源代码构建:

    pip install git+https://github.com/huggingface/transformers accelerate

    否则可能遇到以下错误

    KeyError: 'qwen2_5_vl'

    Qwen团队提供了一个工具包,帮助我们更方便地处理各种类型的可视输入,就像使用 API 一样。其中包括 base64、URL 以及交错图片和视频。可以使用以下命令安装它:

    # It's highly recommanded to use `[decord]` feature for faster video loading.
    pip install qwen-vl-utils[decord]==0.0.8

    如果您使用的不是 Linux,您可能无法从 PyPI 安装 decord。在这种情况下,您可以使用 pip install qwen-vl-utils,这会退回到使用 torchvision 进行视频处理。不过,您仍然可以从源代码中安装 decord,以便在加载视频时使用 decord。

    -

    使用transformers进行推理

    单图推理

    from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor
    from qwen_vl_utils import process_vision_info
    from modelscope import snapshot_downloadmodel_dir=snapshot_download("Qwen/Qwen2.5-VL-7B-Instruct")    # 从modelscope中下载Qwen2.5-VL模型的权重文件,并将其保存到本地目录model_dir中。# 默认方法
    model = Qwen2_5_VLForConditionalGeneration.from_pretrained(    # 加载模型。model_dir, torch_dtype="auto", device_map="auto"        # torch_dtype="auto"表示自动选择合适的张量数据类型,device_map="auto"表示自动将模型分配到可用的设备(如GPU)上。
    )# 以下注释部分提供了另一种加载方式,启用了flash_attention_2,这是一种优化技术,可以提高模型在多图像和视频场景下的加速和内存节省。
    # model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
    #     "Qwen/Qwen2.5-VL-7B-Instruct",
    #     torch_dtype=torch.bfloat16,
    #     attn_implementation="flash_attention_2",
    #     device_map="auto",
    # )# 使用AutoProcessor加载处理器,它将用于处理文本和视觉输入数据。
    processor = AutoProcessor.from_pretrained(model_dir)# 模型中每幅图像的视觉token数默认范围为 4-16384。
    # 用于设置模型处理图像时的像素范围。通过调整min_pixels和max_pixels,可以在性能和成本之间进行平衡。例如,设置为256-1280的像素范围。
    # min_pixels = 256*28*28
    # max_pixels = 1280*28*28
    # processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)messages = [        # 一个messages列表,包含了用户输入的内容。其中包含一个图像的URL和一段文字提示“Describe this image.”。{"role": "user","content": [{"type": "image","image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg",},{"type": "text", "text": "Describe this image."},],}
    ]# Preparation for inference
    text = processor.apply_chat_template(        # 将messages中的文本内容转换为模型可以理解的格式,并添加生成提示。messages, tokenize=False, add_generation_prompt=True
    )
    image_inputs, video_inputs = process_vision_info(messages)        # 从messages中提取图像和视频信息。
    inputs = processor(        # 将文本、图像和视频输入组合成一个输入字典,并将其转换为PyTorch张量。text=[text],images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt",
    )
    inputs = inputs.to("cuda")        # 将输入数据移动到GPU上(如果可用)。generated_ids = model.generate(**inputs, max_new_tokens=128)    # 调用模型生成输出。max_new_tokens=128表示生成的输出最多包含128个新token。
    generated_ids_trimmed = [        # 从生成的generated_ids中移除输入部分,只保留生成的输出部分。out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
    ]
    output_text = processor.batch_decode(    # 将生成的token ID解码为文本。generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
    )
    print(output_text)

    多图推理

    # Messages containing multiple images and a text query
    messages = [{"role": "user","content": [{"type": "image", "image": "file:///path/to/image1.jpg"},    # file:///协议指定本地路径{"type": "image", "image": "file:///path/to/image2.jpg"},{"type": "text", "text": "Identify the similarities between these images."},],}
    ]# Preparation for inference
    text = processor.apply_chat_template(    # 将messages中的文本内容转换为模型可以理解的格式,并添加生成提示。messages, tokenize=False, add_generation_prompt=True
    )
    image_inputs, video_inputs = process_vision_info(messages)    # 从messages中提取图像和视频信息。在这个例子中,video_inputs为空,因为输入中没有视频。
    inputs = processor(    # 将文本、图像和视频输入组合成一个输入字典,并将其转换为PyTorch张量。text=[text],images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt",
    )
    inputs = inputs.to("cuda")    # 将输入数据移动到GPU上(如果可用)。# Inference
    generated_ids = model.generate(**inputs, max_new_tokens=128)    # 调用模型生成输出。max_new_tokens=128表示生成的输出最多包含128个新token。
    generated_ids_trimmed = [        # 从生成的generated_ids中移除输入部分,只保留生成的输出部分。out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
    ]
    output_text = processor.batch_decode(    # 将生成的token ID解码为文本。generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
    )
    print(output_text)

    视频推理

    对于视频文件,我们可以使用3种方法引入模型

    1. 视频由图像帧列表组成
    2. 本地视频文件路径
    3. 视频URL
    # 视频由图像帧列表组成
    messages = [{"role": "user","content": [{"type": "video","video": ["file:///path/to/frame1.jpg","file:///path/to/frame2.jpg","file:///path/to/frame3.jpg","file:///path/to/frame4.jpg",],},{"type": "text", "text": "Describe this video."},],}
    ]# 本地视频文件路径
    messages = [{"role": "user","content": [{"type": "video","video": "file:///path/to/video1.mp4","max_pixels": 360 * 420,"fps": 1.0,},{"type": "text", "text": "Describe this video."},],}
    ]# 视频URL
    messages = [{"role": "user","content": [{"type": "video","video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4",},{"type": "text", "text": "Describe this video."},],}
    ]#在 Qwen 2.5 VL 中,帧频信息也被输入到模型中,以便与绝对时间保持一致。
    # Preparation for inference
    text = processor.apply_chat_template(    ¥ 将messages中的文本内容转换为模型可以理解的格式,并添加生成提示。messages, tokenize=False, add_generation_prompt=True
    )
    image_inputs, video_inputs, video_kwargs = process_vision_info(messages, return_video_kwargs=True)    # process_vision_info:从messages中提取图像和视频信息。return_video_kwargs=True表示返回与视频处理相关的参数(如帧率fps)
    inputs = processor(    # processor:将文本、图像和视频输入组合成一个输入字典,并将其转换为PyTorch张量。fps参数用于指定视频的帧率。text=[text],images=image_inputs,videos=video_inputs,fps=fps,padding=True,return_tensors="pt",**video_kwargs,
    )
    inputs = inputs.to("cuda")    # inputs.to("cuda"):将输入数据移动到GPU上(如果可用)# Inference
    generated_ids = model.generate(**inputs, max_new_tokens=128)    # 调用模型生成输出。max_new_tokens=128表示生成的输出最多包含128个新token。
    generated_ids_trimmed = [    # 从生成的generated_ids中移除输入部分,只保留生成的输出部分。out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
    ]
    output_text = processor.batch_decode(    # 将生成的token ID解码为文本。generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
    )
    print(output_text)

    注意:视频 URL 兼容性主要取决于第三方库的版本。如果不想使用默认后端,可通过 FORCE_QWENVL_VIDEO_READER=torchvision 或 FORCE_QWENVL_VIDEO_READER=decord 更改后端。

    批量推理

    # 代码中定义了两组不同的输入消息,用于批量处理:
    messages1 = [{"role": "user","content": [{"type": "image", "image": "file:///path/to/image1.jpg"},{"type": "image", "image": "file:///path/to/image2.jpg"},{"type": "text", "text": "What are the common elements in these pictures?"},],}
    ]
    messages2 = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Who are you?"},
    ]# 将两组消息合并为一个列表,用于批量处理。
    messages = [messages1, messages2]# Preparation for batch inference
    texts = [processor.apply_chat_template(msg, tokenize=False, add_generation_prompt=True)for msg in messages
    ]    # 对每组消息应用模板,将文本内容转换为模型可以理解的格式,并添加生成提示。
    image_inputs, video_inputs = process_vision_info(messages)    # 从所有消息中提取图像和视频信息。
    inputs = processor(    # 将文本、图像和视频输入组合成一个输入字典,并将其转换为PyTorch张量。text=texts,images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt",
    )
    inputs = inputs.to("cuda")    # 将输入数据移动到GPU上(如果可用)。# Batch Inference
    generated_ids = model.generate(**inputs, max_new_tokens=128)    # 调用模型生成输出。max_new_tokens=128表示生成的输出最多包含128个新token。
    generated_ids_trimmed = [    # 从生成的generated_ids中移除输入部分,只保留生成的输出部分。out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
    ]
    output_texts = processor.batch_decode(    # 将生成的token ID解码为文本。generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
    )
    print(output_texts)

     

    图片调用方法

    Qwen2.5-vl支持的图片调用有三种,以下是他们的详细使用方法:

    1. 本地文件路径
    2. URL网页
    3. Base64编码图像
    # 你可以在文本中想要插入的位置直接插入本地文件路径、URL 或 base64 编码的图片。
    ## 本地文件路径
    messages = [{"role": "user","content": [{"type": "image", "image": "file:///path/to/your/image.jpg"},{"type": "text", "text": "Describe this image."},],}
    ]
    ## URL
    messages = [{"role": "user","content": [{"type": "image", "image": "http://path/to/your/image.jpg"},{"type": "text", "text": "Describe this image."},],}
    ]
    ## Base64 encoded image
    messages = [{"role": "user","content": [{"type": "image", "image": "data:image;base64,/9j/..."},{"type": "text", "text": "Describe this image."},],}
    ]

    图像分辨率
    该模型支持多种分辨率输入。默认情况下,它使用本机分辨率进行输入,但更高的分辨率会以更多计算量为代价提高性能。用户可以根据自己的需要设置最小和最大像素数,以达到最佳配置,例如令牌数范围为 256-1280,从而在速度和内存使用之间取得平衡。

    min_pixels = 256 * 28 * 28
    max_pixels = 1280 * 28 * 28
    processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels
    )

     

    此外,Qwen团队还提供了两种方法来精细控制输入模型的图像尺寸:

    • 定义 min_pixels 和 max_pixels: 图像将在 min_pixels 和 max_pixels 的范围内调整大小以保持长宽比。(注意,这个是保持长宽比进行缩放)
    • 指定精确尺寸: 直接设置 resized_height 和 resized_width。这些值将四舍五入为最接近的 28 的倍数。(注意,这个不会保持长宽比进行缩放)
    # min_pixels and max_pixels
    messages = [{"role": "user","content": [{"type": "image","image": "file:///path/to/your/image.jpg","resized_height": 280,"resized_width": 420,},{"type": "text", "text": "Describe this image."},],}
    ]
    # 调整高度和宽度
    messages = [{"role": "user","content": [{"type": "image","image": "file:///path/to/your/image.jpg","min_pixels": 50176,"max_pixels": 50176,},{"type": "text", "text": "Describe this image."},],}
    ]

    处理长文本

    当前的 config.json 设置为上下文长度不超过 32,768 个字节。为了处理超过 32,768 个字节的大范围输入,Qwen团队使用了 YaRN,这是一种增强模型长度外推的技术,可确保在处理长文本时获得最佳性能。

    对于支持的框架,可在 config.json 中添加以下内容以启用 YaRN:

    { ..., “type”: “yarn“, ”mrope_section": [ 16, 24, 24 ], “factor”: 4,“original_max_position_embeddings”: 32768 }

    不过需要注意的是,这种方法对时间和空间定位任务的性能有很大影响,因此不建议使用。

    同时,对于长视频输入,由于 MRoPE 本身更节省 id,因此可直接将 max_position_embeddings 修改为更大的值,如 64k。

     -

    使用魔搭社区API进行推理

    可在对应界面点开API-Inference,直接复制代码

    代码如下:记得将api_key替换掉

    from openai import OpenAIclient = OpenAI(base_url='https://api-inference.modelscope.cn/v1/',api_key="<Your Key>", # ModelScope Token
    )response = client.chat.completions.create(model='Qwen/Qwen2.5-VL-7B-Instruct', # ModelScope Model-Idmessages=[{'role':'user','content': [{'type': 'text','text': '描述这幅图',}, {'type': 'image_url','image_url': {'url':'https://modelscope.oss-cn-beijing.aliyuncs.com/demo/images/audrey_hepburn.jpg',},}],}],stream=True
    )for chunk in response:print(chunk.choices[0].delta.content, end='', flush=True)

     

    API-Inference文档:https://www.modelscope.cn/docs/model-service/API-Inference/intro

    -

    微调

    接下来介绍使用ms-swift对Qwen/Qwen2.5-VL-7B-Instruct进行微调。ms-swift是魔搭社区官方提供的大模型与多模态大模型微调部署框架。

    ms-swift开源地址:https://github.com/modelscope/ms-swift

    首先安装ms-swift的环境

    git clone https://github.com/modelscope/ms-swift.git
    cd ms-swift
    pip install -e .

    图像OCR微调

    安装完成后直接在命令行使用:

    MAX_PIXELS=1003520 \CUDA_VISIBLE_DEVICES=0 \swift sft \    --model Qwen/Qwen2.5-VL-7B-Instruct \    --dataset AI-ModelScope/LaTeX_OCR:human_handwrite#20000 \    --train_type lora \    --torch_dtype bfloat16 \    --num_train_epochs 1 \    --per_device_train_batch_size 1 \    --per_device_eval_batch_size 1 \    --learning_rate 1e-4 \    --lora_rank 8 \    --lora_alpha 32 \    --target_modules all-linear \    --freeze_vit true \    --gradient_accumulation_steps 16 \    --eval_steps 50 \    --save_steps 50 \    --save_total_limit 5 \    --logging_steps 5 \    --max_length 2048 \    --output_dir output \    --warmup_ratio 0.05 \    --dataloader_num_workers 4

    自定义数据集格式如下(system字段可选),只需要指定`--dataset <dataset_path>`即可:

    {"messages": [{"role": "user", "content": "浙江的省会在哪?"}, {"role": "assistant", "content": "浙江的省会在杭州。"}]}
    {"messages": [{"role": "user", "content": "<image><image>两张图片有什么区别"}, {"role": "assistant", "content": "前一张是小猫,后一张是小狗"}], "images": ["/xxx/x.jpg", "xxx/x.png"]}
    

    视频微调

    参数含义可以查看:https://swift.readthedocs.io/zhcn/latest/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.html#id18nproc_per_node=2

    命令行使用:

    CUDA_VISIBLE_DEVICES=0,1 \NPROC_PER_NODE=$nproc_per_node \VIDEO_MAX_PIXELS=100352 \FPS_MAX_FRAMES=24 \swift sft \    --model Qwen/Qwen2.5-VL-7B-Instruct \    --dataset swift/VideoChatGPT:all \    --train_type lora \    --torch_dtype bfloat16 \    --num_train_epochs 1 \    --per_device_train_batch_size 1 \    --per_device_eval_batch_size 1 \    --learning_rate 1e-4 \    --lora_rank 8 \    --lora_alpha 32 \    --target_modules all-linear \    --freeze_vit true \    --gradient_accumulation_steps $(expr 16 / $nproc_per_node) \    --eval_steps 50 \    --save_steps 50 \    --save_total_limit 5 \    --logging_steps 5 \    --max_length 2048 \    --output_dir output \    --warmup_ratio 0.05 \    --dataloader_num_workers 4 \    --deepspeed zero2

    自定义数据集格式如下(system字段可选),只需要指定`--dataset <dataset_path>`即可:

    {"messages": [{"role": "system", "content": "你是个有用无害的助手"}, {"role": "user", "content": "<video>视频中是什么"}, {"role": "assistant", "content": "视频中是一只小狗在草地上奔跑"}], "videos": ["/xxx/x.mp4"]}

     grounding任务微调

    即目标检测等定位任务,命令行使用:

    CUDA_VISIBLE_DEVICES=0 \MAX_PIXELS=1003520 \swift sft \    --model Qwen/Qwen2.5-VL-7B-Instruct \    --dataset 'AI-ModelScope/coco#20000' \    --train_type lora \    --torch_dtype bfloat16 \    --num_train_epochs 1 \    --per_device_train_batch_size 1 \    --per_device_eval_batch_size 1 \    --learning_rate 1e-4 \    --lora_rank 8 \    --lora_alpha 32 \    --target_modules all-linear \    --freeze_vit true \    --gradient_accumulation_steps 16 \    --eval_steps 100 \    --save_steps 100 \    --save_total_limit 2 \    --logging_steps 5 \    --max_length 2048 \    --output_dir output \    --warmup_ratio 0.05 \    --dataloader_num_workers 4 \    --dataset_num_proc 4

    自定义数据集格式如下(system字段可选),只需要指定`--dataset <dataset_path>`即可:

    {"messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "<image>描述图像"}, {"role": "assistant", "content": "<ref-object><bbox>和<ref-object><bbox>正在沙滩上玩耍"}], "images": ["/xxx/x.jpg"], "objects": {"ref": ["一只狗", "一个女人"], "bbox": [[331.5, 761.4, 853.5, 1594.8], [676.5, 685.8, 1099.5, 1427.4]]}}
    {"messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "<image>找到图像中的<ref-object>"}, {"role": "assistant", "content": "<bbox><bbox>"}], "images": ["/xxx/x.jpg"], "objects": {"ref": ["羊"], "bbox": [[90.9, 160.8, 135, 212.8], [360.9, 480.8, 495, 532.8]]}}
    {"messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "<image>帮我打开谷歌浏览器"}, {"role": "assistant", "content": "Action: click(start_box='<bbox>')"}], "images": ["/xxx/x.jpg"], "objects": {"ref": [], "bbox": [[615, 226]]}}

    验证

    训练完成后,使用以下命令对训练时的验证集进行推理,

    这里`--adapters`需要替换成训练生成的last checkpoint文件夹.

    由于adapters文件夹中包含了训练的参数文件,因此不需要额外指定`--model`:

    命令行使用:

    CUDA_VISIBLE_DEVICES=0 \swift infer \    --adapters output/vx-xxx/checkpoint-xxx \    --stream false \    --max_batch_size 1 \    --load_data_args true \    --max_new_tokens 2048

    -

    4.总结

    Qwen2.5-VL是由阿里巴巴通义千问团队推出的一款开源视觉语言模型,它在视觉理解、多模态交互以及自动化任务执行等方面展现出卓越的能力。

    该模型不仅能够识别常见的物体,如花卉、鸟类、鱼类、昆虫等,还能深入分析图像中的文本、图表、图标、图形和布局,其通用图像识别能力得到了显著增强,大幅扩展了可识别的图像类别范围。此外,Qwen2.5-VL还具备强大的智能代理能力,能够直接作为视觉Agent进行操作,推理并动态使用工具,支持在计算机和手机上完成多步骤的复杂任务,例如自动查询天气、预订机票、发送消息等,这种能力无需对特定任务进行微调。

    在长视频理解方面,Qwen2.5-VL表现尤为出色,能够理解超过1小时的长视频内容,并通过精准定位相关视频片段来捕捉事件。它引入了动态帧率(FPS)训练和绝对时间编码技术,能够定位秒级事件,并在长视频中搜索具体事件。这种时间感知能力使得模型在处理视频内容时更加精准和高效。同时,Qwen2.5-VL在视觉定位方面也表现出色,采用矩形框和点的多样化方式对通用物体进行定位,能够实现层级化定位,并输出规范的JSON格式坐标和属性。这种精准的视觉定位能力使其在多个领域具有广泛的应用前景。

    Qwen2.5-VL在处理结构化数据方面同样表现出色,能够高效解析发票、表格、文档等结构化数据,并生成准确的结构化输出,广泛适用于金融、商业等领域的数字化信息处理。与Qwen2-VL相比,Qwen2.5-VL在多个技术维度上进行了优化。它的时间和空间感知能力得到了显著提升,模型能够动态地将不同尺寸的图像转换为不同长度的token,并直接使用图像的实际尺寸表示检测框和点等坐标。在时间维度上,引入了动态FPS训练和绝对时间编码,使得模型在处理视频内容时更加精准和高效。

    综上所述,Qwen2.5-VL凭借其强大的视觉理解能力、智能代理功能和技术创新,为多模态AI的发展提供了新的思路和解决方案,适用于多种复杂的应用场景,展现了其在人工智能领域的巨大潜力和价值。


    如果你觉得我的内容对你有帮助,或者让你眼前一亮,那就太好了!🎉

    🌟 点赞 是对我最大的鼓励,你的每一个赞都是我继续努力的动力!

    👀 关注 我,这样你就不会错过我接下来的精彩内容啦!我会持续分享更多有趣、有用的知识和见解。

    📌 收藏 这篇文章,以后需要的时候可以随时回顾,方便又实用!

    如果你还有任何问题或想法,欢迎随时在评论区留言,我会第一时间回复你。让我们一起交流、一起进步!

    感谢你的支持,希望我们都能在这个知识的海洋里,收获满满!💖

    相关文章:

    qwen2.5-vl:阿里开源超强多模态大模型(包含使用方法、微调方法介绍)

    1.简介 在 Qwen2-VL 发布后的五个月里&#xff0c;众多开发者基于该视觉语言模型开发了新的模型&#xff0c;并向 Qwen 团队提供了极具价值的反馈。在此期间&#xff0c;Qwen 团队始终致力于打造更具实用性的视觉语言模型。今天&#xff0c;Qwen 家族的最新成员——Qwen2.5-VL…...

    PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

    git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹&#xff0c;寻…...

    Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)

    Java 基于 springboot 的校园选课小程序 博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&…...

    网络工程师 (7)进程管理

    一、进程相关的概念 &#xff08;一&#xff09;定义 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;也是操作系统结构的基础。进程是程序的一次执行实例&#xff0c;具有动…...

    大屏 UI 设计风格的未来趋势

    在科技飞速革新的时代&#xff0c;大屏设备的应用领域不断拓展&#xff0c;从城市的智能交通指挥中心&#xff0c;到商场的互动广告大屏&#xff0c;再到家庭的超大尺寸智能电视&#xff0c;大屏已然成为信息展示与交互的关键载体。大屏 UI 设计风格也随之不断演变&#xff0c;…...

    Kmesh v1.0 正式发布

    2025 年 1 月 23 日&#xff0c;Kmesh 团队正式发布了 Kmesh v1.0235。Kmesh 作为一款开源的服务网格解决方案&#xff0c;v1.0 版本在网络流量管理领域引入了多项重磅特性2。具体如下134&#xff1a; IPsec 加密通信&#xff1a;引入 IPsec 加密协议&#xff0c;将节点间流量加…...

    低代码系统-产品架构案例介绍、轻流(九)

    轻流低代码产品定位为零代码产品&#xff0c;试图通过搭建来降低企业成本&#xff0c;提升业务上线效率。 依旧是从下至上&#xff0c;从左至右的顺序 名词概述运维层底层系统运维层&#xff0c;例如上线、部署等基础服务体系内置的系统能力&#xff0c;发消息、组织和权限是必…...

    深入理解动态规划(dp)--(提前要对dfs有了解)

    前言&#xff1a;对于动态规划&#xff1a;该算法思维是在dfs基础上演化发展来的&#xff0c;所以我不想讲的是看到一个题怎样直接用动态规划来解决&#xff0c;而是说先用dfs搜索&#xff0c;一步步优化&#xff0c;这个过程叫做动态规划。&#xff08;该文章教你怎样一步步的…...

    C++传送锚点的内存寻址:内存管理

    文章目录 1.C/C内存分布回顾2.C内存管理2.1 内存申请2.2 operator new与operator delete函数2.3 定位new表达式 3.关于内存管理的常见知识点3.1 malloc/free和new/delete的区别3.2 内存泄漏 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 继C语…...

    webAPI -DOM 相关知识点总结(非常细)

    title: WebAPI语法 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端WEB API 了解DOM的结构并掌握其基本的操作&#xff0c;体验 DOM 在开发中的作用 API简介 就是使用js来操作html和浏览器 什么是DOM? 就是一个文档对象模型&#xff0c;是用来呈现预计于任意htm…...

    Deepseek的RL算法GRPO解读

    在本文中&#xff0c;我们将深入探讨Deepseek采用的策略优化方法GRPO&#xff0c;并顺带介绍一些强化学习&#xff08;Reinforcement Learning, RL&#xff09;的基础知识&#xff0c;包括PPO等关键概念。 策略函数&#xff08;policy&#xff09; 在强化学习中&#xff0c; a…...

    设计模式的艺术-策略模式

    行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解策略模式 在策略模式中&#xff0c;可以定义一些独立的类来封装不同的算法&#xff0c;每个类封装一种具体的算法。在这里&#xff0c;每个封装算法的类都可以称之为一种策略&#xff08;Strategy…...

    MyBatis 写法

    MyBatis 高效使用技巧 常见 MyBatis 使用技巧&#xff0c;这些技巧有助于简化数据库操作&#xff0c;提高开发效率&#xff0c;并增强系统的性能。 1. 动态 SQL 动态 SQL 让开发者能够依据参数灵活地构建 SQL 语句&#xff0c;避免了手动拼接字符串带来的复杂性和错误风险。…...

    Git图形化工具【lazygit】

    简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面&#xff08;TUI&#xff09;工具&#xff0c;它让 Git 操作变得更加直观和高效。 Github地址&#xff1a;https://github.com/jesseduffield/lazygit 主要特点 主要…...

    K8s运维管理平台 - xkube体验:功能较多

    目录 简介Lic安装1、需要手动安装MySQL&#xff0c;**建库**2、启动命令3、[ERROR] GetNodeMetric Fail:the server is currently unable to handle the request (get nodes.metrics.k8s.io qfusion-1) 使用总结优点优化 补充1&#xff1a;layui、layuimini和beego的详细介绍1.…...

    5.3.1 软件设计的基本任务

    文章目录 软件设计解决的问题概要设计基本任务详细设计基本任务 软件设计解决的问题 需求分析解决“做什么”的问题&#xff0c;软件设计解决“如何做”的问题。软件设计分为概要设计、详细设计两块。概要设计是设计软件和数据的总体框架&#xff0c;比详细设计的颗粒度更大。详…...

    Go学习:字符、字符串需注意的点

    Go语言与C/C语言编程有很多相似之处&#xff0c;但是Go语言中在声明一个字符时&#xff0c;数据类型与其他语言声明一个字符数据时有一点不同之处。通常&#xff0c;字符的数据类型为 char&#xff0c;例如 &#xff1a;声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…...

    LabVIEW无线齿轮监测系统

    本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机&#xff0c;实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件&#xff0c;可以实现对齿轮箱振动信号的采集、传输和故障识别&#xff0c;集远程采集、数据库存储…...

    基于SpringBoot的租房管理系统(含论文)

    基于SpringBoot的租房管理系统是一个集订单管理、房源信息管理、屋主申诉处理、用户反馈等多项功能于一体的系统。该系统通过SpringBoot框架开发&#xff0c;拥有完善的管理员后台、屋主管理模块、用户功能模块等&#xff0c;适用于房地产租赁平台或中介公司进行日常管理与运营…...

    剑指 Offer II 008. 和大于等于 target 的最短子数组

    comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20008.%20%E5%92%8C%E5%A4%A7%E4%BA%8E%E7%AD%89%E4%BA%8E%20target%20%E7%9A%84%E6%9C%80%E7%9F%AD%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 008.…...

    【微服务与分布式实践】探索 Eureka

    服务注册中心 心跳检测机制&#xff1a;剔除失效服务自我保护机制 统计心跳失败的比例在15分钟之内是否低于85%&#xff0c;如果出现低于的情况&#xff0c;Eureka Server会将当前的实例注册信息保护起来&#xff0c;让这些实例不会过期。当节点在短时间内丢失过多的心跳时&am…...

    关于opencv环境搭建问题:由于找不到opencv_worldXXX.dll,无法执行代码,重新安装程序可能会解决此问题

    方法一&#xff1a;利用复制黏贴方法 打开opencv文件夹目录找到\opencv\build\x64\vc15\bin 复制该目录下所有文件&#xff0c;找到C:\Windows\System32文件夹&#xff08;注意一定是C盘&#xff09;黏贴至该文件夹重新打开VS。 方法二&#xff1a;直接配置环境 打开opencv文…...

    重构字符串(767)

    767. 重构字符串 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:string reorganizeString(string s){string res;//因为1 < s.length < 500 &#xff0c; uint64_t 类型足够uint16_t n s.size();if (n 0) {return res;}unordere…...

    【MQ】如何保证消息队列的高性能?

    零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件&#xff0c;基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO&#xff0…...

    通义灵码插件保姆级教学-IDEA(安装及使用)

    一、JetBrains IDEA 中安装指南 官方下载指南&#xff1a;通义灵码安装教程-阿里云 步骤 1&#xff1a;准备工作 操作系统&#xff1a;Windows 7 及以上、macOS、Linux&#xff1b; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本&#xff0c;通义灵码与以下 IDE 兼容&…...

    babylon.js-3:了解STL网格模型

    网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …...

    面向对象设计(大三上)--往年试卷题+答案

    目录 1. UML以及相关概念 1.1 动态图&静态图 1.2 交互图 1.3 序列图 1.4 类图以及关联关系 1.4.1类图 1.4.2 关系类型 (1) 用例图中的包含、扩展关系(include & extend) (2) 类图中的聚合、组合关系(aggragation & composition) 1.5 图对象以及职责划…...

    Java基础知识总结(二十四)--Collections

    它的出现给集合操作提供了更多的功能。这个类不需要创建对象&#xff0c;内部提供的都是静态方法。 静态方法&#xff1a; Collections.sort(list);//list集合进行元素的自然顺序排序。 Collections.sort(list,new ComparatorByLen());//按指定的比较器方法排序。 class Co…...

    大语言模型的API接口如何操作

    选择大语言模型 根据自身需求和应用场景选择合适的大语言模型&#xff0c;如 OpenAI 的 GPT 系列、百度的文心一言、智谱的 GLM 等。需要考虑模型的性能、功能特点、适用领域、成本等因素。 获取 API 密钥和凭证 注册账号&#xff1a;访问所选大语言模型的官方平台或相关开发…...

    【漫话机器学习系列】067.希腊字母(greek letters)-写法、名称、读法和常见用途

    希腊字母&#xff08;Greek Letters&#xff09; 希腊字母在数学、科学、工程学和编程中广泛使用&#xff0c;常用于表示变量、常量、参数、角度等。以下是希腊字母的完整列表及其常见用途。 大写与小写希腊字母表 大写小写名称&#xff08;英文&#xff09;名称&#xff08;…...

    Kotlin判空辅助工具

    1&#xff09;?.操作符 //执行逻辑 if (person ! null) {person.doSomething() } //表达式 person?.doSomething() 2&#xff09;?:操作符 //执行逻辑 val c if (a ! null) {a } else {b } //表达式 val c a ?: b 3&#xff09;!!表达式 var message: String? &qu…...

    【Python-办公自动化】实现自动化输出json数据类型的分析报告和正逆转换

    分析报告 import json from pprint import pprint, PrettyPrinterdef analyze_energy_data(file_path):"""能源数据分析与结构查看函数参数:file_path (str): JSON文件路径功能:1. 加载并解析JSON数据2. 显示数据结构概览3. 交互式结构探索"""…...

    深入理解指针(2)

    数组名的理解 什么是数组名&#xff1f;在计算机编程中&#xff0c;数组名是用于标识一个数组的名称。那应当如何来理解数组名呢&#xff1f;事实上&#xff0c;在数组中数组名就是数组首元素的地址。 示例1&#xff1a; #include<stdio.h> int main() {int arr[10] …...

    SOME/IP--协议英文原文讲解3

    前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…...

    计算机网络之计算机网络主要性能

    一、速率与带宽 速率&#xff1a; 定义&#xff1a;数据的传送速率&#xff0c;也称数据率或比特率&#xff0c;表示单位时间内传输的比特数。 单位&#xff1a;比特/秒&#xff08;bit/s&#xff09;&#xff0c;常用单位有千比特/秒&#xff08;kb/s&#xff09;、兆比特/秒…...

    家居 EDI:Haverty‘s EDI 需求分析

    Havertys 成立于 1885 年&#xff0c;是一家历史悠久的美国家具零售商。公司致力于为客户提供高品质的家具和家居饰品&#xff0c;其产品线涵盖客厅、卧室、餐厅及办公家具等多个领域。 电子数据交换&#xff08;EDI&#xff09;是一种通过标准化电子格式在商业伙伴之间进行数据…...

    JavaScript - Web APIs(上)

    Web API 介绍 严格意义上讲&#xff0c;我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系&#xff0c;ECMAScript 简称 ES 它提供了一套语言标准规范&#xff0c;如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的。浏览器将 ECM…...

    【漫话机器学习系列】068.网格搜索(GridSearch)

    网格搜索&#xff08;Grid Search&#xff09; 网格搜索&#xff08;Grid Search&#xff09;是一种用于优化机器学习模型超参数的技术。它通过系统地遍历给定的参数组合&#xff0c;找出使模型性能达到最优的参数配置。 网格搜索的核心思想 定义参数网格 创建一个包含超参数值…...

    MySQL 的索引类型【图文并茂】

    基本分类 文本生成MindMap:https://app.pollyoyo.com/planttext <style> mindmapDiagram {node {BackgroundColor yellow}:depth(0) {BackGroundColor SkyBlue}:depth(1) {BackGroundColor lightGreen} } </style> * MySQL 索引** 数据结构角度 *** B树索引*** 哈…...

    OSCP:发送钓鱼电子邮件执行客户端攻击

    概述 在渗透测试领域&#xff0c;钓鱼攻击是一种有效的客户端攻击手段&#xff0c;尤其在目标用户缺乏安全意识或系统存在未修复漏洞时&#xff0c;成功率较高。针对Windows平台&#xff0c;滥用Windows库文件&#xff08;.Library-ms&#xff09;是一种技术性较强但易于实施的…...

    Oracle 普通用户连接hang住处理方法

    一、现象说明 $ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Wed Dec 18 16:49:19 2024 Version 19.11.0.0.0Copyright (c) 1982, 2020, Oracle. All rights reserved.Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Pro…...

    C++ ——— 学习并使用 priority_queue 类

    目录 何为 priority_queue 类 学习并使用 priority_queue 类 实例化一个 priority_queue 类对象 插入数据 遍历堆&#xff08;默认是大堆&#xff09; 通过改变实例化的模板参数修改为小堆 何为 priority_queue 类 priority_queue 类为 优先级队列&#xff0c;其本质就是…...

    JVM--类加载器

    概念 类加载器&#xff1a;只参与加载过程中的字节码获取并加载到内存中的部分&#xff1b;java虚拟机提供给应用程序去实现获取类和接口字节码数据的一种技术&#xff0c;也就是说java虚拟机是允许程序员写代码去获取字节码信息 类加载是加载的第一步&#xff0c;主要有以下三…...

    【C++】类与对象初级应用篇:打造自定义日期类与日期计算器(2w5k字长文附源码)

    文章目录 一、日期类的实现1. 日期类的默认成员函数的分析与实现构造函数其它默认成员函数 2. 各种逻辑比较运算符重载3. 日期加与减天数日期加天数系列日期减天数系列日期加减天数的最后修定和- -系列 4. 日期减日期方法一方法二 5. 流插入与流提取重载流插入重载流提取重载(含…...

    ROS应用之SwarmSim在ROS 中的协同路径规划

    SwarmSim 在 ROS 中的协同路径规划 前言 在多机器人系统&#xff08;Multi-Robot Systems, MRS&#xff09;中&#xff0c;SwarmSim 是一个常用的模拟工具&#xff0c;可以对多机器人进行仿真以实现复杂任务的协同。除了任务分配逻辑以外&#xff0c;SwarmSim 在协同路径规划方…...

    Shell特殊位置变量以及常用内置变量总结

    目录 1. 特殊的状态变量 1.1 $?&#xff08;上一个命令的退出状态&#xff09; 1.2 $$&#xff08;当前进程的 PID&#xff09; 1.3 $!&#xff08;后台进程的 PID&#xff09; 1.4 $_&#xff08;上一条命令的最后一个参数&#xff09; 2.常用shell内置变量 2.1 echo&…...

    【ollama通过命令行启动后如何在网页端查看运行】

    ollama通过命令行启动后如何在网页端查看运行 http://localhost:11434/...

    【MySQL】初始MySQL、库与表的操作

    目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …...

    信息学奥赛一本通 1342:【例4-1】最短路径问题

    【题目描述】 平面上有n个点&#xff08;n<100&#xff09;&#xff0c;每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。 若有连线&#xff0c;则表示可从一个点到达另一个点&#xff0c;即两点间有通路&#xff0c;通路的距离为两点间的直线距离。现在的任务是…...

    芯片AI深度实战:基础篇之langchain

    基于ollama, langchain,可以构建一个自己的知识库&#xff0c;比如这个 Build Your Own RAG App: A Step-by-Step Guide to Setup LLM locally using Ollama, Python, and ChromaDB | HackerNoon 这是因为&#xff1a; 以上范例就实现了这样一个流程&#xff1a; 系列文章&…...