# ScreenAgent
**Repository Path**: nilbody_0/ScreenAgent
## Basic Information
- **Project Name**: ScreenAgent
- **Description**: just test, do not know what to say
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-03-15
- **Last Updated**: 2024-06-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
ScreenAgent
:视觉语言大模型驱动的计算机控制智能体
[ScreenAgent 论文链接 arxiv:2402.07945](https://arxiv.org/abs/2402.07945)
我们构建了 ScreenAgent 项目,为视觉语言模型智能体(VLM Agent)构建了一个与真实计算机屏幕交互的环境。在这个环境中,智能体可以观察屏幕截图,并通过输出鼠标和键盘操作来操纵图形用户界面。我们还设计了一个自动控制流程,其中包括计划、行动和反思阶段,引导智能体与环境持续交互并完成多步骤任务。此外,我们还构建了 ScreenAgent 数据集,该数据集收集了完成各种日常计算机任务时的屏幕截图和动作序列。
ScreenAgent 设计动机
为了引导 VLM Agent 与计算机屏幕进行持续的交互,我们构建了一个包含“计划-执行-反思”的运行流程。在计划阶段,Agent 被要求将用户任务拆解为子任务。在执行阶段,Agent 将观察屏幕截图,给出执行子任务的具体鼠标和键盘动作。控制器将执行这些动作,并将执行结果反馈给 Agent。在反思阶段,Agent 将观察执行结果,并判定当前的状态,选择继续执行、重试或调整计划。这一流程将持续进行,直到任务完成。
自动化的运行流程
我们参考了 VNC 远程桌面连接协议来设计Agent的动作空间,其中都是最为基础的鼠标和键盘操作,鼠标的大部分点击操作都需要 Agent 给出精确的屏幕坐标位置。相比起调用特定的 API 来完成任务,这种方式更加通用,可以适用于各种桌面操作系统和应用程序,对用户更具可解释性。
支持的动作类型和动作属性
要教会Agent使用电脑并不是一件简单的事情,需要 Agent 具备任务规划、图像理解、视觉定位、工具使用等多种综合能力,为此我们人工标注了 ScreenAgent 数据集,这一数据集涵盖了多种日常计算机任务,包括文件操作、网页浏览、游戏娱乐等场景。我们按照上述的“计划-执行-反思”的运行流程来构建一个完整 session 。
ScreenAgent 数据集任务类型分布
电脑是人类最为强大且通用的工具,通过训练 ScreenAgent 这样能够使用电脑的模型,有望构建一个更通用的代理,协助人类完成各种日常数字工作。
项目主要包括以下部分:
```
├── client 控制器客户端代码
│ ├── prompt 提示词模版
│ ├── config.yml 控制器客户端配置文件模版
│ └── tasks.txt 任务列表
├── data 其中包含ScreenAgent数据集和其他视觉定位相关数据集
├── model_workers 大模型推理器
└── train 训练模型代码
```
# 准备
## 第一步,准备被控制的桌面操作系统
首先你需要准备被控制的桌面操作系统,其中安装VNC Server,如[TightVNC](https://www.tightvnc.com/download.php)。或者你可以使用一个带有GUI的Docker容器,我们准备好了一个容器`niuniushan/screenagent-env`,您可以使用以下的命令来拉取并启动这一容器:
```bash
docker run -d --name ScreenAgent -e RESOLUTION=1024x768 -p 5900:5900 -p 8001:8001 -e VNC_PASSWORD= -e CLIPBOARD_SERVER_SECRET_TOKEN= -v /dev/shm:/dev/shm niuniushan/screenagent-env:latest
```
其中,请将``替换为你设置的新VNC密码,``替换为你的剪贴板服务密码。由于键盘输入长串文本或unicode字符是依靠剪贴板实现的,如果不启用剪贴板服务则只能通过键盘依次按下的方式输入ASCII字符串,无法输入中文等unicode字符,这一镜像中已经包含一个剪贴板服务,默认监听8001端口,你需要设置一个密码来保护你的剪贴板服务。`niuniushan/screenagent-env`是基于`fcwu/docker-ubuntu-vnc-desktop`构建的,你可以在[这里](https://github.com/fcwu/docker-ubuntu-vnc-desktop)找到更多关于这个镜像的信息。
如果您想使用已有的桌面环境,例如Windows、Linux Desktop或其他任何桌面环境,您需要运行任意一种VNC Server,记下来它的IP地址和端口号。如果您想启用剪贴板服务,请在您的桌面环境中执行以下步骤:
```bash
# 安装依赖
pip install fastapi pydantic uvicorn pyperclip
# 在环境变量中设置密码
export CLIPBOARD_SERVER_SECRET_TOKEN=
# 启动剪贴板服务
python client/clipboard_server.py
```
`clipboard_server.py` 将监听8001端口,接收来自控制器的键盘输入长串文本的(text)指令。
保持运行后您可以测试剪贴板服务是否正常工作,例如:
```bash
curl --location 'http://localhost:8001/clipboard' \
--header 'Content-Type: application/json' \
--data '{
"text":"Hello world",
"token":""
}'
```
如果正常工作,则会收到`{"success": True, "message": "Text copied to clipboard"}`的响应。
如果遇到“Pyperclip could not find a copy/paste mechanism for your system.” 的错误,请在运行`python client/clipboard_server.py`前增加一个环境变量,指定 X 服务器位置:
```bash
export DISPLAY=:0.0
```
具体请根据您的系统环境进行调整。如果还出现报错,请参考[这里](https://pyperclip.readthedocs.io/en/latest/introduction.html#not-implemented-error)。
请将上面的信息填写到配置文件`client/config.yml`的`remote_vnc_server`项中。
## 第二步,准备控制器代码运行环境
你需要运行控制器的代码,它的使命有三个:首先控制器会连接到VNC Server,采集屏幕截图,发送鼠标和键盘等命令;其次,控制器内部维护一个状态机,实现计划、行动和反思的自动控制流程,引导智能体与环境持续交互;最后,控制器会根据提示词模版来构造完整的提示词,发送给大模型推理API,解析大模型生成回复中的控制命令。控制器是一个基于的PyQt5的程序,你需要安装一些依赖:
```bash
pip install -r client/requirements.txt
```
## 第三步,准备大模型推理器或API
请选择一种VLM作为Agent,我们在`model_workers`中提供了4种模型的推理器,分别是:GPT-4V、LLaVA-1.5、CogAgent和ScreenAgent。您也可以自己实现一个推理器或使用第三方API,您可以参考`client/interface_api`下的代码来实现新的API调用接口。
请参考`client/config.yml`中的`llm_api`部分来准备配置文件,`llm_api` 下只保留一种模型即可。
```yaml
llm_api:
# Select ONE of the following models to use:
GPT4V:
model_name: "gpt-4-vision-preview"
openai_api_key: ""
target_url: "https://api.openai.com/v1/chat/completions"
LLaVA:
model_name: "LLaVA-1.5"
target_url: "http://localhost:40000/worker_generate"
CogAgent:
target_url: "http://localhost:40000/worker_generate"
ScreenAgent:
target_url: "http://localhost:40000/worker_generate"
# Common settings for all models
temperature: 1.0
top_p: 0.9
max_tokens: 500
```
### 如果使用GPT-4V作为Agent
请在`client/config.yml`中设置`llm_api`为`GPT4V`,并填写您的OpenAI API Key,请随时注意您的账户余额。
### 如果使用LLaVA-1.5作为Agent
请参考[LLaVA](https://github.com/haotian-liu/LLaVA)项目的来下载准备LLaVA-1.5模型,例如:
```bash
git clone https://github.com/haotian-liu/LLaVA.git
cd LLaVA
conda create -n llava python=3.10 -y
conda activate llava
pip install --upgrade pip # enable PEP 660 support
pip install -e .
```
`model_workers/llava_model_worker.py`提供了一个LLaVA-1.5非流式的输出的推理器,您可以拷贝到`llava/serve/model_worker`下,并使用以下命令来启动:
```bash
cd llava
python -m llava.serve.llava_model_worker --host 0.0.0.0 --port 40000 --worker http://localhost:40000 --model-path liuhaotian/llava-v1.5-13b --no-register
```
### 如果使用CogAgent作为Agent
请参考[CogVLM](https://github.com/THUDM/CogVLM)项目下载准备CogAgent模型,请在[这里](https://huggingface.co/THUDM/CogAgent/tree/main)下载sat版本的的CogAgent权重`cogagent-chat.zip`,解压后放到`train/saved_models/cogagent-chat`目录下。
`train/cogagent_model_worker.py`提供了一个CogAgent非流式的输出的推理器,并使用以下命令来启动:
```bash
cd train
RANK=0 WORLD_SIZE=1 LOCAL_RANK=0 python ./cogagent_model_worker.py --host 0.0.0.0 --port 40000 --from_pretrained "saved_models/cogagent-chat" --bf16 --max_length 2048
```
### 如果使用ScreenAgent作为Agent
ScreenAgent是在CogAgent的基础上训练的,请到[这里](https://huggingface.co/niurl/ScreenAgent)下载sat格式的权重文件`ScreenAgent-2312.zip`,解压后放在`train/saved_models/ScreenAgent-2312`,并使用以下命令来启动:
```bash
cd train
RANK=0 WORLD_SIZE=1 LOCAL_RANK=0 python ./cogagent_model_worker.py --host 0.0.0.0 --port 40000 --from_pretrained "./saved_models/ScreenAgent-2312" --bf16 --max_length 2048
```
# 运行
准备工作完成后,你可以运行控制器了:
```bash
cd client
python run_controller.py -c config.yml
```
控制器界面如下,您需要先从左侧双击选择一个任务,然后按下“Start Automation”按钮,控制器会按照计划-行动-反思的流程自动运行,控制器会采集当前的屏幕画面、填充提示词模版、发送图像和完整提示词给大模型推理器、解析大模型推理器的回复、发送鼠标键盘控制命令给VNC Server,循环往复。
控制器界面
如果画面卡住,请尝试按下“Re-connect”按钮,控制器会尝试重新连接VNC Server。
# 数据集
所有的数据集和数据集的处理代码都在`data`目录下。我们使用了三个现有数据集COCO2014、Rico & widget-caption、Mind2Web
## COCO Dataset
我们使用COCO 2014 validation images作为视觉定位能力的训练数据集。您可以在[这里](https://cocodataset.org/#download)下载COCO 2014 train images,在这里我们使用的annotation信息是refcoco,split by unc。
```
├── COCO
├── prompts # 用于训练Agent视觉定位能力的提示词模板
├── train2014 # COCO 2014 train
└── annotations # COCO 2014 annotations
```
## Rico & widget-caption Dataset
Rico 是一个包含了大量Android应用的截图和控件信息的数据集,您可以在[这里](http://www.interactionmining.org/rico.html)下载Rico数据集中 “1. UI Screenshots and View Hierarchies (6 GB)“ 的部分,文件名是`unique_uis.tar.gz`,请将解压后文件夹`combined`放在`data/Rico`目录下。
widget-caption 是在Rico基础上对控件信息进行了标注,请在`data/Rico`下克隆`https://github.com/google-research-datasets/widget-caption`项目。
最终目录结构如下:
```
├── Rico
├── prompts # 用于训练Agent视觉定位能力的提示词模板
├── combined # Rico dataset screenshots
└── widget-caption
├── split
│ ├── dev.txt
│ ├── test.txt
│ └── train.txt
└── widget_captions.csv
```
## Mind2Web Dataset
[Mind2Web](https://osu-nlp-group.github.io/Mind2Web/) 是一个真实模拟网页浏览数据集,您需要下下载原始数据集并进行处理,首先使用globus工具下载[这里](https://app.globus.org/file-manager?origin_id=32e6b738-a0b0-47f8-b475-26bf1c5ebf19)的原始网页截图,文件夹名称为`raw_dump`,放置在`data/Mind2Web/raw_dump`目录下,然后使用以下命令来处理数据集:
```bash
cd data/Mind2Web
python convert_dataset.py
```
这段代码中会从huggingface datasets中下载`osunlp/Mind2Web`数据集的处理形式,请确保网络畅通,同时这一步会涉及到将英文指令翻译成中文指令,您需要在`data/Mind2Web/translate.py`中调用你自己的翻译API。
目录结构如下:
```
├── Mind2Web
├── convert_dataset.py
├── translate.py
├── prompts # 用于训练Agent网页浏览能力的提示词模板
├── raw_dump # Mind2Web raw_dump downloaded from globus
└── processed_dataset # Created by convert_dataset.py
```
## ScreenAgent Dataset
ScreenAgent是本文标注的数据集,分为训练和测试集合,目录结构如下:
```
├── data
├── ScreenAgent
├── train
│ ├──
│ │ ├── images
│ │ │ ├── .jpg
│ │ │ └── ...
│ │ ├── .json
│ │ └── ...
│ ├── ...
└── test
```
json文件中每个字段的含义:
- session_id:Session ID
- task_prompt:任务总体的目标
- task_prompt_en:任务总体的目标(En)
- task_prompt_zh:任务总体的目标(Zh)
- send_prompt:发送给模型的完整提示词
- send_prompt_en:发送给模型的完整提示词(En)
- send_prompt_zh:发送给模型的完整提示词(Zh)
- LLM_response:模型给出的原始回复文本,即RLHF中的 reject response
- LLM_response_editer:人工修正后的回复文本,即RLHF中的 choice response
- LLM_response_editer_en:人工修正后的回复文本(En)
- LLM_response_editer_zh:人工修正后的回复文本(Zh)
- video_height,video_width:图像的高度和宽度
- saved_image_name:截图文件名,在每个session的images文件夹下
- actions:从 LLM_response_editer 中解析出的动作序列
ScreenAgent数据集中的一个案例
# 训练 ScreenAgent
如果你想训练自己的模型,或复现ScreenAgent模型,请先准备好以上的数据集,并在`train/dataset/mixture_dataset.py`文件中核对所有数据集的路径,如果只想使用其中一部分数据集或增加新的数据集,请在`train/dataset/mixture_dataset.py`中修改`make_supervised_data_module`函数。请在[这里](https://huggingface.co/THUDM/CogAgent/tree/main)下载sat版本的的CogAgent权重`cogagent-chat.zip`,解压后放到`train/saved_models/`目录下。
您需要关注并检查以下文件:
```
train
├── data -> ../data
├── dataset
│ └── mixture_dataset.py
├── finetune_ScreenAgent.sh
└── saved_models
└── cogagent-chat # unzip cogagent-chat.zip
├── 1
│ └── mp_rank_00_model_states.pt
├── latest
└── model_config.json
```
请根据您设备情况修改`train/finetune_ScreenAgent.sh`里面的参数,之后运行:
```bash
cd train
bash finetune_ScreenAgent.sh
```
最后如果想将sat分布式训练的权重合并为一个权重文件,请参考`train/merge_model.sh`代码,请确保该文件中模型并行的个数`MP_SIZE`与`train/finetune_ScreenAgent.sh`中的`WORLD_SIZE`保持一致。修改`--from-pretrained`后参数为训练时存储的checkpoint位置。合并后的权重文件将保存为`train/saved_models/merged_model`文件夹。
# TODO
- [ ] 提供huggingface版本权重。
- [ ] 简化控制器的设计,提供 no render 模式。
- [ ] 集成Gym。
- [ ] 增加技能库,支持更为复杂的函数调用。
# 引用本文
```bib
@article{niu2024screenagent,
title={ScreenAgent: A Vision Language Model-driven Computer Control Agent},
author={Runliang Niu and Jindong Li and Shiqi Wang and Yali Fu and Xiyu Hu and Xueyuan Leng and He Kong and Yi Chang and Qi Wang},
year={2024},
eprint={2402.07945},
archivePrefix={arXiv},
primaryClass={cs.HC}
}
```
# 许可信息
```
Code License: MIT
Dataset License: Apache-2.0
Model License: The CogVLM License
```