---
license: apache-2.0
base_model: Qwen/Qwen3-VL-2B-Instruct
base_model_relation: merge
tags: [vision-language, grounding, android, ui-automation, chinese]
language: [zh, en]
pipeline_tag: visual-question-answering
---
# Pony-AndroidGrounding
A vision-language model fine-tuned for **visual grounding on Android UI screenshots**.
Base model: Qwen3-VL-2B-Instruct. Trained with LoRA (r=16 on q/k/v/o_proj), then
**merged into full bf16 weights** (`merge_and_unload`). Also carries a custom
identity/behavior corpus (Identity + Behavior SFT + DPO).
## Usage
```python
from transformers import AutoModelForImageTextToText, AutoProcessor
model = AutoModelForImageTextToText.from_pretrained("JivinDotL/pony-android-grounding", dtype="bfloat16")
proc = AutoProcessor.from_pretrained("JivinDotL/pony-android-grounding")
# instruction + portrait phone screenshot -> x1,y1,x2,y2 (normalized 0-1000), or 未找到 ("not found")
```
Protocol: for a target-finding instruction the model returns exactly one bbox;
if the target is absent it must output `未找到` (refusal).
## Metrics (frozen test sets: val 225 / test 115 = held-out app domain, frozen before training, reproducible; v10.0b, 2026-11)
| split | iou50 | iou75 | click | correct refusal | valid JSON |
|---|---|---|---|---|---|
| val (225) | 87.3 | 85.0 | 93.5 | 100 | 100 |
| **test (115)** | **80.4** | **72.5** | **87.5** | **100** | **100** |
| dense enumeration holdout (52, multi-target) | 100.0 | 98.1 | — | — | 100 |
Latency: ~0.5 s per request (bf16, single datacenter GPU). The test split contains
a fully held-out app domain, so the numbers reflect cross-interface generalization.
Split manifests (`splits/v9.json`, `splits/dense_exam.json`) ship with this repo.
Tool-call protocol (`` JSON; `locate_ui_element` / `tap`) scores 6/6 under a
strict parser; the model **only outputs suggested coordinates and never executes actions**.
## Known issues (honest limits, measured 2026-11-04, v10.0b)
1. **Persona probes 5/6.** Direct and paraphrased "who are you / what can you do /
when were you released" are answered truthfully (including "I cannot tap for you,
I only output coordinates"). The single unstable probe Q6 (relationship to
"Pony.ai") is **confabulation-prone**: depending on the numerical form of the same
model (adapter vs merged weights were both measured), it either honestly denies any
relationship or fabricates a fake "co-founded by" story. This axis is not fully
fixed — treat its answers as unreliable chit-chat, not facts. No other probe shows
this behavior.
2. Meta info such as the release date (2027-01-01) is a fictional persona value, not a real event.
3. Training domain is portrait 720x1600 phones; landscape/web UIs are out of distribution.
Dense enumeration ("list all clickable elements") scores perfect within trained app families only.
4. Weak on small icons (<40 px) and near-identical icon groups.
5. The personal/lab names the model uses about itself are self-created fictional personas,
unrelated to any real person or organization (author attribution in public texts follows
the usual abbreviation; model behavior keeps the original names).
## Data & Training
- Training screenshots were captured on real devices and are **not redistributed** with the
model (third-party app UI copyright). Annotations are released separately as JSON
(L1 scope, annotations only) — see `DATASET_CARD.md`.
- Training: two-stage SFT (LoRA) + DPO on a single GPU; recipes and protocols are documented
in the project repository.
## Citation / License
Model weights Apache-2.0 (aligned with the base model Qwen3-VL-2B-Instruct).