A model gets one full, unedited photograph taken somewhere in India and has to find and read every legible sign in it, in the original script — no crop, no hint about where the text is. Eight open-weight vision-language models, every image in BSTD's official test split, gold answers straight from the dataset's own annotations. The best F1 in the suite is 0.4715, and the top two models are separated by 0.0055 on the fuzzy variant and tied on the exact one. The decisive gap is not between models but between scripts: on the 914 images that carry both, every model reads the English better than the Indic text beside it — the strongest of them 0.79 against 0.21.
This benchmark asks a vision-language model to read Indian public signage the way it is actually photographed: a hand-painted shop board at an angle, a fare list behind a grille, a hoarding half in shadow, multiple languages on one signboard. Each model is shown one full, unedited test-set image from BSTD — a scene-text dataset of real photographs from across India, annotated at word level with a polygon, the exact transcription, and a script-language label — and asked to find and read everything legible in it.
Every model is given the identical prompt, verbatim:
No bounding boxes are given, no script is named and no example is shown, so the model has to both find the text and read it.
Because BSTD supplies the gold strings, scoring is a string comparison rather than a model-judged rubric: the sign says what it says.
difflib.SequenceMatcher), forgiving a dropped matra or one swapped character but not a wrong
reading. The leaderboard gives both; the per-script tables give fuzzy.All eight, without exception, on the 914 test images that carry both. The gap runs from 1.4× at the narrowest to 23× at the widest — the strongest model recalls 0.79 of the English text against 0.21 of the Indic text in the same photographs. Camera, exposure and framing are constant by construction, though text size and contrast can still differ within a frame.
58 photographs carry no legible text at all by BSTD's own annotators. Across all eight models — 464 model-image pairs — the abstention count is zero. The prompt says to skip an illegible word, but never says what to output when nothing in the frame is legible, so this measures a gap in the prompt as much as a property of the models.
Qwen2.5-VL-32B scores 0.4715 fuzzy F1 against the 7B's 0.4660 — and on the exact variant it is fractionally behind, 0.4527 to 0.4530. A cluster bootstrap over images puts the gap at +0.0055 with a 95% interval of [−0.031, +0.041] — the two are not separable, and the 7B comes out ahead in 39% of resamples. What the size buys is output volume: 42,036 lines against 19,406, which lifts recall by 0.063 and costs 0.080 of precision.
Split the gold strings into purely numeric ones (1,082 of them — phone numbers, prices, distances, years) and Indic-script ones, and every run recalls the digits several times better: Qwen-32B 0.680 against 0.212, Gemma-3-27B 0.347 against 0.195, MiniCPM-V-2.6 0.214 against 0.013. Numerals are shared with Latin script; the letters beside them are not. They are not simply the easy end of the English side either: on the same signs the ordering for all eight models is Latin letters, then numerals, then Indic script.
BSTD is a scene-text dataset of
6,582 photographs taken across India — 5,263 in its train
split and the 1,319 of its test split scored here — each
annotated by hand at word level: a polygon around every piece of text, the exact string inside that polygon,
and the language it is written in. Those annotations are the ground truth; a transcription is graded by string
comparison against them, with no model judging the answer.
Every item in this benchmark looks like the three below: one full, unedited photograph, and a set of human-drawn polygons each carrying the exact string inside it and the language it is written in. Nothing is cropped for the model and nothing is straightened — it is handed the whole frame and asked to transcribe every piece of legible text it can find, in the original script, one per line. The yellow outlines below are BSTD's ground truth, not model output.
A railway station board with three scripts stacked on one panel: Gurmukhi on top, Devanagari and Latin below, and an elevation line beneath them in small Devanagari and Latin digits.
A weathered bilingual plaque under a 13th-century Vishnu relief. The Telugu and the English say the same thing, side by side, in the same enamel and the same state of wear.
A museum label on a bamboo post beside a wheeled iron cage. Two lines on one small board — four Kannada words above, the four English words that translate them below — at the same angle, the same distance from the lens and the same exposure.
Fuzzy recall on the 9,512 English and 11,785 Indic-script annotations that appear on the same 914 images. Each pair of dots is one model; the bar between them is that model's script gap, with image quality held constant by construction.
Of the 1,319 test images, 914 carry both at least one English annotation and at least one Indic-script annotation.
BSTD's full test split, one run per model, less the one or two images per model that failed every retry. exact is a normalized substring match; fuzzy additionally accepts a match at 0.8 similarity, so it is always the higher of the pair.
| # | run | recall | precision | F1 | |||
|---|---|---|---|---|---|---|---|
| exact | fuzzy | exact | fuzzy | exact | fuzzy | ||
| 01 | Qwen2.5-VL-32B Qwen/Qwen2.5-VL-32B-Instruct | 0.444 | 0.460 | 0.461 | 0.483 | 0.453 | 0.471 |
| 02 | Qwen2.5-VL-7B Qwen/Qwen2.5-VL-7B-Instruct | 0.386 | 0.397 | 0.548 | 0.564 | 0.453 | 0.466 |
| 03 | Gemma-3-27B google/gemma-3-27b-it | 0.292 | 0.302 | 0.414 | 0.434 | 0.343 | 0.356 |
| 04 | Aria rhymes-ai/Aria | 0.176 | 0.179 | 0.242 | 0.245 | 0.204 | 0.207 |
| 05 | MiniCPM-V-2.6 openbmb/MiniCPM-V-2_6 | 0.151 | 0.154 | 0.376 | 0.395 | 0.216 | 0.221 |
| 06 | Pixtral-12B mistralai/Pixtral-12B-2409 | 0.119 | 0.121 | 0.322 | 0.330 | 0.173 | 0.178 |
| 07 | LLaVA-1.6-34B llava-hf/llava-v1.6-34b-hf | 0.115 | 0.116 | 0.439 | 0.442 | 0.182 | 0.184 |
| 08 | Aya-Vision-8B CohereForAI/aya-vision-8b | 0.056 | 0.059 | 0.297 | 0.308 | 0.094 | 0.098 |
repetition_penalty 1.30, the
other six at 1.05, so any comparison involving those two rows is not strictly controlled — neither low
value was a real option, though: at 1.05, Pixtral fell into repetition loops on 21.7% of images, and LLaVA at
vLLM's own default degenerated on effectively all of them.One table per metric, because the three answer different questions: a model can score well on precision by writing very little, and that looks nothing like scoring well on recall by reading accurately. Rows are the eight models. Columns group the images by their dominant language label — the most common one among that image's annotations. These are BSTD's own labels rather than scripts: Hindi and Marathi share Devanagari, Assamese and Bengali share Eastern Nagari, so the thirteen columns span eleven writing systems. All three tables are the fuzzy variant, the more generous of the two matchers; the exact variant is in the leaderboard above. An outlined cell is the best model in that column, except in Meitei — at 130 gold strings, less than half the next-smallest column, a few hits move it enough that a "best" badge there would mark a coin flip, not a result, so the outline is suppressed for that column only.
| model | all images | assamese | bengali | english | gujarati | hindi | kannada | malayalam | marathi | meitei | odia | punjabi | tamil | telugu |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Qwen2.5-VL-32B | 0.460 | 0.304 | 0.445 | 0.613 | 0.154 | 0.517 | 0.193 | 0.192 | 0.439 | 0.369 | 0.098 | 0.130 | 0.257 | 0.172 |
| Qwen2.5-VL-7B | 0.397 | 0.253 | 0.417 | 0.508 | 0.147 | 0.506 | 0.156 | 0.179 | 0.419 | 0.292 | 0.096 | 0.107 | 0.298 | 0.122 |
| Gemma-3-27B | 0.302 | 0.237 | 0.199 | 0.372 | 0.142 | 0.358 | 0.161 | 0.113 | 0.269 | 0.285 | 0.131 | 0.170 | 0.313 | 0.196 |
| Aria | 0.179 | 0.052 | 0.048 | 0.260 | 0.031 | 0.230 | 0.069 | 0.048 | 0.092 | 0.208 | 0.059 | 0.046 | 0.068 | 0.058 |
| MiniCPM-V-2.6 | 0.154 | 0.076 | 0.035 | 0.245 | 0.028 | 0.106 | 0.053 | 0.048 | 0.037 | 0.046 | 0.055 | 0.036 | 0.056 | 0.079 |
| Pixtral-12B | 0.121 | 0.052 | 0.038 | 0.180 | 0.007 | 0.133 | 0.048 | 0.031 | 0.053 | 0.008 | 0.037 | 0.045 | 0.065 | 0.032 |
| LLaVA-1.6-34B | 0.116 | 0.058 | 0.016 | 0.182 | 0.016 | 0.111 | 0.021 | 0.017 | 0.034 | 0.023 | 0.021 | 0.034 | 0.032 | 0.034 |
| Aya-Vision-8B | 0.059 | 0.015 | 0.025 | 0.074 | 0.011 | 0.096 | 0.016 | 0.022 | 0.043 | 0.169 | 0.006 | 0.033 | 0.029 | 0.026 |
| model | all images | assamese | bengali | english | gujarati | hindi | kannada | malayalam | marathi | meitei | odia | punjabi | tamil | telugu |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Qwen2.5-VL-32B | 0.483 | 0.542 | 0.336 | 0.573 | 0.403 | 0.480 | 0.446 | 0.199 | 0.363 | 0.281 | 0.311 | 0.160 | 0.228 | 0.722 |
| Qwen2.5-VL-7B | 0.564 | 0.474 | 0.600 | 0.735 | 0.344 | 0.583 | 0.339 | 0.417 | 0.706 | 0.867 | 0.155 | 0.399 | 0.493 | 0.088 |
| Gemma-3-27B | 0.434 | 0.249 | 0.414 | 0.577 | 0.201 | 0.400 | 0.257 | 0.446 | 0.555 | 0.765 | 0.306 | 0.437 | 0.808 | 0.089 |
| Aria | 0.245 | 0.222 | 0.089 | 0.295 | 0.116 | 0.281 | 0.195 | 0.080 | 0.357 | 0.866 | 0.228 | 0.124 | 0.051 | 0.050 |
| MiniCPM-V-2.6 | 0.395 | 0.549 | 0.173 | 0.561 | 0.097 | 0.368 | 0.046 | 0.283 | 0.477 | 0.007 | 0.117 | 0.139 | 0.024 | 0.212 |
| Pixtral-12B | 0.330 | 0.243 | 0.188 | 0.501 | 0.032 | 0.446 | 0.117 | 0.066 | 0.400 | 0.062 | 0.090 | 0.329 | 0.115 | 0.022 |
| LLaVA-1.6-34B | 0.442 | 0.240 | 0.169 | 0.551 | 0.068 | 0.616 | 0.041 | 0.024 | 0.341 | 0.333 | 0.082 | 0.305 | 0.362 | 0.085 |
| Aya-Vision-8B | 0.308 | 0.574 | 0.727 | 0.304 | 0.049 | 0.494 | 0.034 | 0.055 | 0.348 | 0.985 | 0.013 | 0.419 | 0.049 | 0.100 |
| model | all images | assamese | bengali | english | gujarati | hindi | kannada | malayalam | marathi | meitei | odia | punjabi | tamil | telugu |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Qwen2.5-VL-32B | 0.471 | 0.390 | 0.383 | 0.592 | 0.223 | 0.497 | 0.270 | 0.195 | 0.398 | 0.319 | 0.148 | 0.143 | 0.241 | 0.278 |
| Qwen2.5-VL-7B | 0.466 | 0.330 | 0.492 | 0.601 | 0.206 | 0.542 | 0.214 | 0.251 | 0.525 | 0.437 | 0.119 | 0.169 | 0.371 | 0.102 |
| Gemma-3-27B | 0.356 | 0.243 | 0.269 | 0.452 | 0.166 | 0.378 | 0.198 | 0.180 | 0.362 | 0.415 | 0.184 | 0.245 | 0.451 | 0.123 |
| Aria | 0.207 | 0.084 | 0.062 | 0.277 | 0.049 | 0.253 | 0.102 | 0.060 | 0.146 | 0.335 | 0.093 | 0.068 | 0.058 | 0.054 |
| MiniCPM-V-2.6 | 0.221 | 0.134 | 0.058 | 0.341 | 0.044 | 0.165 | 0.049 | 0.082 | 0.069 | 0.013 | 0.075 | 0.057 | 0.034 | 0.116 |
| Pixtral-12B | 0.178 | 0.086 | 0.064 | 0.264 | 0.012 | 0.205 | 0.068 | 0.043 | 0.094 | 0.014 | 0.053 | 0.080 | 0.083 | 0.026 |
| LLaVA-1.6-34B | 0.184 | 0.094 | 0.030 | 0.274 | 0.026 | 0.188 | 0.028 | 0.019 | 0.061 | 0.043 | 0.034 | 0.061 | 0.059 | 0.049 |
| Aya-Vision-8B | 0.098 | 0.030 | 0.048 | 0.119 | 0.018 | 0.161 | 0.022 | 0.032 | 0.077 | 0.289 | 0.009 | 0.062 | 0.037 | 0.042 |
test — 1,319 images, 24,994 gold strings after cleaning; each model scores 24,987 or 24,988, the 1–2 that failed every retry being excluded rather than zeroed"UNK"/"NA"-placeholder annotations dropped (14.5% of the raw set), unevenly by languagemax_tokens 1024, one pass per imagedifflib.SequenceMatcher ratio ≥ 0.8; ordering is not checked