Plate Recognition
About this benchmark
Reads the plate off the vehicle in a 1920x1015 barrier camera still and returns it as one string. One field, so every trial scores 0 or 1 and the mean across four cases and five trials is a plain success rate.
The frames are real captures from a Malaysian multi-storey carpark: sun glare on a bonnet, a plate recessed behind a grille with dealer text under it, a two-line plate on a dirty bumper, and a small plate on an unlit level. Malaysian plates carry no state colour coding or hyphens, so there is no format prior to lean on when the pixels are ambiguous.
Each fixture is cropped along the bottom to drop a burnt-in camera overlay that printed the plate in clean text, so the plate can only be read from the plate. Faces and a passing motorcyclist are pixelated in the bytes the models are sent.
Cases
bmw-grille: BMW iX at a barrier, VJP 9981, with a dealer strip under the digits inside the plate frame.honda-glare: Honda City on a sunlit rooftop level, VJF 5591, the plate shadowed under a hard windscreen flare.kancil-dim: Perodua Kancil on an unlit level, WNH 8994, on a slanted decorative plate face that turns the leading W into an M.proton-twoline: Proton Saga at an entry lane, BLM 8686, on a two-line plate with letters above digits.
Results
| Target | Score ↓ | Stddev | Latency | Tok/s | Cost | Errors |
|---|---|---|---|---|---|---|
| qwen3.7-flash@alibaba | 100.0 | 0.0 | 3s | 12.7 | $0.0008 | 0/12 |
| claude-haiku-5.5@anthropic | 100.0 | 0.0 | 3.9s | 4.3 | $0.0036 | 0/12 |
| ⚠qwen3.8-flash@alibabaerrorPOST "https://openrouter.ai/api/v1/chat/completions": 429 Too Many Requests {"message":"Provider returned error","code":429,"metadata":{"raw":"qwen/qwen3.8-flash is temporarily rate-limited upstream. Please retry shortly, or add your own key to accumulate your rate limits: https://openrouter.ai/settings/integrations","provider_name":"Alibaba","is_byok":false,"limit_source":"upstream_provider_shared_pool","remedy_hint":"Retry shortly, add your own provider key (https://openrouter.ai/settings/integrations), or route to another provider with provider routing: https://openrouter.ai/docs/features/provider-routing"}} | 100.0 | 0.0 | 11.7s | 9.1 | $0.0037 | 2/12 |
| gpt-6-luna@openai | 100.0 | 0.0 | 5.4s | 10.2 | $0.0040 | 0/12 |
| gemini-3.5-flash-lite@google-ai-studio | 100.0 | 0.0 | 1.7s | 9.9 | $0.0048 | 0/12 |
| deepseek-v4.1-flash | 100.0 | 0.0 | 1.4s | 107.0 | $0.0059 | 0/12 |
| gpt-5-mini@openai | 100.0 | 0.0 | 5.3s | 22.8 | $0.0102 | 0/12 |
| gemini-3.8-flash@google-ai-studio | 100.0 | 0.0 | 3.4s | 45.0 | $0.0175 | 0/12 |
| gpt-5.4-mini@openai | 100.0 | 0.0 | 3.7s | 4.6 | $0.0229 | 0/12 |
| claude-sonnet-5@anthropic | 100.0 | 0.0 | 3.9s | 4.3 | $0.0720 | 0/12 |
| grok-4.6@xai | 100.0 | 0.0 | 7s | 37.9 | $0.0734 | 0/12 |
| gpt-5.6-sol@openai | 100.0 | 0.0 | 3.6s | 4.7 | $0.0754 | 0/12 |
| gpt-6.1-sol@openai | 100.0 | 0.0 | 4.8s | 7.2 | $0.0775 | 0/12 |
| gpt-6-sol@openai | 100.0 | 0.0 | 5s | 16.0 | $0.0829 | 0/12 |
| ⚠gpt-5.6-luna@openai3 field misseskancil-dim: plate_number (3/3) | 75.0 | 43.3 | 3.9s | 10.0 | $0.0079 | 0/12 |
| ⚠claude-haiku-4.5@anthropic3 field missesproton-twoline: plate_number (3/3) | 75.0 | 43.3 | 4.1s | 3.5 | $0.0229 | 0/12 |
| ⚠qwen3.7-plus@alibaba9 field missesbmw-grille: plate_number (2/3)honda-glare: plate_number (3/3)kancil-dim: plate_number (2/3)proton-twoline: plate_number (2/3) | 25.0 | 43.3 | 4.6s | 45.2 | $0.0113 | 0/12 |
| ⚠kimi-k2.5@moonshotaierrorPOST "https://openrouter.ai/api/v1/chat/completions": 404 Not Found {"message":"No endpoints found for moonshotai/kimi-k2.5. Every candidate endpoint was removed during routing: Filter by Image Support removed siliconflow/int4; Filter by Parameters removed amazon-bedrock/us-east-2; Filter by Fallback removed atlas-cloud/int4, venice, novita.","code":404,"metadata":{"routing_funnel":[{"step":"Initial Endpoints","endpoint_count":5},{"step":"Filter by Image Support","endpoint_count":4},{"step":"Filter by Parameters","endpoint_count":3},{"step":"Filter by Fallback","endpoint_count":0}],"failed_routing_step":"Filter by Fallback"}} | n/a | n/a | n/a | n/a | $0.0000 | 12/12 |
Score by case
| Target | bmw-grille | honda-glare | kancil-dim | proton-twoline |
|---|---|---|---|---|
| claude-haiku-5.5@anthropic | 100 | 100 | 100 | 100 |
| claude-sonnet-5@anthropic | 100 | 100 | 100 | 100 |
| deepseek-v4.1-flash | 100 | 100 | 100 | 100 |
| gemini-3.5-flash-lite@google-ai-studio | 100 | 100 | 100 | 100 |
| gemini-3.8-flash@google-ai-studio | 100 | 100 | 100 | 100 |
| gpt-5-mini@openai | 100 | 100 | 100 | 100 |
| gpt-5.4-mini@openai | 100 | 100 | 100 | 100 |
| gpt-5.6-sol@openai | 100 | 100 | 100 | 100 |
| gpt-6-luna@openai | 100 | 100 | 100 | 100 |
| gpt-6-sol@openai | 100 | 100 | 100 | 100 |
| gpt-6.1-sol@openai | 100 | 100 | 100 | 100 |
| qwen3.7-flash@alibaba | 100 | 100 | 100 | 100 |
| qwen3.8-flash@alibaba | 100 | 100 | 100 | 100 |
| grok-4.6@xai | 100 | 100 | 100 | 100 |
| claude-haiku-4.5@anthropic | 100 | 100 | 100 | 0 |
| gpt-5.6-luna@openai | 100 | 100 | 0 | 100 |
| qwen3.7-plus@alibaba | 33 | ✕ | 33 | 33 |
| kimi-k2.5@moonshotai | err | err | err | err |
Note
moonshotai/kimi-k2.5produced no gradable output. All 12 calls returned404 No endpoints found: OpenRouter's routing funnel went from five endpoints to zero, and the last three were removed at the fallback filter. Its 0.0 is 12 routing failures, not 12 wrong plates.qwen/qwen3.8-flashlost two of its 12 calls (proton-twolinetrials 2 and 3) to429 Too Many Requestsfrom the upstream provider. Its 100.0 is the mean of the 10 trials that returned, andproton-twolinewas graded on one trial only.qwen/qwen3.7-plusread the correct plate on all 12 trials and still scores 25.0. It wraps the object in an array ([{"plate_number": ...}]) on 9 trials; the 3 trials that returned a bare object scored 1. The score measures output shape, not reading.- The other two misses are real misreads, the same way on every trial of one
case.
openai/gpt-5.6-lunareadskancil-dimasMNH8994on all three trials.anthropic/claude-haiku-4.5reads theproton-twolinedigits as9595(twice) and9535with aPprefix (once).
Conclusion
Fourteen targets read every graded plate, so the choice comes down to cost and
speed. qwen/qwen3.7-flash is the cheapest clean sweep at $0.0008 for the
run, at 2,951ms. If latency matters, deepseek/deepseek-v4.1-flash is the
fastest at 1,369ms for $0.0059, with gemini-3.5-flash-lite close behind at
1,688ms for $0.0048. anthropic/claude-haiku-5.5 ($0.0036, 3,937ms) and
gpt-6-luna ($0.0040) are also clean and cheap. The sol models, sonnet-5
and grok-4.6 get the same result for $0.072 to $0.083, which buys nothing
here.
qwen3.7-plus is fixable: every plate is right, and an array unwrap in the
caller recovers all of it, so its mean understates it. gpt-5.6-luna and
haiku-4.5 are the unsafe kind: their 75.0 hides one case each that they get
wrong on every trial, with well-formed JSON and a confident wrong plate, so
nothing in the output flags the error.