Problem & solution

CSV Integration in MotoGP Photography — Rider Matching

Three classes on the same weekend means three separate number pools — and a MotoGP #21 has nothing to do with a Moto2 #21 or a Moto3 #21. Match your photos against a start-list that doesn't carry the class alongside the number, and a shared number crosses classes without you noticing. Here's how a CSV that's built for MotoGP's structure keeps that from happening.

A photo tagged to the wrong rider because the number matched the wrong class is a credibility problem with team media and wire clients, and it's a harder one to catch than a plain unmatched read — the frame looks correctly tagged, just to the wrong person. Archive systems that file by rider or team end up with photos misfiled under someone who wasn't even in that class.

Understanding the problem

CSV integration in MotoGP is the workflow of matching a detected rider number from a photo to a start-list CSV that has to carry rider name, team, and — critically — a Category field, because MotoGP, Moto2, and Moto3 issue numbers independently. The same digits on a fairing mean different riders depending on which class's session you were shooting.

Paddock photographers shoot across sessions and classes in a single day, often switching from a Moto3 session straight into MotoGP qualifying. Team media, wire services, and archive platforms expect the rider credit to be right every time, and a cross-class mixup is the kind of error that doesn't show up until someone downstream notices the wrong name on a photo of a bike they recognize. Keeping the start-list matched per class, not just per number, is what protects that.

In this sport specifically

A MotoGP weekend runs three classes back to back — Moto3, Moto2, MotoGP — each with its own grid and its own number assignments, so overlapping numbers across classes are the norm, not the exception. Riders are hard to identify from the fairing alone at speed or at lean, and a visor-down helmet removes face ID as a backup. Wildcards are common at home rounds (a national series rider added for one weekend), and mid-season call-ups move a rider from Moto3 or Moto2 up a class when an injury opens a seat. A CSV that only tracks number, without the Category that number belongs to in that session, breaks as soon as two classes share a digit.

Where it shows up

Traditional approaches, and why they fall short

A single number-to-rider list downloaded once and reused across all three classes for the weekend

Almost no setup time, but it's wrong the moment a number repeats across classes · Fine within one class, but it doesn't distinguish MotoGP #21 from Moto2 #21

No Category field means no way to tell two riders with the same number apart. Wildcards and mid-season call-ups aren't reflected until you rebuild the list.

Manual lookup of unmatched or ambiguous numbers after each session, class by class

Slow, and it scales with how many sessions you shot that day — three classes means three separate manual passes · Good when the person doing it knows the paddock, but it depends entirely on them staying sharp across a long race day

Time-intensive on a day with three classes and back-to-back sessions, and fatigue by the third session pushes the error rate up right when volume is highest.

A paid official data provider or third-party timing feed

Subscription plus integration and authentication work to set up · High when it's current, because official sources are authoritative

Expensive and complex for a freelance paddock photographer, with API access, authentication, and a network dependency that isn't a given trackside.

How RaceTagger handles it

RaceTagger matches a detected rider number against the start-list CSV you provide, and if that CSV carries a Category column, it matches against the number-and-Category pair for the session you're tagging rather than the number alone. You build the CSV from the pre-event entry list — rider name, team, Category, number — and update the row for a wildcard or a call-up before you tag that session. When a number isn't in your list for that Category, it comes back unmatched and is flagged for review rather than guessed against the wrong class. It reads both JPEG and RAW from the embedded preview, so you can run it straight off the card between sessions.

Key advantage

Matching against a Category-tagged list is what keeps a shared number from crossing classes. Because you tag each session's folder against the CSV rows for that class, a MotoGP #21 and a Moto2 #21 stay separate even though the digits match — and when RaceTagger isn't confident about a read, it flags that photo for you instead of committing to a guess.

Good conditions
Clear rider numbers on the standard fairing angle, matched against a current Category-tagged start-list, read reliably
Challenging
Deep lean angles that compress the fairing number, and wet sessions with roost spray, are more likely to come back flagged for review
Worst case
Numbers obscured by extreme lean, spray, or simply missing from your CSV for that Category are flagged with low confidence rather than matched blind, so you verify them by hand

Before the weekend, build your start-list CSV from the entry list with a Category column alongside rider, team, and number. Between sessions, point RaceTagger at that session's folder with the CSV for the class you just shot, and it matches detected numbers against the rows for that Category and writes rider identification into standard metadata. Unmatched numbers — a wildcard, a late call-up — are flagged so you can add the row and re-run before you move to the next class's session. The output is EXIF, XMP, and IPTC metadata that drops into your existing Photo Mechanic or Lightroom delivery flow rather than replacing it.

