告别“一句话”时代:把 GUI 指令变成会思考的“多面手”——UI-Ins 实战全记录
“
核心问题:为什么同一张界面截图,换一句人话描述,模型就能暴涨 76% 准确率?本文用一次完整实验复盘,带你亲手做出“会自己挑角度”的 GUI 视觉定位模型 UI-Ins。
1 背景:GUI 视觉定位的隐形天花板
1.1 一句话总结
指令不是“传声筒”,而是“思考路径”。只要让模型像人一样在不同视角间切换,零样本也能涨点 76%。
1.2 行业痛点
-
数据:开源数据集 23.3% 指令有 flaw,训练即“喂毒” -
方法:主流 SFT 把指令当静态字符串,视角单一、鲁棒性差 -
评测:静态离线 benchmark 高分≠在线 Agent 不掉链子
1.3 解决思路
把“指令”升级为“Instruction-as-Reasoning”——
-
先让模型见多识广:同一张截图,四种视角(外观/功能/位置/意图)各写一句话 -
再让模型学会“挑视角”:用 RL 自动选最适合当前场景的那一条推理路径
2 数据:把 23.3% 噪音降到 8% 的清洗流水线
2.1 核心问题
如何低成本、可复现地得到“一条指令只对应一个像素框”的高质量数据集?
2.2 三步流水线
| 步骤 | 工具 | 目的 | 原文错误率 |
|---|---|---|---|
| ① 预检测 | OmniParser V2 | 先检出所有可交互元素,拿到候选框 | – |
| ② IoU 过滤 | 自写脚本 | 清洗与原标注框 IoU<0.5 的脏样本 | 23.3%→8% |
| ③ 多视角重写 | GPT-4.1 + 人工规则 | 生成外观/功能/位置/意图 4 类指令,再反向验证唯一性 | 8%→<8% |
2.3 场景示例
假设原指令:“点这里”(含糊不清)
流水线输出:
-
外观:点击紫色圆形“+”图标 -
功能:点击“新建任务”按钮 -
位置:点击屏幕右下角第一个按钮 -
意图:我想新增任务,请帮我找到入口
反思:数据清洗不是“洁癖”,而是把 1/4 的“毒样本”拦在训练门外,这一步省不得。
3 方法:两阶段训练,让模型“先见世面、后学选择”
3.1 核心问题
怎么既让模型会“多条思路”,又能自动挑“最优思路”?
3.2 阶段一:SFT——“见世面”
-
样本构造:随机抽 2 个视角,一个当“用户指令”,一个当“内部推理” -
训练目标:联合最大化“推理文本 + 坐标点”似然 -
输出格式:
<think>
从功能视角:这是“关闭窗口”按钮
</think>
<tool_call>
{"name":"grounding","arguments":{"action":"click","coordinate":[123,45]}}
</tool_call>
3.3 阶段二:GRPO RL——“学选择”
-
动作空间:模型可自由生成任意内容(不限制四种视角) -
奖励:简单 point-in-box 0/1,归一化优势 -
关键:用 Group Relative Policy Optimization,8 条 rollout 对比,自动推高“命中”路径的概率
3.4 场景示例
同一条高级指令:“升级工作区”
-
SFT 阶段:模型见过“升级=紫色按钮”等 20 种改写,知道不止一种描述 -
RL 阶段:发现“紫色按钮”在暗色主题下最难区分→自动学会优先用“功能+位置”组合描述,准确率再涨 9.9%
反思:自由式思维链(Free-Form Reasoning)在 GUI 定位常掉点,而“有菜单的思维”——提前规定视角再自由组合——反而稳。
4 实验:离线 benchmark 全 SOTA,在线 Agent 也抗打
4.1 核心问题
新范式到底涨在哪?是否只是“刷榜”?
4.2 离线结果
| Benchmark | 指标 | UI-Ins-7B | UI-Ins-32B | 原 SOTA |
|---|---|---|---|---|
| UI-I2E-Bench | Acc | 81.1 | 87.3 | 83.5 |
| ScreenSpot-Pro | Acc | 52.2 | 57.0 | 53.6 |
| MMBench-GUI L2 | Acc | 83.1 | 84.9 | 83.4 |
“
在“隐式指令”子集上,UI-Ins-32B 比次优模型高 6.6%,证明“推理视角”对复杂语义最有效。
4.3 在线结果
AndroidWorld 实时 Agent 任务(GPT-5 做高层规划,UI-Ins-7B 做像素级执行)
-
成功率:74.1% -
超过 Gemini 2.5 Computer Use (69.7%) 与 UI-TARS-2 (73.3%)
场景举例:
任务——“把 7 AM 日历空闲时段标为健身”
GPT-5 输出“点击 7 AM 空白格子”,UI-Ins-7B 在动态滚动页面准确定位到坐标(319, 612),完成。
5 消融:每一步都不能省
| 消融项 | MMBench-GUI L2 得分 | 结论 |
|---|---|---|
| 去掉多视角数据 | 63.4→72.4 | 数据质量是下限 |
| 去掉 RL 阶段 | 83.1→76.3 | 不会“挑视角”立刻掉点 |
| 去掉推理 | 83.1→79.1 | 中间推理是“导航仪”,省不得 |
6 错误案例:三类坑还在
-
领域知识缺失
指令:“找积木玩具公司”→模型点 Jazwares,真值是 MEGA
反思:纯视觉模型不懂品牌知识,未来需与知识图谱联动 -
布局理解短板
把“状态栏按钮”点成“单元格”——边界框对了,可点区域却错
反思:需要像素级分割而不仅是中心点 -
视觉幻觉
两个同色图标并排,模型选错;需更高分辨率+局部放大策略
7 落地指南:30 分钟跑通 UI-Ins-7B 推理
7.1 环境
pip install torch transformers pillow
7.2 最小可运行代码
import torch, re, requests
from PIL import Image
from transformers import AutoProcessor, Qwen2_5_VLForConditionalGeneration
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
"Tongyi-MiA/UI-Ins-7B",
torch_dtype=torch.bfloat16,
device_map="auto").eval()
processor = AutoProcessor.from_pretrained("Tongyi-MiA/UI-Ins-7B")
image = Image.open("demo.jpg").convert("RGB")
instruction = "Click the search icon"
messages = [{"role": "system",
"content": [{"type": "text",
"text": "You are a GUI agent. You need to think step-by-step and output coordinate."}]},
{"role": "user",
"content": [{"type": "image"}, {"type": "text", "text": instruction}]}]
prompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(text=[prompt], images=[image], return_tensors="pt").to(model.device)
with torch.no_grad():
out = model.generate(**inputs, max_new_tokens=128)
pred = processor.decode(out[0, len(inputs["input_ids"][0]):], skip_special_tokens=True)
coords = re.findall(r"\[(\d+),\s*(\d+)\]", pred)
if coords:
x, y = map(int, coords[0])
print(f"Predicted click: ({x}, {y})")
7.3 常见坑
-
输入截图需保持原始分辨率,UI-Ins 内部会自适应 1024×768 -
一定加 <think>标签提示,否则模型可能直接吐坐标,掉点约 4%
8 实用摘要 / 一页速览
| 要做什么 | 一句话口诀 |
|---|---|
| 数据 | 先洗后扩,四视角重写,一条指令一个框 |
| 训练 | SFT 先给“菜单”,RL 再学“点菜” |
| 推理 | 强制 <think>→选视角→出坐标 |
| 评测 | 离线看“隐式指令”子集,在线跑 AndroidWorld |
| 避坑 | 知识缺口、布局细节、视觉幻觉三类错最多 |
9 FAQ
-
Q:没有 A100,能在 24G 显卡上训练吗?
A:7B 模型 SFT 阶段 fp16 + Deepspeed ZeRO-2 约 22G;RL 阶段 8 条 rollout 需 28G,可改 4 条 rollout 或开 CPU offload。 -
Q:四视角模板写不满怎么办?
A:允许 GPT-4.1 同视角多 paraphrase;最终只保留“唯一对应框”的句子即可。 -
Q:必须四视角吗,两视角行不行?
A:实验降到两视角平均掉 2.3%,仍能打,但四视角是性价比拐点。 -
Q:在线 Agent 时延如何?
A:UI-Ins-7B 单帧推理 180ms(A100),GPT-5 规划 1.2s,整体任务耗时与人工操作相当。 -
Q:商业化授权?
A:代码与权重均 CC-BY-NC-SA 4.0,商业需联系阿里通义实验室另议。 -
Q:能直接输出 bounding box 而不是点吗?
A:目前训练目标为中心点,输出框需改损失函数为 IoU,代码已留接口。
“
作者反思:做 UI-Ins 最大感受——“指令”不是模型耳边风,而是方向盘。只要肯把指令当推理路径而不是静态字符串,哪怕不堆参数,也能让 7B 小模型跑赢 32B 大块头。下一程,把知识图谱和分割能力并进来,让模型不仅“看得见”,还要“看得懂”。

