OmniParser 在 ScreenSpot Pro 上的评测复现指南:GPT-4o + OmniParser v2 的 GUI 点击定位评估流程

发布时间:2026/9/11 23:18:06
OmniParser 在 ScreenSpot Pro 上的评测复现指南:GPT-4o + OmniParser v2 的 GUI 点击定位评估流程
OmniParser 在 ScreenSpot Pro 上的评测复现指南GPT-4o OmniParser v2 的 GUI 点击定位评估流程【免费下载链接】OmniParserA simple screen parsing tool towards pure vision based GUI agent项目地址: https://gitcode.com/GitHub_Trending/omn/OmniParser导读本文完整解析 OmniParser 仓库中用于 ScreenSpot Pro 基准评测的官方实现涵盖评测脚本eval/ss_pro_gpt4o_omniv2.py的接入方式、Prompt 设计、结果日志eval/logs_sspro_omniv2.json字段结构与样本分布统计并深入 util/utils.py 底层源码还原解析 → 描述 → 点击定位的完整技术链路。读者读完可以理解 ScreenSpot Pro 评测如何运行、如何用 OmniParser 复现 GPT-4o 的 GUI 点击定位结果以及如何解读评测日志中的每个字段。一、背景为什么用 ScreenSpot Pro 评测 OmniParserOmniParser 的定位是面向纯视觉 GUI Agent 的屏幕解析工具其核心能力是把一张 UI 截图解析成语义化的可交互元素文本框、图标等及其边界框供 GPT-4V / GPT-4o 等视觉语言模型据此做出可落地的点击、输入等动作。要量化解析后对 LLM 动作落地的增益需要一个能把预测点击点与真值框对齐的基准。ScreenSpot ProScreenSpot-Pro-GUI-Grounding正是这样的一个 GUI grounding 基准它收集了真实软件截图标注了指令对应的 UI 元素框并要求模型输出点击位置。仓库 README 的 News 中明确记录OmniParser v2 在 ScreenSpot Pro 上取得 39.5% 的准确率而详细评测配置正是由 docs/Evaluation.md 所述的两个文件承载——这与日志文件实测统计完全吻合见下文第五节。本文档的定位是评测配置说明与结果存档不涉及模型权重的发布细节模型权重由 Hugging Face 发布。评测代码从 ScreenSpot Pro 官方评测仓库适配而来本仓库的eval/目录存放推理脚本与结果。二、eval 目录结构与接入方式eval/目录下只有两个文件职责非常清晰文件作用eval/ss_pro_gpt4o_omniv2.py推理脚本内含 OmniParser 调用封装、Prompt 模板、GPT-4o 调用与响应解析逻辑eval/logs_sspro_omniv2.json评测结果日志JSONL 格式共 1581 条样本即 GPT-4o OmniParser v2 在 ScreenSpot Pro 上的推理结果关键接入方式作为 gpt4x.py 的替换文件文档明确指出eval/ss_pro_gpt4o_omniv2.py可以直接替换 ScreenSpot Pro 官方评测仓库中models/gpt4x.py这一文件即可把官方评测跑在 OmniParser 之上。这意味着你需要先按官方仓库的目录结构准备 ScreenSpot Pro 数据集截图目录日志中的img_path形如./ScreenSpot-Pro/images/...说明日志是在官方仓库目录布局下生成的将本文件改名为gpt4x.py放入官方仓库的models/目录脚本头部保留了对官方仓库工具函数models.utils的 importfrom models.utils import get_som_labeled_img, check_ocr_box, get_caption_model_processor, get_yolo_model from models.utils import get_pred_phi3v, extract_dict_from_text, get_phi3v_model_dict其中get_som_labeled_img、check_ocr_box等函数在本仓库 util/utils.py 中有等价实现extract_dict_from_text、get_pred_phi3v则来自官方评测仓库的 utils脚本中定义了与官方评测协议一致的类名GPT4XModel及其方法签名ground_only_positive、ground_allow_negative、ground_with_uncertainty等从而满足评测框架对模型实现接口的约定。模型与权重占位脚本开头加载两个核心模型其中SOM_MODEL_PATH与CAPTION_MODEL_PATH是占位符需要替换为实际权重路径device cuda if torch.cuda.is_available() else cpu SOM_MODEL_PATH... CAPTION_MODEL_PATH... som_model get_yolo_model(SOM_MODEL_PATH) som_model.to(device) # 两个可选 caption 模型微调版 blip2 或 florence2 caption_model_processor get_caption_model_processor( model_nameflorence2, model_name_or_pathCAPTION_MODEL_PATH, devicedevice )som_model图标 / 交互区域检测模型YOLO 系列v2 对应icon_detect_v3负责框出屏幕上的可点击元素caption_model_processor图标语义描述模型脚本注释说明可选微调版 blip2 或 florence2实际使用 florence2。这也是仓库主流程 util/utils.py 中get_caption_model_processor支持的两种模型。注意文档说明当前正处于 OmniParser v2 的法律审查发布流程中一旦模型正式发布文件会被更新为直接加载 v2 模型。因此当前脚本中的权重路径是待替换状态运行前请务必填入实际路径。三、OmniParser 解析调用链omniparser_parse 逐行拆解omniparser_parse(image, image_path)是评测脚本与 OmniParser 对接的唯一入口它把屏幕截图 → 带标号的标注图 归一化坐标 结构化解析内容三步串联起来。其实现与仓库主线 util/omniparser.py 的Omniparser.parse()高度一致。3.1 绘制配置随分辨率自适应的标注样式box_overlay_ratio max(image.size) / 3200 draw_bbox_config { text_scale: 0.8 * box_overlay_ratio, text_thickness: max(int(2 * box_overlay_ratio), 1), text_padding: max(int(3 * box_overlay_ratio), 1), thickness: max(int(3 * box_overlay_ratio), 1), }标注框与数字标签的尺寸以max(image.size) / 3200为基准等比缩放保证高分屏例如 3200 像素宽度的截图上的数字标号不会因为画布变大而显得过小。这与 util/utils.py 中annotate()使用的BoxAnnotator(text_scale, text_padding, text_thickness, thickness)参数一一对应。3.2 OCR 文本识别EasyOCR 参数BOX_TRESHOLD 0.05 ocr_bbox_rslt, is_goal_filtered check_ocr_box( image_path, display_imgFalse, output_bb_formatxyxy, goal_filteringNone, easyocr_args{paragraph: False, text_threshold:0.5, canvas_size:max(image.size), decoder:beamsearch, beamWidth:10, batch_size:256}, use_paddleocrFalse ) text, ocr_bbox ocr_bbox_rslt关键参数说明对照 util/utils.py 中check_ocr_box的实现参数取值作用use_paddleocrFalse走 EasyOCR 分支True走 PaddleOCR 分支且会按text_threshold过滤置信度output_bb_formatxyxy输出的文本框坐标为[x0,y0,x1,y1]另一个可选值xywhparagraphFalse不合并段落按文本行粒度返回识别结果text_threshold0.5文本识别的置信度阈值decoder/beamWidthbeamsearch/10使用束搜索解码宽度 10精度更高但更慢canvas_sizemax(image.size)EasyOCR 缩放画布尺寸保证高分图不被降采样batch_size256OCR 批大小注意主线 util/omniparser.py 中check_ocr_box的 EasyOCR 参数仅设置{text_threshold: 0.8}而评测脚本为了在高分真实软件截图上获得更稳的文本识别采用了更激进的参数组合——这也是评测场景与普通解析场景参数配置的典型差异。3.3 图标检测 语义描述get_som_labeled_imgdino_labled_img, label_coordinates, parsed_content_list get_som_labeled_img( image_path, som_model, BOX_TRESHOLDBOX_TRESHOLD, output_coord_in_ratioTrue, ocr_bboxocr_bbox, draw_bbox_configdraw_bbox_config, caption_model_processorcaption_model_processor, ocr_texttext, use_local_semanticsTrue, iou_threshold0.7, scale_imgFalse, batch_size128 )对照 util/utils.py 中get_som_labeled_img的实现这条调用链实际做了四件事区域检测predict_yolo()以BOX_TRESHOLD0.05置信度阈值、iou_threshold0.1检测交互区域并把像素坐标归一化到[0,1]OCR 框融合OCR 文本框与 YOLO 检测框通过remove_overlap_new()合并规则是——保留小框、剔除与 OCR 框重叠的图标框、被图标框包含的 OCR 文本直接吸收为图标的内容sourcebox_yolo_content_ocr见 util/utils.py局部语义描述use_local_semanticsTrue时对每个图标区域裁切并缩放到 64×64分批batch_size128送入 florence2CAPTIONprompt生成一句话功能描述见 util/utils.py。脚本注释提示128 的批大小在 florence v2 下大约占用 4GB 显存标注出图按draw_bbox_config画出带数字 ID 的标注框并返回label_coordinatesoutput_coord_in_ratioTrue时坐标为归一化 xywh与parsed_content_list结构化元素列表。四、Prompt 设计把解析结果喂给 GPT-4o4.1 解析内容的结构化重组reformat_messagesdef reformat_messages(parsed_content_list): screen_info for idx, element in enumerate(parsed_content_list): element[idx] idx if element[type] text: screen_info fp id{idx} classtext alt{element[content]} /p\n elif element[type] icon: screen_info fimg id{idx} classicon alt{element[content]} /img\n return screen_info每个检测到的元素被转成带 ID 的 HTML 片段文本元素用p、图标元素用imgalt属性承载内容描述。这种HTML 片段序列形式相比纯文本ID: x, Text: y的列表被注释掉的原写法更容易让 LLM 建立编号元素 ↔ 界面区域的关联。4.2 两套 Prompt 模板脚本保留了两代Prompt 模板对应不同的评测要求模板 A带 few-shot 的完整版Please generate the next move according to the UI screenshot and task instruction. ... Task instruction: {}. Here is the list of all detected bounding boxes by IDs and their descriptions: {}. Keep in mind the description for Text Boxes are likely more accurate than the description for Icon Boxes. Requirement: 1. ... 2. ... 3. Your answer should follow the following format: {Analysis: xxx, Click BBox ID: y}. Do not include any other info. Some examples: {}. The task is to {}. Retrieve the bbox id where its description matches the task instruction. ...模板 Bv1单次点击版实际用于 GPT-4o 评测The instruction is to {}. Here is the list of all detected bounding boxes by IDs and their descriptions: {}. Keep in mind the description for Text Boxes are likely more accurate than the description for Icon Boxes. Requirement: 1. ... 2. ... 3. Your answer should follow the following format: {Analysis: xxx, Click BBox ID: y}. Please do not include any other info.两者的共同点显式提示模型文本框描述通常比图标框描述更可靠——这是 OmniParser 解析结果的一个已知特性强制输出{Analysis: ..., Click BBox ID: ...}结构要求基于 bbox 描述列表做出选择而不是直接在图上找。Few-shot 示例模板 A 使用Example 1: Task instruction: Next page. {Analysis: ..., Click BBox ID: x} Example 2: Task instruction: Search on google. {Analysis: ..., Click BBox ID: y}4.3 系统提示与多图输入评测实际调用的是ground_only_positive使用模板 B并同时向 GPT-4o 发送两张图self.client.chat.completions.create( modelself.model_name, # gpt-4o-2024-05-13 messages[...], temperatureself.override_generation_config[temperature], max_tokens2048, )第一张图原始截图base64第二张图OmniParser 标注后的dino_labled_img带数字标号的图系统提示You are an expert at completing instructions on GUI screens. You will be presented with two images. The first is the original screenshot. The second is the same screenshot with some numeric tags. ...choose the numeric bbox idx you want to click...。这体现了 OmniParser 评测的核心设定模型在看图和读解析文本两条信息通路上同时作答——解析结果负责把图标转成语义描述标注图负责建立数字 ID 与像素位置的对应。4.4 响应解析ast 优先、正则兜底response_text response_text.replace(json, ).replace(, ) # TODO: fix this try: response_text ast.literal_eval(response_text) icon_id response_text[Click BBox ID] bbox label_coordinates[str(icon_id)] click_point [bbox[0] bbox[2]/2, bbox[1] bbox[3]/2] except: response_text extract_dict_from_text(response_text) icon_id response_text[Click BBox ID] bbox label_coordinates[str(icon_id)] click_point [bbox[0] bbox[2]/2, bbox[1] bbox[3]/2]解析逻辑分两级先用ast.literal_eval直接解析模型输出的字典失败时模型输出了多余文字回退到extract_dict_from_text来自官方仓库 utils做正则提取。得到icon_id后从label_coordinates取出该 ID 的归一化 xywh 框取中心点作为最终点击坐标bbox[0] bbox[2]/2。若 GPT-4o 返回 400 错误BadRequestError则返回None由评测框架按失败处理。4.5 其他 grounding 方法除主路径ground_only_positive外脚本还兼容其他评测协议ground_only_positive_phi35v面向 phi-3.5V 的变体走get_pred_phi3v推理输出键为Click ID并使用模板 A带 few-shotground_allow_negative允许目标不存在输出Target not existent要求模型直接输出[[x0,y0,x1,y1]]格式的归一化框对应 ScreenSpot Pro 中的负样本评测ground_with_uncertainty允许模型不确定时输出Target not found辅助函数extract_first_bounding_box/extract_first_point用正则从文本中提取[[x0,y0,x1,y1]]或[[x0,y0]]形式的第一个匹配供后两种 grounding 方法把模型的框输出转为可评测坐标。五、评测结果日志字段语义与统计分析eval/logs_sspro_omniv2.json 是 JSONL 格式每行一条独立 JSON 记录共 1581 条。每条记录字段如下字段含义示例img_path评测截图路径相对 ScreenSpot Pro 仓库根目录./ScreenSpot-Pro/images/davinci_mac/...pnggroup应用类别Creative/CAD/Dev/OS/Office/Scientificplatform平台windows/macos/linuxapplication具体应用davinci/inventor/vivado/excel等lang/instruction_style语言与指令风格en/instructionprompt_to_evaluate评测指令文本linked selectiongt_type真值类型当前日志全部为positiveui_type目标元素类型icon/texttask_filename任务文件名davinci_macospred预测点击点像素坐标[x, y][1396, 1215]raw_response模型原始回复{Analysis: ..., Click BBox ID: 16}bbox被点击元素的预测框像素[2042, 1153, 2067, 1182]correctness判定结果correct/wrongidx样本序号05.1 总体准确率对日志全量统计correct共625 条wrong共956 条总样本1581 条准确率625/1581 ≈ 39.5%——与 README 中OmniParser v2 在 ScreenSpot Pro 上取得 39.5% 准确率的官方声明完全一致两者互为印证。5.2 按类目 / 平台 / 元素类型分布按 group 分布类别样本数Creative341CAD261Scientific254Office230Dev299OS196按 platform 分布windows 927、macos 604、linux 50。按 ui_type 分布text 977、icon 604。全部 1581 条样本的gt_type均为positive。5.3 从样本看 OmniParser 的表现特征从raw_response与correctness的对照中可以直观看到该基准的难点以及文本框描述更可靠这一提示词设计的原因文本类目标text命中率高例如addtive dissolve、Blur Dissolve、Cross Dissolve、Leader Text等指令模型的Analysis通常直接引用某个p元素描述并命中正确框图标类目标icon易误判mark in、Loop、color wheels等指令多次出现根据描述推理却点错的情况因为图标描述是模型生成的语义粒度有限如把View as View当作缩略图视图、把Play当作快速预览中文界面干扰部分 Windows 应用如 Inventor 的中文界面描述包含中文尺寸约束视图模型需要跨语言理解个别样本因语言错位而判错日志中pred与bbox中心不一致的样本通常意味着模型选择了错误的 IDicon_id对应框在界面另一处。这些观测仅基于本仓库日志的定性归纳供后续分析参考不构成对模型能力的绝对论断。六、与仓库主线实现的对应关系评测脚本虽然是独立于主解析流程的适配层但它调用的核心函数在仓库主线中都有完整实现理解主线有助于理解评测脚本的每个参数check_ocr_box见 util/utils.py支持 EasyOCR / PaddleOCR 双引擎easyocr_args直接透传给reader.readtextget_som_labeled_img见 util/utils.py内部完成检测、OCR 融合remove_overlap_new、局部语义描述、标注出图与坐标归一化其use_local_semanticsTrue分支即评测脚本中parsed_content_list的来源get_caption_model_processor见 util/utils.py支持blip2默认Salesforce/blip2-opt-2.7b与florence2两类描述模型评测选用 florence2get_yolo_model见 util/utils.py对icon_detect_v3走仓库内置的YOLOv9Detectorutil/yolov9.py其他路径走 Ultralytics YOLO生产解析入口 util/omniparser.py 的Omniparser.parse()与评测脚本的omniparser_parse结构几乎一一对应区别仅在 EasyOCR 参数与权重加载方式。从源码结构可以推断评测脚本刻意复用了主线解析管线保证评测即生产的一致性——在 ScreenSpot Pro 上的 39.5% 结果反映的正是 OmniParser 主解析能力在接地基准上的表现。七、复现评测的注意事项目录依赖脚本from models.utils import ...依赖 ScreenSpot Pro 官方仓库的models/包必须按文档说明放入官方仓库后运行单独在 OmniParser 仓库内无法直接执行权重路径SOM_MODEL_PATH与CAPTION_MODEL_PATH为待替换占位符需填入实际模型路径文档明确说明 v2 模型正在法律审查发布后文件将更新为直接加载 v2 权重环境变量OPENAI_API_KEY os.environ.get(OPENAI_API_KEY)需提前设置 API Key默认模型为gpt-4o-2024-05-13显存florence2 图标描述按batch_size128分批util/utils.py 注释提示该批大小约需 4GB GPU 显存输出一致性评测判定以pred点击点与真值框的对齐为准raw_response中的Click BBox ID需经由label_coordinates才能转为像素坐标因此解析失败会直接导致correctness wrong——这也是脚本中ast.literal_eval 正则兜底两级解析的意义所在。八、小结docs/Evaluation.md虽然篇幅短小但锚定了 OmniParser v2 一个关键的量化评估阵地以 GPT-4o 为决策模型、以 OmniParser 为屏幕解析器、以 ScreenSpot Pro 为 grounding 基准。仓库内 eval/ss_pro_gpt4o_omniv2.py 提供了可复现的完整推理实现含两代 Prompt 模板、双图输入、两级响应解析、多 grounding 协议eval/logs_sspro_omniv2.json 则沉淀了 1581 条带逐样本Analysis推理记录的评测结果总体约 39.5% 准确率与官方声明一致。如果你正在构建自己的纯视觉 GUI Agent这套官方评测脚本 结果日志的组合既是复现 OmniParser v2 表现的直接入口也是理解 ScreenSpot Pro 评测协议的最佳样例。【免费下载链接】OmniParserA simple screen parsing tool towards pure vision based GUI agent项目地址: https://gitcode.com/GitHub_Trending/omn/OmniParser创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考