Research note · August 30, 2026
What it took to describe half a million photographs.
The first full attempt at generating image descriptions across the whole corpus: which model, what it cost, where the output failed, and the parts of the process I got wrong. Superseded on cost by a later note, kept for the working notes.
linkedcultureaccessibilitywcagmachinelearningculturalheritagemuseums
Note, updated September 2026. Two things here have since changed. The cost figure I gave was wrong: I measured throughput with a much shorter prompt than the one the project settled on, so the real number came out at roughly $181 for the corpus rather than $46, and lower again once batching worked. And I have since found that several museums do publish real descriptions of their own, so the opening claim below is too sweeping. For current numbers and a comparison across services, read What automated image descriptions cost. What follows is kept for the process and the failures, which have not changed.
If you have looked at your own collection's alt text recently, you may recognise this: an object page carrying the alt text "Untitled". For anyone using a screen reader, that word is the entire visual content of the photograph. A 19th-century albumen print of the Ramesseum at Thebes, announced as "Untitled".
That is not really a failing of any one institution. Alt text costs staff time in direct proportion to the size of the collection, and it is usually the first thing cut. A large museum with an accessibility office manages some of it. A regional museum with one part-time collections manager and a catalog exported from a 2004 system manages none. The gap is budget, not care.
So I wanted a practical answer to a practical question. Can a machine close it, what does that cost, and what is the honest quality of what comes out.
The cost, and why the figure moved
When I wrote this I had measured roughly $46 to describe 460,478 images on rented hardware. That number was wrong, and I have left it visible rather than quietly editing it, because a note about cost transparency that silently revises its own costs is not much use to anyone.
What I had actually measured was throughput on a much shorter prompt than the one the project ended up using. Measured properly, the rate came out at 428 records an hour on a rented RTX 3090, which prices the corpus at about $181. With batching enabled it came down again.
The comparison that still holds is the shape rather than the numbers. A commercial frontier model would have cost thousands. A mainstream cloud provider costs several hundred. A marketplace of independent providers costs a fraction of that, and the discount is what you are paid to absorb their unreliability. More on that below, since it is the part most likely to decide whether you should attempt this in-house.
Which model, and why
I used Qwen2.5-VL-7B-Instruct, an open-weights vision-language model released by Alibaba.
The reasons are institutional more than technical. Open weights mean it runs on hardware you rent by the hour: nothing is sent to a commercial API, no per-image fee accrues, and no vendor can change the terms or withdraw the service later. If you might want to re-run this in five years, that independence has real value.
It is also small enough to run on a consumer graphics card, which is the only reason the cost lands in the hundreds rather than the thousands. A larger model would describe more accurately and cost proportionally more.
The trade-off is real and I would rather be plain about it: a 7-billion-parameter model is not as careful as a commercial frontier model. Most of the quality problems below follow from that choice.
What good output looks like
Some of it is genuinely useful, in a way the catalog record is not. A Getty photograph titled only "Gibson, Pandore":
A classical statue of a draped figure holding a book, standing against a dark background.
Or one cataloged as "[Cairo with Distant Views of Pyramids]":
Two men sit between large, open wooden frames, possibly for photography, with a cityscape in the background. The ground is sandy.
The second describes something the title does not mention at all: two figures, and what look like a photographer's working frames. A researcher looking for images of photographic practice in the field would never reach that record through its title.
What bad output looks like
The first batch produced descriptions that looked like invention. A commemorative medal described as bearing the inscription "TREATY OF VERSAILLES". A photograph of Philae described as showing text reading "THE SMALLER TEMPLE AT PHILA". A Getty photograph of Antinoë returned with text reading "Antin's Palace of Antin".
None of those inscriptions were legible in the way described.
The cause was not the model inventing from nothing. It was a mistake in how I was asking. I had been passing the catalog title into the request, thinking it would help the model orient itself. Given a record titled Medal to Commemorate the Treaty of Versailles, a model this size cannot hold the distinction between "here is context" and "here is what you see". It reported the title back as an inscription it had read off the object.
Removing the title fixed it. The proof came later: the same model, given no title at all, correctly read a pub sign in a street scene as "Bears & Bees Inn", and correctly transcribed a French caption with its accents intact as "Montagne de la guérandière".
I would dwell on this failure rather than move past it, because it is the one that should shape policy. A wrong description of a painting is a small embarrassment to a sighted visitor, who can look at the painting and see the text is wrong. To a blind visitor it is false information about an object they have no other way to examine, delivered in the one channel available to them. That asymmetry is the argument for keeping a person in the loop.
What review actually looks like
Saying a person should check the output is easy. Building something a person can realistically work through is the harder half, and it decides whether any of this is usable.
The first thing that makes it tractable is that not every record needs the same attention. When the model encounters lettering in an image, it answers in one of three ways: there is no text here, here is the text I can read, or there is text here and I cannot read it reliably. That third answer is the valuable one. It is the model declining to guess, and it is the queue a person should work first. A reviewer can ask for every image where lettering was present and unreadable, rather than reading half a million descriptions looking for problems.
The second is ordering by who can actually reach the record. Descriptions are generated for the most visible objects first, the ones already surfaced on a person page or plotted on the map, rather than in whatever order the database returns. A description on a page nobody can navigate to helps nobody.
The third is that every generated field is marked unreviewed from the moment it is created. Approval is a separate, recorded act by a named person, not an absence of objection.
I have since built that review interface, and there is a walkthrough of it in a later note. The requirements are unglamorous: the image and the generated text side by side at a readable size, approve or correct or reject in one action without leaving the keyboard, visible provenance for which model produced the text and when, and a queue that tells you what to look at next. What it should not do is present five hundred thousand records and a search box.
Instructions are not enough
One pattern held across every version of the request I wrote, and it is useful to know before commissioning work like this. A model this size reliably follows the shape you give it and unreliably follows the rules you give it.
Ask for a structured response with a fixed set of fields and it returns a valid one every time, 60 out of 60 in testing. Tell it in the same breath never to begin with "This image shows", and it begins with "This image shows" anyway. Forbid vague hedging and roughly a third still say "appears to be".
What worked was not more emphatic instruction. It was cleaning the output afterward with fixed, testable rules, which took empty or hedging language from 92 percent of records down to 13 percent. If you are buying this kind of work, the practical lesson is that quality does not come from a cleverly worded prompt. It comes from what happens to the output afterward, and from someone checking.
Recording which machine said what
If a description is going to be read aloud to someone who cannot check it against the image, you need to be able to say exactly where it came from. Every description stores the model that produced it and who provides that model, the version of the request and a fingerprint of its exact wording, the version of the cleanup rules applied afterward, when it was generated, and whether a human has reviewed it, which begins as no.
One correction fell out of taking this seriously. Each image also gets a color palette, measured directly from the pixels by ordinary arithmetic rather than produced by the model. I had initially stored that alongside the model's output and attributed it to the model, which is a false statement in a provenance record. "Which model produced this information" has to have exactly one true answer for every field, so the palette now carries its own producer and is marked as not applicable for human review. A measurement is not something a person checks for accuracy the way they check generated prose.
The distinction turned out to matter for quality too. Asked to name colors, the model says "sepia", "brown", "black". Measured from the pixels, the same photograph is 33 percent a particular dark olive, 23 percent near-black, 17 percent a warm grey. The words help searching. Only the numbers let you compare one object against another.
The part that nearly went wrong quietly
For most of the process my pipeline did this: send the image, receive a description, clean it up, store the cleaned version, discard the original.
That is a one-way transformation wearing the costume of a repeatable process. The cleanup rules changed four times in a single afternoon, which means two records generated by the same model on the same day could hold different text purely because of when they were processed. Worse, improving the cleanup later would have meant renting hardware again to regenerate text already paid for.
The fix is the rule this project already applies to museum metadata: the original is never overwritten, and anything derived from it sits alongside rather than on top. The model's raw response is now kept verbatim, and every cleaned field records which version of the rules produced it. Changing those rules now costs nothing.
If you are commissioning this, the institutional version of that principle is simple. If you cannot reproduce how a piece of published text was created, you cannot defend it, correct it systematically, or improve it without paying twice.
This is not turnkey
The cost figure makes this sound easier than it is, so I should be honest about the operational reality.
Getting a single successful run required fixing more than a dozen separate faults, and almost none of them were about the model. They were about renting computers from strangers. A machine that accepts a booking and never starts. A host whose disk is too small for the job but says yes anyway. Instances that report themselves ready minutes before they accept a connection. A network connection dropping mid-job and taking several hours of completed work with it.
That is the reliability difference the discount pays for. A mainstream cloud provider has none of these problems and costs roughly ten times more. A marketplace has all of them, and every one has to be handled before an unattended overnight run will survive.
If your museum is considering this, the honest framing is that the model is the easy part and the cheapest part. The work is in the plumbing, the verification, and the review.
What it adds up to
For a few hundred dollars of rented computing time, a collection of half a million photographs can go from having no text alternatives at all to having, for every image, a short description for screen readers, a longer description for anyone who wants more detail, a transcription of any legible lettering, and a structured record of subject, setting, materials and color.
Every one of those is labeled as machine-generated, carries the provenance of what produced it, and is marked unreviewed until a person says otherwise.
That is not a substitute for institutional accessibility work and should not be presented as one. It is a floor, at a price that does not scale with the size of the institution, which is the only way a museum with one collections manager ends up on the same footing as one with an accessibility department.
The expensive part was never the model. It was finding out what the model actually does, and building something honest enough to admit it.