Multi-Sensor Fusion for 3D Detection
Lidar plus cameras in one bird's-eye frame keep boxes alive when night, rain, or glare knocks out either sensor alone.
Why Does This Exist?
Lidar measures depth and fails in spray. Cameras read texture and fail at night. Radar reports speed and localizes poorly. Any single sensor has weather where it quits, and 3D object detection built on one sensor inherits that quit.
Late fusion merges finished boxes and inherits each sensor's misses. Multi-sensor fusion for 3D detection moves the merge earlier: encode lidar and cameras into separate bird's-eye grids and in one shared ego frame at time , stack them, and run one head. Either branch can then carry the frame when the other degrades.
This page owns the 3D detection merge. The general fusion choice is sensor fusion, the driving system around it is BEV perception and sensor fusion, and the single-sensor baselines are LiDAR based and camera-based. Dense fusion is BEVFusion and sparse refinement is TransFusion, built on heads like CenterPoint and SECOND.
Think of It Like This
Two tracing sheets on one light table
One friend traces building outlines from a laser scan onto tracing paper. Another traces window colors from photos onto a second sheet. You lay both sheets on one light table, align the corner marks, and draw the final map from the stack.
Grids are the sheets and ego calibration is the corner marks. Training with one sheet sometimes missing teaches you to read either alone. The sitting stops at alignment: friends tolerate sloppy corners while grids split one car into two boxes on a degree error.
How It Actually Works
Lidar points voxelize into of shape at m, covering m from to m. Camera views lift into on the same footprint through depth splatting. Motion compensation shifts both grids into ego coordinates at time before fusion. The stack has channels, passes three convolutions, then feeds a center head predicting heat plus .
Sparse fusion flips the order: run the lidar head first, keep the top boxes as queries, then refine each with image cross-attention at its projected corners. Dense fusion serves occupancy too; sparse fusion spends compute on objects only. Both train with sensor dropout, often percent camera dropout, so the lidar path stays strong when night removes color.
Worked example
Cell covers m and m. The lidar branch gives from points on a car door. The camera branch gives from a headlight patch at predicted depth m. Concatenated fuses to , and the head emits car score with center m. Either branch alone scored below in night rain.
Alignment sets the ceiling. A degree yaw error at m shifts the camera grid by m, pushing lidar and camera peaks into adjacent cells so one car becomes two weak boxes. Online calibration plus static-pole checks hold the stack together.
Code
Cell mapping plus the yaw-shift check behind ghost boxes.
import math
def cell_90(x: float, y: float, origin: float = -45.0, cell: float = 0.5) -> tuple[int, int]: """BEV cell on the 180 grid for an ego point.""" return int((x - origin) / cell), int((y - origin) / cell)
def yaw_shift(range_m: float, deg: float = 0.4) -> float: """Lateral shift from a calibration yaw error.""" return round(range_m * math.tan(math.radians(deg)), 2)
print(cell_90(0.0, 5.0)) # -> (90, 100)print(yaw_shift(50.0)) # -> 0.35Watch Out For
Calibration drift that splits one car in two
A degree yaw error moves camera evidence m at m while lidar stays put. The head sees two half peaks and emits two boxes at each instead of one at . Re-calibrate online, verify on static poles, and alert when pole reprojection exceeds m.
Fusion trained only on clean paired frames
Always-on both sensors teaches the fuser to lean on cameras, so night frames drop points and the lidar path cannot carry alone. Train with percent camera dropout plus lidar-only batches, and test each sensor removed before trusting rain gains.
The Quick Version
- Multi-sensor 3D fusion stacks lidar and camera bird's-eye grids in one ego frame and detects once.
- A grid at m cells aligns both sensors over m.
- Our cell at m fuses to when each branch alone sits below .
- A degree yaw error shifts cameras m at m and splits boxes.
- Dropout training keeps either sensor able to carry the frame alone.