视觉定位三条路线
视觉定位问题为什么难?
- 问题形式: 模型需要在截图中定位目标元素——“搜索框在哪里?”“提交按钮的坐标是什么?”;
- 两大思路: 把定位变成选择题(先标注界面元素编号,模型从中选一个)与纯坐标预测(模型直接“看”截图报出坐标);
- 选择题的两种实现: 纯视觉标注(原始 Set-of-Mark,用分割模型在像素上切出候选区域)与结构化元素索引(读取 DOM/Accessibility Tree 自带的结构);
- 选择题的共同优势: 把开放式的“在截图中找到按钮并预测坐标”转化为封闭式的“从已标注好的元素中选一个”;
- 类比: 像考试中选择题比填空题更容易答对,模型只需说“点击 [123]”而不是“点击屏幕 (350, 464) 处的按钮”;
- 坐标预测的代价: 需要大量训练才能做准确,而且在不同屏幕分辨率下很容易出错;
Set-of-Mark 如何把定位变成选择题?
- 提出: 原始 SoM 由微软研究院于 2023 年提出,最初是为了释放 GPT-4V 的视觉定位能力;
- 机制: 纯视觉方法——用图像分割模型(SAM、SEEM 等)在截图上自动切出候选区域,为每个区域叠加编号标记;
- 模型输出: 模型看到的是一张带编号的图,只需报出编号,由系统换算成对应区域的中心坐标;
- 适用范围: 不需要 DOM,也不需要任何界面内部结构,原生桌面软件、游戏界面同样适用,只要分割模型能把候选区域切出来;
结构化元素索引如何实现同一思想?
- 适用条件: 界面本身能提供结构化信息——现代网页在渲染前已定义完整 DOM 树与语义角色,无障碍接口(Accessibility Tree)为许多桌面应用提供类似信息;
- 流程: ① 通过浏览器调试接口(CDP,Chrome DevTools Protocol)获取 DOM 树与无障碍信息 → ② 自动检测可交互元素(按钮、输入框、链接)→ ③ 为每个可交互元素标注唯一 ID 并在截图上绘制边界框 → ④ 同时生成描述每个 ID 对应元素的文本列表;
- 代表实现: browser-use 等 Web Agent 方案,可看作 SoM 思想在 Web 上的结构化实现;
- 上下文形式:
Screenshot: [图片中关键元素标注了 [1]、[2]、[3]、[4] 等 ID]
Elements:
[1] <input type="text" placeholder="Search" aria-label="Search" />
[2] <button id="submit-btn" aria-label="Submit form" />
[3] <input type="text" placeholder="Enter your name" value="" />
[4] <a href="/docs" aria-label="Documentation" />
- 执行: 模型只输出一个 ID,系统自动用该元素的中心坐标执行点击;
- 权衡: 不省 token(要把所有标注信息发给模型),但定位准确稳定,还免去分割模型可能引入的漏检与误检;
纯坐标预测要付出什么代价?
- 代表: SeeClick 与 Claude 的 computer use——在海量 GUI 截图与元素位置配对数据上训练视觉模型,把自然语言描述直接映射到精确坐标;
- 分辨率依赖: 模型对坐标的理解高度依赖训练时使用的分辨率,如 XGA(1024×768)、WXGA(1280×800)、FWXGA(1366×768);
- 不匹配的后果: 输入截图分辨率不匹配时预测坐标会系统性偏移——像在小地图上量距离然后直接用到大地图上;
- 工程要求: 工具层实现双向坐标缩放,并按宽高比选择目标分辨率,避免非等比拉伸压变形画面连带带偏坐标;
- 计算示例: 真实分辨率 2560×1440(16:9)应在三档中选宽高比最接近的 FWXGA(1366×768);截图等比缩放到 1366×768,模型输出 (683, 384) 后反向映射为 (683×2560/1366, 384×1440/768) ≈ (1280, 720);
- 反例: 把 16:9 硬拉伸进 4:3 的 1024×768,画面横向压扁,坐标会系统性偏移;
三条路线如何选择?
- 首选: 结构化信息可得时优先用 DOM/Accessibility Tree 索引,定位最精确稳定;
- 退路: 结构化信息不可得时(原生桌面软件如 Photoshop、Canvas/WebGL 渲染界面、游戏),可在视觉标注与坐标预测之间选择;
- 视觉标注: 把定位变成选择题,对未经专门训练的通用模型更友好;
- 坐标预测: 省去标注步骤,对做过 GUI 定位训练的模型更直接;
- 共同短板: 两者在小元素和密集界面上的精度都仍有差距,详见 Computer Use 交互循环;