Race Numbers & Start Lists
Fetch the start list, read the race numbers, and name who is in each picture.
FLOGVIT.photosuite reads the race numbers in your pictures and writes who is in each one into the file: the runner's or rider's name, number, class and club. It reads the numbers only against the event's start list, so a number painted on a car door or a house is never taken for a participant.
Numbers are read with the computer's own text recognition: Apple's Vision framework on a Mac, and Windows' OCR on Windows 10 and 11. Nothing needs to be downloaded for it.
Get the start list#
The start list is an event folder holding teams.json and bibs.json. The app fetches it for you:
- Open Settings → Workflow and add an Identify step to a workflow (or open the one you have).
- Under Fetch start list, paste the address of the event's start-list page and choose Fetch:
- race-result, also behind elapse.no and racetracker.no (the page that embeds the list is enough),
- onreg / MYLAPS (
secure.onreg.com/…?id=…).
- The folder is added to the step's start lists, and the app says how many entrants it found.
For an event with no timing system, fetch a CSV file instead. It needs a header row naming a number column (Startnr, Bib, Start number) and a name column (Navn, Name); a club (Klubb, Club), class (Klasse, Class) and team (Lag, Team) column are read when they are there. Separate the columns with ;, , or tabs.
Contests not on the course: some events sell a spectator ticket that carries a number like everyone else's. Type part of its name under Leave out (Tilskuer) before you fetch, and those entrants are dropped, so a misread number never lands on a spectator. The folder remembers it, and Fetch Again keeps it out.
Relays of teams whose number carries the heat, like Energistafetten (07-422): tick Teams whose number carries the heat before you fetch. Each number is then a team, named by the team, with the company as its club.
Results in the caption#
For a race-result event, tick Also fetch the results before you fetch: each number then has its place and time, and Fetch Again keeps them current while the results come in. Tick Say how each did in the Identify step and the caption reads Emil Hannevik Fyhn (9), 1. 35:55. In a template, {results} is that text for everyone in the picture, and {place} and {time} are the first person's.
On race day#
Late entrants get their numbers on the day. Choose Fetch Again to read every start list in the step again, or set Fetch again every to a number of minutes: the step then fetches a list again before it reads a picture, whenever the list is older than that. If the timing system cannot be reached, the step keeps the list it had.
Several races on one photo day? Put every race's start list in the same step: the numbers are read once, and each race keeps the participants on its own list.
What is written into the picture#
- the event, as the start list names it,
- each person's name (and every runner of a relay team),
- names, numbers, class and club as keywords,
- a caption:
Name (12); Name (31).
A number the app cannot be sure of — a single digit, or a number with a hidden digit that would also fit a longer number on the list — is held rather than named, so no picture gets the wrong person.
A number small or far off in a large frame can vanish when the whole frame is read at once. When someone in the picture wore a readable number but nothing else was read off the plates, the whole frame is read again in overlapping tiles, and every region with digits is read up close. A number found that way counts only when two different crops agree, it has at least two digits, and it passes the same checks as every other read. In a frame where nobody wore a readable number, such as a medal ceremony, numbers read this way are never used.
Correct the numbers#
When a folder has a start list, the info panel shows a Numbers section: each number on the picture and who wears it. Type a number or a name and press Return to add it. × takes a number off, and Nobody clears the picture. With more than one picture selected, the change goes to all of them.
The people, the keywords (names, numbers, contest, class, club), the caption and the event follow from the start list, written the way Identify writes them. Keywords, captions and events someone typed by hand stay. A number of someone a delivery does not name (below) is not written, and the panel says so.
Deliver → Start Lists for This Folder… chooses which start lists the folder's numbers are looked up in. The folder remembers them; without a choice, every Identify step's start lists are used. Numbers only writes the numbers and never a name, as a relay's delivery does.
Every correction is logged in the start list's folder (updated.json), with what was read and what you set. That is what the reading learns from, and a picture you have set is never named differently when Identify runs on it again. Over the API: PUT /api/numbers with numbers or entry, GET /api/images/current/numbers and PUT /api/folder/start-lists (SDK: client.setNumbers, client.currentNumbers, client.setFolderStartLists).
Pictures waiting for you#
Identify never names a read it cannot be sure of. It holds it for you: a number a longer number begins or ends with ("87" is what 187 looks like with a ribbon over the 1), a single digit, or, when nothing was read, who passed the timing point when the picture was taken. Filter → Numbers → Needs review shows only those pictures. The Numbers section says why each was held and gives a button for each number it could be. Pick the right one, type another, or choose ✓ Right as it is. The picture leaves the list, and the next one waiting comes up.
The holds are kept in the start list's folder (held.json) until you settle them. An event built by the old delivery scripts is reviewed the same way: its out-bibs/counts.json uncertain rows become holds the first time the folder is opened with that start list. Over the API: GET /api/review lists them, and PUT /api/numbers settles one (SDK: client.reviewQueue(); the filter is needs_review in POST /api/filter).
A hidden number: the timing point#
A rider with the number behind an arm is still in the timing system, at the mat the photographer stands by. With Timing point on in the Identify step, a frame with a person and no readable number is held with the participants who passed that point when the frame was taken. It never names anyone on its own; the names wait for a person to choose.
- Fetch the start list with Also fetch the results: the results carry each participant's split times.
- Under Timing point, give the results column of your point (
TIME21, orfinishfor the finish line). Tick time since start when the column counts from the start rather than the time of day, and give the mass start when participants' results carry no start time of their own. The column must be the time at the point, not the time of one leg — check a participant you know. - Set the camera's clock offset: open a picture where you know the number, type it, and choose Set. The offset is the timing system's time minus the camera's.
- The window is how many seconds either side still count: a few seconds at a mat, more where the point is a stretch of road.
Pick the pictures for the paper#
Deliver → Pick for Delivery… chooses at most the number of pictures you give, so that nobody is in the delivery twice. It works on the selection when more than one picture is selected, otherwise on the whole folder, and uses the numbers Identify wrote into each picture.
- The participant with the fewest pictures is served first: someone in one picture gets that one before someone in ten can claim it.
- A picture is taken only if everyone in it is still without one.
- Alone in the frame goes before in a group; every photographer gets a picture before anyone gets a second (Photographers); then the sharpest.
The picks get the color label you choose and an album named after the folder. The report says why each was picked, the runners-up, and who got no picture. Over the API: POST /api/pick-for-delivery (SDK: client.pickForDelivery({ count: 200 })).
The report for the editor#
Deliver → Delivery Report counts what the folder (or the selection) delivers: how many pictures, how many participants are named and how many appear more than once, pictures with nobody named, pictures per photographer and participants per class. From Identify's journal it also counts how many frames had a number held for a person to check, and how many had someone who is not named (class or opt-out). For each start list it also says what the guard against hidden digits costs: how many of its numbers a longer number begins or ends with (and so are never named from a read alone), how many pictures wait for a person because of it, and how many were named with such a number anyway. A dense list of one- to three-digit numbers can lose a third of its numbers this way, while a list of four-digit numbers loses none. The summary goes on the clipboard for the e-mail. delivery-report.txt and delivery-report.pdf are written beside the pictures; the PDF is a contact sheet with each picture's caption under it. Over the API: POST /api/delivery-report (SDK: client.deliveryReport()).
Learning from what the editor published#
After the paper has run its picture series, give the app the editor's list: Deliver → Import Published… with the delivered folder open, and a file of the published file names (one per line, or published.json with [{"file": …}]). File names match even with the publishing system's copy suffixes (_1, (1)).
The published pictures get an album named after the folder, and every picture of the folder is recorded as published or not, with what the picker knows about it: sharpness within the folder, alone or in a group, how many people, the stars. Once at least 30 published pictures are known, across events, Pick for Delivery scores by what this editor publishes instead of by sharpness alone, and its report says so. Over the API: POST /api/published/import (SDK: client.importPublished({ list })).
Who had what published#
Deliver → Published by Photographer… saves a CSV of every imported event: per photographer, how many of their pictures were delivered, how many were published, and which — for paying each photographer for what the paper used. The photographer is the one the Photographers table names for the camera, else the EXIF Artist. Over the API: GET /api/published/by-photographer.
Who is not named#
Some participants should not be named in a newspaper: children and young people, and anyone who has asked not to be. In the Identify step:
- Classes not named — part of a class or age group, one per line (
Barn,U1,Ungdom). Everyone in a matching class is left out. - Not named — numbers or names, one per line, of people who asked.
Their number is still read, so the picture is not mistaken for someone else's, but nothing about them — name, number, class or club — goes into the delivered picture. Over the API, unnamedClasses and optedOut do the same on identify and detect, and detect lists them in unnamed.
Over the API#
POST /api/start-lists/fetch fetches a start list into a folder (source: the page's address or a CSV file; dir: the folder; empty source with a dir fetches it again; heat_numbers for team relays, exclude_contests for contests not on the course). From the SDK: client.fetchStartList({ source }). See the API reference.