Tan Shuai

Best AI Model for Captioning and Tagging Photos: GPT-6 vs Claude 5.5 Blind Benchmark

AI

I Blind-Tested 10 AI Models on My 142,000-Photo Library: GPT-6.1 Sol Beat Claude Opus

Cover image: ten AI models blind-tested on real photos. GPT-6.1 Sol scored 9.72 out of 10 and Claude Opus 5.5 scored 8.57.

Abstract

I use Claude Opus 5.5 every day for coding and workflows, and for that work I find it faster and better than GPT-6. I assumed it would also be the best at describing photos, so I tested it. I ran ten configurations: Claude Haiku, Sonnet and Opus 5.5, plus OpenAI's GPT-6.1 Sol, GPT-6 Astra and GPT-6 Luna at several effort levels. Each one titled, captioned, keyworded and filed 50 real photos from my 142,521-photo library, and flagged the photos it thought I should delete. Two blind graders from different vendors, Claude Fable 5.1 and GPT-6 Astra, scored all 500 answers on facts, invented details, delete judgment, album fit and usefulness. GPT-6.1 Sol scored highest at 9.72 out of 10. Opus scored 8.57, and Sonnet and Haiku came in at 7.7 to 7.8. Ultra effort was no better than max. At official Batch API prices, captioning the whole library would cost about $240 with Sol at medium effort (9.56), $661 with Opus, and $11 to $20 with Luna, which still outscored Haiku.

Why I tested this

Most of my day goes to coding, agent workflows and automation, and Claude Opus 5.5 is the model I reach for. For that kind of work it has felt faster and better to me than GPT-6. So when I decided to have AI caption and tag my photo library, I picked Opus without a second thought.

The library is 25 years of my life: 142,521 photos, from early digital camera shots to last week's phone pictures, plus more than 16,000 screenshots. Almost none of them have a caption. I want each photo to have a title, a caption, keywords I can search, a sensible album, and an honest flag when it's a duplicate or junk. Before paying to process 142,000 photos, I wanted to know which model does this best and what the difference costs.

I expected Opus to win. On these 50 photos, GPT-6.1 Sol scored more than a point higher.

Results at a glance

Horizontal bar chart of average scores for the ten configurations. The five GPT-6.1 Sol and GPT-6 Astra configurations score 9.56 to 9.72, Claude Opus 5.5 scores 8.57, GPT-6 Luna scores 8.11 to 8.41, Claude Haiku 5.5 scores 7.81 and Claude Sonnet 5.5 scores 7.68. Figure 1. Average score from two blind graders, out of 10.

Rank Model and effort Score (out of 10) Full library, Batch API Full library, standard API
1 GPT-6.1 Sol, max 9.72 $563 $1,126
2 GPT-6 Astra, max 9.61 $2,987 $5,973
3 GPT-6.1 Sol, ultra 9.59 $468 $937
4 GPT-6 Astra, ultra 9.58 $2,156 $4,313
5 GPT-6.1 Sol, medium 9.56 $240 $479
6 Claude Opus 5.5 8.57 $661 $1,323
7 GPT-6 Luna, max 8.41 $20 $40
8 GPT-6 Luna, medium 8.11 $11 $22
9 Claude Haiku 5.5 7.81 $18 $36
10 Claude Sonnet 5.5 7.68 $334 $668

Cost is for all 142,521 photos at each vendor's official API price.

What I'd use, based on this test:

  • If I only cared about the score, GPT-6.1 Sol at max effort.
  • For my own library, GPT-6.1 Sol at medium. It got 98% of the top score for $240, about a third of what Opus would cost.
  • On a tight budget, GPT-6 Luna at max. At $20 it beat Haiku, which costs the same per token, and Sonnet, which would cost about 17 times as much for this library.
  • Not Claude Sonnet 5.5. It's mid-priced and had the lowest score.

The models

Vendor Model Effort tested Positioning
Anthropic Claude Opus 5.5 default (medium) Flagship daily driver
Anthropic Claude Sonnet 5.5 default Mid-tier
Anthropic Claude Haiku 5.5 default Fast, low-cost
OpenAI GPT-6 Astra max, ultra Frontier model
OpenAI GPT-6.1 Sol medium, max, ultra Workhorse
OpenAI GPT-6 Luna medium, max Fast, low-cost

