Module 10 · Agent evals, every modality

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.

IntermediateAdvanced~60 minPrereqs: Modules 03, 04, 08

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.

A. Understanding image/video text answer A reference answer exists graders: multiple choice, exact match, ANLS, LLM judge MMMU, MathVista, ChartQA, DocVQA, Video-MME, MVBench risk: did it really look? B. Generation prompt image/video Many valid outputs graders: FID, CLIPScore, detectors, VQA checks, human votes GenEval, T2I-CompBench, TIFA, DSG, VBench, arenas risk: metric ≠ what people want C. Multimodal agents look make/edit A loop of A and B graders: VLM judge + rubric, reference diffs, human review design agents, editors, computer-use (Module 08) risk: judge shares model's blind spots
The map of this module. Understanding evals have a reference answer and fight shortcuts. Generation evals have no single answer and fight weak metrics. Agent evals combine both inside a loop.
Analogy: the art school

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

BenchmarkWhat it testsSize and formatGrading
MMMU (Yue et al., Nov 2023, CVPR 2024)College-level reasoning over charts, diagrams, chemical structures, sheet music, maps11.5K questions, 6 disciplines, 30 subjects, 183 subfields; mostly multiple choiceAccuracy, zero-shot
MMMU-Pro (Sep 2024)MMMU hardened: drops text-only-solvable questions, 10 options, a "vision-only" setting with the question inside the imageSubset of MMMUAccuracy
MathVista (Lu et al., Oct 2023, ICLR 2024)Math reasoning in visual contexts: function plots, geometry, IQ puzzles, figures from papers6,141 examples from 31 datasets; testmini has 1,000An LLM extracts the final answer, then exact match
ChartQA (Masry et al., ACL Findings 2022)Visual and logical reasoning over bar, line and pie charts9.6K human-written plus 23.1K generated questionsUsually "relaxed accuracy": numeric answers within 5% count as correct
DocVQA (Mathew et al., WACV 2021)Reading scanned documents: forms, letters, tables, layout50K questions on 12K+ document imagesANLS (a fuzzy string match, see below)
Video-MME (Fu et al., May 2024, CVPR 2025)Video understanding from 11 seconds to 1 hour, 6 domains900 videos, 2,700 human-annotated multiple-choice questionsAccuracy, reported with and without subtitles
MVBench (Li et al., Nov 2023, CVPR 2024)Temporal understanding: action order, motion direction, counting over time20 tasks × 200 multiple-choice questions = 4,000, auto-generated from existing video datasetsAccuracy
MMStar (Chen et al., Mar 2024)A cleaned benchmark where every question needs the image1,500 human-curated samples, 6 capabilities, 18 axesAccuracy 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).

Worked example: ANLS by hand

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).

1 0.5 0 0 0.5 1 normalized edit distance (edits ÷ longer length) item score score = 0 beyond threshold ① ③ ② ④ Reference → prediction ANLS ① invoice 2023 → invoce 2023 typo0.92 ② John Smith → Jonh Smith swap0.80 ③ invoice 2023 → invoice 2032 wrong year!0.83 ④ invoice 2023 → receipt unrelated0
How ANLS turns edit distance into credit. Small reading slips keep most of their credit, and anything more than half wrong scores zero. Example ③ shows the catch: a wrong year differs by only two characters, so ANLS gives it 0.83. For fields where one digit matters (amounts, dates, IDs), add an exact-match check on top.

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.

Question + image + options with image image removed VLM (normal) accuracy = 70% VLM (blind) accuracy = 45% Compare per question and in aggregate visual gain 70 − 45 = 25 pts flag items right when blind compare blind accuracy to the random baseline (25% for 4 options) to see how much leaks
The blind baseline. Run every question twice, with and without the image. The gap is what vision actually contributes. Items the blind model gets right (well above chance, across several models or samples) are candidates for removal. Numbers are illustrative, not real data.

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
Do this for your own eval sets too

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.

