Industries · 6 min read
Warehouse rack occupancy detection from a camera on the forklift, so an empty bay is a finding and never a guess
Rack slots and pallets as separate classes, occupancy written back per position with the frame, and stock staged in the aisle as the first failure to rule out.
Summary
This post describes rack occupancy detection from a camera on the forklift mast or a fixed aisle camera, with rack slots and pallets as separate classes so that an empty bay is a confirmed detection rather than the absence of one. It covers writing occupancy back per position with the frame, the runner on the truck, and why a stack of stock blocking the view is the first failure to rule out before anyone retrains. It is for warehouse automation and robotics teams.
Andreas Ohrvall · CTO · Sep 26, 2026

A warehouse aisle with racked pallets from a high camera, forklift and pallet boxed, generated scene with detections from our model
The warehouse system says bay 12 in aisle C is empty. The forklift driver arrives at 3 pm to put a pallet in it and finds a pallet already there, unlabelled, put down by someone on the night shift who meant to update the system later. He drives on to find another bay, and the system now has a wrong answer for one bay and, after the next few hours, for several more. By Friday the count of bays the system holds as empty and the count that are is a difference nobody can explain from a desk.
The forklift passes every bay in the building several times a shift, at a fixed height, with its lights on. A camera on the mast sees exactly what the driver sees, and the question is what the model should be asked so that its answer for bay 12 can be trusted.
Object detection on slots and pallets makes an empty bay a positive finding
The obvious model finds pallets. That model's answer for bay 12 when it is empty is silence, and silence is also what it says when the bay was out of shot, or behind a stack of stock, or in the dark. A system that turns silence into "empty" has built the night shift's mistake into the model.
So there are two classes. The rack slot is one, a box on the upright-to-upright, beam-to-beam opening whether anything is in it or not. The pallet is the other. Object detection puts both boxes on every frame, and occupancy is the rule over them: a slot box with a pallet box inside it is occupied, a slot box with none is empty, and a slot the model could not find at all is unseen. Empty becomes something the model found rather than something it failed to find, and unseen becomes a state the warehouse system has to carry.
The warehouse spatial mapping use case makes the harder version of this argument for the fleet's map, where an obstacle needs a footprint. For occupancy a box is enough, because the question is whether the bay is taken, and a pallet's box inside a slot's box answers it.
The camera on the mast passes every bay the driver does
A fixed camera at the end of aisle C sees the near bays well and the far ones as a strip of pixels. A camera on the forklift mast sees every bay from the same distance, because the driver drives past all of them, and it sees them at the moment they matter, which is when a pallet is going in or coming out. The mast camera's frames are tagged with the truck's position, from the warehouse's own positioning, and the position is what turns a slot box into bay 12.
The model runs on a runner on the truck. Frames stay on the truck, the verdict per bay goes to the warehouse system over the site network, and only the frames the model doubts leave for review. The deployment doc covers what leaves the site and what does not, and on a forklift the honest answer is that the footage never needs to.
The bay labels are on the uprights at floor level, where the forks scrape them off. The position from the truck is more reliable than the label.
Occupancy is written back per position, with the frame
Each pass of the truck produces a verdict per bay it saw: occupied, empty or unseen, with a timestamp and the frame. The warehouse system takes the verdict, and the frame is kept so that when the driver and the system disagree at 3 pm, the argument is settled by a picture from 2:40 pm rather than by whoever is more tired.
The verdict also carries a rule. An alert is a rule written as a sentence, with a severity and a cooldown, approved before it goes live: a bay the system holds as empty that the camera has found occupied on two consecutive passes, routine, to the shift lead's list. The reverse is the more expensive one, a bay the system holds as full that the camera keeps finding empty, since that is stock the building has lost.
A stack of stock in the aisle is the first failure to rule out
On Tuesday a delivery was staged in aisle C because the dock was full, and a row of bays behind the staged pallets went unseen for two days. The model's detections for those bays fell to nothing while the rest of the building held, which is the signature the drift catalog gives for something in the way: spatial rather than global, one region of one aisle.
That is a maintenance finding and never a labeling job. Nothing retrained on those frames would find a bay that is physically hidden. The unseen state is what carries the building through those two days honestly, and the count of unseen bays per aisle against its own history is the cheapest monitor the warehouse has. When it climbs in aisle C and nowhere else, somebody has put something down.
My own view is that a schema without an unseen state should not go live. The occupancy systems we have seen fail all failed the same way, by turning a bay the camera could not see into a bay the system reported as empty.
A slot and a pallet that disagree are the review queue
A pallet overhanging two slots, a half-height pallet the slot box swallows, a bay with loose cartons in it and no pallet at all: these are the frames the model doubts, and they go to a person with both boxes drawn. The person's verdict is recorded against the frame, and those corrections are what the next version trains on.
LexData takes the occupancy model through its whole life. You type what to look for, Lexi puts a box on every slot and every pallet on every frame, and a person checks each label before anything trains on it. The model then watches the mast camera on each truck, on a runner beside the recorder, with the frames staying on the truck. Frames it is unsure of come back to a person, the corrections retrain it, and the new version replaces the old one with no downtime.
The night shift still puts pallets down without telling anyone. The difference is that the next truck past bay 12 tells the system, with a frame, before the driver at 3 pm has to.
See it on your own footage.
Start with your footageMore in Industries

Industries · 6 min read
AI crop analysis in the greenhouse, catching tomato disease before it spreads down the row
Lesions boxed by disease with a healthy class, a question of the footage about how far a patch spread since last week, and a model that turns with the season.
Rob Hickey · Sep 26, 2026

Industries · 6 min read
Ceramic defect detection for hairline cracks a fixed-rule camera cannot learn
Edge chips, hairline cracks and pinholes on the tile line after the kiln, masks where the area sets the grade, and the new glaze as the day to relabel.
Esdras Ntuyenabo · Sep 26, 2026

Industries · 6 min read
Chocolate box inspection with a camera over the tray line
Each piece boxed by type, a plain check against the box template, damage as its own class, and the new spring assortment as the day the labels go stale.
Stephen Biswas · Sep 26, 2026