The prices line up across the two vendors. GPT-6.1 Sol costs the same per token as Claude Sonnet 5.5, GPT-6 Astra the same as Claude Fable 5.1, and GPT-6 Luna the same as Claude Haiku 5.5. Claude Opus 5.5 sits between Sol and Astra. So when two models end up with different costs below, it's mostly because one of them used more tokens for the same job.

The Claude models ran once each at their default settings, which means medium effort for Opus. I tested the GPT models at several effort levels. The closest like-for-like comparison is GPT-6.1 Sol at medium against Claude Opus 5.5 at medium: 9.56 against 8.57.

The test

I used the 50 most recent photos in my library at the time, without videos. They're an ordinary week of my camera roll: family moments at home and on a shopping trip, city views from a high floor, a storage card on my desk, product-page screenshots of electronic parts, order-tracking screenshots, a social media post, a parking-discount QR sign and an EV charger label.

Each model had five jobs for every photo. It wrote a short title and a one-to-three-sentence caption in Chinese, gave 5 to 12 keywords in Chinese and English, and picked the best album from my existing albums, or none. Then it gave a quality score and said whether to keep or delete the photo, looking for duplicates, failed shots, expired screenshots and photos with no lasting value. Every model got the same instructions and the same context for each photo, ten photos at a time.

A street-level photo of two coffee shops side by side, with the captions written by GPT-6.1 Sol, Claude Opus 5.5 and Claude Haiku 5.5. Sol names the place 星河盛世, Opus writes 银河盛世, and Haiku keeps the English name Galaxy Shengshi. Figure 2. One of the 50 test photos, with three of the captions. Look at how each model handles the place name; I come back to it below. People in the photo are blurred.

How I graded it

I didn't grade the answers myself. I had already picked a winner before the test, and I use Claude every day, so I wasn't neutral.

Instead, I shuffled each photo's ten answers and labeled them A to J, with a new random order for every photo. Two graders then scored all 500 answers independently while looking at the photos. One was Claude Fable 5.1, Anthropic's most capable model. The other was GPT-6 Astra at xhigh effort, OpenAI's frontier model.

Diagram: 50 photos go to 10 model configurations, producing 500 answers. Each photo's answers are shuffled and labeled A to J, then scored by two graders, Claude Fable 5.1 and GPT-6 Astra, on five criteria worth 0 to 2 points each. Figure 3. How the blind grading worked.

Each answer was scored on five criteria, 0 to 2 points each, for a total of 10:

Criterion What the grader checked
Facts Are the subject, place and any readable text correct, including local place names?
No invented details Does the answer avoid claiming anything the photo doesn't show?
Delete judgment Is keep or delete reasonable? Deleting a good photo scores 0.
Album fit Is the album right? A wrong old album scores 0; no album is an acceptable 1.
Usefulness Would the title, caption and keywords help me find and remember this photo later?

I picked one grader from each vendor to see whether either would favor its own models. They mostly agreed. The correlation across the 500 paired scores was 0.71, and both put the same five GPT configurations at the top. The Claude grader also ranked GPT-6.1 Sol and GPT-6 Astra above Claude Opus. The GPT grader was stricter overall, and strictest with the Claude models.

Dot plot comparing the two graders' scores for each configuration. Both graders rank the five GPT-6.1 Sol and GPT-6 Astra configurations highest. The GPT-6 Astra grader scores lower overall, with the largest gaps on the Claude models. Figure 4. Each grader's average score per configuration.

Results

Heat map of average scores per criterion, from 0 to 2, for the ten configurations. GPT-6.1 Sol and GPT-6 Astra are close to 2 on almost every criterion. Claude Opus 5.5 loses the most on invented details and album fit. Claude Haiku 5.5 and Claude Sonnet 5.5 are lowest on facts and usefulness. Figure 5. Average score per criterion, both graders combined. An asterisk marks scores lowered by the grading mistake I describe below.

GPT-6.1 Sol and GPT-6 Astra

