Vision, image and video
Pixels make evaluation harder in two opposite directions. When a model reads images, you must prove it actually looked. When a model makes images, there is no single right answer to compare against. This module covers both, then puts them together in agents that see, create and revise.
By the end of this module you can
- Name the main image and video understanding benchmarks (MMMU, MathVista, ChartQA, DocVQA, Video-MME, MVBench) and say how each one is graded.
- Detect "blind-answerable" questions with a text-only baseline, and explain why resolution and OCR can distort vision scores.
- Explain FID and CLIPScore from first principles, compute a toy FID by hand, and list what each one cannot see.
- Describe how GenEval, T2I-CompBench, TIFA, DSG and VQAScore check prompt alignment, and how arenas and VBench cover preference and video quality.
- Design an eval for a multimodal agent that generates or edits images in a loop, using a VLM judge with a rubric, reference checks and human review.
Two directions, one problem
A vision-language model (VLM) is a model that accepts images (and sometimes video frames) as input alongside text. Claude, GPT and Gemini models are all VLMs today. A generative image model goes the other way: text (and optionally an image) in, pixels out. Diffusion models such as Stable Diffusion, and video generators, are in this family. Agents increasingly use both: a design agent looks at a screenshot, calls an image generator, looks at the result, and edits again.
An art history exam (understanding) has an answer key: "Which painter made this?" The only trick is making sure students actually look at the slide rather than guessing from the caption. A painting class (generation) has no answer key: you judge a canvas on whether it followed the brief, whether it is technically good, and whether people like it. A working illustrator (an agent) does both all day: looks at the client's sketch, paints, steps back, fixes.
Part A: evaluating image and video understanding
Understanding evals look like ordinary text evals (Module 02) with an image attached. The format that dominates is VQA, "visual question answering": an image, a question about it, and a reference answer. The differences hide in two places: what the question actually requires, and how the answer is graded.
The main benchmarks
| Benchmark | What it tests | Size and format | Grading |
|---|---|---|---|
| MMMU (Yue et al., Nov 2023, CVPR 2024) | College-level reasoning over charts, diagrams, chemical structures, sheet music, maps | 11.5K questions, 6 disciplines, 30 subjects, 183 subfields; mostly multiple choice | Accuracy, zero-shot |
| MMMU-Pro (Sep 2024) | MMMU hardened: drops text-only-solvable questions, 10 options, a "vision-only" setting with the question inside the image | Subset of MMMU | Accuracy |
| MathVista (Lu et al., Oct 2023, ICLR 2024) | Math reasoning in visual contexts: function plots, geometry, IQ puzzles, figures from papers | 6,141 examples from 31 datasets; testmini has 1,000 | An LLM extracts the final answer, then exact match |
| ChartQA (Masry et al., ACL Findings 2022) | Visual and logical reasoning over bar, line and pie charts | 9.6K human-written plus 23.1K generated questions | Usually "relaxed accuracy": numeric answers within 5% count as correct |
| DocVQA (Mathew et al., WACV 2021) | Reading scanned documents: forms, letters, tables, layout | 50K questions on 12K+ document images | ANLS (a fuzzy string match, see below) |
| Video-MME (Fu et al., May 2024, CVPR 2025) | Video understanding from 11 seconds to 1 hour, 6 domains | 900 videos, 2,700 human-annotated multiple-choice questions | Accuracy, reported with and without subtitles |
| MVBench (Li et al., Nov 2023, CVPR 2024) | Temporal understanding: action order, motion direction, counting over time | 20 tasks × 200 multiple-choice questions = 4,000, auto-generated from existing video datasets | Accuracy |
| MMStar (Chen et al., Mar 2024) | A cleaned benchmark where every question needs the image | 1,500 human-curated samples, 6 capabilities, 18 axes | Accuracy plus "multi-modal gain" and "leakage" |
No scores are quoted here on purpose. Frontier scores on these benchmarks move every few months, and several (MMMU, MathVista, ChartQA, DocVQA) are near their ceilings for top models. Check each benchmark's official leaderboard, with a date, when you need a number.
How understanding answers are graded
You met these grader types in Module 03. Here is how they apply to vision.
Multiple choice
The model picks A, B, C or D. Cheap and unambiguous, but random guessing gives 25% with four options (10% with MMMU-Pro's ten). Always report the chance baseline. You also need an answer extractor: models write "The answer is (B) because...", so a regex or small LLM pulls out the letter.
Exact match with normalization
For short numeric or word answers (MathVista, ChartQA). Normalize units, commas and case first. For charts, allow a tolerance: reading 41.8 from a bar labeled 42 is not a reasoning failure.
ANLS (for text read from images)
Average Normalized Levenshtein Similarity. Levenshtein distance counts character edits between two strings. ANLS turns that into a similarity from 0 to 1 and sets it to 0 when it falls below a threshold (0.5 in DocVQA), so "Jonh Smith" earns partial credit for "John Smith" but a wrong name does not.
LLM judge with image access
For open-ended answers ("describe what is wrong in this X-ray"). A text-only judge can only compare against a reference description. A judge that also sees the image can catch hallucinated details the reference did not mention. It then inherits its own vision errors (Module 13).
Reference "invoice 2023", prediction "invoce 2023". Levenshtein distance = 1 (one missing letter). Normalize by the longer length, 12 characters: 1/12 ≈ 0.083. Similarity = 1 − 0.083 = 0.917, which is above the 0.5 threshold, so the item scores 0.917. Prediction "receipt" against the same reference is far more than half wrong, so the similarity falls under 0.5 and the item scores 0. The benchmark score is the mean over questions (taking the best match when there are several accepted answers).
The big pitfall: did the model actually look?
The most important idea in vision understanding evals is that a question can be answerable without the image. That happens for two reasons: the question text gives the answer away ("What color is the sky in this clear daytime photo?"), or the model has memorized the item from training data. Either way the benchmark stops measuring vision.
The MMStar paper (Chen et al., 2024) measured this directly. Its headline example: Gemini Pro scored 42.9% on MMMU with no image at all, and across six popular benchmarks, models running without images beat the random-choice baseline by over 24% on average. MMMU-Pro was built partly as a response: it filters out questions that text-only models can solve.
Here is the whole idea as code. It works with any VLM client; the function ask is whatever you already use to call your model.
# Blind-baseline audit for a multiple-choice vision benchmark.
# ask(question, options, image_or_None) -> a letter like "B"
import random
from collections import Counter
def audit(items, ask, n_blind_samples=3):
with_img = blind = 0
leaky = []
for it in items:
if ask(it["question"], it["options"], it["image"]) == it["answer"]:
with_img += 1
# Ask several times without the image; a single lucky guess is not a leak.
votes = Counter(ask(it["question"], it["options"], None)
for _ in range(n_blind_samples))
top, count = votes.most_common(1)[0]
if top == it["answer"]:
blind += 1
if count == n_blind_samples: # consistently right without looking
leaky.append(it["id"])
n = len(items)
chance = sum(1 / len(it["options"]) for it in items) / n
print(f"with image {with_img/n:.1%} blind {blind/n:.1%} chance {chance:.1%}")
print(f"visual gain {(with_img - blind)/n:.1%}; {len(leaky)} items look blind-answerable")
return leaky
If you build a private vision eval (say, "does our agent read the error dialog correctly?"), the same leak happens with your own questions. A question like "The dialog says the upload failed. Why?" gives half the answer away. Run the blind baseline once when you build the set, and again whenever you add items.
Resolution, cropping and the invisible detail
Every VLM resizes images before it reads them. Claude's documentation, for example, says images above a model's maximum are downscaled while preserving aspect ratio: 1568 px on the long edge for most models, 2576 px for the newer high-resolution tier (Anthropic vision docs, fetched September 2026). Other providers tile the image into crops, or let you choose a "detail" level. Image cost scales with pixels too: Claude counts roughly one visual token per 28 × 28 pixel patch, so a 1920 × 1080 screenshot is shrunk to 1456 × 819 (about 1,560 tokens) on the standard tier but sent whole (about 2,700 tokens) on the high-resolution tier. This matters for evals in two ways.
- Preprocessing is part of the harness. Two teams reporting DocVQA for the same model can differ because one tiles pages and the other sends a single downscaled image. When you compare numbers, compare preprocessing too, just as Module 07 insists on comparing scaffolds for coding agents.
- Failures that look like reasoning are often perception. In error analysis (Module 12), add a label for "could not see it" separate from "saw it, reasoned wrong". The fix for the first is cropping, zoom tools or higher resolution; for the second it is a better model or prompt.
- Agents can zoom. A computer-use agent (Module 08) that can take a closer screenshot or crop is a different system from one that cannot. Test both if your product allows it.
OCR shortcuts and other ways to score without understanding
OCR (optical character recognition) means reading text out of an image. Many "vision" tasks can be solved by OCR alone: read every word on the chart, then do text reasoning. That is legitimate for DocVQA (reading is the point) but misleading for a benchmark that claims to test spatial or visual reasoning. Warning signs:
- A pipeline of "OCR tool + text-only LLM" scores close to the VLM. The benchmark mostly tests reading.
- Chart questions whose answer is printed as a data label on the chart. The model copies a number instead of comparing bar heights. ChartQA's human-written questions were collected partly to require visual and logical reasoning rather than lookup.
- Video questions answerable from subtitles. That is why Video-MME reports results with and without subtitles. MVBench's known issue is the video version of the blind question: some items are answerable from a single frame, so they do not test temporal understanding.
The strongest test that a model uses the image is to change the image and check that the answer changes. Swap the colors of two bars, flip the arrow in a diagram, shuffle video frames. If the model gives the same answer to both versions, it is not reading that detail. For video, shuffling or reversing frames is a cheap probe of whether a "temporal" question really needs time order.
Long video and the visual needle in a haystack
Long-context text models are tested with needle in a haystack: hide one fact in a very long document and ask for it. The video version inserts a "needle" (an out-of-place image or short clip with a question about it) somewhere inside a long video. Zhang et al.'s V-NIAH (June 2024, from the LongVA paper) is the standard example: it measures whether a model can find and use one piece of visual information buried among thousands of frames' worth of visual tokens.
Most video models do not see every frame. The harness samples, say, 1 frame per second or a fixed 64 frames. A one-hour video at a fixed 64 frames is one frame every ~56 seconds, so short events simply are not in the input. When you report a video score, report the frame count or rate, the resolution per frame, and whether subtitles or audio were included.
Part B: evaluating image and video generation
Now flip direction. Given "a red cube on top of a blue sphere", there are infinitely many correct images. So instead of one grader, generation evals combine several questions:
- Quality / realism: does it look like a real, well-made image? (FID, aesthetic predictors, human ratings)
- Alignment / faithfulness: does it show what the prompt asked for? (CLIPScore, GenEval, T2I-CompBench, TIFA, DSG, VQAScore)
- Preference: which of two images do people prefer? (arenas, reward models)
- Temporal behavior (video only): is motion smooth, does the subject stay the same? (VBench)
- Safety and provenance: is it allowed, and is it labeled as AI-made? (classifiers, watermarks, C2PA)
FID: comparing two clouds of images
FID, the Fréchet Inception Distance (Heusel et al., 2017), asks: "Do the generated images, as a population, look like real images, as a population?" It never looks at a single image in isolation, and it never looks at the prompt.
The recipe: pass a few thousand real images and a few thousand generated images through a fixed pretrained network (Inception-v3), take a 2,048-number feature vector from near the end of the network for each image, and fit a Gaussian (a mean vector and a covariance matrix) to each set. FID is the distance between the two Gaussians. Lower is better; 0 means the two feature distributions are identical.
Pretend features are a single number. Real images: mean 0, variance 1. Generated: mean 0.5, variance 2.25 (standard deviation 1.5). In 1-D the formula becomes (μr − μg)² + σr² + σg² − 2σrσg.
= (0 − 0.5)² + 1 + 2.25 − 2 × 1 × 1.5 = 0.25 + 3.25 − 3 = 0.5.
If the generator produced exactly the right mean but too little variety (variance 0.25, standard deviation 0.5): 0 + 1 + 0.25 − 2 × 0.5 = 0.25. Notice that FID punishes a lack of diversity even when every single image might look fine. That is mode collapse (a generator producing only a few kinds of output), and catching it is one of FID's real strengths.
Limits of FID
- No prompt. A text-to-image model that ignores prompts but draws lovely photos can get a good FID.
- Sample-size bias. FID estimated from fewer images is biased upward, so scores computed with different sample counts are not comparable. Report the count (commonly 10K to 50K images) and the reference set (for text-to-image, often MS-COCO captions and images).
- Implementation details move it. Image resizing method, JPEG compression and the exact Inception weights all change the number. Use one library (for example the
clean-fidpackage) for every model you compare. - Feature bias. Inception-v3 was trained on ImageNet classification. It may not care about text rendering, hands or artistic style. Jayasumana et al. ("Rethinking FID", CVPR 2024) argue FID can contradict human judgment and propose CMMD, which uses CLIP features and a distance that does not assume Gaussians.
CLIPScore: does the image match the text?
CLIP (OpenAI, 2021) is a pair of encoders trained so that an image and its caption land near each other in a shared embedding space. CLIPScore (Hessel et al., 2021) uses this directly: embed the image, embed the prompt, take the cosine similarity, and rescale. The paper defines CLIP-S = w × max(cos(image, text), 0) with w = 2.5. Many libraries instead report 100 × cosine. Both are fine as long as you use one convention throughout.
Here is CLIPScore with the open_clip library (API as in the project's README; install with pip install open_clip_torch).
import torch
import open_clip
from PIL import Image
model, _, preprocess = open_clip.create_model_and_transforms(
"ViT-B-32", pretrained="laion2b_s34b_b79k")
model.eval()
tokenizer = open_clip.get_tokenizer("ViT-B-32")
def clip_score(image_path: str, prompt: str, w: float = 2.5) -> float:
image = preprocess(Image.open(image_path).convert("RGB")).unsqueeze(0)
text = tokenizer([prompt])
with torch.no_grad():
img = model.encode_image(image)
txt = model.encode_text(text)
img = img / img.norm(dim=-1, keepdim=True) # unit vectors, so dot = cosine
txt = txt / txt.norm(dim=-1, keepdim=True)
cos = (img @ txt.T).item()
return w * max(cos, 0.0) # Hessel et al. 2021 definition
# Sanity check the metric before trusting it: score the SAME image against
# the correct prompt and a "swapped" prompt. If the gap is tiny, CLIPScore
# cannot see the thing you care about.
print(clip_score("gen_001.png", "a red cube on top of a blue sphere"))
print(clip_score("gen_001.png", "a blue cube on top of a red sphere"))
That last pair of lines is a habit worth keeping for every automatic metric: build a small set of contrast pairs (right prompt vs minimally wrong prompt) and check that the metric separates them. It is the generation-side version of the blind baseline. Winoground (Thrush et al., 2022) is a benchmark built on exactly this idea for vision-language models.
Compositional checks: GenEval and T2I-CompBench
Because CLIPScore misses composition, researchers built evals that check specific, verifiable facts about the image. The trick is to turn "is this image faithful?" into several small questions that a specialist vision model can answer reliably.
GenEval (Ghosh, Hajishirzi and Schmidt, NeurIPS 2023 Datasets and Benchmarks) has 553 templated prompts covering single objects, two objects, counting, colors, position and attribute binding. It runs an object detector (Mask2Former) on the generated image, then applies simple rules: are the right objects present, is the count right, is object A left of object B (by comparing box centers), and is each object's color right (by classifying the cropped object with CLIP).
You can build the same kind of check for your own product with an off-the-shelf detector. This sketch uses the Hugging Face transformers object-detection pipeline.
from transformers import pipeline
from PIL import Image
detector = pipeline("object-detection", model="facebook/detr-resnet-50")
def check_count_and_position(image_path, obj, n, left_of=None, thresh=0.7):
"""GenEval-like rule check: exactly n of obj, and (optionally) all left of another."""
dets = [d for d in detector(Image.open(image_path).convert("RGB"))
if d["score"] >= thresh] # drop low-confidence boxes
objs = [d for d in dets if d["label"] == obj]
result = {"count_ok": len(objs) == n, "found": len(objs)}
if left_of:
anchors = [d for d in dets if d["label"] == left_of]
if not anchors:
result["position_ok"] = False
else:
cx = lambda b: (b["xmin"] + b["xmax"]) / 2 # box centre x
a = cx(anchors[0]["box"])
result["position_ok"] = all(cx(o["box"]) < a for o in objs)
result["pass"] = all(v for k, v in result.items() if k.endswith("_ok"))
return result
# Prompt was generated from a template, so we know what to expect:
# "a photo of three apples to the left of a bowl"
print(check_count_and_position("gen_042.png", "apple", 3, left_of="bowl"))
Two things to calibrate before trusting it. First, the confidence threshold: too high and real objects are missed, too low and hallucinated boxes appear. Hand-label 50 images and pick the threshold that best agrees with you. Second, the label vocabulary: this detector knows the 80 COCO categories, so "croissant" is not checkable with it.
T2I-CompBench (Huang et al., NeurIPS 2023) scales the idea to 6,000 compositional prompts in three groups: attribute binding (color, shape, texture), object relationships (spatial and non-spatial) and complex compositions. It uses a different specialist per group: BLIP-VQA for attributes, the UniDet detector for spatial relations, CLIPScore for non-spatial relations, and a combined "3-in-1" metric for complex prompts. T2I-CompBench++ (TPAMI 2025) adds numeracy and 3-D relations.
Recent models score above 0.9 on GenEval, so it no longer separates the frontier. A subtler issue: many products rewrite the user's prompt with an LLM before generating ("prompt expansion"). That can raise GenEval scores by adding explicit details, so a reported score may measure the rewriter as much as the image model. When comparing, state whether rewriting was on.
VQA-based alignment: TIFA, DSG and VQAScore
Detectors only know object categories. The next step replaces them with a general VLM that can answer any question about the image. This family goes: prompt → questions → answers from the image → score.
- TIFA (Hu et al., ICCV 2023): a language model generates question-answer pairs from the prompt, and a VQA model answers them on the generated image. TIFA v1.0 has 4K prompts and 25K questions across 12 categories. Its authors found models struggled with counting, spatial relations and composing multiple objects, while doing well on color and material.
- DSG, Davidsonian Scene Graph (Cho et al., Google, ICLR 2024): generates atomic, unique questions organized in a dependency graph, which avoids duplicate questions and contradictory answers (a VQA model saying "no dog" but "yes, the dog is black"). DSG-1k has 1,060 prompts.
- VQAScore (Lin et al., CMU and Meta, 2024): skips question generation entirely. It asks one question, "Does this figure show '{prompt}'?", and uses the VQA model's probability of answering "Yes" as the score. The authors also released GenAI-Bench: 1,600 compositional prompts with over 15,000 human ratings, used to check which metric agrees best with people.
All three inherit the VQA model's mistakes. If the VQA model cannot count past four, neither can your metric. This is why these papers report correlation with human ratings: that is the "measure the measurer" step from Module 13. When you adopt one for your product, re-check it on 100 of your own images with human labels before you trust it on a dashboard.
Human preference and arenas
Alignment metrics check that the prompt was followed. They do not tell you whether the image is good: attractive, coherent, free of odd hands and melted text. For that, the field uses people.
Arenas show a voter two anonymous images for the same prompt and ask which is better. LMArena runs text-to-image and image-edit arenas, and Artificial Analysis runs text-to-image and video arenas. Votes are aggregated into ratings using Elo or, more commonly now, a Bradley-Terry model, which assumes the probability that model A beats model B is determined by the difference of their hidden strengths, and fits those strengths to all the votes at once (see Module 04 and Module 13).
Arenas have the same problems as text arenas: voters' taste for vivid, saturated images, prompts skewed toward what arena visitors happen to type, and the "Leaderboard Illusion" critique (Singh et al., 2025) of labs privately testing many variants and publishing the best. Use them as a signal about general appeal, not as proof your use case is covered.
When you cannot afford humans for every comparison, learned preference models approximate them: HPSv2, ImageReward and PickScore are models trained on large sets of human choices to predict which image people prefer. They are useful for ranking many candidates quickly, but they are also a common training reward, and a generator optimized against one will learn its quirks. Do not evaluate with the same reward model you trained on (that is Goodhart's law: once a measure becomes a target, it stops being a good measure).
Video generation: VBench
Video adds a time axis, so new failures appear: a character's face changes between frames, the background flickers, objects teleport, or nothing moves at all. VBench (Huang et al., CVPR 2024) splits "video quality" into 16 separate dimensions, each with its own prompt set and an automatic evaluator chosen for that dimension, validated against human preference.
Follow-ups extend it: VBench++ adds image-to-video and trustworthiness dimensions, and VBench-2.0 (2025) targets "intrinsic faithfulness" such as physics, commonsense and human anatomy, which the original automatic metrics could not judge. Known issues: top models cluster tightly on many dimensions, and some automatic dimensions disagree with what viewers perceive as quality. As with images, arenas fill that gap.
Safety and provenance for generated media
Generation evals also have to answer "should this image exist?". Module 17 covers safety evals in general; the image-specific parts are:
| Risk | What you measure | Typical method |
|---|---|---|
| Sexual or violent content (NSFW) | Rate of unsafe outputs on adversarial and benign prompts; false refusals on safe prompts | Image safety classifiers, plus human review of a sample; red-team prompt sets |
| Likeness of real people | Can it produce a recognizable real person (especially public figures or private individuals) when policy forbids it? | Prompt sets naming people, face-matching against reference photos, human raters |
| Copyrighted characters and styles | Reproduction of protected characters or near-copies of training images | Similarity search against reference sets, human review |
| Provenance | Is the output marked as AI-made, and does the mark survive edits? | Invisible watermark detection after crops, compression and screenshots; C2PA manifest present and valid |
C2PA (Coalition for Content Provenance and Authenticity) is an open standard for Content Credentials: signed metadata attached to a file that records its origin and edit history, described by C2PA as "a nutrition label for digital content". Metadata can be stripped, so providers often combine it with invisible watermarks. An eval here is a robustness test: apply common transformations and measure how often the credential or watermark is still detected.
Part C: multimodal agents that see and make
A multimodal agent uses vision and generation as steps in a loop. Examples: a design agent that produces a social-media banner from a brief, looks at its draft, and fixes the logo placement; an image-editing agent that takes "remove the car and make it evening" and applies several tool calls; a slide agent that renders a deck and checks each slide for overflow. Computer-use agents (Module 08) are the closest cousin: they also see screenshots and act, and "did the rendered page look right?" is a shared question.
Layer 1: code checks first
Many requirements are objective and cheap. Is the image 1200 × 628? Is it a PNG under 1 MB? Does OCR find the exact headline "Summer Sale, 30% off" with no misspellings (text rendering is still a common weak spot of image generators)? Is the brand hex color present in the palette? For an edit ("remove the car"), are pixels outside the edit region unchanged? Measure that with a pixel difference or a perceptual similarity metric such as SSIM or LPIPS on the masked region. Code checks are deterministic, so they belong in CI (Module 15).
Layer 2: a VLM judge with a rubric
For everything subjective, use a VLM as the judge: give it the brief, the image and a rubric with separate criteria, and ask for a short reason before each score. Separate criteria stop one strong impression (a gorgeous image) from hiding a failure (the wrong product in it).
Here is a judge call using the Anthropic Python SDK with a base64 image content block (structure from Anthropic's vision documentation; the model id is the one used in the current docs, so swap in whichever model you have chosen as your judge).
import base64, json, pathlib
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY from the environment
RUBRIC = """Score each criterion 1-5 using these anchors.
gate: fail if unsafe content OR the headline text is not exactly as in the brief.
adherence: 1 wrong subject, 3 subject ok but a required detail missing, 5 all present.
layout: 1 text over faces or cropped, 3 cramped but legible, 5 clear hierarchy.
brand: 1 wrong logo or colours, 3 colours off, 5 matches the guide.
quality: 1 obvious artefacts (extra fingers, melted text), 3 minor, 5 clean.
Write a one-sentence reason BEFORE each score.
Return only JSON: {"gate": {"reason": str, "pass": bool},
"adherence": {"reason": str, "score": int}, "layout": {...},
"brand": {...}, "quality": {...}}"""
def judge(image_path: str, brief: str) -> dict:
data = base64.standard_b64encode(pathlib.Path(image_path).read_bytes()).decode()
msg = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image",
"source": {"type": "base64", "media_type": "image/png", "data": data}},
{"type": "text",
"text": f"<brief>\n{brief}\n</brief>\n\n<rubric>\n{RUBRIC}\n</rubric>"},
],
}],
)
text = msg.content[0].text
return json.loads(text[text.find("{"): text.rfind("}") + 1]) # tolerate stray prose
result = judge("banner_017.png",
"Summer sale banner, 1200x628. Headline exactly 'Summer Sale, 30% off'. "
"Show a beach towel and sunglasses. Brand colours teal and white.")
passed = result["gate"]["pass"] and all(
result[k]["score"] >= 4 for k in ("adherence", "layout", "brand", "quality"))
print(passed, result)
- Shared blind spots. If the generator and judge come from the same model family, the judge may miss exactly the errors the generator makes, and may favor its own style (self-preference, Module 13). Use a different family as judge where you can.
- Counting and fine text. VLMs are still weaker at exact counts and at spotting a single wrong letter. Push those checks down to Layer 1 (detectors, OCR) instead.
- Resolution. The judge sees a downscaled image too. Small artifacts (a sixth finger in a crowd) may be invisible to it. For high-stakes checks, send crops of key regions as extra images.
- Position bias in pairwise mode. When comparing two images, run both orders and only count consistent verdicts.
Layer 3: reference comparison
Some tasks have a reference, even in generation. Image editing is the main one: given an original and an instruction, you can compare against a human-made target edit, check that unedited regions are preserved (pixel or LPIPS difference inside the unchanged mask), and check the edit itself with a VQA question ("Is there a car in the image?" should now be "no"). Brand work has a style guide: compare logo crops against the official logo, and extracted colors against the palette. Design reproduction ("make this mock-up as a web page") can be graded by rendering the result and comparing it with the target screenshot, the same idea as screenshot-based checks in VisualWebArena and SWE-bench Multimodal (Modules 07 and 08).
Layer 4: human review
Humans stay in the loop for three jobs: labeling the calibration set for the judge, reviewing a random sample of production outputs every week (Module 15), and adjudicating disagreements between judge and code checks. Pairwise comparisons ("is version B's output better than version A's?") are faster and more consistent for reviewers than absolute scores, exactly as in arenas.
Tying into computer use
Everything in Part A applies when the agent's "image" is a screenshot. A computer-use agent that misreads a small button label has a perception failure, not a planning failure, and resolution and cropping decide how often it happens (ScreenSpot-style grounding benchmarks in Module 08 measure exactly this). Everything in Part C applies when the agent's output is visual: a web-building agent's result should be rendered and graded like an image. In practice, many teams evaluate front-end and design agents with the four layers above, applied to screenshots of the rendered output.
- Dataset: 150 (image, instruction) pairs from real user logs, stratified by edit type: remove object, add object, change color, change time of day, text edit. Include 20 that should be refused (for example, editing a real person into a compromising scene).
- Code checks: output dimensions equal input; pixel change outside the edit mask under a threshold; OCR for text edits.
- VQA checks: two or three yes/no questions per item written with the dataset ("Is there a car?" expect no; "Is the sky dark?" expect yes), answered by a VLM.
- Judge rubric: instruction followed, realism of the edited region, nothing else changed, safety gate.
- Human: label 60 items to calibrate the judge; weekly pairwise review of 30 production edits between current and candidate versions.
- Report: pass rate per edit type with confidence intervals (Module 04), refusal accuracy, average tool calls and cost per edit.
Putting it together: choosing metrics
| Question you are asking | Cheap first choice | Stronger choice | Watch out for |
|---|---|---|---|
| Does the VLM understand my images? | Multiple choice or exact match on your own VQA set | Open answers graded by an image-aware judge | Blind-answerable items; preprocessing differences |
| Can it read documents or charts? | ANLS / relaxed accuracy | Counterfactual edits (change a number, check the answer changes) | Answers printed as labels; downscaling |
| Does it understand video? | Video-MME-style MCQ | Needle tests + shuffled-frame probes | Subtitles leaking answers; frame sampling |
| Are generated images realistic? | FID on a fixed reference set | Human pairwise preference | Sample size; no prompt awareness |
| Do they follow the prompt? | CLIPScore | Detector rules (GenEval-style), DSG or VQAScore | Composition blindness; judge errors |
| Is the video good? | VBench dimensions | Arena votes | Static videos scoring well on smoothness |
| Is my design / edit agent good? | Code checks + VLM rubric judge | Plus reference comparison and human review | Same-family judge; counting and text |
Key takeaways
- Vision understanding has an answer key; the danger is that the model never looked. Always run a blind (no-image) baseline and report the visual gain over it, not just raw accuracy.
- Counterfactual edits (change the image, expect the answer to change) are the sharpest proof that a model uses the pixels.
- Preprocessing is part of the system: resolution limits, tiling, frame sampling and subtitles can move scores as much as the model does. Log the exact pixels and frames the model received.
- FID compares populations (quality and diversity) and ignores the prompt; CLIPScore checks concepts but is blind to composition. Neither is enough alone.
- Compositional checks (GenEval, T2I-CompBench) and VQA-based checks (TIFA, DSG, VQAScore) turn "is it faithful?" into small verifiable questions, but inherit their detector or VQA model's errors.
- For multimodal agents, layer the graders: code checks, a rubric VLM judge from a different model family, reference comparisons, then sampled human review.
- Every automatic metric needs a sanity check on your data: contrast pairs, a few hundred human labels, and a look at what it cannot see.
Check yourself
1. Your VLM scores 68% on a 4-option vision benchmark. With images removed it scores 51%. What should you conclude?
2. A generator produces only a few near-identical images per prompt, each of high quality. Which metric is most likely to catch this?
3. Why does GenEval use an object detector rather than CLIPScore to check "two dogs to the left of a cat"?
4. In DSG, why are the questions arranged in a dependency graph?
5. A video model scores near the top on VBench's motion smoothness and subject consistency but viewers call its videos "boring". Likely cause?
6. Your design agent uses model X to generate and critique images. Which judge choice is best for the offline eval?
Interview questions (with model answers)
Q: How would you prove a vision benchmark measures vision? Run a text-only (blind) baseline and compare to chance; run counterfactual image edits and check answers change; for video, shuffle frames and remove subtitles. Report the visual gain, not just the raw score.
Q: Why is FID not enough for a text-to-image model? It ignores the prompt entirely, is biased by sample size and implementation, and uses ImageNet-trained features that miss things people care about (text, hands, style). Pair it with an alignment metric (DSG, VQAScore, GenEval) and human preference.
Q: CLIPScore vs VQAScore? CLIPScore is a cosine similarity of separate embeddings, which behaves like a bag of words. VQAScore asks a VQA model "does this figure show '{text}'?" and uses P(yes), letting the model attend to the image conditioned on the full text, which handles composition better. Both should be checked with contrast pairs on your own data.
Q: Design an eval for an agent that makes slide decks. Render each slide to an image. Layer 1: code checks for text overflow, font sizes, image resolution, required sections. Layer 2: VLM rubric judge per slide (clarity, hierarchy, faithfulness to source) and per deck (narrative). Layer 3: compare facts against the source document. Layer 4: pairwise human review of a sample. Track tool calls and revisions per deck.
Sources and further reading
- Yue et al., MMMU (2023) and MMMU-Pro (2024).
- Lu et al., MathVista (ICLR 2024).
- Masry et al., ChartQA (ACL Findings 2022).
- Mathew, Karatzas, Jawahar, DocVQA (WACV 2021).
- Fu et al., Video-MME (CVPR 2025); leaderboard at video-mme.github.io.
- Li et al., MVBench (CVPR 2024).
- Chen et al., Are We on the Right Way for Evaluating Large Vision-Language Models? (MMStar) (2024).
- Zhang et al., Long Context Transfer from Language to Vision (LongVA, V-NIAH) (2024).
- Heusel et al., GANs Trained by a Two Time-Scale Update Rule... (FID) (2017); Jayasumana et al., Rethinking FID (CMMD) (CVPR 2024).
- Hessel et al., CLIPScore (EMNLP 2021); open_clip.
- Ghosh, Hajishirzi, Schmidt, GenEval (NeurIPS 2023 D&B).
- Huang et al., T2I-CompBench (NeurIPS 2023).
- Hu et al., TIFA (ICCV 2023); Cho et al., Davidsonian Scene Graph (DSG) (ICLR 2024); Lin et al., VQAScore and GenAI-Bench (2024).
- Huang et al., VBench (CVPR 2024) and VBench++.
- Preference models: HPSv2, ImageReward, PickScore / Pick-a-Pic. Arenas: LMArena, Artificial Analysis; Singh et al., The Leaderboard Illusion (2025).
- Anthropic, Vision documentation (image content blocks, resizing limits; fetched September 2026).
- C2PA and Content Credentials.