官方 OmniTool 由以下 4 个模块组成:

  • OmniParserServer:负责解析屏幕元素,输出元素 ID、坐标位置及语义化内容;
  • OmniBox:承载 Win11 系统的前端执行环境,持续截图并执行 LLM 下发的指令;
  • gradio:整体调度中心,负责串联三端——从 OmniBox 获取截图后发送至 OmniParserServer 进行解析,再将结果转发给 LLM,最终将指令下发至 OmniBox,如此循环;
  • LLM:新用户注册 Qwen 百炼大模型可获得 100 万 Token 的免费额度,额度耗尽后可切换至免费的 Gemini。

本文对应的修改版项目代码托管于 Github

OmniParserServer

介绍

OmniParserServer 负责接收屏幕截图并执行以下识别流程:

  1. 调用 PaddleOCR 进行文本识别;
  2. 调用 YOLO 模型进行图标检测,标注坐标位置;
  3. 调用 Florence2 模型对图标进行语义化描述,例如将齿轮图标识别为 setting
  4. 对识别结果进行融合与去重,最终输出:

输出内容如下:

  • 图片:标注所有检测到的元素;
  • JSON:包含各元素的索引、坐标、可交互性及语义化内容。

部署流程

AutoDL 上注册账号,选择合适的配置并创建实例。本文选用 RTX 4090D(显存 24G),运行 OmniParserServer 已足够,费用约为 1.88 元/小时。创建实例时,基础环境选择 MiniConda 即可。

部署前请务必先阅读下方的注意事项。

启动命令:

conda activate omni
python -m omniparserserver

注意事项

  • AutoDL 相关:

    • AutoDL 按量计费,不使用时建议手动关机以节省费用;
    • AutoDL 分配的实例本身运行于 Docker 容器中,不支持嵌套容器;
    • 每次开机时不保证有 GPU 可用,若无可用 GPU,需将实例迁移至其他机器,迁移操作不额外收费;
    • 通过 SSH 访问时,需使用 -p 参数指定端口;
    • 数据建议存放于 /root/autodl-tmp 目录,如容量不足可扩容,每 50GB 磁盘约 0.33 元/天,关机期间仍会持续计收扩容磁盘费用。
  • 配置 AutoDL 内网加速
# 开启 GitHub 及 HuggingFace 加速
source /etc/network_turbo

# 配置 HuggingFace 镜像加速
echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc
  • 配置 conda 和 pip 为清华镜像源
# 配置 conda 镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r

# conda-forge 社区镜像源(很多常用包均与此源相关)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge

# (可选)PyTorch 镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch

# (可选)bioconda 镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda

# 验证 conda 源配置
conda config --show

########################################################################################

# 配置 pip 镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 验证 pip 源配置
cat ~/.config/pip/pip.conf

# 配置完成后建议重新登录终端以使环境变量生效。
  • 不建议手动从外网下载模型权重后再手动复制
    手动复制的权重因安全信任机制,每次启动 OmniParserServer 时均需输入 3 次 y 以确认信任。建议按上文配置好 HuggingFace 加速后,直接通过 HuggingFace 自动下载。
  • 修改 requirements.txt

    原始 requirements.txt 存在版本兼容性问题,需按如下方式调整:

transformers==4.36.2    # 需降版本,最新版接口与当前代码不兼容

paddlepaddle>=2.6.0
paddleocr==3.1.0        # 需升版本以提升识别率

pydantic==2.10.6        # 原文件中缺少此依赖,缺失时运行会报错
  • 升级 PaddleOCR 版本至 3.1.0
    默认安装的 PaddleOCR 版本为 2.10.0,识别率较低,建议升级至最新版(当前为 3.1.0)。
  • PaddleOCR 识别阈值
    建议在代码中将 PaddleOCR 的识别阈值设置为 0.5,低于此值时部分内容将无法被识别。
  • 升级 PaddleOCR 为 GPU 版本
    CPU 版本的 PaddleOCR 推理速度较慢,切换至 GPU 版本可显著提升识别速度。若安装时存在库版本冲突,可另建一个 conda 环境,将 PaddleOCR 封装为独立的识别服务,通过 HTTP 与主服务进行通信。
  • YOLO 不支持 Win11 图标
    经测试,Win11 部分图标(如资源管理器)被持续误识别为 gallery,无法正确识别,需针对 Win11 图标重新训练 YOLO 模型。

OmniBox

介绍

OmniBox 被作者定义为一个纯净的 Win11 执行环境,持续进行截图并执行指令(如点击、双击等)。
作者基于 QEMU 的 Docker 镜像重新构建了 Win11 镜像,并在镜像中部署了自定义的 Flask 服务(路径为 omnitool/omnibox/vm/win11setup/setupscripts/server/main.py),配置为开机自启,对外提供以下接口:

  • /probe:健康检测
  • /execute:执行命令
  • /screenshot:截图

部署流程

按照原作者教程部署的要求较高:需要支持 KVM 的物理机、安装 Docker Desktop,并能自由访问互联网(需从 GitHub 和 Google 下载相关软件)。