Sol and Astra read the text accurately and mostly limited their captions to what the photos showed. They were also the best with local place names, which matters for photos taken in China.

Grid showing which configurations wrote two local place names correctly. Every GPT-6.1 Sol and GPT-6 Astra configuration got both right. Figure 6. Two local-name tests. A check means the correct Chinese name, a cross means a literal translation, and EN means the name was left in English.

Several photos were tagged with the location "Rainbow Department Store". That's the English name of the Shenzhen mall chain 天虹. A word-for-word translation gives 彩虹百货, which is wrong. Every Sol and Astra configuration got this right, and so did Opus and Luna at medium. Haiku, Sonnet and Luna at max used the literal translation. The coffee shop photo in Figure 2 was tagged "Galaxy Shengshi", whose Chinese name is 星河盛世. Every Sol and Astra configuration wrote 星河. Opus and Sonnet translated it literally as 银河, and Haiku and both Luna configurations left it in English.

Sol and Astra were also careful about deleting. They suggested deleting 4 to 6 of the 50 photos. The set included eight product-page screenshots of electronic parts, and the GPT models kept almost all of them; one Sol configuration flagged a single screenshot as a near-duplicate. The Claude models flagged two to four each. Both graders sided with keeping them, since the pages held pinouts, dimensions and board photos I'd want to look up later.

Claude Opus 5.5

Opus sometimes wrote things into a caption that the photo alone can't show. It described relationships that the image alone can't prove, such as siblings or parent and child. It also got some poses wrong. In one photo a child was standing behind an adult, and Opus wrote that the child was on the adult's back. Both graders took points off for this.

This surprised me. Before the blind test, I had looked through the answers and praised Opus for correctly guessing that two children were siblings. I know my family; the grader doesn't. But with 142,000 photos, I can't check every caption myself, and a caption that states something the photo doesn't show is a problem.

Opus also suggested the most deletions, 13 of the 50 photos. Three of them were product-page screenshots it called expired, although they held reference information I'd keep. It was the only model that wanted to delete the parking-discount QR sign as low value. It also put several photos of a single person into a "family portrait" album.

Claude Sonnet 5.5 and Haiku 5.5

These two made the most factual mistakes, including the literal 彩虹 translation. Sonnet made the weakest album choices and filed everyday photos into an old album from an unrelated event. Haiku invented a detail that led to a bad delete call. In a burst of near-identical shots, it described the best frame as someone looking down, which is the opposite of what the photo shows, and suggested deleting it.

GPT-6 Luna

Luna costs the same per token as Haiku but scored higher at both effort levels: 8.41 and 8.11, against Haiku's 7.81. At max effort it also beat Sonnet, which would cost about 17 times as much to caption the same library. Luna lost most of its points on usefulness and album choice. Its captions were plainer and its albums less precise.

Effort levels

Three small charts of score by effort level for GPT-6.1 Sol, GPT-6 Astra and GPT-6 Luna, each with a reference line for Claude Opus 5.5 at 8.57. Sol peaks at max, Astra is nearly flat from max to ultra, and Luna improves from medium to max. Figure 7. Score by effort level. The orange line is Claude Opus 5.5 at its default effort.

Ultra was no better than max for either model. Sol scored 9.59 at ultra and 9.72 at max; Astra scored 9.58 and 9.61. In this test, ultra even produced fewer output tokens than max. For Sol, medium came close at 9.56, for less than half the cost of max. Higher effort didn't always mean more accurate details, either: Luna at medium got 天虹 right, and Luna at max didn't.

A mistake in my grading

After grading, I noticed that the graders hadn't been given each photo's capture date and time, although the captioning models had. So the GPT-6 Astra grader treated captions that mentioned the exact date or time as invented details. The top GPT configurations mentioned the date most often, so their "No invented details" scores came out lower than they should have.

If I give back only the points lost over dates, the top four GPT configurations rise to between 9.84 and 9.90, which is effectively a tie, and Opus stays at 8.58. I've kept the original scores in this post. Next time I'll give the graders everything the models saw.

Speed