original, 3000 px tall footnote at bottom ↓ downscale tile / crop fits the limit, but the footnote is ~1 px tall "Fee: $40" (guess) each tile at full detail "Fee: $14.50" ✓ Eval lesson same model, same question, different preprocessing = different score. Log the exact pixels the model received.
Resolution is part of the system under test. A tall scanned page downscaled to fit the model's limit can shrink small text below legibility. Tiling or cropping keeps it readable. The image is a schematic; the fee values are made up.
  • 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.
Expert nuance: counterfactual image edits

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.

Original Counterfactual edit AB swap heights AB Q: "Which region sold more, A or B?" same question text, only the pixels changed Model that looks A → B answer flips with the image ✓ Model that guesses A → A answer ignores the edit ✗ counterfactual consistency = share of pairs where the answer changes the way the edit requires
A counterfactual probe. Make a minimal edit that should flip the answer and check that it does. Prior knowledge, question wording and memorized items cannot follow the edit, so this separates looking from guessing more sharply than any single accuracy number. Schematic chart, not real data.

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.

1. Insert a needle frame into a long video needle at depth 40% … thousands of frames Q: "What object appeared on the table?" 2. Sweep length × depth, grade each cell video length → needle depth → short very long Reading the grid green = found, red = missed. A typical failure pattern: longer videos and mid-video needles are hardest. Also vary frame sampling: a model that samples 32 frames can simply never see a 1-second needle.
Visual needle in a haystack. Sweep video length and needle position, and grade each cell. The heat-map pattern here is illustrative, not real data. It is a stress test of retrieval, not of deep understanding, so pair it with question-answering benchmarks such as Video-MME.
Frame sampling is a hidden variable

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:

  1. Quality / realism: does it look like a real, well-made image? (FID, aesthetic predictors, human ratings)
  2. Alignment / faithfulness: does it show what the prompt asked for? (CLIPScore, GenEval, T2I-CompBench, TIFA, DSG, VQAScore)
  3. Preference: which of two images do people prefer? (arenas, reward models)
  4. Temporal behavior (video only): is motion smooth, does the subject stay the same? (VBench)
  5. 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.

real images generated images Inception-v3 2,048-d features feature space (squashed to 2-D) μ gap real: μr, Σr gen: μg, Σg FID = ‖μr − μg‖² (centers apart) + Tr(Σr + Σg − 2(Σr Σg)^½) (spreads differ) lower = closer
FID intuition. Each image becomes a point. FID fits an ellipse (Gaussian) to the real points and another to the generated points, then adds up how far apart their centers are and how different their shapes are. It says nothing about any single prompt.
Worked example: FID in one dimension

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-fid package) 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.

generated image "a red cube ona blue sphere" image encoder text encoder cosine × 2.5, floor at 0 0.78 Blind spot: composition image: red cube ON blue sphere ✓ CLIP-S 0.78 image: blue cube ON red sphere ✗ CLIP-S 0.77 gap ≈ 0.01 cannot separate them
CLIPScore and its bag-of-words problem. CLIP embeddings capture which concepts are present much better than how they are bound together (which color belongs to which object, what is on top). The score values are illustrative.

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"))
Why the swap test matters

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).

Prompt "three red apples left of a bowl" image Detector boxes + labels + confidences Rule checks apple present?✓ count(apple) == 3?✓ bowl present?✓ apples x < bowl x?✓ color red? (CLIP)✓ pass all ✓ score = fraction of prompts that pass, per category and overall weak link: the detector. Missed or hallucinated boxes become grading errors. Stylised images (cartoons, sketches) fool detectors trained on photos.
A GenEval-style check. The prompt is generated from a template, so the grader knows exactly what should be in the image. A detector turns pixels into a list of objects, and plain code does the rest. This combines a model-based grader (detector) with a code-based grader (rules), as in Module 03.

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.

Saturation and prompt rewriting

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.

Prompt "a black dog sleeping on a sofa" LLM 1. question graph (DSG-style) Is there a dog? Is there a sofa? Is the dog black? Is the dog asleep? Is the dog onthe sofa? arrows: ask the child only if the parent is "yes" 2. VQA model sees the image, answers each yes / no 3. Score dog ✓ sofa ✓ black ✓ on ✓ asleep ✗ 4 / 5 = 0.8
VQA-based alignment. The prompt becomes atomic yes/no questions; a VQA model answers them from the image; the score is the fraction answered correctly. The dependency arrows are DSG's contribution: if there is no dog, asking "is the dog black?" is meaningless and is skipped (counted as failed).
  • 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.
