johnzqlu/clawgui-eval

Dataset

ClawGUI-Eval: Standardized GUI Grounding Evaluation

0

8 commits

2 linked in READMEs

updated Jun 8, 2026

See the code

README

ClawGUI-Eval Logo

ClawGUI-Eval: Standardized GUI Grounding Evaluation

Python 3.12 License HuggingFace Dataset ModelScope Dataset

English | δΈ­ζ–‡

πŸ“š Table of Contents

πŸ“– Overview

ClawGUI-Eval is the evaluation module of ClawGUI. GUI grounding evaluation is harder to reproduce than it looks: prompt order, coordinate systems, temperature, and image resolution all interact to shift numbers by several points. ClawGUI-Eval pins all of these choices per model and adopts a three-stage pipeline β€” Infer β†’ Judge β†’ Metric β€” to evaluate how accurately a model can locate UI elements based on natural language instructions. The result is a 95.8% reproduction rate against official baselines, making cross-paper comparisons meaningful.

Key Features:

  • Dual backend support β€” Local GPU via transformers or remote API via OpenAI-compatible endpoints
  • 6 benchmarks β€” ScreenSpot-Pro, ScreenSpot-V2, UIVision, MMBench-GUI, OSWorld-G, AndroidControl
  • 12+ models β€” Qwen3-VL, Qwen2.5-VL, UI-TARS, MAI-UI, GUI-G2, UI-Venus, Gemini, Seed 1.8, Kimi K2.5, and more
  • Multi-GPU & multi-thread β€” NUM_GPUS processes launched via Python multiprocessing, each pinned to one GPU via CUDA_VISIBLE_DEVICES. Shard files are automatically split and merged; interrupted runs resume from the last completed shard.
  • Easily extensible β€” Add new models by inheriting a simple base class; shared architectures (e.g. UI-TARS extends Qwen2.5-VL) reuse parent model loading and only override prompt building and output parsing
  • Faithful reproduction β€” Comprehensive reproduction results with detailed official vs. reproduced comparisons (see details)
  • Frontier model evaluation β€” Successfully reproduced Gemini 3.0 Pro and Seed 1.8 official results on ScreenSpot-Pro using a Zoom paradigm (2-stage crop-then-ground: Gemini uses 25% crop tiles, Seed uses 50% crop tiles), and added Gemini 3.1 Pro evaluation
  • ClawGUI-Agent integration β€” Pair with ClawGUI-Agent to launch the full evaluation pipeline with a single natural language command (env check β†’ inference β†’ judging β†’ metrics). See ClawGUI-Agent README for setup details

πŸ—οΈ Architecture

ClawGUI-Eval Architecture

πŸ”§ Installation

Docker eliminates dependency conflicts and makes it easy to share exact evaluation environments.

Prerequisites: NVIDIA Container Toolkit

cd ClawGUI/clawgui-eval

# Build the image (first build is slow due to flash-attn compilation)
docker build -t clawgui-eval .

Then create a .env file to point at your data and model directories:

# .env
DATA_DIR=/data/clawgui-eval/data
IMAGE_DIR=/data/clawgui-eval/image
OUTPUT_DIR=/data/clawgui-eval/output
MODEL_DIR=/data/models           # HuggingFace model cache or local weights

Run any inference script inside the container:

# Inference
docker compose run clawgui-eval \
    bash scripts/infer/transformers/qwen3vl_run_transformers.sh

# Judge
docker compose run clawgui-eval \
    bash scripts/judge/screenspot-pro_run_judge.sh

# Metric
docker compose run clawgui-eval \
    bash scripts/metric/run_metric_screenspot_pro.sh

Note: Edit MODEL_PATH inside the shell scripts to point to /models/<your-model-dir> (the container-side path of MODEL_DIR).

Option B: Conda + pip

cd ClawGUI/clawgui-eval
conda create -n opengui python=3.12 -y
conda activate opengui
pip install -r requirements.txt
# Recommended: FlashAttention-2 for better precision (falls back to SDPA if not installed)
pip install flash-attn==2.8.1 --no-build-isolation
# Optional: vLLM support
pip install vllm==0.11.0

πŸ’‘ Tip: If building flash-attn from source is too slow, you can download a prebuilt wheel from the flash-attn releases page and install it directly.

πŸ“₯ Download Data

Benchmark images and data files are hosted on Hugging Face and ModelScope. Download them before running evaluations.

From Hugging Face:

pip install -U huggingface_hub

# If you have trouble accessing HF, use the mirror:
# export HF_ENDPOINT=https://hf-mirror.com

huggingface-cli download johnzqlu/clawgui-eval --repo-type dataset --local-dir .

From ModelScope:

pip install -U modelscope

modelscope download --dataset Matrix0602/clawgui-eval --local_dir .

Then extract the archives under the clawgui-eval/ directory:

cd clawgui-eval
unzip image.zip
unzip data.zip
unzip output.zip

⚠️ Important: All zip files (image.zip, data.zip, output.zip) must be extracted under the clawgui-eval/ directory to ensure the relative paths resolve correctly.

FileContents
image.zipBenchmark images (image/ directory)
data.zipBenchmark data & prompt files (data/ directory)
output.zipPre-computed inference & judge results (output/ directory)

πŸ“ Project Structure

