Image-Text-to-Text
Transformers
Safetensors
qwen3_vl
vision-language
multimodal
android
gui
software-testing
rotation-bug
qwen3-vl
vllm
conversational
Instructions to use ImDim/RotVL-2B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ImDim/RotVL-2B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="ImDim/RotVL-2B") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("ImDim/RotVL-2B") model = AutoModelForMultimodalLM.from_pretrained("ImDim/RotVL-2B", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use ImDim/RotVL-2B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "ImDim/RotVL-2B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ImDim/RotVL-2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/ImDim/RotVL-2B
- SGLang
How to use ImDim/RotVL-2B with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "ImDim/RotVL-2B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ImDim/RotVL-2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "ImDim/RotVL-2B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ImDim/RotVL-2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use ImDim/RotVL-2B with Docker Model Runner:
docker model run hf.co/ImDim/RotVL-2B
| library_name: transformers | |
| pipeline_tag: image-text-to-text | |
| base_model: | |
| - Qwen/Qwen3-VL-2B-Instruct | |
| - Qwen/Qwen3-VL-4B-Instruct | |
| - Qwen/Qwen3-VL-8B-Instruct | |
| tags: | |
| - vision-language | |
| - multimodal | |
| - android | |
| - gui | |
| - software-testing | |
| - rotation-bug | |
| - qwen3-vl | |
| - vllm | |
| # RotVL | |
| RotVL is a rotation-aware vision-language model fine-tuned for cross-orientation state-equivalence checking and for detecting, classifying, and localizing GUI defects caused by screen rotation in Android applications. It accompanies the paper *“RotDroid: Cross-Orientation State Equivalence Testing for Detecting GUI Rotation Bugs in Android Apps”*, accepted at the 37th IEEE International Symposium on Software Reliability Engineering (ISSRE 2026). | |
| RotDroid supplies RotVL with two screenshots representing corresponding portrait and landscape states. RotVL determines whether a rotation-induced GUI defect is present and, when requested, returns the defective orientation, defect type, and bounding box. | |
| ## Released checkpoints | |
| The three released checkpoints are: | |
| | Checkpoint | Base model | | |
| | ------------------------------------------------------ | -------------------- | | |
| | [ImDim/RotVL-2B](https://huggingface.co/ImDim/RotVL-2B) | Qwen3-VL-2B-Instruct | | |
| | [ImDim/RotVL-4B](https://huggingface.co/ImDim/RotVL-4B) | Qwen3-VL-4B-Instruct | | |
| | [ImDim/RotVL-8B](https://huggingface.co/ImDim/RotVL-8B) | Qwen3-VL-8B-Instruct | | |
| Each RotVL checkpoint is obtained by fine-tuning the corresponding Qwen3-VL-Instruct model on the [RotBench dataset](https://huggingface.co/datasets/ImDim/RotBench). It accepts two Android GUI screenshots and a text instruction, and produces JSON output for bug detection or bug classification/localization. | |
| ## Evaluation on RotBench | |
| The models are evaluated on RotBench test splits for bug detection, bug classification, defective-orientation identification, and bounding-box localization. Accuracy (Acc.), precision (Prec.), recall (Rec.), and F1 are percentages. For coordinate localization, a lower center-point distance is better, and an area ratio closer to 1 is better. | |
| ### Bug detection (%) | |
| | Model | Acc. | Prec. | Rec. | F1 | | |
| | ------------------ | --------------: | --------------: | --------------: | --------------: | | |
| | Qwen3-VL-2B | 53.24 | 62.82 | 53.24 | 42.48 | | |
| | Qwen3-VL-4B | 61.47 | 61.54 | 61.47 | 61.41 | | |
| | Qwen3-VL-8B | 66.47 | 67.65 | 66.47 | 65.90 | | |
| | Qwen3-VL-32B | 58.82 | 59.73 | 58.82 | 57.84 | | |
| | Qwen3-VL-235B | 60.00 | 60.72 | 60.00 | 59.32 | | |
| | GPT-5.2 | 70.88 | 71.01 | 70.88 | 70.84 | | |
| | RotVL-2B | 71.76 | 74.21 | 71.76 | 71.03 | | |
| | RotVL-4B | 76.47 | 76.50 | 76.47 | 76.46 | | |
| | **RotVL-8B** | **85.29** | **85.37** | **85.29** | **85.29** | | |
| ### Bug classification (%) | |
| | Model | Acc. | Prec. | Rec. | F1 | | |
| | ------------------ | --------------: | --------------: | --------------: | --------------: | | |
| | Qwen3-VL-2B | 20.59 | 8.76 | 20.59 | 9.56 | | |
| | Qwen3-VL-4B | 21.47 | 20.54 | 21.47 | 13.03 | | |
| | Qwen3-VL-8B | 30.59 | 52.49 | 30.59 | 26.02 | | |
| | Qwen3-VL-32B | 30.00 | 65.02 | 30.00 | 25.89 | | |
| | Qwen3-VL-235B | 37.06 | 46.05 | 37.06 | 33.77 | | |
| | GPT-5.2 | 49.71 | 65.70 | 49.71 | 49.95 | | |
| | RotVL-2B | 48.53 | 59.51 | 48.53 | 42.97 | | |
| | RotVL-4B | 44.41 | 65.37 | 44.41 | 39.54 | | |
| | **RotVL-8B** | **62.65** | **66.71** | **62.65** | **62.68** | | |
| ### Bug localization: orientation (%) | |
| | Model | Acc. | Prec. | Rec. | F1 | | |
| | ------------------ | --------------: | --------------: | --------------: | --------------: | | |
| | Qwen3-VL-2B | 54.12 | 54.41 | 54.12 | 53.34 | | |
| | Qwen3-VL-4B | 52.06 | 75.53 | 52.06 | 37.75 | | |
| | Qwen3-VL-8B | 54.41 | 69.03 | 54.41 | 43.58 | | |
| | Qwen3-VL-32B | 53.82 | 75.99 | 53.82 | 41.31 | | |
| | Qwen3-VL-235B | 56.18 | 74.48 | 56.18 | 46.10 | | |
| | GPT-5.2 | 68.82 | 70.61 | 68.82 | 68.13 | | |
| | RotVL-2B | 57.35 | 68.95 | 57.35 | 49.56 | | |
| | RotVL-4B | 71.47 | 77.38 | 71.47 | 69.84 | | |
| | **RotVL-8B** | **80.29** | **82.36** | **80.29** | **79.97** | | |
| ### Bug localization: coordinates | |
| | Model | Center-point distance (px) | Area ratio | | |
| | ------------------ | -------------------------: | -------------: | | |
| | Qwen3-VL-2B | 466 | 73.29 | | |
| | Qwen3-VL-4B | 499 | 53.72 | | |
| | Qwen3-VL-8B | 435 | 38.45 | | |
| | Qwen3-VL-32B | 478 | 30.07 | | |
| | Qwen3-VL-235B | 459 | 45.06 | | |
| | GPT-5.2 | 276 | 9.76 | | |
| | RotVL-2B | 237 | 4.87 | | |
| | RotVL-4B | 263 | 16.62 | | |
| | **RotVL-8B** | **198** | **3.17** | | |
| RotVL-8B achieves the best result in every evaluated dimension. Its improvements over the strongest baseline are statistically significant for bug detection, bug classification, bug localization error (`p < 0.001`). | |
| ## Evaluation on natural bugs | |
| Bug detection generalization is also evaluated using 100 runtime cross-orientation screenshot pairs sampled from 44 real-world applications with developer-confirmed rotation bugs. | |
| | Model | Accuracy | Precision | Recall | F1 | | |
| | ------------------ | --------------: | --------------: | --------------: | --------------: | | |
| | Qwen3-VL-8B | 63.00 | 70.22 | 63.00 | 66.41 | | |
| | GPT-5.2 | 65.00 | 59.21 | 65.00 | 61.97 | | |
| | **RotVL-8B** | **70.00** | **74.81** | **70.00** | **72.32** | | |
| RotVL-8B performs best on this natural bug set, indicating that its gains are not limited to the synthetic bug patterns in RotBench. | |
| ## Download | |
| Choose one of `2B`, `4B`, or `8B` and download the corresponding checkpoint with the Hugging Face CLI. The following example downloads RotVL-8B: | |
| ```bash | |
| MODEL_SIZE=8B | |
| hf download "ImDim/RotVL-${MODEL_SIZE}" \ | |
| --local-dir "RotVL-${MODEL_SIZE}" | |
| ``` | |
| ## Serve with vLLM | |
| The tested model-server setup uses Linux, NVIDIA V100 GPUs, CUDA 12.2 or later, and vLLM 0.11.1. Start the selected checkpoint as an OpenAI-compatible service: | |
| ```bash | |
| MODEL_SIZE=8B | |
| CUDA_VISIBLE_DEVICES=0 VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 \ | |
| vllm serve "RotVL-${MODEL_SIZE}" \ | |
| --served-model-name "RotVL-${MODEL_SIZE}" \ | |
| --limit-mm-per-prompt '{"image": 2}' \ | |
| --host 0.0.0.0 \ | |
| --port 8000 \ | |
| --dtype float16 \ | |
| --api-key xxx \ | |
| --max-model-len 32768 \ | |
| --tensor-parallel-size 1 | |
| ``` | |
| The value passed to `--served-model-name` must match the model name used by the client. | |
| ## Output formats | |
| ### Bug detection | |
| RotVL is prompted to return a strict JSON object: | |
| ```json | |
| {"bug": true} | |
| ``` | |
| ### Bug classification and localization | |
| For a defective pair, RotVL is prompted to return: | |
| ```json | |
| { | |
| "type": "layout-overlap", | |
| "image": "portrait", | |
| "bbox_2d": [100, 200, 400, 500] | |
| } | |
| ``` | |
| - `type` is one of `layout-overlap`, `layout-clip`, `layout-miss`, `direction-mismatch`, and `state-loseinput`. | |
| - `image` is `portrait` or `landscape`. | |
| - `bbox_2d` is `[x_min, y_min, x_max, y_max]` in the defective image's pixel coordinates. | |
| ## Intended uses | |
| RotVL is intended for: | |
| - use as the visual defect detector in RotDroid; | |
| - research on Android GUI rotation-bug detection; | |
| - evaluation on RotBench. | |
| ## Use with RotDroid | |
| For integration details and instructions on running RotDroid, see the [RotDroid source repository](https://github.com/ImDiM/RotDroid). | |
| ## Related resources | |
| - RotDroid source code: https://github.com/ImDiM/RotDroid | |
| - RotBench dataset: https://huggingface.co/datasets/ImDim/RotBench | |
| - Full artifact: https://doi.org/10.5281/zenodo.21897206 | |
| ## Citation | |
| ```bibtex | |
| @inproceedings{qin2026rotdroid, | |
| title = {RotDroid: Cross-Orientation State Equivalence Testing for Detecting GUI Rotation Bugs in Android Apps}, | |
| author = {Qin, Mengdi and Jiang, Bo}, | |
| booktitle = {Proceedings of the 37th IEEE International Symposium on Software Reliability Engineering (ISSRE)}, | |
| year = {2026} | |
| } | |
| ``` | |