Bar chart of seconds per batch of 10 photos. GPT-6 Luna at medium is fastest at 24 seconds. Claude Opus 5.5 and GPT-6.1 Sol at medium both take 49 seconds. GPT-6 Astra at max is slowest at 227 seconds. Figure 8. Seconds per batch of 10 photos, as observed. This isn't a controlled latency test, because the two vendors' models were reached through different access paths.

This matches how Opus feels in my daily work: it's fast, about three times quicker than Sol at max. Sol at medium was just as fast as Opus, though, and scored about a point higher.

What it costs

I priced every configuration at the vendors' official API prices. Treating a subscription plan's included usage as free would make some models look better than they are.

Official prices per million tokens, standard tier:

Model Input Output
Claude Opus 5.5 $4.00 $20.00
Claude Sonnet 5.5 $2.00 $10.00
Claude Haiku 5.5 $0.10 $0.50
GPT-6 Astra $10.00 $50.00
GPT-6.1 Sol $2.00 $10.00
GPT-6 Luna $0.10 $0.50

Both vendors' Batch APIs cost 50% less, which suits a job like this that doesn't need instant answers. I took the prices from Anthropic's pricing page (claude.com/pricing) and OpenAI's API pricing page (developers.openai.com/api/docs/pricing) on October 20, 2026.

Scatter plot of score against the Batch API cost of captioning all 142,521 photos, on a logarithmic cost axis. GPT-6.1 Sol at medium sits near the top at $240. GPT-6 Astra costs $2,156 to $2,987 for similar scores. Claude Opus 5.5 costs $661 for 8.57. GPT-6 Luna and Claude Haiku 5.5 cost $11 to $20. Figure 9. Score against the cost of captioning the whole library at Batch prices. The cost axis is logarithmic.

Model and effort Output tokens per photo Standard Batch Score
GPT-6.1 Sol, medium 193 $479 $240 9.56
GPT-6.1 Sol, ultra 514 $937 $468 9.59
GPT-6.1 Sol, max 647 $1,126 $563 9.72
Claude Opus 5.5 ~292 $1,323 $661 8.57
Claude Sonnet 5.5 ~297 $668 $334 7.68
GPT-6 Astra, ultra 462 $4,313 $2,156 9.58
GPT-6 Astra, max 695 $5,973 $2,987 9.61
GPT-6 Luna, medium 163 $22 $11 8.11
Claude Haiku 5.5 ~330 $36 $18 7.81
GPT-6 Luna, max 419 $40 $20 8.41

Sol at medium got 98% of the top score for 36% of what Opus would cost and 43% of Sol at max. Astra matched Sol's quality but costs about five times as much, because its per-token price is five times higher. Opus cost more than Sol at max and scored lower. It already ran at medium effort, but its per-token price is twice Sol's. Luna would caption the whole library for $11 to $20 and still outscore Haiku and Sonnet.

Method note: GPT token counts were measured from the runs, and Claude token counts were estimated from the run logs. Some Claude reasoning tokens weren't visible, so the Claude costs may be slightly understated. No discounts beyond Batch, such as prompt caching, were applied to any model.

What I learned

I picked Opus before I had any blind scores, mostly because it was already my coding default. I still prefer Claude Opus 5.5 for coding and workflows, where it's faster and stronger in my experience. Describing real photos takes a different skill: reading what's actually in the frame without filling in poses or relationships. GPT-6.1 Sol did that better. If I had gone with habit and skipped the blind test, I would have paid more for worse captions.

Next time I'll start blind and give graders from different vendors all the inputs the captioning models got. I'll keep comparing at official API prices, too, and I won't assume more effort is better: ultra didn't beat max here.

Even the best models flagged useful photos for deletion, so I'll check every delete flag myself before removing anything.

Limitations

This was a small test: 50 recent photos from one city. I didn't test older photos, scanned documents, other languages or videos. The Claude models ran only at their default settings; a higher-effort Opus might score better, at a higher cost. The graders are AI models, not people. They agreed well but not perfectly, and a human spot-check would make the result stronger. Models and prices change quickly, and every number here is as of October 2026.

My pick

For my library: GPT-6.1 Sol at medium effort. For coding and workflows, I'm sticking with Claude Opus 5.5.