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

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 -> <bbox>x1,y1,x2,y2</bbox> (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 (<tool_call> 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).

Downloads last month
36
Safetensors
Model size
2B params
Tensor type
BF16
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for JivinDotL/pony-android-grounding

Merge model
this model
Quantizations
1 model