Problem & solution

Bib Detection in Marathon Photos — Folded, Covered, Crowded

On paper, road running should be the easy case for automatic number reading: the bib is printed large, high-contrast, and pinned to the runner's chest. In practice, marathon bibs fold as runners lean, soak through with sweat, twist sideways on race belts, and disappear under jackets and hydration vests — while finish-line frames stack runners on top of each other in a single shot. This guide covers why bib detection is harder in marathons than it looks, what the traditional approaches cost at mass-participation volume, and how we handle it, including the frames that can't be read.

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

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

MetricManualBasic OCRRaceTagger
How a full event folder is processedFrame by frame, zooming and typing by handAutomated text pass plus a manual hunt for wrong and missed readsBatch read against your start list, with low-confidence frames flagged for review
Clean, flat chest bib in good lightReliable but slowReads well when the text is flat and unobstructedReads reliably and matches cleanly against the start list
Folded, faded, or partly covered bibReadable with effort and squinting, at minutes per frameOften fails or returns an incomplete number as if it were certainReadable more often than plain OCR; ambiguous reads are flagged rather than guessed
Several runners in one frameEach bib typed separately — the slowest caseTypically returns one text blob; associating numbers to runners is manualEach visible bib is read and the photo is matched to every identified runner
Cost modelYour time, or a paid tagging teamCompute only, but heavy manual review afterCredits — 1 credit per photo analyzed

Practical tips

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

← All guides