Every unread bib is a photo a runner can't find. Mass-participation galleries are searched by bib number, so a missed read doesn't just slow delivery — it makes that runner's photos effectively invisible. For event photographers who earn from participant photo sales, untagged frames are unsold frames.
Understanding the problem
Bib detection is the task of locating and reading the printed race number on each runner in a photo, then attaching it to the file so the photo can be found by number. In marathons the bib is worn on the chest (or on a race belt at the waist), which sounds ideal for reading — but paper bibs deform constantly: they fold, crease, curl at the corners, and lose contrast as they get wet. The read also has to work at gallery scale, across everything a mass-participation event puts on your cards in a day.
Marathon photography is unusual in that the participants are the ones buying the photos. Runners find their pictures by typing their bib number into a search box, which means the tag IS the product: a photo without a bib number attached might as well not exist in the gallery. Slow or incomplete tagging delays the delivery window right when post-race excitement — and willingness to buy — is highest.
In this sport specifically
Road running puts the primary number on the chest, but real races complicate it: many runners wear the bib on an elastic race belt that rotates toward the hip mid-race; cold starts mean jackets and ponchos cover bibs for the first kilometers; hydration vests and charity singlets put straps and text right across the digits; and late in the race, sweat-soaked paper folds over itself. Finish-line photography adds the crowding problem — multiple runners per frame, arms raised in celebration exactly where the bib is.
Where it shows up
Finish-line frame with several runners abreast, arms raised in celebration · very common
Raised arms and other runners' bodies block bibs exactly at the most valuable moment of the race. Some numbers in the frame read cleanly, others are half-hidden — so the frame is only partly matchable without a review pass.
Bib worn on a race belt, rotated toward the hip with a vest strap across a digit · very common
Only part of the number is visible. A partial read is ambiguous when the start list contains other runners whose numbers share the visible digits, so trusting it blindly risks tagging the wrong person.
Cold-morning start: jackets, ponchos, and space blankets covering bibs in the early kilometers · common
The number simply isn't in the frame. Photos from the first part of the course can be unmatchable no matter how good the reading is — there's nothing to read.
Late-race bib: sweat-soaked, folded corners, ink bleeding into the paper · common
Contrast drops and folded corners hide digits. A read that would be trivial at kilometer 5 becomes unreliable at kilometer 40, precisely where the emotional, saleable photos are taken.
Traditional approaches, and why they fall short
Manual tagging — zooming into each frame and typing the bib number by hand
Per-photo lookup and typing, repeated across a full mass-participation take — in practice days of work, or a paid tagging team · High on a fresh pair of eyes, but degrades with fatigue — and every typo becomes a photo filed under the wrong runner
Doesn't scale to mass-participation volume. The gallery ships late or partially tagged, and the tagging cost eats the margin on every sale.
Basic OCR over the image — treating the bib as printed text to be transcribed
Fast to run, but adds a heavy manual verification pass, because failed and wrong reads have to be found by hand · Reasonable on a flat, clean, well-lit bib; weak on folds, partial occlusion, curved fabric, and sweat-faded print
Plain OCR doesn't know what a bib is — it transcribes any text it finds (sponsor logos, shirt slogans, distance markers) and returns confident wrong answers, which are worse than no answer in a searchable gallery.
Timing-mat correlation — matching photo timestamps against chip-timing crossings
Requires access to the event's timing data and careful clock synchronization between cameras and the timing system · Good for photos taken exactly at a mat when runners cross spread out; ambiguous when a pack crosses together
Only works at timing points. Mid-course positions — where much of the best photography happens — have no mat, and dense pack crossings at the finish leave several candidates for every frame.
How RaceTagger handles it
RaceTagger sends each photo to a vision model that understands what a race bib is, rather than transcribing every piece of text in the frame. You set the sport to running and upload the event's start list as a CSV; it reads the visible bib numbers — including multiple bibs when several runners are in frame — and matches each read against your list. Reads that are partial, low-contrast, or ambiguous are flagged for review instead of being written as a guess. It processes folders in batch and reads RAW files via the embedded preview as well as JPEG. Worth knowing before you send a folder: the local scene-skip step is not part of the running profile, so every frame you send is analyzed and costs a credit (1 credit = 1 photo). Cull the spectator and empty-road frames yourself first — that's the pass that decides what the day costs.
Key advantage
It aims to read each visible bib in a crowded frame and checks every read against the actual start list — so a finish-line photo with several runners is typically attached to each identified runner, and a read that doesn't correspond to any registered bib is treated as suspect rather than trusted. When nothing is legible, the photo is flagged for a quick human check instead of being tagged blindly.
- Good conditions
- Clean, flat, well-lit chest bib — reads reliably and matches cleanly against the start list
- Challenging
- Folded corners, a strap across a digit, sweat-faded print — often still readable, but more of these land in the review queue
- Worst case
- Bib fully covered by a jacket or another runner — there's nothing to read, so the frame is flagged for review rather than guessed
Import the start list once as a CSV — bib numbers alone are enough for a searchable gallery, and columns like name or category carry through into the metadata if your list has them. RaceTagger batch-processes the folder, tags each photo with every matched bib, and separates low-confidence frames for a quick manual pass. Confirmed numbers are written into the files as EXIF/XMP/IPTC metadata, so the tags travel with the photos into Photo Mechanic, Lightroom, or the gallery platform your runners search.
Manual vs OCR vs AI vision
| Metric | Manual | Basic OCR | RaceTagger |
|---|---|---|---|
| How a full event folder is processed | Frame by frame, zooming and typing by hand | Automated text pass plus a manual hunt for wrong and missed reads | Batch read against your start list, with low-confidence frames flagged for review |
| Clean, flat chest bib in good light | Reliable but slow | Reads well when the text is flat and unobstructed | Reads reliably and matches cleanly against the start list |
| Folded, faded, or partly covered bib | Readable with effort and squinting, at minutes per frame | Often fails or returns an incomplete number as if it were certain | Readable more often than plain OCR; ambiguous reads are flagged rather than guessed |
| Several runners in one frame | Each bib typed separately — the slowest case | Typically returns one text blob; associating numbers to runners is manual | Each visible bib is read and the photo is matched to every identified runner |
| Cost model | Your time, or a paid tagging team | Compute only, but heavy manual review after | Credits — 1 credit per photo analyzed |
Practical tips
- 1
Shoot the finish from a slightly elevated position to separate rows of runners
At chest height, a runner two steps back is hidden behind the one in front. A small elevation — a step ladder or a raised platform — opens sightlines to second-row bibs and turns unreadable frames into readable ones.
- 2
Prefer course points where the field is strung out over the packed early kilometers
In the first kilometers runners are shoulder to shoulder and many still wear throwaway layers over their bibs. A few kilometers in — especially on inclines — the field spreads, layers come off, and bib visibility improves dramatically.
- 3
Get the final start list, not the early registration export
Late entries, transfers, and race-morning changes mean the list from a week before the race is incomplete. Matching quality depends on the list: a bib that isn't in your CSV can be read but not matched to a person, so ask the organizer for the freshest export they have.
- 4
Shoot short bursts at the finish line rather than single frames
Arms swing and runners shift stride to stride, so occlusion changes frame to frame. Across a burst there's usually one frame where a given runner's bib is clear enough to read — and one readable frame is all the match needs.
- 5
Budget a review pass for flagged frames and treat it as quality control, not rework
At marathon volume some frames will always be unreadable — covered bibs, extreme folds, dense pileups. The review queue concentrates exactly those frames, so clearing it is a short, focused pass rather than a hunt through the whole gallery.
The takeaway
Marathon bib detection isn't about a perfect read on every frame — at mass-participation volume, no tool can honestly promise that. It's about clearing the bulk of clean reads automatically, aiming to catch each readable bib in crowded frames, and flagging the hard frames for review, so your review time goes exactly where it's needed and each identified runner ends up findable in the gallery.
Tag your marathon gallery by bib number — with the hard frames flagged, not guessed
500 free credits when you sign up — 1 credit per photo after that. Upload a batch of finish-line shots and see how it handles folded bibs, multi-runner frames, and your start list CSV.
Try it free →Questions photographers ask
How does automatic bib detection work in marathon photos?
A vision model looks at each photo, finds the race bibs on the runners, and reads the numbers — as context-aware detection, not plain text transcription. Each read is then matched against the start list CSV you upload, and low-confidence or ambiguous reads are flagged for manual review instead of being written into the file.
Can one photo be tagged to several runners at once?
Yes. When a frame shows several readable bibs — a finish-line group, a pack shot — each number is read and the photo is matched to every identified runner. That matters for search galleries: each of those runners will find the photo under their own bib number.
What happens when a bib is covered or unreadable?
The photo is flagged as low-confidence and set aside for review instead of being tagged with a guess. We'd rather hand you a short queue of uncertain frames than quietly write a wrong number into a searchable gallery, where a misread means a runner finds someone else's photos.
Does it work with my gallery platform and editing tools?
Tags are written into the photos as EXIF/XMP/IPTC metadata, so they travel with the files into Photo Mechanic, Lightroom, or any gallery platform that indexes standard metadata. The start list side is a plain CSV — bib numbers alone are enough to run the match.
Do I need to shoot in a special way or format for detection to work?
No special setup — it processes JPEG and RAW files, reading RAW via the embedded preview. Shooting habits that help a human read bibs help the model too: elevated finish-line angles, course points where the field is spread out, and short bursts so at least one frame per pass shows the bib cleanly.
Keep reading