The judge is a model too

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).

voter's prompt Model A(hidden) Model B(hidden) Vote A / B / tie ×10⁴ Bradley-Terry fit strengths Ratings ± CI overlapping bars = no clear winner biases: voters favor vivid style; prompts skew to what arena users type; vendors can test many private variants
How an image arena works. Pairwise votes are easier and more consistent for people than absolute 1 to 10 ratings. The ratings are only as representative as the voters and the prompts; the confidence intervals shown are illustrative.

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.

Video quality Temporal subject consistencysame face every frame? background consistencyroom stays the room? temporal flickeringno strobing pixels? motion smoothnessno jerky jumps? dynamic degreedoes anything move? Per frame aesthetic qualitypleasing composition? imaging qualityno blur, noise, artifacts? trade-off: a still video is perfectly "smooth" Matches the prompt Semantics object class, multiple objectsright things? human actionright activity? color, spatial relationshipbound correctly? sceneright place? Style appearance style"oil painting"? temporal style"slow zoom in"? overall consistencytext-video match
VBench's 16 dimensions, grouped. Reporting separate dimensions rather than one number makes trade-offs visible. The classic one: a model that barely moves scores very well on smoothness and consistency but poorly on dynamic degree.

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:

RiskWhat you measureTypical method
Sexual or violent content (NSFW)Rate of unsafe outputs on adversarial and benign prompts; false refusals on safe promptsImage safety classifiers, plus human review of a sample; red-team prompt sets
Likeness of real peopleCan 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 stylesReproduction of protected characters or near-copies of training imagesSimilarity search against reference sets, human review
ProvenanceIs 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.

Generated C2PA + watermark Transformation C2PA still valid? Watermark found? none (control) ✓ valid ✓ found resize 50% depends on tool ✓ found JPEG quality 50 depends on tool ✓ usually crop to 60% depends on tool ~ weaker screenshot ✗ gone ✓ usually strip metadata ✗ gone ✓ found typical pattern only: run each transform on a few hundred images and report detection rates
Testing provenance like a robustness eval. Signed metadata (C2PA) is exact but fragile: it survives only if every tool in the chain preserves it, and a screenshot creates a brand-new file without it. Invisible watermarks live in the pixels, so they usually survive ordinary edits but can weaken under heavy crops or deliberate attacks. That is why providers combine both, and why your eval should report a detection rate per transformation. The cell values show a typical qualitative pattern, not measurements.

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.

system under test: the agent loop Brief+ assets Plan / actcall tools Generate / editimage tool Lookself-critique revise final Eval harness 1. code checks: size, format, text via OCR 2. VLM judge + rubric (per criterion) 3. reference comparison (edits, brand) 4. human review of a sample trajectory metrics: tool calls, revisions, cost, time, did the self-critique catch real problems?
Evaluating a design agent. The outcome (the final image) goes through layered graders, cheapest first. The trajectory is logged too, because an agent that gets there in 12 costly generations is worse than one that gets there in 2.

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).

Instruction: "remove the car" edit mask 1 · original 2 · agent's edit 3 · |difference| Edit happened? VQA "Is there a car?" → no ✓ Rest preserved? outside-mask LPIPS 0.21 > 0.05 ✗ Format kept? same size, PNG, under 1 MB ✓ the window changed too: collateral damage outside the mask
Checking an edit with code. Diff the before and after images, split the difference into inside and outside the edit mask, and test each part separately: the inside should change (confirmed with a VQA question), the outside should not (a pixel or LPIPS threshold). A judge looking at the whole picture easily misses the recoloured window. Schematic images; the threshold and score are illustrative.

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).

