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
A number is assigned to a MotoGP rider and, independently, to a different rider in Moto2 for the same round. · very common
If your CSV only lists number-to-rider without a Category column, a photo from the Moto2 race gets matched against the MotoGP rider who shares that number — the frame looks correctly tagged, just to the wrong person and the wrong class.
A wildcard rider is confirmed for a home Grand Prix, entered in Moto2 or Moto3 for that weekend only. · common
The wildcard isn't in the CSV you built from the pre-event entry list, so their photos come back unmatched until you add them — and if you don't tag the row with the right Category, they can collide with an existing number in another class.
A Moto2 rider is called up to MotoGP mid-season to cover an injured rider, taking a different number than they ran in Moto2. · occasional
Your Moto2 CSV still has them under the old number and Category. Photos from their MotoGP outing don't match anything in the list you're using unless you update the row for the new class and number before tagging that session.
Two riders on the same team, one in Moto2 and one in MotoGP, run similar livery colors for the round. · occasional
If a number match comes back ambiguous or the Category field is blank in your CSV, the similar team colors don't help you tell the two riders apart by eye when you're spot-checking a flagged frame.
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
| Metric | Manual | Basic OCR | RaceTagger |
|---|---|---|---|
| Approach for a three-class weekend | Separate manual lookup pass per class, per session | Reads numbers but applies no rider identification and no class awareness | Matches detected numbers to your Category-tagged CSV, session by session |
| A number shared across two classes | Cross-referenced by hand against whichever list is open — error-prone under fatigue | No support — a shared digit reads the same regardless of class | Matched against the number-and-Category pair for that session's CSV rows |
| A wildcard or mid-season call-up | Update the list by hand, then re-check the affected photos | No support — there's no list to match against | Add the row to that Category's CSV and re-run the affected session |
| Standard-grid ID in good light | Reliable when the person doing it knows the current entry list | Reads many numbers but maps none to a rider or class | Reads clear numbers reliably and matches them against your Category-tagged list |
| Numbers hard to read or missing from the list | Easy to mislabel across a long three-class day | Returns a guess with no confidence signal and no class check | Flagged for review so you add the row or verify by hand instead of shipping a cross-class mismatch |
Practical tips
- 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
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
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
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
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