clawgui-eval/
β”œβ”€β”€ πŸ“„ main.py                          # Inference entry point
β”œβ”€β”€ πŸ“‚ inference/                        # Model inferencers
β”‚   β”œβ”€β”€ base_inferencer.py               # Abstract base class
β”‚   β”œβ”€β”€ qwen3vl_inferencer.py            # Qwen3-VL
β”‚   β”œβ”€β”€ qwen25vl_inferencer.py           # Qwen2.5-VL
β”‚   β”œβ”€β”€ maiui_inferencer.py              # MAI-UI
β”‚   β”œβ”€β”€ stepgui_inferencer.py            # StepGUI
β”‚   β”œβ”€β”€ guiowl15_inferencer.py           # GUI-Owl 1.5
β”‚   β”œβ”€β”€ guig2_inferencer.py              # GUI-G2
β”‚   β”œβ”€β”€ uitars_inferencer.py             # UI-TARS (extends Qwen2.5-VL)
β”‚   β”œβ”€β”€ uivenus15_inferencer.py          # UI-Venus 1.5 (extends Qwen3-VL)
β”‚   β”œβ”€β”€ uivenus_inferencer.py            # UI-Venus (extends GUI-G2)
β”‚   β”œβ”€β”€ gemini_inferencer.py             # Gemini (API, optional Zoom)
β”‚   β”œβ”€β”€ seed_inferencer.py               # Seed 1.8 (API, optional Zoom)
β”‚   └── kimi_inferencer.py               # Kimi K2.5 (API, optional Zoom)
β”œβ”€β”€ πŸ“‚ judge/                            # Judgment module
β”‚   β”œβ”€β”€ base_judge.py                    # Abstract base class
β”‚   β”œβ”€β”€ grounding_judge.py               # Point-in-box judge (most benchmarks)
β”‚   β”œβ”€β”€ osworld_g_judge.py               # OSWorld-G judge (bbox/polygon/refusal)
β”‚   └── androidcontrol_judge.py          # AndroidControl judge (multi-action)
β”œβ”€β”€ πŸ“‚ metric/                           # Metric calculation
β”‚   β”œβ”€β”€ base_metric.py
β”‚   β”œβ”€β”€ screenspotpro_metric.py
β”‚   β”œβ”€β”€ screenspotv2_metric.py
β”‚   β”œβ”€β”€ mmbenchgui_metric.py
β”‚   β”œβ”€β”€ osworldg_metric.py
β”‚   β”œβ”€β”€ uivision_metric.py
β”‚   └── androidcontrol_metric.py
β”œβ”€β”€ πŸ“‚ data/                             # Benchmark data & prompt injection
β”‚   β”œβ”€β”€ convert_any_models.py            # Prompt injection script
β”‚   └── *.json                           # Base & model-specific data files
β”œβ”€β”€ πŸ“‚ scripts/
β”‚   β”œβ”€β”€ infer/
β”‚   β”‚   β”œβ”€β”€ transformers/                # Local GPU inference scripts
β”‚   β”‚   β”œβ”€β”€ api/                         # API inference scripts
β”‚   β”‚   └── vllm_depoly/                 # vLLM server deployment
β”‚   β”œβ”€β”€ judge/                           # Judge scripts (one per benchmark)
β”‚   └── metric/                          # Metric scripts
β”œβ”€β”€ πŸ“‚ image/                            # Benchmark images (downloaded)
└── πŸ“‚ output/                           # Inference & judge output

πŸ“Š Supported Benchmarks & Models

Benchmarks

BenchmarkScreenSpot-ProScreenSpot-V2UIVisionMMBench-GUIOSWorld-GAndroidControl
Statusβœ…βœ…βœ…βœ…βœ…βœ…

Open-Source Models

Model KeyModel NameArchitectureCoordinate SystemInput OrderSystem PromptScreenSpot-ProScreenSpot-V2UIVisionMMBench-GUIOSWorld-GAndroidControl
qwen3vlQwen3-VLStandalone[0, 1000]vtβœ… Requiredβœ…βœ…βœ…βœ…βœ…βœ…
qwen25vlQwen2.5-VLStandaloneAbsolutevtβœ… Requiredβœ…βœ…βœ…βœ…βœ…βœ…
maiuiMAI-UIStandalone[0, 1000]tvβœ… Requiredβœ…βœ…βœ…βœ…βœ…-
stepguiStepGUI (GELab-Zero)Standalone[0, 999]vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
guiowl15GUI-Owl 1.5Standalone[0, 1000]vtβœ… Requiredβœ…βœ…βœ…βœ…βœ…-
uitarsUI-TARS 1.5Extends Qwen2.5-VLAbsolute (smart_resize)vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
guig2GUI-G2Extends Qwen2.5-VL[0, 1000]vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
uivenus15UI-Venus 1.5Extends Qwen3-VL[0, 1000]vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
uivenusUI-VenusExtends GUI-G2[0, 1000]vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
geminiGemini 3.x ProAPI (optional Zoom)[0, 1000]tvβœ… Built-inβœ…-----
seedSeed 1.8API (optional Zoom)[0, 1000]tvβœ… Built-inβœ…-----
kimiKimi K2.5API (optional Zoom)[0, 1000]tvβœ… Built-inβœ…βœ…βœ…βœ…βœ…-

Frontier / Closed-Source Models

We have also reproduced GUI grounding results for frontier models on ScreenSpot-Pro using the Zoom paradigm (crop-then-ground). For details on the Zoom pipeline, see the MAI-UI blog: A Practical Guide to GUI Grounding for Frontier Models.

ModelCoordinate SystemZoom ParadigmSS-Pro OfficialSS-Pro Ours
Gemini 3.1 Pro[0, 1000]βœ…N/A85.01
Gemini 3.0 Pro[0, 1000]βœ…72.7075.08 βœ…
Seed 1.8[0, 1000]βœ…73.1072.80 βœ…