Rubric: marketing banner from a brief each criterion scored separately, reason first Criterion1 (fail)3 (partial)5 (pass) GATE: safety + textunsafe, or headline misspelledclean, exact text Prompt adherencewrong subjectsubject ok, detail missingall items present Composition / layouttext over faces, croppedcramped but legibleclear hierarchy Brand fidelitywrong logo or colorscolors offmatches guide Technical qualityartifacts, extra fingersminor artifactsclean Final: fail if GATE fails; otherwise report each criterion, and pass if all ≥ 4. Keep 20 human-labeled anchors to calibrate the judge.
A rubric card for generated images. Anchored scales (what a 1, 3 and 5 look like) make scores repeatable. A hard gate stops a beautiful but unusable image from averaging its way to a pass.
brief (text) rubric (text) generated image reference (optional) VLM judge different model from the one that made it { "gate": {"pass": true}, "adherence": { "reason": "...", "score": 4}, ... } Aggregate per-criterion rates, gate failures, confidence intervals calibrate: compare judge scores with ~100 human labels, fix rubric wording, repeat
VLM judge flow. The judge sees everything a human reviewer would, returns structured scores with reasons, and is itself validated against human labels (Module 13) before its numbers go on a dashboard.

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)
Known weaknesses of VLM judges
  • 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.

Worked example: an eval plan for an image-editing agent
  1. 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).
  2. Code checks: output dimensions equal input; pixel change outside the edit mask under a threshold; OCR for text edits.
  3. 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.
  4. Judge rubric: instruction followed, realism of the edited region, nothing else changed, safety gate.
  5. Human: label 60 items to calibrate the judge; weekly pairwise review of 30 production edits between current and candidate versions.
  6. 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 askingCheap first choiceStronger choiceWatch out for
Does the VLM understand my images?Multiple choice or exact match on your own VQA setOpen answers graded by an image-aware judgeBlind-answerable items; preprocessing differences
Can it read documents or charts?ANLS / relaxed accuracyCounterfactual edits (change a number, check the answer changes)Answers printed as labels; downscaling
Does it understand video?Video-MME-style MCQNeedle tests + shuffled-frame probesSubtitles leaking answers; frame sampling
Are generated images realistic?FID on a fixed reference setHuman pairwise preferenceSample size; no prompt awareness
Do they follow the prompt?CLIPScoreDetector rules (GenEval-style), DSG or VQAScoreComposition blindness; judge errors
Is the video good?VBench dimensionsArena votesStatic videos scoring well on smoothness
Is my design / edit agent good?Code checks + VLM rubric judgePlus reference comparison and human reviewSame-family judge; counting and text

Key takeaways

  1. 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.
  2. Counterfactual edits (change the image, expect the answer to change) are the sharpest proof that a model uses the pixels.
  3. 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.
  4. FID compares populations (quality and diversity) and ignores the prompt; CLIPScore checks concepts but is blind to composition. Neither is enough alone.
  5. 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.
  6. For multimodal agents, layer the graders: code checks, a rubric VLM judge from a different model family, reference comparisons, then sampled human review.
  7. 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?

Blind accuracy of 51% is far above the 25% chance level, so the question text or memorization carries much of the score. This is the MMStar finding. Audit the items the blind model gets right consistently.

2. A generator produces only a few near-identical images per prompt, each of high quality. Which metric is most likely to catch this?

CLIPScore and GenEval score each image on its own, so a lack of variety is invisible to them. FID's covariance term penalizes low diversity, as the 1-D worked example showed.

3. Why does GenEval use an object detector rather than CLIPScore to check "two dogs to the left of a cat"?

The detector turns pixels into structured objects, and rules check count and position exactly. The detector can still err (stylised images, unknown categories), which is GenEval's weak link.

4. In DSG, why are the questions arranged in a dependency graph?

Without dependencies, a VQA model might say there is no dog but also that the dog is black, inflating the score. DSG skips (fails) children of failed parents.

5. A video model scores near the top on VBench's motion smoothness and subject consistency but viewers call its videos "boring". Likely cause?

Almost-still videos are trivially smooth and consistent. That is why VBench reports dynamic degree separately, and why you should never read one dimension alone.

6. Your design agent uses model X to generate and critique images. Which judge choice is best for the offline eval?

A same-family judge shares blind spots and may prefer its own outputs. CLIPScore misses composition and brand details. Layer the graders and validate the judge against people.
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