OmniTool 部署指南及常见问题
官方 OmniTool 由以下 4 个模块组成:
- OmniParserServer:负责解析屏幕元素,输出元素 ID、坐标位置及语义化内容;
- OmniBox:承载 Win11 系统的前端执行环境,持续截图并执行 LLM 下发的指令;
- gradio:整体调度中心,负责串联三端——从 OmniBox 获取截图后发送至 OmniParserServer 进行解析,再将结果转发给 LLM,最终将指令下发至 OmniBox,如此循环;
- LLM:新用户注册 Qwen 百炼大模型可获得 100 万 Token 的免费额度,额度耗尽后可切换至免费的 Gemini。
本文对应的修改版项目代码托管于 Github。
OmniParserServer
介绍
OmniParserServer 负责接收屏幕截图并执行以下识别流程:
- 调用 PaddleOCR 进行文本识别;
- 调用 YOLO 模型进行图标检测,标注坐标位置;
- 调用 Florence2 模型对图标进行语义化描述,例如将齿轮图标识别为
setting; - 对识别结果进行融合与去重,最终输出:
输出内容如下:
- 图片:标注所有检测到的元素;
- 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:8000LLM
介绍
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);
- 输出结果不稳定,同一任务在不同执行时可能产生不同结果。
评论已关闭