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 ·

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. The fixed aisle camera, for a site with lower racking, is the version in computer vision in the warehouse, dock door to sorter.
See it on your own footage.
Start with your footageRelated posts

Industries · 7 min read
Sensor fusion with computer vision, the tag says which pallet and the camera says what happened to it
The RFID portal reads a tag at the dock door. The camera above it sees the pallet lifted, filled or left behind, and catches the tag that fell off on the way.
Andreas Ohrvall · Sep 29, 2026

Industries · 7 min read
Computer vision for autonomous mobile robots that pull pallets from dark trailers
A robot's forward cameras in a dark trailer find a worn pallet and its pose, keep people in view, and the second warehouse is a new site with its own frames.
Andreas Ohrvall · Sep 25, 2026

Industries · 6 min read
Vision AI for factory robots, picking from a bin nobody arranged
A cell camera over a bin of oily sheet metal blanks, each found with its position and rotation for the arm, and the new part number labeled before changeover.
Finn Ellingwood · Sep 23, 2026