经过多次尝试,最终采用以下方式完成了部署:

宿主机 Win11 → Hyper-V Debian12 → (基于 QEMU Docker 镜像构建 Win 镜像)→ Docker 容器 Win11 环境

共计嵌套了 3 层,部署过程较为繁琐。

注意事项

  • 宿主机需支持 KVM
    即 VMware 虚拟机设置中的「虚拟化 Intel VT-x/EPT」选项。
  • Hyper-V 中需关闭动态内存
    否则安装的 Debian12 虚拟机可能因内存不足而无法正常运行。
  • 无需安装 Docker Desktop
    直接使用 Docker 命令行工具即可满足需求。
  • Docker 镜像拉取问题
    如无法直接拉取镜像,可在能访问外网的环境中将镜像导出后再导入:
docker pull qemux/qemu:6.18
xz -9 -v qemu_6.18.tar
scp
xz -d qemu_6.18.tar.xz
sudo docker load -i qemu_6.18.tar

也可尝试使用国内 Docker 镜像源,但 qemu:6.18 较为冷门,不一定收录。

  • QEMU 镜像版本问题
    官方原本使用的 qemu-docker:6.08 镜像已被删除,需将版本修改为 qemu:6.18
  • wsdd 缺失问题
    wsdd 已被移除,需替换为 wsdd2 并添加 python3 依赖,详见 相关 Issue
  • 无法从 GitHub 下载 wsdd 及 virtio-win-1.9.43.tar.xz
    建议提前在可访问外网的环境中通过浏览器下载上述文件,再上传至 Debian12 虚拟机,并相应修改 Dockerfile 中的路径:
ADD --chmod=755 ./scripts/wsdd.py /usr/sbin/wsdd 
ADD --chmod=664 ./scripts/virtio-win-1.9.43.tar.xz /drivers.txz
  • 镜像磁盘容量
    默认容量可能不足,建议在 compose.yml 中将磁盘容量设置为 50G 以上。
  • 按需安装软件
    Win11 安装完成后会按配置安装一批软件,若不需要可在 omnitool/omnibox/vm/win11setup/setupscripts/tools_config.json 中删减相应条目,避免占用不必要的空间和时间。
  • 无需使用全新系统
    OmniBox 的核心职责是运行 Flask 服务和提供 VNC 视图,无需完整初始化一个新系统。

gradio

介绍

gradio 是整体流程的调度中心,负责串联以下三个模块:

  • OmniBox:负责截图及执行指令;
  • OmniParserServer:负责识别截图;
  • LLM:接收识别结果,返回调度指令后再转发至 OmniBox。

部署流程

gradio 本身无需额外部署,直接运行即可。
但由于 gradio 需要调用 LLM 接口,国内可用的仅有 Qwen,海外模型均需付费且需要代理访问,因此对代码进行了以下修改:

  • 添加支持本地LLM
  • 添加支持gemini
  • 添加支持代理

启动命令:

# 开启端口转发,至OmniParserServer
ssh -CNg -L 8000:127.0.0.1:8000 [email protected] -p <端口号>

# 启动
python app.py --windows_host_url localhost:8006 --omniparser_server_url localhost:8000

LLM

介绍

LLM 是整个项目的核心,负责接收 gradio 发来的屏幕截图,并根据 Prompt 返回下一步应执行的操作指令。

部署流程

初期可使用 qwen2.5-vl-72b-instruct 的免费额度,新用户注册即可获得 100 万 Token。
需注意:免费额度消耗较快,且 Qwen 平台默认开启了 10 元的透支额度,欠费不超过 10 元时服务不会自动停止。为避免意外扣费,建议注册后立即关闭该透支额度。

随后尝试在 AutoDL 上自行部署 qwen2.5-vl-72b-instruct,使用 32GB 显存,从接收图片到输出操作指令约需 10 分钟,推理速度过慢,且大显存机型费用更高,因此放弃了本地部署方案。

最终选择使用免费的 gemini-2.5-flash,需配置代理访问外网,相关代理支持已添加至代码中。

注意事项

  • 注册 Qwen 百炼平台后,建议提前关闭 10 元透支额度以避免欠费。
  • 接入 Gemini 接口需配置代理。
  • 本地部署 70B 模型,在 32GB 显存环境下推理单张图片约需 10 分钟,速度不可接受,不建议采用。

OmniTool 已知缺陷

  • 识别率问题:

    • PaddleOCR(3.1.0 版本)在识别中文时,菜单文字存在粘连的情况;
    • Florence2 模型在为 Win11 任务栏图标生成语义描述时存在误识别,例如资源管理器图标被识别为 Gallery
  • VLM 问题:

    • 当界面上出现多个相同图标时,大模型无法准确判断应点击哪一个。该问题在原作者论文中亦有提及(作者使用的是 GPT-4V);
    • 输出结果不稳定,同一任务在不同执行时可能产生不同结果。

标签: none

评论已关闭