MirageTVQA is the first large-scale multilingual visual table question-answering benchmark designed to evaluate Vision-Language Models (VLMs) on realistic table understanding tasks. Unlike existing benchmarks that focus solely on clean English tables, MirageTVQA challenges models with:
Our evaluation reveals two critical failure modes in current VLMs:
| Language | Code | Questions | Clean Images | Noise Images |
|---|---|---|---|---|
| English | en | 2,618 | 241 | 723 |
| Chinese (Mandarin) | zh_cn | 2,537 | 234 | 702 |
| Arabic (MSA) | ar | 2,557 | 236 | 708 |
| Spanish | es | 2,420 | 224 | 672 |
| French | fr | 2,455 | 226 | 678 |
| Japanese (Formal) | ja_formal | 2,546 | 235 | 705 |
| Korean (Formal) | ko_formal | 2,506 | 232 | 696 |
| Hindi | hi | 2,508 | 231 | 693 |
| Bengali | bn | 2,484 | 231 | 693 |
| Russian (Formal) | ru_formal | 2,442 | 225 | 675 |
| Italian | it | 2,477 | 228 | 684 |
| Portuguese | pt | 2,317 | 222 | 666 |
| Indonesian (Formal) | id_formal | 2,477 | 229 | 687 |
| Indonesian (Casual) | id_casual | 2,478 | 229 | 687 |
| Thai | th | 2,518 | 232 | 696 |
| Vietnamese | vi | 2,276 | 220 | 660 |
| Turkish | tr | 2,330 | 219 | 657 |
| Czech | cs | 2,461 | 227 | 681 |
| Marathi | mr | 2,525 | 233 | 699 |
| Telugu | te | 2,329 | 222 | 666 |
| Tamil | ta | 2,322 | 222 | 666 |
| Persian | fa | 2,345 | 223 | 669 |
| Hebrew | he | 2,374 | 220 | 660 |
| Azerbaijani | az | 2,457 | 227 | 681 |
| Hokkien (Written) | nan | 2,584 | 238 | 714 |
| Javanese (Krama) | jv_krama | 2,538 | 234 | 702 |
| Javanese (Ngoko) | jv_ngoko | 2,516 | 233 | 697 |
| Tagalog | tl | 2,456 | 228 | 684 |
| Sundanese | su_loma | 2,438 | 228 | 684 |
| Sardinian | sc | 2,519 | 232 | 696 |
| Sinhala | si_formal_spoken | 2,531 | 235 | 705 |
| Ukrainian | uk | 2,337 | 222 | 666 |
| Polish | pl | 2,300 | 220 | 660 |
| Romanian | ro | 2,338 | 222 | 666 |
| Filipino | fil | 2,341 | 219 | 657 |
| Urdu | ur | 2,337 | 221 | 663 |
| Nepali | np | 2,334 | 221 | 663 |
| Punjabi | pb | 2,330 | 221 | 663 |
| Burmese | my | 2,267 | 221 | 663 |
| Malay | ms | 2,304 | 219 | 657 |
| Amharic | am | 2,348 | 220 | 660 |
| Danish | da | 2,315 | 221 | 663 |
| Greek | el | 2,311 | 221 | 663 |
| Norwegian | no | 2,297 | 219 | 657 |
| Swedish | sv | 2,272 | 220 | 660 |
MirageTVQA/
├── miragetvqa_eval.jsonl # All QA pairs with metadata
└── images.zip # All table images
└── images/
└── {table_id}/
├── clean/
│ └── {lang_code}_clean.jpg
└── noisy/
├── {lang_code}_noise1.jpg
├── {lang_code}_noise2.jpg
└── {lang_code}_noise3.jpg
Each line in miragetvqa_eval.jsonl contains:
{
"question_id": "finqa_cdb26d6873_006",
"table_id": "finqa_cdb26d6873",
"language": "te",
"language_name": "Telugu",
"language_family": "Dravidian",
"question": "మొదటి కాలానికి సంబంధించిన 'ఇతర సమగ్ర ఆదాయం (నష్టం)' (వరుస 5) లో, '$606 మిలియన్ల' మొత్తం నష్టంలో 'అందుబాటులో ఉన్న పెట్టుబడులపై వాస్తవికం కాని హోల్డింగ్ లాభాలు (నష్టాలు)'కి ఎంత శాతం నష్టం ఆపాదించబడింది?",
"answer": [["117.16%"]],
"question_type": "value",
"reasoning_category": "Proportional/Ratio Analysis",
"evidence_cells": ["B5", "H5"]
}
| Field | Type | Description |
|---|---|---|
question_id | string | Unique identifier for each question |
table_id | string | Identifier linking to the source table |
language | string | ISO language code |
language_name | string | Human-readable language name |
language_family | string | Linguistic family classification |
question | string | Question text in target language |
answer | list[list[string]] | Ground truth answer(s) |
question_type | string | Either "value" or "open_ended_reasoning" |
reasoning_category | string | One of 10 reasoning types |
evidence_cells | list[string] | Cell references needed for answer (e.g., "A1", "B2") |
from datasets import load_dataset
import zipfile
import json
# Load the JSONL data
dataset = load_dataset("your-username/MirageTVQA", split="test")
# Or load directly from JSONL
data = []
with open("miragetvqa_eval.jsonl", "r", encoding="utf-8") as f:
for line in f:
data.append(json.loads(line))
# Extract images
with zipfile.ZipFile("images.zip", "r") as zip_ref:
zip_ref.extractall(".")
from PIL import Image
import os
def evaluate_model(model, language="en", use_noisy=False):
results = []
for item in data:
if item["language"] != language:
continue
# Construct image path
table_id = item["table_id"]
lang_code = item["language"]
if use_noisy:
img_path = f"images/{table_id}/noisy/{lang_code}_noise1.jpg"
else:
img_path = f"images/{table_id}/clean/{lang_code}_clean.jpg"
# Load image
image = Image.open(img_path)
# Get model prediction
prediction = model.predict(image, item["question"])
# Calculate exact match
is_correct = prediction in item["answer"][0]
results.append(is_correct)
accuracy = sum(results) / len(results) * 100
return accuracy
# Evaluate on clean English images
clean_acc = evaluate_model(your_model, language="en", use_noisy=False)
print(f"Clean accuracy: {clean_acc:.2f}%")
# Evaluate on noisy English images
noisy_acc = evaluate_model(your_model, language="en", use_noisy=True)
print(f"Noisy accuracy: {noisy_acc:.2f}%")
# Evaluate across all languages
language_scores = {}
for lang_info in dataset.unique("language"):
lang_code = lang_info
score = evaluate_model(your_model, language=lang_code)
language_scores[lang_code] = score
# Print results
for lang, score in sorted(language_scores.items(), key=lambda x: x[1], reverse=True):
print(f"{lang}: {score:.2f}%")
MirageTVQA covers 45 languages across diverse linguistic families:
Indo-European: English, Spanish, French, Italian, Portuguese, Russian, Czech, Polish, Ukrainian, Romanian, Hindi, Bengali, Marathi, Nepali, Punjabi, Urdu, Sinhala, Persian, Greek, Danish, Norwegian, Swedish
Sino-Tibetan: Chinese (Mandarin), Burmese, Hokkien
Afro-Asiatic: Arabic, Hebrew, Amharic
Austronesian: Indonesian (Formal & Casual), Javanese (Krama & Ngoko), Tagalog, Sundanese, Filipino, Malay
Japonic: Japanese
Koreanic: Korean
Kra-Dai: Thai
Turkic: Turkish, Azerbaijani
Dravidian: Tamil, Telugu
Constructed: Sardinian
Best performing models on clean English images:
| Model | Clean EM (%) | Noisy EM (%) | Performance Drop |
|---|---|---|---|
| Qwen-2.5-VL 72B | 25.52 | 16.50 | -35.3% |
| Qwen-2.5-VL 32B | 23.15 | 20.36 | -12.1% |
| Qwen-2.5-VL 8B | 17.53 | 16.62 | -5.2% |
| InternVL3-78B | 27.84 | - | - |
If you use MirageTVQA in your research, please cite:
@inproceedings{singh2024mirageTVQA,
title={Lost in Translation and Noise: A Deep Dive into the Failure Modes of VLMs on Real-World Tables},
author={Singh, Anshul and Chaudhary, Rohan and Singh, Gagneet and Kumar, Abhay},
booktitle={EurIPS Workshop on AI for Tabular Data},
year={2025}
}
This dataset is released under the Apache 2.0 License.
We thank the creators of the source datasets:
6 commits
MirageTVQA is the first large-scale multilingual visual table question-answering benchmark designed to evaluate Vision-Language Models (VLMs) on realistic table understanding tasks. Unlike existing benchmarks that focus solely on clean English tables, MirageTVQA challenges models with:
Our evaluation reveals two critical failure modes in current VLMs:
| Language | Code | Questions | Clean Images | Noise Images |
|---|---|---|---|---|
| English | en | 2,618 | 241 | 723 |
| Chinese (Mandarin) | zh_cn | 2,537 | 234 | 702 |
| Arabic (MSA) | ar | 2,557 | 236 | 708 |
| Spanish | es | 2,420 | 224 | 672 |
| French | fr | 2,455 | 226 | 678 |
| Japanese (Formal) | ja_formal | 2,546 | 235 | 705 |
| Korean (Formal) | ko_formal | 2,506 | 232 | 696 |
| Hindi | hi | 2,508 | 231 | 693 |
| Bengali | bn | 2,484 | 231 | 693 |
| Russian (Formal) | ru_formal | 2,442 | 225 | 675 |
| Italian | it | 2,477 | 228 | 684 |
| Portuguese | pt | 2,317 | 222 | 666 |
| Indonesian (Formal) | id_formal | 2,477 | 229 | 687 |
| Indonesian (Casual) | id_casual | 2,478 | 229 | 687 |
| Thai | th | 2,518 | 232 | 696 |
| Vietnamese | vi | 2,276 | 220 | 660 |
| Turkish | tr | 2,330 | 219 | 657 |
| Czech | cs | 2,461 | 227 | 681 |
| Marathi | mr | 2,525 | 233 | 699 |
| Telugu | te | 2,329 | 222 | 666 |
| Tamil | ta | 2,322 | 222 | 666 |
| Persian | fa | 2,345 | 223 | 669 |
| Hebrew | he | 2,374 | 220 | 660 |
| Azerbaijani | az | 2,457 | 227 | 681 |
| Hokkien (Written) | nan | 2,584 | 238 | 714 |
| Javanese (Krama) | jv_krama | 2,538 | 234 | 702 |
| Javanese (Ngoko) | jv_ngoko | 2,516 | 233 | 697 |
| Tagalog | tl | 2,456 | 228 | 684 |
| Sundanese | su_loma | 2,438 | 228 | 684 |
| Sardinian | sc | 2,519 | 232 | 696 |
| Sinhala | si_formal_spoken | 2,531 | 235 | 705 |
| Ukrainian | uk | 2,337 | 222 | 666 |
| Polish | pl | 2,300 | 220 | 660 |
| Romanian | ro | 2,338 | 222 | 666 |
| Filipino | fil | 2,341 | 219 | 657 |
| Urdu | ur | 2,337 | 221 | 663 |
| Nepali | np | 2,334 | 221 | 663 |
| Punjabi | pb | 2,330 | 221 | 663 |
| Burmese | my | 2,267 | 221 | 663 |
| Malay | ms | 2,304 | 219 | 657 |
| Amharic | am | 2,348 | 220 | 660 |
| Danish | da | 2,315 | 221 | 663 |
| Greek | el | 2,311 | 221 | 663 |
| Norwegian | no | 2,297 | 219 | 657 |
| Swedish | sv | 2,272 | 220 | 660 |
MirageTVQA/
├── miragetvqa_eval.jsonl # All QA pairs with metadata
└── images.zip # All table images
└── images/
└── {table_id}/
├── clean/
│ └── {lang_code}_clean.jpg
└── noisy/
├── {lang_code}_noise1.jpg
├── {lang_code}_noise2.jpg
└── {lang_code}_noise3.jpg
Each line in miragetvqa_eval.jsonl contains:
{
"question_id": "finqa_cdb26d6873_006",
"table_id": "finqa_cdb26d6873",
"language": "te",
"language_name": "Telugu",
"language_family": "Dravidian",
"question": "మొదటి కాలానికి సంబంధించిన 'ఇతర సమగ్ర ఆదాయం (నష్టం)' (వరుస 5) లో, '$606 మిలియన్ల' మొత్తం నష్టంలో 'అందుబాటులో ఉన్న పెట్టుబడులపై వాస్తవికం కాని హోల్డింగ్ లాభాలు (నష్టాలు)'కి ఎంత శాతం నష్టం ఆపాదించబడింది?",
"answer": [["117.16%"]],
"question_type": "value",
"reasoning_category": "Proportional/Ratio Analysis",
"evidence_cells": ["B5", "H5"]
}
| Field | Type | Description |
|---|---|---|
question_id | string | Unique identifier for each question |
table_id | string | Identifier linking to the source table |
language | string | ISO language code |
language_name | string | Human-readable language name |
language_family | string | Linguistic family classification |
question | string | Question text in target language |
answer | list[list[string]] | Ground truth answer(s) |
question_type | string | Either "value" or "open_ended_reasoning" |
reasoning_category | string | One of 10 reasoning types |
evidence_cells | list[string] | Cell references needed for answer (e.g., "A1", "B2") |
from datasets import load_dataset
import zipfile
import json
# Load the JSONL data
dataset = load_dataset("your-username/MirageTVQA", split="test")
# Or load directly from JSONL
data = []
with open("miragetvqa_eval.jsonl", "r", encoding="utf-8") as f:
for line in f:
data.append(json.loads(line))
# Extract images
with zipfile.ZipFile("images.zip", "r") as zip_ref:
zip_ref.extractall(".")
from PIL import Image
import os
def evaluate_model(model, language="en", use_noisy=False):
results = []
for item in data:
if item["language"] != language:
continue
# Construct image path
table_id = item["table_id"]
lang_code = item["language"]
if use_noisy:
img_path = f"images/{table_id}/noisy/{lang_code}_noise1.jpg"
else:
img_path = f"images/{table_id}/clean/{lang_code}_clean.jpg"
# Load image
image = Image.open(img_path)
# Get model prediction
prediction = model.predict(image, item["question"])
# Calculate exact match
is_correct = prediction in item["answer"][0]
results.append(is_correct)
accuracy = sum(results) / len(results) * 100
return accuracy
# Evaluate on clean English images
clean_acc = evaluate_model(your_model, language="en", use_noisy=False)
print(f"Clean accuracy: {clean_acc:.2f}%")
# Evaluate on noisy English images
noisy_acc = evaluate_model(your_model, language="en", use_noisy=True)
print(f"Noisy accuracy: {noisy_acc:.2f}%")
# Evaluate across all languages
language_scores = {}
for lang_info in dataset.unique("language"):
lang_code = lang_info
score = evaluate_model(your_model, language=lang_code)
language_scores[lang_code] = score
# Print results
for lang, score in sorted(language_scores.items(), key=lambda x: x[1], reverse=True):
print(f"{lang}: {score:.2f}%")
MirageTVQA covers 45 languages across diverse linguistic families:
Indo-European: English, Spanish, French, Italian, Portuguese, Russian, Czech, Polish, Ukrainian, Romanian, Hindi, Bengali, Marathi, Nepali, Punjabi, Urdu, Sinhala, Persian, Greek, Danish, Norwegian, Swedish
Sino-Tibetan: Chinese (Mandarin), Burmese, Hokkien
Afro-Asiatic: Arabic, Hebrew, Amharic
Austronesian: Indonesian (Formal & Casual), Javanese (Krama & Ngoko), Tagalog, Sundanese, Filipino, Malay
Japonic: Japanese
Koreanic: Korean
Kra-Dai: Thai
Turkic: Turkish, Azerbaijani
Dravidian: Tamil, Telugu
Constructed: Sardinian
Best performing models on clean English images:
| Model | Clean EM (%) | Noisy EM (%) | Performance Drop |
|---|---|---|---|
| Qwen-2.5-VL 72B | 25.52 | 16.50 | -35.3% |
| Qwen-2.5-VL 32B | 23.15 | 20.36 | -12.1% |
| Qwen-2.5-VL 8B | 17.53 | 16.62 | -5.2% |
| InternVL3-78B | 27.84 | - | - |
If you use MirageTVQA in your research, please cite:
@inproceedings{singh2024mirageTVQA,
title={Lost in Translation and Noise: A Deep Dive into the Failure Modes of VLMs on Real-World Tables},
author={Singh, Anshul and Chaudhary, Rohan and Singh, Gagneet and Kumar, Abhay},
booktitle={EurIPS Workshop on AI for Tabular Data},
year={2025}
}
This dataset is released under the Apache 2.0 License.
We thank the creators of the source datasets:
6 commits