Reading a shelf from a photograph
Nobody is going to key four thousand labels into a spreadsheet, and the stores that try get through one aisle. A phone photograph of a shelf section holds about seven labels, and a model can read all seven in a few seconds, provided the photograph is good enough and the model is not told what it ought to find.
Key takeaways
- Photograph by bay, so every label arrives with a position as well as a price.
- Send the retake verdict back to the phone while the person is still in the aisle.
- Read every field as printed. Units and prices are parsed in code, not by the model.
- Read blind. The model never sees the till price or the last walk.
- An unreadable label is a result, not a gap. It goes on the list as unreadable.
From a photo to label records
- Database
- Machine learning
- Management
- Analytics
- Front-end & mobile
Bay first, then photos
Every store already numbers its aisles and bays for planograms and replenishment, and the walk page asks for that number before it opens the camera. That one field does more work than anything the model reads. It turns a photograph into a place, which is what lets part three tell a correct label from a correct label sitting under the wrong product.
The page itself is deliberately plain: a bay number, a camera button, a strip of thumbnails and a Done button when the bay is finished. It is a web page rather than an app, because installing anything on a shared store phone is a conversation with somebody who is not in the building. A photo uploaded twice, which a weak signal at the back of a store makes common, is recognised by its hash and never read twice.
The retake has to happen in the aisle
Shelf-edge strips are glossy, chilled cabinets have glass doors that reflect everything, and a photo taken at arm’s length on a busy morning is often soft. On top of the 583 photos kept from the first full walk of the largest store, 37 were rejected and retaken, almost all of them in the chilled and frozen runs.
So the verdict goes back to the phone within a few seconds, as a red border on the thumbnail. The person is still in the bay, the fix is to step to one side and shoot again, and it costs ten seconds. The same verdict delivered at the end of the walk costs a second walk, which in practice means the bay is simply not checked.
What came back from the first walk
Read as printed, parse in code
The model returns what the label says, in the characters it says it: £1.25, 65p, 2 for £3, £2.50 per kg, 44.6p/100g. It does not convert pence to pounds, per 100 grams to per kilogram, or a multibuy into a price per item. Every one of those conversions happens afterwards in ordinary code, where a slipped decimal point is a bug that fails a test rather than a plausible number in a report.
This matters more here than in most extraction jobs, because the mistakes are small. A model asked to normalise units will usually turn 44.6p per 100 grams into £4.46 per kilogram, which is right, and occasionally into £44.60, which is not. Both look like prices.
Why the read is blind
It would be easy to hand the model the till price file and ask it to check the labels. It would also destroy the point of the exercise. A model told that a product costs £1.85, looking at a slightly blurred label, will read £1.85, and a mismatch that exists will be read out of existence.
So the read knows the store, the bay and nothing else. Its only job is to report what a customer standing in front of that shelf would see. Deciding whether that is right is the next step, and it is done by a comparison that cannot be persuaded.
What a label record holds
- Where. Store, bay, photo, and position in the frame.
- When. The time the photo was taken, from the upload, not from the read.
- Price as printed. The characters on the label, never a converted value.
- Unit price as printed. The figure and the unit, kept separately.
- Promotion. The mechanic wording and end date, where printed.
- Identifiers. Barcode digits or shelf code where legible, and the description.
- Legibility. Which fields were read, and which came back null.
Unreadable is an answer
Ninety-one labels could not be read at all. The temptation is to drop them, because there is nothing to compare. They go on the manager’s list instead, as unreadable, because a label a camera cannot read at arm’s length is usually a label a customer cannot read either, and a price has to be clearly legible to count as displayed.
The next post is where the reading stops and the judgement starts: which product a label belongs to, and which price it should be compared with.
All posts