Skip to content
AI360Xpert
Beta

PointPillars Fast Pillar Detector

Skip 3D cubes and stand pillars on the ground plane. PointPillars runs 2D convolutions on pillars for real-time lidar boxes.

Vertical pillars collapse into a pseudo image that a 2D head detects
Vertical pillars collapse into a pseudo image that a 2D head detects

Why Does This Exist?

VoxelNet pays for 3D convolutions even though cars never stack vertically. PointPillars exists to collapse height: it groups points into vertical pillars, encodes each with a mini-PointNet, scatters codes into a bird's-eye-view pseudo image, and detects with fast 2D convolutions. Speed jumps past 6060 Hz with small accuracy cost.

Sensing context is LiDAR based; task context is 3D object detection.

Think of It Like This

Counting crowds from a balcony

Judge a plaza crowd by looking straight down and counting heads per floor tile. Nobody stacks, so height adds nothing; tile counts plus shoe colors already find groups.

Pillars are floor tiles and pseudo images are the down view. The analogy stops at overpasses: tiles merge stacked roads while pillars keep max height features to separate them.

How It Actually Works

Pillars of 0.16×0.160.16 \times 0.16 m footprint keep up to 100100 points each, augmented with offsets to pillar center and mean. A shared MLP plus max-pool gives one 6464-dim code per pillar, scattered into a (H,W,64)(H, W, 64) pseudo image. A 2D backbone with top-down fusion plus an SSD-style head regresses boxes and heading. Height resolves from pillar codes rather than explicit zz convolutions.

Worked numbers

A 70×7070 \times 70 m scene at 0.160.16 m gives about 440×440440 \times 440 pillars, but only 1200012000 hold points (66 percent dense). Inference runs near 1616 ms (6262 Hz) versus 250250 ms for early VoxelNet, while KITTI moderate car AP moves from 8181 to about 7777 percent.

Code

def pillar_count(area: float, size: float, dense_frac: float) -> int:    total = (area / size) ** 2  # grid cells over square scene    return int(total * dense_frac)

print(pillar_count(70.0, 0.16, 0.06))  # -> 11484

Watch Out For

Pillaring tall stacks as one cell

Bridges over roads share pillars with cars below, and max-pooling can keep the wrong height. The symptom is boxes floating at deck level. Check height histograms on multi-level scenes and keep explicit zz features in the code.

The Quick Version

  • PointPillars groups points into vertical pillars, not 3D voxels.
  • Each pillar encodes to one code scattered into a pseudo image.
  • Fast 2D convolutions replace costly 3D ones.
  • Pillar 0.160.16 m grids run past 6060 Hz near 7777 percent car AP.
  • Height survives through pillar features, not 3D math.
  • Stacked roads need extra height care.