Manual vs OCR vs AI vision

MetricManualBasic OCRRaceTagger
Approach for a three-class weekendSeparate manual lookup pass per class, per sessionReads numbers but applies no rider identification and no class awarenessMatches detected numbers to your Category-tagged CSV, session by session
A number shared across two classesCross-referenced by hand against whichever list is open — error-prone under fatigueNo support — a shared digit reads the same regardless of classMatched against the number-and-Category pair for that session's CSV rows
A wildcard or mid-season call-upUpdate the list by hand, then re-check the affected photosNo support — there's no list to match againstAdd the row to that Category's CSV and re-run the affected session
Standard-grid ID in good lightReliable when the person doing it knows the current entry listReads many numbers but maps none to a rider or classReads clear numbers reliably and matches them against your Category-tagged list
Numbers hard to read or missing from the listEasy to mislabel across a long three-class dayReturns a guess with no confidence signal and no class checkFlagged for review so you add the row or verify by hand instead of shipping a cross-class mismatch

Practical tips

  1. 1

    Add a Category column to your start-list CSV — rider, team, Category, number — before the weekend starts, not after you notice a number collision.

    A number-only list works fine until two classes share a digit, which happens most rounds. Building the Category column in from the start avoids a mid-weekend rebuild.

  2. 2

    Keep one CSV per weekend with all three classes in it, rather than three separate files, so the Category column is what disambiguates instead of which file you happened to load.

    Three separate files invite the mistake of running the wrong file against the wrong session. One file with a Category column, filtered per session, is harder to mismatch.

  3. 3

    Add a wildcard or call-up rider's row — Category, team, number — as soon as it's confirmed, before you tag the session they're riding in.

    A rider who isn't in your CSV comes back unmatched, and one who's in the wrong Category row can collide with an existing number. Getting the row right before tagging is what keeps their photos identified from that session on.

  4. 4

    When a flagged frame is ambiguous, cross-check team colors and bike livery against your CSV's team column before assuming the flagged match is correct.

    At lean or in poor light a fairing number is hard to read cleanly, and RaceTagger flags those low-confidence frames rather than guess. Livery is often unambiguous even when the number isn't, so it's a fast way to confirm a flagged frame.

  5. 5

    When a rider moves up a class mid-season, update their row's Category and number rather than adding a second row — a stale duplicate is how old-class mismatches creep back in.

    A call-up rider often keeps showing up in your old CSV under the previous Category. Editing the existing row keeps one source of truth instead of two rows that can drift out of sync.

The takeaway

The fix isn't a smarter number reader — it's a start-list CSV with a Category column, matched per session, kept current when a wildcard or a call-up rider shows up mid-weekend.

Match a MotoGP weekend against your own Category-tagged start-list

Try it free. Build a CSV with rider, team, Category and number from the entry list, point RaceTagger at a session folder, and see how the Category-aware matching handles a number that repeats across MotoGP, Moto2 and Moto3. 1 credit covers 1 photo, and new accounts start with free credits.

Try it free →

Questions photographers ask

Does RaceTagger know which class a rider is in, or does it just match the number?

It matches against the CSV you provide, so it knows the class only if your CSV has a Category column. That's why a Category column matters in MotoGP specifically — without it, a shared number across MotoGP, Moto2, and Moto3 can match the wrong rider even though the number itself was read correctly.

What happens if the same number is used in two different classes at the same round?

As long as your CSV rows include a Category value, RaceTagger matches the number-and-Category pair for the session's folder rather than the number alone, so a MotoGP rider and a Moto2 rider who happen to share a number stay separate. If your CSV doesn't carry Category, that disambiguation isn't possible — the Category column is what does the work.

How do I handle a wildcard rider who isn't on the pre-event entry list?

Add a row for them — rider, team, Category, number — to that class's section of your CSV as soon as they're confirmed, then tag the session against the updated list. Until you add the row, their photos come back unmatched and are flagged for review rather than guessed.

If a rider is called up to a different class mid-season, how do I keep the CSV right?

Update their existing row's Category and number rather than adding a second row for the new class. A leftover row under their old Category is what causes stale matches later in the season if that number gets reassigned.

Does RaceTagger work on RAW files, and does it replace my editing software?

It reads both JPEG and RAW, working from the embedded preview so you can run it on files straight off the card between sessions. It's the tagging step between the shoot and your editor: it writes rider identification into standard EXIF, XMP, and IPTC fields, so tagged files flow into your existing Photo Mechanic or Lightroom workflow rather than replacing it.

Keep reading

← All guides