feat: enhance AI pane picking with OCR and cancellable hotkeys
This commit is contained in:
1 parent
0132871885
commit
1ddd1f1b35
10 files changed
+496
-33
No files matched your search
@@ -0,0 +1,119 @@
|
||||
# AI 拾取模型选型与 RPA 执行方案
|
||||
|
||||
## 结论
|
||||
|
||||
当前模型“只能识别控件”不是解析器写错,而是 OmniParser 的 icon detect 本身就是单类别模型。它适合解决“屏幕上有哪些可交互区域”,不适合直接回答“这是一个登录按钮还是搜索框”。
|
||||
|
||||
更合适的不是换一个全能小模型,而是分四层:
|
||||
|
||||
1. 视觉定位:YOLO/OmniParser 找 bbox,保证又快又能看到 UIA 看不到的区域。
|
||||
2. 视觉语义:OCR 读取框内文本;必要时用小分类模型或图标匹配补充类别。
|
||||
3. UIA 增强:用 AI bbox 中心回查 Windows UIA,拿到 `Name / ControlType / AutomationId / ClassName`。
|
||||
4. RPA 执行:优先保存 UIA selector,AI bbox 只作为兜底坐标和运行时重定位依据。
|
||||
|
||||
这才是对齐实在这类产品的方向:AI 负责感知和定位,RPA 引擎负责稳定执行和状态反馈。
|
||||
|
||||
## 当前可试模型
|
||||
|
||||
模型已经放在 `D:\code\PRA-only-demo\temp\models`。同名 `*.labels.json` 已经配好,当前实验台会读取标签,不再显示“类别1/类别2”。
|
||||
|
||||
| 本地文件 | 来源 | 类别数 | 类别 | 速度/体积 | 适用场景 | License 风险 |
|
||||
|---|---|---:|---|---|---|---|
|
||||
| `omniparser-v1-fp16.onnx` | `onnx-community/OmniParser-icon_detect` | 1 | `控件` | 约 6 MB,测试约 0.8s | 可交互区域粗定位、基线对比 | 商用前复核 OmniParser/底模授权 |
|
||||
| `amigo-ui-elements-yolov8.onnx` | `amigodev/ui-elements-detector-test` | 8 | `button/field/heading/iframe/image/label/link/text` | 约 12 MB,测试约 0.4s | 网页截图、轻量多类别试验 | 仓库未标 License,仅试验 |
|
||||
| `webpage-element.onnx` | `OpenDILabCommunity/webpage_element_detection` | 8 | `button/field/heading/iframe/image/label/link/text` | 约 99 MB,测试约 1.5s | 网页 UI,准确率通常优于小模型 | Apache-2.0 |
|
||||
| `android-ui-yolov8n.onnx` | `yasirfaizahmed/android_ui_detection_yolov8` | 21 | `TextButton/EditText/CheckBox/Switch/Toolbar` 等 | 约 12 MB,测试约 0.4s | 安卓/移动 UI;桌面也可当轻量 UI 分类基线 | Apache-2.0 |
|
||||
| `macpaw-ui-elements-yolo11l.onnx` | `macpaw-research/yolov11l-ui-elements-detection` | 5 | `AXButton/AXDisclosureTriangle/AXImage/AXLink/AXTextArea` | 约 102 MB,测试约 1.7s | 桌面/辅助功能导向,语义更接近可访问性控件 | AGPL-3.0,商用谨慎 |
|
||||
| `resources/models/ui-element-detect/webpage-element.onnx` | OpenDILab webpage | 8 | `button/field/heading/iframe/image/label/link/text` | 当前默认,约 99 MB | 已实测并接入 Pane AI 拾取 | Apache-2.0 |
|
||||
| `resources/models/ui-icon-detect/model.onnx` | OmniParser v2 icon detect | 1 | `控件` | 旧链路兼容回退 | 仅缺新模型时兜底 | 商用前复核 |
|
||||
|
||||
测试方式:打开“AI 识别实验台”,选择识别目标,点“选择 ONNX”,选择上表中的 `.onnx` 文件。确保同名 `.labels.json` 放在同一目录。
|
||||
|
||||
## 实测观察
|
||||
|
||||
同一张简单网页风格测试图:
|
||||
|
||||
- Android UI YOLOv8n:约 431ms,能识别 `TextButton`、`EditText`、`Text`,置信度普遍高。
|
||||
- Amigo UI YOLOv8:约 430ms,能识别 `button`、`field`,框更整齐。
|
||||
- OpenDILab webpage:约 1533ms,类别与 Amigo 相同,体积和耗时更大。
|
||||
- MacPaw YOLO11l:约 1743ms,能识别 `AXButton`、`AXTextArea`,但对该测试图置信度偏低。
|
||||
- OmniParser v1:约 781ms,只输出“控件”,定位能力可用但没有类别语义。
|
||||
|
||||
这组结果说明:轻量 YOLO 完全能做到实时/近实时,速度问题不是模型架构本身,而是模型大小、截图裁剪、进程通信和重复初始化共同决定的。
|
||||
|
||||
## 当前 RPA 可用性
|
||||
|
||||
当前 Pane AI 拾取生成:
|
||||
|
||||
```text
|
||||
screen=x,y,width,height;window=...;name=OCR文本或类别;type=视觉类别;aiType=视觉类别;aiText=OCR文本;ai=1
|
||||
```
|
||||
|
||||
`webpage-element.onnx` 先定位候选;PaddleOCR/PP-OCRv4 对同一张 Pane 截图做一次整图识别,并按几何关系把文本写回候选框。整图结果按截图 SHA-256 缓存,重复识别同一画面不会重复推理。执行层已经支持以 `screen=` 做坐标点击、坐标输入、坐标取值,所以“立刻执行一次”是可用的。
|
||||
|
||||
但只靠当前 selector 还不能算稳定 RPA 元素,原因是:
|
||||
|
||||
- `screen=` 是拾取瞬间的坐标快照。
|
||||
- 窗口移动、页面滚动、分辨率/DPI 变化后会失效。
|
||||
- `exists/wait` 目前对 `screen=` 过于宽松。
|
||||
- `name/type` 很多时候只是视觉模型类别,不是业务语义。
|
||||
- 没有运行时重定位机制。
|
||||
|
||||
## 目标 selector 结构
|
||||
|
||||
建议逐步变成:
|
||||
|
||||
```text
|
||||
window=title:xxx;process=xxx;
|
||||
type=Button;name=登录;id=loginButton;class=Button;
|
||||
aiType=button;aiRect=x,y,w,h;aiModel=webpage-element;
|
||||
template=sha1:...;ai=1
|
||||
```
|
||||
|
||||
定位策略:
|
||||
|
||||
1. 优先按 `window + AutomationId + Name + ControlType` 查 UIA。
|
||||
2. UIA 查不到时,限制在原窗口/原 Pane 附近重找。
|
||||
3. 再失败时截图并运行视觉模型,在候选中按 `aiType + IoU + 外观相似度` 找回目标。
|
||||
4. 找回后更新真实 UIA rect,再执行动作。
|
||||
|
||||
## AI 类别到 RPA 动作映射
|
||||
|
||||
| AI/UIA 类别 | RPA 默认动作 |
|
||||
|---|---|
|
||||
| `button / AXButton / TextButton` | `Element_Click` |
|
||||
| `field / EditText / AXTextArea / TextBox` | `Element_SetValue` / `Element_GetValue` |
|
||||
| `link / AXLink` | `Element_Click` |
|
||||
| `text / label / heading` | `Element_GetText` / OCR |
|
||||
| `CheckBox / Switch` | `Element_SetCheck` / `Element_GetCheck` |
|
||||
| `Spinner / ComboBox` | `Element_SetSelect` / 展开后点击 |
|
||||
| `image / Icon` | 坐标点击 / 图标匹配 |
|
||||
| `Toolbar / Navigation / Group` | 作为容器遍历子元素,不直接执行动作 |
|
||||
|
||||
## 最好用的落地路线
|
||||
|
||||
### 第一阶段:可用
|
||||
|
||||
- 已完成:本地模型、Pane AI、候选框、悬浮确认。
|
||||
- 已完成:候选类别从 sidecar 读取,默认模型切换为 `webpage-element.onnx`。
|
||||
- 已完成:PaddleOCR 整图识别、候选框文本分配、OCR 结果缓存和异步回填。
|
||||
- 已完成:`F2/F4` 进入 AI;`Esc/F9` 取消 AI;`F8` 切换开发候选框。
|
||||
- 补 UIA 回查:选中框后用中心点/范围找最小 UIA 元素,生成稳定 selector。
|
||||
|
||||
### 第二阶段:稳定
|
||||
|
||||
- `exists/wait` 真正支持 `screen= + window + aiRect`。
|
||||
- 执行前校验窗口和元素仍在预期区域。
|
||||
- 增加 AI 重定位:截图 → 检测 → 与保存的 bbox/裁剪图匹配 → 更新坐标。
|
||||
- 所有执行结果回写目标快照,方便排查框偏。
|
||||
|
||||
### 第三阶段:接近实在
|
||||
|
||||
- 元素检测、元素分类、OCR、图标相似、UISelector 组合。
|
||||
- AI 只输出结构化 target/action,不直接控鼠标键盘。
|
||||
- RPA 执行器负责窗口激活、等待、重试、截图、异常恢复。
|
||||
- 对复杂远程桌面/Canvas/Java 应用保留视觉兜底。
|
||||
|
||||
## 推荐优先级
|
||||
|
||||
已选定 `webpage-element.onnx` 作为 Pane AI 默认模型。其他模型继续留在本地 `temp/models` 供实验台对比,不再进入默认链路和安装包。内置 OmniParser 只作为老安装包兼容回退,不建议作为最终业务 selector 的唯一来源。
|
||||
Reference in new issue
Block a user