πŸ“ Coordinate Systems:

  • Absolute β€” Output is in raw pixel coordinates of the original (or smart_resize'd) image
  • [0, 1000] β€” Output is normalized to a 1000Γ—1000 coordinate space, then mapped back to the original image
  • [0, 1] β€” Output is a ratio in [0, 1] relative to the original image dimensions
  • [0, 999] β€” Similar to [0, 1000] but with a 999 divisor

πŸ’‘ Reproduction Tips

Click to expand 9 key lessons for faithful reproduction

1. πŸ”€ Message Format (tv_or_vt)

Different models are sensitive to the order of image and text in the input message. Our framework provides the TV_OR_VT parameter to control this:

  • vt = image first, then text (default for most models)
  • tv = text first, then image (required by MAI-UI)

⚠️ Always align with the model's official implementation. Using the wrong order can cause significant accuracy drops.

2. 🌑️ Temperature

For grounding tasks, always set TEMPERATURE=0.0 (greedy decoding). Non-zero temperatures introduce randomness that hurts coordinate precision.

3. πŸ“ Prompt Alignment

Most GUI grounding models are highly sensitive to prompt format. Ensure strict alignment with the official prompt template. Even minor wording differences can affect results. The data/convert_any_models.py script handles this for all supported models.

4. πŸ–ΌοΈ Image Resolution (MIN_PIXELS / MAX_PIXELS)

Models are sensitive to image resolution bounds. Always match the official values:

  • Different models use different default resolutions
  • Changing these values can significantly shift accuracy

5. πŸ“Š Sampling Parameters (TOP_P / TOP_K)

These parameters have minimal impact on grounding results β€” typically Β±0.1% fluctuation. Not a major concern for reproduction.

6. πŸ“ Coordinate Systems

Understanding each model's output coordinate format is critical for correct parsing:

  • Qwen2.5-VL family (qwen25vl, uitars) β†’ outputs absolute pixel coordinates
  • Qwen3-VL family (qwen3vl, guiowl15, uivenus15, maiui) β†’ outputs [0, 1000] normalized coordinates
  • GUI-G2 family (guig2, uivenus) β†’ outputs [0, 1000] normalized bounding boxes
  • StepGUI β†’ outputs [0, 999] normalized coordinates

πŸ”‘ Mismatched coordinate parsing is the #1 cause of zero-accuracy results.

7. πŸ’¬ System Prompt

The Qwen-VL series models are notably sensitive to system prompts:

  • qwen3vl, qwen25vl, guiowl15, maiui β†’ require a specific tool-call system prompt
  • uitars, guig2, uivenus, uivenus15, stepgui β†’ inject prompts into the user question instead

Set SYSTEM_PROMPT="call_user" for models that require it; the prompt content is pre-injected into the data files.

8. πŸͺ„ Default System Prompt Boost

Some models are sensitive to even the most generic system prompt. Simply adding "You are a helpful assistant." as a default system prompt can improve accuracy by ~1% on certain models. If a model's official code includes any system prompt, always replicate it β€” even if it seems trivial.

9. πŸ“± AndroidControl: Scroll Direction Convention

AndroidControl defines scroll direction from the screen's perspective β€” scroll_direction=down means the screen scrolls down (content moves up). However, some models (trained on human gesture data) output swipe directions from the finger's perspective β€” a finger swipe up causes the screen to scroll down. Always verify which convention a model follows and normalize accordingly.

Additionally, since OS-Atlas, most subsequent works evaluate on the 7,708-sample subset of AndroidControl. For click accuracy, the ground-truth target is parsed from the original AndroidControl accessibility tree as a bounding box (point-in-box judgment) β€” this differs from GUI-Odyssey, which computes Euclidean distance between the predicted point and the GT point, using a threshold of 0.14 (normalized by screen size).

πŸš€ Quick Start

Step 1: Inference (Infer)

Two backends are supported:

πŸ–₯️ Transformers Backend (Local GPU)

bash scripts/infer/transformers/qwen3vl_run_transformers.sh

🌐 API Backend (Remote Service)

# 1. Deploy vLLM service first
bash scripts/infer/vllm_depoly/vllm_serve.sh

# 2. Run inference
bash scripts/infer/api/qwen3vl_run_api.sh

# Kimi K2.5 API
bash scripts/infer/api/kimi_run_api.sh

Output is saved to:

output/<experiment_name>/<benchmark>/predictions.jsonl

Step 2: Judgment (Judge)

# GUI Grounding benchmarks
bash scripts/judge/screenspot-pro_run_judge.sh

# AndroidControl benchmark
bash scripts/judge/androidcontrol_run_judge.sh

Each record gets a correct field (true/false). Output:

output/<experiment_name>/<benchmark>/predictions_judge.jsonl

Step 3: Metric Calculation (Metric)

# GUI Grounding benchmarks
bash scripts/metric/run_metric_screenspot_pro.sh

# AndroidControl benchmark
bash scripts/metric/run_metric_androidcontrol.sh

Reports accuracy broken down by platform, UI type, etc.

βš™οΈ Script Parameters

πŸ–₯️ Transformers Backend

ParameterDescriptionDefault
EXPERIMENT_NAMEExperiment name (used as output directory)β€”
MODEL_TYPEModel key (see model table above)β€”
MODEL_PATHHuggingFace model ID or local pathβ€”
BENCHMARKBenchmark name (e.g. screenspot-pro-qwen3vl)β€”
NUM_GPUSNumber of GPUs for parallel inference8
MAX_TOKENSMax generation tokens512
TEMPERATURESampling temperature0.0
TOP_PNucleus sampling top-p1.0
TOP_KTop-k sampling (-1 to disable)-1
TV_OR_VTInput order: vt=image first, tv=text firstvt
SYSTEM_PROMPT"call_user"=read from data, "default"=generic, ""=disabledvaries
USE_CACHEEnable KV cache during generationtrue
MIN_PIXELS / MAX_PIXELSImage resize pixel boundsmodel default

🌐 API Backend

In addition to the parameters above:

ParameterDescriptionDefault
API_BASEComma-separated API endpoint URLs (supports multi-instance load balancing)β€”
API_KEYAPI key (leave empty for local vLLM)""
MODEL_NAMEModel name for API callsβ€”
NUM_THREADSNumber of concurrent API threads64

πŸ” Judge Parameters

ParameterDescription
EXP_NAMEExperiment name (must match inference output)
MODEL_TYPEModel type (selects the correct parser)
INCLUDE_REFUSAL"" to exclude refusal samples, "--include_refusal" to include (OSWorld-G only)

🧩 Adding a New Model

  1. Create inference/<name>_inferencer.py, extending BaseInferencer (or an existing inferencer if architectures match).

  2. Implement four methods: _init_model(), _build_prompt(), _generate(), _post_process().

  3. Register in inference/__init__.py:

    INFERENCER_REGISTRY = {
        ...
        "your_model": YourModelInferencer,
    }
    
  4. Add prompt injection logic in data/convert_any_models.py, then generate data files.

  5. Add parsing logic in judge/grounding_judge.py (and osworld_g_judge.py if needed).

  6. Create launch scripts under scripts/infer/transformers/ and scripts/infer/api/.

πŸ“‹ Data Format

Each input sample must contain the following fields:

FieldRequiredDescription
idβœ…Unique sample identifier
questionβœ…Instruction text
answerβœ…Ground truth (bounding box coordinates)
imageβœ…Image file path
image_sizeβœ…[width, height] in pixels
system_prompt❌List of system prompt strings (used when SYSTEM_PROMPT="call_user")

πŸ“ˆ Reproduction Results

A key goal of ClawGUI-Eval is faithful reproduction of officially reported numbers. Below we compare our reproduced results against official baselines across all supported benchmarks.

πŸ“‚ All inference results are publicly available on our dataset page: πŸ€— HuggingFace: johnzqlu/clawgui-eval | πŸ€– ModelScope: Matrix0602/clawgui-eval

Criterion: A result is considered successfully reproduced (βœ…) if the reproduced number meets or exceeds the official number, or the absolute difference is ≀ 2%. - means no official baseline is available.

GUI Grounding Benchmarks

ModelSS-Pro OfficialSS-Pro OursSS-V2 OfficialSS-V2 OursUIVision OfficialUIVision OursMMB-GUI OfficialMMB-GUI OursOSWorld-G OfficialOSWorld-G Ours
GUI-G247.5047.75 βœ…93.3093.32 βœ…-25.99-79.33-58.63
GUI-Owl 1.5-2B57.8056.36 βœ…89.7089.23 βœ…-23.7172.1771.54 βœ…52.8052.04 βœ…
GUI-Owl 1.5-4B66.8066.16 βœ…93.2092.53 βœ…-29.9783.2482.94 βœ…63.7062.34 βœ…
GUI-Owl 1.5-8B71.1070.08 βœ…93.7093.55 βœ…-36.7082.5282.33 βœ…65.8064.12 βœ…
Qwen3-VL-2B48.5043.90 ❌-88.92-15.06-73.12-54.12
Qwen3-VL-4B59.5059.39 βœ…-93.08-27.78-84.28-68.43
Qwen3-VL-8B54.6056.42 βœ…-94.26-27.96-84.25-65.88
Qwen2.5-VL-3B-15.62-64.86-6.73-52.81-26.08
Qwen2.5-VL-7B-27.45-87.66-14.40-70.26-35.49
UI-TARS 1.5-7B49.6042.06 ❌-89.54-20.30-73.23-58.24
UI-Venus-7B50.8050.47 βœ…94.1094.03 βœ…26.5026.52 βœ…-80.0858.8059.41 βœ…
UI-Venus 1.5-2B57.7058.82 βœ…92.8093.24 βœ…44.8043.82 βœ…80.3081.19 βœ…59.4058.97 βœ…
UI-Venus 1.5-8B68.4067.68 βœ…95.9095.83 βœ…46.5045.88 βœ…88.1087.79 βœ…69.7069.98 βœ…
MAI-UI-2B57.4057.94 βœ…92.5092.30 βœ…30.3029.68 βœ…82.6082.80 βœ…52.0054.17 βœ…
MAI-UI-8B65.8064.07 βœ…95.2094.34 βœ…40.7040.23 βœ…88.8088.81 βœ…60.1063.23 βœ…
StepGUI-4B60.0059.14 βœ…93.6091.98 βœ…-29.9084.0083.03 βœ…66.9065.69 βœ…
Gemini 3.0 Pro (Zoom, API)72.7075.08 βœ…--------
Gemini 3.1 Pro (Zoom, API)-85.01--------
Seed 1.8 (Zoom, API)73.1072.80 βœ…--------
Kimi K2.5 (API)----------

Open-Source GUI Grounding Reproduction Rate: 44 / 46 cells with official baselines = 95.7%

Frontier Model ScreenSpot-Pro Reproduction Rate: 2 / 2 = 100.0%

Overall Reproduction Rate: 46 / 48 = 95.8%

AndroidControl (HIGH Split β€” Step Success Rate)

AndroidControl evaluates offline navigation with multi-action prediction (click, type, scroll, etc.). We currently support Qwen3-VL and Qwen2.5-VL on this benchmark.

ModelAndroidControl HIGH SR (Ours)
Qwen3-VL-2B59.12
Qwen2.5-VL-7B64.47

Note: Official AndroidControl baselines for these models are not yet publicly available. We will update the comparison once official numbers are released.

πŸ—ΊοΈ Roadmap

  • Support ScreenSpot-Pro, ScreenSpot-V2, UIVision, MMBench-GUI, OSWorld-G benchmarks
  • Support AndroidControl benchmark (Qwen3-VL, Qwen2.5-VL)
  • Transformers & API dual backend inference
  • Multi-GPU parallel inference with automatic resume
  • Frontier model reproduction (Claude 4.5 Sonnet, Gemini 3.1/3.0 Pro, Seed 1.8) with Zoom paradigm
  • Integrate vLLM offline inference (non-server mode)
  • Add more GUI-specific models
  • GUI offline navigation evaluation (e.g. GUI-Odyssey)

πŸ“„ License

This project is licensed under the Apache License 2.0.

Contributors

johnzqlu

8 commits

johnzqlu/clawgui-eval

Dataset

ClawGUI-Eval: Standardized GUI Grounding Evaluation

0

8 commits

2 linked in READMEs

updated Jun 8, 2026

See the code

README

ClawGUI-Eval Logo

ClawGUI-Eval: Standardized GUI Grounding Evaluation

Python 3.12 License HuggingFace Dataset ModelScope Dataset

English | δΈ­ζ–‡

πŸ“š Table of Contents

πŸ“– Overview

ClawGUI-Eval is the evaluation module of ClawGUI. GUI grounding evaluation is harder to reproduce than it looks: prompt order, coordinate systems, temperature, and image resolution all interact to shift numbers by several points. ClawGUI-Eval pins all of these choices per model and adopts a three-stage pipeline β€” Infer β†’ Judge β†’ Metric β€” to evaluate how accurately a model can locate UI elements based on natural language instructions. The result is a 95.8% reproduction rate against official baselines, making cross-paper comparisons meaningful.

Key Features:

  • Dual backend support β€” Local GPU via transformers or remote API via OpenAI-compatible endpoints
  • 6 benchmarks β€” ScreenSpot-Pro, ScreenSpot-V2, UIVision, MMBench-GUI, OSWorld-G, AndroidControl
  • 12+ models β€” Qwen3-VL, Qwen2.5-VL, UI-TARS, MAI-UI, GUI-G2, UI-Venus, Gemini, Seed 1.8, Kimi K2.5, and more
  • Multi-GPU & multi-thread β€” NUM_GPUS processes launched via Python multiprocessing, each pinned to one GPU via CUDA_VISIBLE_DEVICES. Shard files are automatically split and merged; interrupted runs resume from the last completed shard.
  • Easily extensible β€” Add new models by inheriting a simple base class; shared architectures (e.g. UI-TARS extends Qwen2.5-VL) reuse parent model loading and only override prompt building and output parsing
  • Faithful reproduction β€” Comprehensive reproduction results with detailed official vs. reproduced comparisons (see details)
  • Frontier model evaluation β€” Successfully reproduced Gemini 3.0 Pro and Seed 1.8 official results on ScreenSpot-Pro using a Zoom paradigm (2-stage crop-then-ground: Gemini uses 25% crop tiles, Seed uses 50% crop tiles), and added Gemini 3.1 Pro evaluation
  • ClawGUI-Agent integration β€” Pair with ClawGUI-Agent to launch the full evaluation pipeline with a single natural language command (env check β†’ inference β†’ judging β†’ metrics). See ClawGUI-Agent README for setup details

πŸ—οΈ Architecture

ClawGUI-Eval Architecture

πŸ”§ Installation

Docker eliminates dependency conflicts and makes it easy to share exact evaluation environments.

Prerequisites: NVIDIA Container Toolkit

cd ClawGUI/clawgui-eval

# Build the image (first build is slow due to flash-attn compilation)
docker build -t clawgui-eval .

Then create a .env file to point at your data and model directories:

# .env
DATA_DIR=/data/clawgui-eval/data
IMAGE_DIR=/data/clawgui-eval/image
OUTPUT_DIR=/data/clawgui-eval/output
MODEL_DIR=/data/models           # HuggingFace model cache or local weights

Run any inference script inside the container:

# Inference
docker compose run clawgui-eval \
    bash scripts/infer/transformers/qwen3vl_run_transformers.sh

# Judge
docker compose run clawgui-eval \
    bash scripts/judge/screenspot-pro_run_judge.sh

# Metric
docker compose run clawgui-eval \
    bash scripts/metric/run_metric_screenspot_pro.sh

Note: Edit MODEL_PATH inside the shell scripts to point to /models/<your-model-dir> (the container-side path of MODEL_DIR).

Option B: Conda + pip

cd ClawGUI/clawgui-eval
conda create -n opengui python=3.12 -y
conda activate opengui
pip install -r requirements.txt
# Recommended: FlashAttention-2 for better precision (falls back to SDPA if not installed)
pip install flash-attn==2.8.1 --no-build-isolation
# Optional: vLLM support
pip install vllm==0.11.0

πŸ’‘ Tip: If building flash-attn from source is too slow, you can download a prebuilt wheel from the flash-attn releases page and install it directly.

πŸ“₯ Download Data

Benchmark images and data files are hosted on Hugging Face and ModelScope. Download them before running evaluations.

From Hugging Face:

pip install -U huggingface_hub

# If you have trouble accessing HF, use the mirror:
# export HF_ENDPOINT=https://hf-mirror.com

huggingface-cli download johnzqlu/clawgui-eval --repo-type dataset --local-dir .

From ModelScope:

pip install -U modelscope

modelscope download --dataset Matrix0602/clawgui-eval --local_dir .

Then extract the archives under the clawgui-eval/ directory:

cd clawgui-eval
unzip image.zip
unzip data.zip
unzip output.zip

⚠️ Important: All zip files (image.zip, data.zip, output.zip) must be extracted under the clawgui-eval/ directory to ensure the relative paths resolve correctly.

FileContents
image.zipBenchmark images (image/ directory)
data.zipBenchmark data & prompt files (data/ directory)
output.zipPre-computed inference & judge results (output/ directory)

πŸ“ Project Structure

clawgui-eval/
β”œβ”€β”€ πŸ“„ main.py                          # Inference entry point
β”œβ”€β”€ πŸ“‚ inference/                        # Model inferencers
β”‚   β”œβ”€β”€ base_inferencer.py               # Abstract base class
β”‚   β”œβ”€β”€ qwen3vl_inferencer.py            # Qwen3-VL
β”‚   β”œβ”€β”€ qwen25vl_inferencer.py           # Qwen2.5-VL
β”‚   β”œβ”€β”€ maiui_inferencer.py              # MAI-UI
β”‚   β”œβ”€β”€ stepgui_inferencer.py            # StepGUI
β”‚   β”œβ”€β”€ guiowl15_inferencer.py           # GUI-Owl 1.5
β”‚   β”œβ”€β”€ guig2_inferencer.py              # GUI-G2
β”‚   β”œβ”€β”€ uitars_inferencer.py             # UI-TARS (extends Qwen2.5-VL)
β”‚   β”œβ”€β”€ uivenus15_inferencer.py          # UI-Venus 1.5 (extends Qwen3-VL)
β”‚   β”œβ”€β”€ uivenus_inferencer.py            # UI-Venus (extends GUI-G2)
β”‚   β”œβ”€β”€ gemini_inferencer.py             # Gemini (API, optional Zoom)
β”‚   β”œβ”€β”€ seed_inferencer.py               # Seed 1.8 (API, optional Zoom)
β”‚   └── kimi_inferencer.py               # Kimi K2.5 (API, optional Zoom)
β”œβ”€β”€ πŸ“‚ judge/                            # Judgment module
β”‚   β”œβ”€β”€ base_judge.py                    # Abstract base class
β”‚   β”œβ”€β”€ grounding_judge.py               # Point-in-box judge (most benchmarks)
β”‚   β”œβ”€β”€ osworld_g_judge.py               # OSWorld-G judge (bbox/polygon/refusal)
β”‚   └── androidcontrol_judge.py          # AndroidControl judge (multi-action)
β”œβ”€β”€ πŸ“‚ metric/                           # Metric calculation
β”‚   β”œβ”€β”€ base_metric.py
β”‚   β”œβ”€β”€ screenspotpro_metric.py
β”‚   β”œβ”€β”€ screenspotv2_metric.py
β”‚   β”œβ”€β”€ mmbenchgui_metric.py
β”‚   β”œβ”€β”€ osworldg_metric.py
β”‚   β”œβ”€β”€ uivision_metric.py
β”‚   └── androidcontrol_metric.py
β”œβ”€β”€ πŸ“‚ data/                             # Benchmark data & prompt injection
β”‚   β”œβ”€β”€ convert_any_models.py            # Prompt injection script
β”‚   └── *.json                           # Base & model-specific data files
β”œβ”€β”€ πŸ“‚ scripts/
β”‚   β”œβ”€β”€ infer/
β”‚   β”‚   β”œβ”€β”€ transformers/                # Local GPU inference scripts
β”‚   β”‚   β”œβ”€β”€ api/                         # API inference scripts
β”‚   β”‚   └── vllm_depoly/                 # vLLM server deployment
β”‚   β”œβ”€β”€ judge/                           # Judge scripts (one per benchmark)
β”‚   └── metric/                          # Metric scripts
β”œβ”€β”€ πŸ“‚ image/                            # Benchmark images (downloaded)
└── πŸ“‚ output/                           # Inference & judge output

πŸ“Š Supported Benchmarks & Models

Benchmarks

BenchmarkScreenSpot-ProScreenSpot-V2UIVisionMMBench-GUIOSWorld-GAndroidControl
Statusβœ…βœ…βœ…βœ…βœ…βœ…

Open-Source Models

Model KeyModel NameArchitectureCoordinate SystemInput OrderSystem PromptScreenSpot-ProScreenSpot-V2UIVisionMMBench-GUIOSWorld-GAndroidControl
qwen3vlQwen3-VLStandalone[0, 1000]vtβœ… Requiredβœ…βœ…βœ…βœ…βœ…βœ…
qwen25vlQwen2.5-VLStandaloneAbsolutevtβœ… Requiredβœ…βœ…βœ…βœ…βœ…βœ…
maiuiMAI-UIStandalone[0, 1000]tvβœ… Requiredβœ…βœ…βœ…βœ…βœ…-
stepguiStepGUI (GELab-Zero)Standalone[0, 999]vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
guiowl15GUI-Owl 1.5Standalone[0, 1000]vtβœ… Requiredβœ…βœ…βœ…βœ…βœ…-
uitarsUI-TARS 1.5Extends Qwen2.5-VLAbsolute (smart_resize)vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
guig2GUI-G2Extends Qwen2.5-VL[0, 1000]vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
uivenus15UI-Venus 1.5Extends Qwen3-VL[0, 1000]vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
uivenusUI-VenusExtends GUI-G2[0, 1000]vt❌ Noneβœ…βœ…βœ…βœ…βœ…-
geminiGemini 3.x ProAPI (optional Zoom)[0, 1000]tvβœ… Built-inβœ…-----
seedSeed 1.8API (optional Zoom)[0, 1000]tvβœ… Built-inβœ…-----
kimiKimi K2.5API (optional Zoom)[0, 1000]tvβœ… Built-inβœ…βœ…βœ…βœ…βœ…-

Frontier / Closed-Source Models

We have also reproduced GUI grounding results for frontier models on ScreenSpot-Pro using the Zoom paradigm (crop-then-ground). For details on the Zoom pipeline, see the MAI-UI blog: A Practical Guide to GUI Grounding for Frontier Models.

ModelCoordinate SystemZoom ParadigmSS-Pro OfficialSS-Pro Ours
Gemini 3.1 Pro[0, 1000]βœ…N/A85.01
Gemini 3.0 Pro[0, 1000]βœ…72.7075.08 βœ…
Seed 1.8[0, 1000]βœ…73.1072.80 βœ…

πŸ“ Coordinate Systems:

  • Absolute β€” Output is in raw pixel coordinates of the original (or smart_resize'd) image
  • [0, 1000] β€” Output is normalized to a 1000Γ—1000 coordinate space, then mapped back to the original image
  • [0, 1] β€” Output is a ratio in [0, 1] relative to the original image dimensions
  • [0, 999] β€” Similar to [0, 1000] but with a 999 divisor

πŸ’‘ Reproduction Tips

Click to expand 9 key lessons for faithful reproduction

1. πŸ”€ Message Format (tv_or_vt)

Different models are sensitive to the order of image and text in the input message. Our framework provides the TV_OR_VT parameter to control this:

  • vt = image first, then text (default for most models)
  • tv = text first, then image (required by MAI-UI)

⚠️ Always align with the model's official implementation. Using the wrong order can cause significant accuracy drops.

2. 🌑️ Temperature

For grounding tasks, always set TEMPERATURE=0.0 (greedy decoding). Non-zero temperatures introduce randomness that hurts coordinate precision.

3. πŸ“ Prompt Alignment

Most GUI grounding models are highly sensitive to prompt format. Ensure strict alignment with the official prompt template. Even minor wording differences can affect results. The data/convert_any_models.py script handles this for all supported models.

4. πŸ–ΌοΈ Image Resolution (MIN_PIXELS / MAX_PIXELS)

Models are sensitive to image resolution bounds. Always match the official values:

  • Different models use different default resolutions
  • Changing these values can significantly shift accuracy

5. πŸ“Š Sampling Parameters (TOP_P / TOP_K)

These parameters have minimal impact on grounding results β€” typically Β±0.1% fluctuation. Not a major concern for reproduction.

6. πŸ“ Coordinate Systems

Understanding each model's output coordinate format is critical for correct parsing:

  • Qwen2.5-VL family (qwen25vl, uitars) β†’ outputs absolute pixel coordinates
  • Qwen3-VL family (qwen3vl, guiowl15, uivenus15, maiui) β†’ outputs [0, 1000] normalized coordinates
  • GUI-G2 family (guig2, uivenus) β†’ outputs [0, 1000] normalized bounding boxes
  • StepGUI β†’ outputs [0, 999] normalized coordinates

πŸ”‘ Mismatched coordinate parsing is the #1 cause of zero-accuracy results.

7. πŸ’¬ System Prompt

The Qwen-VL series models are notably sensitive to system prompts:

  • qwen3vl, qwen25vl, guiowl15, maiui β†’ require a specific tool-call system prompt
  • uitars, guig2, uivenus, uivenus15, stepgui β†’ inject prompts into the user question instead

Set SYSTEM_PROMPT="call_user" for models that require it; the prompt content is pre-injected into the data files.

8. πŸͺ„ Default System Prompt Boost

Some models are sensitive to even the most generic system prompt. Simply adding "You are a helpful assistant." as a default system prompt can improve accuracy by ~1% on certain models. If a model's official code includes any system prompt, always replicate it β€” even if it seems trivial.

9. πŸ“± AndroidControl: Scroll Direction Convention

AndroidControl defines scroll direction from the screen's perspective β€” scroll_direction=down means the screen scrolls down (content moves up). However, some models (trained on human gesture data) output swipe directions from the finger's perspective β€” a finger swipe up causes the screen to scroll down. Always verify which convention a model follows and normalize accordingly.

Additionally, since OS-Atlas, most subsequent works evaluate on the 7,708-sample subset of AndroidControl. For click accuracy, the ground-truth target is parsed from the original AndroidControl accessibility tree as a bounding box (point-in-box judgment) β€” this differs from GUI-Odyssey, which computes Euclidean distance between the predicted point and the GT point, using a threshold of 0.14 (normalized by screen size).

πŸš€ Quick Start

Step 1: Inference (Infer)

Two backends are supported:

πŸ–₯️ Transformers Backend (Local GPU)

bash scripts/infer/transformers/qwen3vl_run_transformers.sh

🌐 API Backend (Remote Service)

# 1. Deploy vLLM service first
bash scripts/infer/vllm_depoly/vllm_serve.sh

# 2. Run inference
bash scripts/infer/api/qwen3vl_run_api.sh

# Kimi K2.5 API
bash scripts/infer/api/kimi_run_api.sh

Output is saved to:

output/<experiment_name>/<benchmark>/predictions.jsonl

Step 2: Judgment (Judge)

# GUI Grounding benchmarks
bash scripts/judge/screenspot-pro_run_judge.sh

# AndroidControl benchmark
bash scripts/judge/androidcontrol_run_judge.sh

Each record gets a correct field (true/false). Output:

output/<experiment_name>/<benchmark>/predictions_judge.jsonl

Step 3: Metric Calculation (Metric)

# GUI Grounding benchmarks
bash scripts/metric/run_metric_screenspot_pro.sh

# AndroidControl benchmark
bash scripts/metric/run_metric_androidcontrol.sh

Reports accuracy broken down by platform, UI type, etc.

βš™οΈ Script Parameters

πŸ–₯️ Transformers Backend

ParameterDescriptionDefault
EXPERIMENT_NAMEExperiment name (used as output directory)β€”
MODEL_TYPEModel key (see model table above)β€”
MODEL_PATHHuggingFace model ID or local pathβ€”
BENCHMARKBenchmark name (e.g. screenspot-pro-qwen3vl)β€”
NUM_GPUSNumber of GPUs for parallel inference8
MAX_TOKENSMax generation tokens512
TEMPERATURESampling temperature0.0
TOP_PNucleus sampling top-p1.0
TOP_KTop-k sampling (-1 to disable)-1
TV_OR_VTInput order: vt=image first, tv=text firstvt
SYSTEM_PROMPT"call_user"=read from data, "default"=generic, ""=disabledvaries
USE_CACHEEnable KV cache during generationtrue
MIN_PIXELS / MAX_PIXELSImage resize pixel boundsmodel default

🌐 API Backend

In addition to the parameters above:

ParameterDescriptionDefault
API_BASEComma-separated API endpoint URLs (supports multi-instance load balancing)β€”
API_KEYAPI key (leave empty for local vLLM)""
MODEL_NAMEModel name for API callsβ€”
NUM_THREADSNumber of concurrent API threads64

πŸ” Judge Parameters

ParameterDescription
EXP_NAMEExperiment name (must match inference output)
MODEL_TYPEModel type (selects the correct parser)
INCLUDE_REFUSAL"" to exclude refusal samples, "--include_refusal" to include (OSWorld-G only)

🧩 Adding a New Model

  1. Create inference/<name>_inferencer.py, extending BaseInferencer (or an existing inferencer if architectures match).

  2. Implement four methods: _init_model(), _build_prompt(), _generate(), _post_process().

  3. Register in inference/__init__.py:

    INFERENCER_REGISTRY = {
        ...
        "your_model": YourModelInferencer,
    }
    
  4. Add prompt injection logic in data/convert_any_models.py, then generate data files.

  5. Add parsing logic in judge/grounding_judge.py (and osworld_g_judge.py if needed).

  6. Create launch scripts under scripts/infer/transformers/ and scripts/infer/api/.

πŸ“‹ Data Format

Each input sample must contain the following fields:

FieldRequiredDescription
idβœ…Unique sample identifier
questionβœ…Instruction text
answerβœ…Ground truth (bounding box coordinates)
imageβœ…Image file path
image_sizeβœ…[width, height] in pixels
system_prompt❌List of system prompt strings (used when SYSTEM_PROMPT="call_user")

πŸ“ˆ Reproduction Results

A key goal of ClawGUI-Eval is faithful reproduction of officially reported numbers. Below we compare our reproduced results against official baselines across all supported benchmarks.

πŸ“‚ All inference results are publicly available on our dataset page: πŸ€— HuggingFace: johnzqlu/clawgui-eval | πŸ€– ModelScope: Matrix0602/clawgui-eval

Criterion: A result is considered successfully reproduced (βœ…) if the reproduced number meets or exceeds the official number, or the absolute difference is ≀ 2%. - means no official baseline is available.

GUI Grounding Benchmarks

ModelSS-Pro OfficialSS-Pro OursSS-V2 OfficialSS-V2 OursUIVision OfficialUIVision OursMMB-GUI OfficialMMB-GUI OursOSWorld-G OfficialOSWorld-G Ours
GUI-G247.5047.75 βœ…93.3093.32 βœ…-25.99-79.33-58.63
GUI-Owl 1.5-2B57.8056.36 βœ…89.7089.23 βœ…-23.7172.1771.54 βœ…52.8052.04 βœ…
GUI-Owl 1.5-4B66.8066.16 βœ…93.2092.53 βœ…-29.9783.2482.94 βœ…63.7062.34 βœ…
GUI-Owl 1.5-8B71.1070.08 βœ…93.7093.55 βœ…-36.7082.5282.33 βœ…65.8064.12 βœ…
Qwen3-VL-2B48.5043.90 ❌-88.92-15.06-73.12-54.12
Qwen3-VL-4B59.5059.39 βœ…-93.08-27.78-84.28-68.43
Qwen3-VL-8B54.6056.42 βœ…-94.26-27.96-84.25-65.88
Qwen2.5-VL-3B-15.62-64.86-6.73-52.81-26.08
Qwen2.5-VL-7B-27.45-87.66-14.40-70.26-35.49
UI-TARS 1.5-7B49.6042.06 ❌-89.54-20.30-73.23-58.24
UI-Venus-7B50.8050.47 βœ…94.1094.03 βœ…26.5026.52 βœ…-80.0858.8059.41 βœ…
UI-Venus 1.5-2B57.7058.82 βœ…92.8093.24 βœ…44.8043.82 βœ…80.3081.19 βœ…59.4058.97 βœ…
UI-Venus 1.5-8B68.4067.68 βœ…95.9095.83 βœ…46.5045.88 βœ…88.1087.79 βœ…69.7069.98 βœ…
MAI-UI-2B57.4057.94 βœ…92.5092.30 βœ…30.3029.68 βœ…82.6082.80 βœ…52.0054.17 βœ…
MAI-UI-8B65.8064.07 βœ…95.2094.34 βœ…40.7040.23 βœ…88.8088.81 βœ…60.1063.23 βœ…
StepGUI-4B60.0059.14 βœ…93.6091.98 βœ…-29.9084.0083.03 βœ…66.9065.69 βœ…
Gemini 3.0 Pro (Zoom, API)72.7075.08 βœ…--------
Gemini 3.1 Pro (Zoom, API)-85.01--------
Seed 1.8 (Zoom, API)73.1072.80 βœ…--------
Kimi K2.5 (API)----------

Open-Source GUI Grounding Reproduction Rate: 44 / 46 cells with official baselines = 95.7%

Frontier Model ScreenSpot-Pro Reproduction Rate: 2 / 2 = 100.0%

Overall Reproduction Rate: 46 / 48 = 95.8%

AndroidControl (HIGH Split β€” Step Success Rate)

AndroidControl evaluates offline navigation with multi-action prediction (click, type, scroll, etc.). We currently support Qwen3-VL and Qwen2.5-VL on this benchmark.

ModelAndroidControl HIGH SR (Ours)
Qwen3-VL-2B59.12
Qwen2.5-VL-7B64.47

Note: Official AndroidControl baselines for these models are not yet publicly available. We will update the comparison once official numbers are released.

πŸ—ΊοΈ Roadmap

  • Support ScreenSpot-Pro, ScreenSpot-V2, UIVision, MMBench-GUI, OSWorld-G benchmarks
  • Support AndroidControl benchmark (Qwen3-VL, Qwen2.5-VL)
  • Transformers & API dual backend inference
  • Multi-GPU parallel inference with automatic resume
  • Frontier model reproduction (Claude 4.5 Sonnet, Gemini 3.1/3.0 Pro, Seed 1.8) with Zoom paradigm
  • Integrate vLLM offline inference (non-server mode)
  • Add more GUI-specific models
  • GUI offline navigation evaluation (e.g. GUI-Odyssey)

πŸ“„ License

This project is licensed under the Apache License 2.0.

Contributors

johnzqlu

8 commits