VLMEvalKit多模态大模型评测工具源码解析
vlmeval/api和vlmeval/vlm文件夹下分别是api接口和本地运行的大模型的代码 基类都是base
vlmeval/dataset是数据集处理代码
vlmeval/inference.py是推理代码
run.py的整个流程
1 vlmeval/api/base.py
主要为需要与外部API交互的系统提供了一个通用的框架
-
类属性
allowed_types:定义了API允许处理的数据类型(在本例中是text和image)。
INTERLEAVE:一个布尔值,表示是否允许文本和图片的交错输入(例如,某些API可能允许同时传入文本和图片)。
INSTALL_REQ:是否需要额外安装API运行时的依赖,默认为 False。 -
初始化方法 (init)
这个方法负责初始化类实例时的配置,主要参数如下:retry:表示如果调用API失败,最多重试的次数(默认10次)。
wait:表示在每次失败后需要等待的时间(默认3秒)。
system_prompt:用于配置系统提示符(如果有的话),可以在调用API时携带给模型的上下文提示。
verbose:控制是否打印详细的调试信息。
fail_msg:当API调用失败时,返回的错误信息。
此外,它还初始化了一个日志记录器 logger,用于记录调试和错误信息。其中self.data = data为pd.read_csv加载的数据[7299 rows x 11 columns]经过处理后如下所示 只有2行数据
index question
hint A
B … D category
image l2-category split 0 243 识别出艾琳的实验能最好回答的问题。
下面的文章描述了一个实验。阅读文章,然后按照以下说明进行操作。\n\n艾琳将番茄和西兰花植物…
蛞蝓会从番茄叶子上吃更多还是从西兰花叶子上吃更多? 蛞蝓在吃了番茄叶子或西兰花叶子后会更重吗? … NaN
identity_reasoning /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBw…
attribute_reasoning test 1 245 请确定Josh和Mark的实验最能回答的问题是什么。
下面的文章描述了一个实验。阅读文章,然后按照以下说明进行操作。\n\n乔什将一个乒乓球放在弹…
乒乓球从30¬∞角度或45¬∞角度发射后,是否更快停止在地面上滚动? 与从45¬∞角度发射相比,乒乓球从30¬∞角度发射是否能飞得更远?
… NaN identity_reasoning
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBw… attribute_reasoning
test
[2 rows x 11 columns]
-
抽象方法 generate_inner
这是一个抽象方法,具体的API子类需要实现这个方法来完成与实际API的交互。该方法会返回三个结果:
ret_code:返回码,表示成功 (0) 或失败的状态。
answer:API返回的实际答案。
log:用于记录过程日志。
此方法的设计确保了所有API子类都要实现自己的生成逻辑。 -
工作状态检测 (working)
这个方法用于检测API是否工作正常。它会尝试发送简单的输入(如"hello"),如果能够正常返回非空响应且不包含失败信息,则认为API是正常工作的。
它也带有超时处理(timeout),以确保在API响应过慢时能够自动调整超时时间。 -
输入检查 (check_content)
该方法用于检查输入数据的类型,支持的类型有字符串 (str)、字典 (dict)、字符串列表 (liststr) 和字典列表 (listdict)。它能够检测传入的数据格式是否符合API的要求。
例如,当输入是 str 时,它会被识别为 text 类型;当输入是字典时,则需要检查其中是否有 type 和 value 字段。 -
内容预处理 (preproc_content)
这个方法将原始输入转换为可以供API使用的格式(一般是字典列表)。它会对输入进行解析和判断,将其转换成API可以理解的标准格式(如type和value键值对)。
如果输入是文件路径,它会尝试通过 parse_file 函数来识别文件的类型(如文本文件或图片),并将其解析为相应的内容。 -
聊天功能 (chat 和 chat_inner)
chat 方法用于处理多轮对话,传入的 messages 参数是一个多轮会话消息的列表。这个方法会调用 chat_inner,它是主要的聊天核心逻辑。
在 chat_inner 中,如果一次生成请求失败,会递归地减少输入的上下文长度,直到找到可以生成响应的输入。通过这种递归方式,可以避免因为上下文长度过长而导致的生成失败问题。 -
生成功能 (generate)
generate 是主要的生成方法,它调用 generate_inner 来生成答案。它首先会对输入进行类型检查和预处理,确保输入符合API的要求。
通过重试机制,多次尝试调用API并处理失败情况。
它还会通过随机延迟 (rd.random() 产生0-0.5秒的随机延迟) 来模拟真实环境中调用API的行为。 -
图片处理 (message_to_promptimg)
该方法用于处理包含图片的输入消息。它会从消息列表中提取图片和文本,然后将其组织为适合API使用的格式(如拼接多个图片)。如果API不支持交错输入图片和文本,它会发出警告,并仅使用第一个图片和所有文本作为输入。
2 vlmeval/dataset/image_base.py
从远程地址下载数据集、解析数据集、处理图像(如加载、解码、存储),并准备好数据供模型或API使用。提供了对数据集的图像处理、数据预处理、提示构建(build_prompt),以及评估功能的接口(evaluate 需要子类实现)
- 类属性
MODALITY = ‘IMAGE’:该类处理的主要模式是图像,这意味着它专注于图像相关的数据处理。
DATASET_URL:用于存储每个数据集的下载地址。
DATASET_MD5:用于存储每个数据集的MD5哈希值,用于校验数据集文件的完整性。 - 初始化方法 (init)
dataset:指定要使用的数据集的名称,默认为 MMBench。
skip_noimg:是否跳过没有图像的数据记录(默认为 True)。如果数据集中有些条目缺少图像,这些条目将被跳过。
img_root:图像保存的路径,通过 img_root_map(dataset) 获取具体路径。
初始化时,调用了 load_data 来加载数据集,具体内容包括:
加载数据并检查图像字段是否为空,跳过没有图像的数据(如果 skip_noimg=True)。
将图像和索引字段转换为字符串,以便处理和存储。
设置 meta_only 标志,表明是否只处理元数据(如图像的路径,而非图像本身)。
3. len 和 getitem
len:返回数据集的长度,供数据迭代时使用。
getitem:根据索引返回数据集中的某一条记录,返回的是一个包含数据记录的字典形式。
4. 准备TSV文件 (prepare_tsv)
这个方法负责从远程URL下载数据集,支持文件的MD5校验,以确保下载的文件没有损坏或被篡改。
如果文件大小超过1GB,还会调用 LOCALIZE 方法进行本地化处理(如文件分割)。
load:加载并返回TSV文件的数据。
5. 图像处理功能
dump_image:这个方法负责将数据中的图像部分存储到本地磁盘。如果图像是Base64编码,它会将其解码并存储为图像文件。它支持处理单张或多张图像,并返回图像的文件路径。
display:显示数据记录中的图像或文本信息,依赖外部的 mmqa_display 方法来实现具体的展示功能。可以通过索引或直接传入数据记录来调用此方法。
- 支持的数据集 (supported_datasets)
这是一个类方法,返回该类支持的数据集名称列表(通过 DATASET_URL 字典来定义)。 - 加载数据集 (load_data)
该方法根据给定的数据集名称,下载并加载数据。具体实现是调用 prepare_tsv 来下载并加载TSV格式的数据集文件。 - 构建提示信息 (build_prompt)
该方法根据给定的数据记录生成多模态提示信息(即包含图像和文本的输入)。对于图像,先通过 dump_image 方法获取图像的存储路径,然后将图像与对应的问题一起打包成消息列表(msgs),供模型或API调用时使用。 - 评估方法 (evaluate)
这是一个抽象方法,必须在子类中实现,用于根据给定的预测文件对模型的表现进行评估。其输入通常是一个预测文件和其他可选参数(judge_kwargs),返回值可以是字典或 pandas DataFrame。 - 钩子函数 (post_build)
该方法是一个钩子函数,允许子类在数据集加载完成后执行特定的操作。子类可以通过重写这个方法,在数据加载完成后进行额外的处理
3 vlmeval/dataset/image_mcq.py
ImageMCQDataset 类是继承自 ImageBaseDataset 的一个具体实现类,专注于处理包含多项选择问题(MCQ,Multiple Choice Questions)的图像数据集。该类添加了特定于多项选择问题的功能,如生成问题选项提示、处理提示中的答案选项,以及提供专门的评估函数来计算模型的准确性。
3.1 类属性
TYPE = ‘MCQ’:这个类的类型标识为 MCQ,即多项选择问题类型的数据集。
DATASET_URL 和 DATASET_MD5:这些字典存储了不同数据集的下载链接以及对应的MD5哈希值,用于下载和校验数据文件。这里定义了几个用于下载MMBench数据集的链接,并将外部定义的 MMMB_URLS 和 MTL_MMBench_URLS 字典更新到其中,使得类可以支持更多数据集。
3.2 build_prompt 方法
这个方法负责构建用于模型推理的提示信息,特别是多模态(图像+文本)问题中的多项选择题。
输入:line 是数据集中的一条记录,可以是一个索引(int)或是一个具体的数据条目(字典或pandas行)。
功能:
图像处理:通过 self.dump_image(line) 函数处理图像部分,如果记录包含多个图像,会把它们转换成相应的文件路径。
问题和选项构建:从 line 中提取问题文本,并生成对应的选项。选项通过字母(如 A, B, C 等)进行标识,函数会根据选项生成一个提示字符串,包含问题、选项和提示(如果有的话)。
返回:返回一个包含图像和文本的消息列表(msgs),这个列表是供多模态模型输入的格式,通常每个消息是一个字典,包含 type 和 value 两个字段。
其中tgt_path = self.dump_image(line)#‘/LMUData/images/MMBench_V11/243.jpg’
返回的msgs的值如下
[{‘type’: ‘image’, ‘value’: ‘/LMUData/images/MMBench_V11/243.jpg’}, {‘type’: ‘text’, ‘value’: ‘Hint: 下面的文章描述了一个实验。阅读文章,然后按照以下说明进行操作。\n\n艾琳将番茄和西兰花植物的叶子切成一英寸的正方形。在12个容器中,她放置了六个叶子正方形:三个番茄叶子正方形和三个西兰花叶子正方形。她在每个容器中放入一只来自她花园的蛞蝓。两天后,艾琳测量了每个叶子正方形被蛞蝓吃掉的数量。她比较了番茄叶子正方形被吃掉的数量与西兰花叶子正方形被吃掉的数量。\n图:一只蛞蝓在一片叶子上。\nQuestion: 识别出艾琳的实验能最好回答的问题。\nOptions:\nA. 蛞蝓会从番茄叶子上吃更多还是从西兰花叶子上吃更多?\nB. 蛞蝓在吃了番茄叶子或西兰花叶子后会更重吗?\nPlease select the correct answer from the options above. \n’}]
3.3 decode_base64_to_image_file 方法
def decode_base64_to_image(base64_string, target_size=-1):image_data = base64.b64decode(base64_string)image = Image.open(io.BytesIO(image_data))if image.mode in ('RGBA', 'P'):image = image.convert('RGB')if target_size > 0:image.thumbnail((target_size, target_size))return image
- 该函数用于将 Base64 编码的图像字符串解码为
PIL.Image图像对象,同时根据需要调整图像的大小。
Base64 解码:
image_data = base64.b64decode(base64_string)
- 使用
base64.b64decode将 Base64 编码的图像字符串解码为二进制数据(image_data)。
生成图像对象:
image = Image.open(io.BytesIO(image_data))
- 使用
PIL.Image.open方法将二进制数据转换为图像对象。这里通过io.BytesIO将二进制数据封装成类似文件对象的流,供Image.open读取。
模式转换:
if image.mode in ('RGBA', 'P'):image = image.convert('RGB')
- 如果图像的模式是
RGBA(带透明度的 RGB 图像)或P(调色板模式的图像),将其转换为标准的RGB模式。这一步通常用于确保图像保存时兼容更多格式。
调整图像大小:
if target_size > 0:image.thumbnail((target_size, target_size))相关文章:
VLMEvalKit多模态大模型评测工具源码解析
vlmeval/api和vlmeval/vlm文件夹下分别是api接口和本地运行的大模型的代码 基类都是base vlmeval/dataset是数据集处理代码 vlmeval/inference.py是推理代码 run.py的整个流程 1 vlmeval/api/base.py 主要为需要与外部API交互的系统提供了一个通用的框架 类属性 allowed_type…...
将 Docker 安装到指定目录
将 Docker 安装到指定目录 将 Docker 安装到指定目录 Docker 默认安装在 C:\Program Files\Docker\Docker,这可能会占用大量 C 盘空间。你可以按以下步骤将 Docker 安装到其他盘(例如 E 盘): 创建安装目录:在 E 盘创…...
哪些企业需要部署SD-WAN?
首先,让我们先明确SD-WAN的定义。SD-WAN,中文全称为软件定义广域网(Software-Defined Wide Area Network),通过集中化管理与流量控制,帮助企业优化网络性能,提升用户体验。与传统广域网…...
通信基站类型、频段与网络标准
【1】通信基站类型 移动通信基站根据覆盖面积和功率大小主要可以分为以下几种类型: 宏基站(宏站):这是最常见的基站类型,具有较大的发射功率和较广的覆盖范围,通常覆盖半径从1到25公里不等。宏基站主要用于…...
Java IO教程之Java 文件一口气讲完!( *︾▽︾)
Java 文件 Java IO教程 - Java文件 File类的对象是文件或目录的路径名的抽象表示。 创建文件 我们可以从中创建一个 File 对象 路径名父路径名和子路径名URI(统一资源标识符) 我们可以使用File类的以下构造函数之一创建一个文件: File(…...
如何在 Ubuntu 24 上安装 Vmware Tools
原文 Vmware Tools作用 增强图形显示性能 分辨率适配 可使虚拟机的分辨率能够自动适应窗口大小的变化。当您调整 VMware 软件窗口的大小时,Ubuntu 24 虚拟机的屏幕分辨率会随之自动调整,为用户提供更好的视觉体验,方便在不同的使用场景下进…...
内网穿透:如何借助Cloudflare连接没有公网的电脑的远程桌面(RDP)
内网穿透:如何借助Cloudflare连接没有公网的电脑的远程桌面(RDP)-含详细原理配置说明介绍 前言 远程桌面协议(RDP, Remote Desktop Protocol)可用于远程桌面连接,Windows系统(家庭版除外)也是支持这种协议的,无需安装…...
明星作家都在使用的电子书制作工具,现在向大家介绍
在数字化时代,电子书已经成为了广大读者和作家的新宠。越来越多的作家开始尝试将手中的文字作品转化为电子书,以便在更广泛的平台上推广和传播。那么,如何高效、便捷地制作电子书呢?今天,我们就来为大家揭秘一款明星…...
简单认识Maven 3-认识pop.Xml配置文件中的代码
pom.xml是 Maven 项目的核心配置文件,它包含了项目的各种配置信息,以下是对其主要内容含义的认识: 一、项目基本信息 <groupId>: 定义项目的组织或团体的唯一标识符,通常采用反向域名的格式。例如,“…...
LangChain4j系列—OpenAI开发实例
一、引入Maven依赖 1、纯Java <dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>0.35.0</version> </dependency> 2、Spring boot <dependency><groupId&g…...
Java 中简化操作集合的方法
在日常 Java 开发中,我们经常需要操作集合,如 List、Set 和 Map。虽然 Java 提供了丰富的集合框架供开发者使用,但在实际编写业务逻辑时,如何简化集合操作、提高代码可读性和效率,依然是一个经常遇到的问题。特别是随着…...
ArcGIS Pro SDK (十七)宗地结构
ArcGIS Pro SDK (十七)宗地结构 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 宗地结构 1 获取活动记录 string errorMessage = await QueuedTask.Run(() => {...
D. Co-growing Sequence
传送门:Problem - 1547D - Codeforces 题意:给定一个 数组 a , 构造一个数组 b ,使得 ( a[i] ^ b[i] ) & ( a[i 1] ^ b[ i 1] ) a[i] ^ b[i] 思路:(二进制题目) 设 a[i] ^ b[i] t 我们要让…...
docker配置加速器
阿里云 控制台》容器镜像服务》镜像工具》镜像加速器 复制地址:https://ywtoq7bz.mirror.aliyuncs.com 到:etc/docker下:vi daemon.json 格式: { "registry-mirrors": ["加速器地址"] } 注࿱…...
JS事件和DOM
1. DOM 1.1 基本概念 DOM,全称 Document Object Model,即文档对象模型。它是 Web 上最常用的 API 之一,是加载在浏览器中的文档模型,可以将文档表示为节点树(或称 DOM 树),其中每个节点代表文…...
CAS 详解
目录 Java 中 CAS 是如何实现的? CAS 算法存在哪些问题? ABA 问题 循环时间长开销大 只能保证一个共享变量的原子操作 Java 中 CAS 是如何实现的? 在 Java 中,实现 CAS(Compare-And-Swap, 比较并交换)操作的一个关键类是Unsafe。 Un…...
AI大模型那么火,教你一键Modelarts玩转开源LlaMA(羊驼)大模型
近日, LlaMA(羊驼) 这个大模型再次冲上热搜! LLaMA(Large Language Model Meta AI),由 Meta AI 发布的一个开放且高效的大型基础语言模型,共有 7B、13B、33B、65B(650 亿)四种版本。…...
Spring AI Alibaba: 支持国产大模型的Spring ai框架
Spring AI :java做ai应用的最好选择 过去,Java在AI应用开发方面缺乏一个高效且易于集成的框架,这限制了开发者快速构建和部署智能应用程序的能力。 Spring AI正是为解决这一问题而生,它提供了一套统一的接口,使得AI功…...
ChatGPT4o、o1 谁才是最佳大模型?
如何选择合适的 ChatGPT 模型?OpenAI 更新细节与 GPTs 的深入解析 随着人工智能的发展,ChatGPT 已成为众多用户的强大助手,广泛应用于写作、编程、学习和商业等多个领域。然而,面对 OpenAI 提供的众多模型(如 GPT-4、…...
[笔记] 关于CreateProcessWithLogonW函数创建进程
函数介绍 https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw BOOL CreateProcessWithLogonW([in] LPCWSTR lpUsername,[in, optional] LPCWSTR lpDomain,[in] …...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
