PointNet & PointNet++: learning directly on point sets
How do you feed an unordered set of 3D points to a neural network? PointNet's answer — a shared MLP and a max pool — became the building block inside almost every LiDAR detector that followed.
Motivation & Main Contribution
- This series is about 3D object detection, so why open with a classification paper?
- Because the trick PointNet introduced shows up again and again: inside every voxel of VoxelNet, every pillar of PointPillars, and as the backbone of PointRCNN and PV-RCNN.
- Main contribution: the first network that consumes raw points directly — no voxel grid, no images — for classification and per-point segmentation.
- PointNet++ adds what PointNet lacks: local neighbourhoods and a hierarchy, like a CNN.
- Reading tip: if you understand “shared MLP + max pool”, you understand half of the detectors that follow.
Challenges at the Time
- A LiDAR scan is a point set: points, each , maybe with intensity. No grid, no order.
- CNNs need a regular grid, so in 2017 people forced points into one — and paid for it:
- Voxel grid + 3D CNN (VoxNet, 3D ShapeNets). A grid with cells per side has cells, so memory and compute grow cubically: doubling the resolution costs . A 3D kernel also has weights instead of . Worse, almost all cells of a LiDAR grid are empty, yet the dense 3D convolution still visits every one of them. So grids stay coarse (e.g. ), and coarse cells blur away fine shape.
- Multi-view images + 2D CNN (MVCNN). Render the object from many viewpoints and classify the images. Strong for classifying single objects, but the 3D geometry is lost in projection, and it does not extend naturally to whole scenes or to a label per point.
- Feeding points directly is not trivial either — a point-set network must respect three properties:
- Unordered. points can be listed in orders; the output must not change (permutation invariance).
- Interaction among points. Neighbouring points form local structure that matters.
- Invariance to rigid transformations. Rotating or translating the whole cloud should not change its class.
Naive Questions
- Why not flatten the array and feed it to an MLP? The weights would be tied to positions in the list: shuffle the points and the output changes.
- Then sort the points first? There is no ordering of 3D points that stays stable under small perturbations. The paper tried it — it works poorly.
- Treat the points as a sequence and use an RNN? Also tried in the paper. The RNN still depends on the order it is fed; it does worse than max pooling.
- Why not stay with voxels? Cubic cost, mostly empty cells, and quantisation error (see above).
- How can one 1024-dimensional vector describe a whole shape? The paper proves that this form can approximate any continuous set function, given enough channels.
- What happens if some points are missing? Usually nothing: only a small set of critical points decides the result (see below).
Key Idea
Key idea. Process every point with the same small network, then combine them with a symmetric function — max pooling — so the order of the points cannot matter.
- : a shared MLP applied to each point independently (in code: a convolution).
- : element-wise max over the points — any order gives the same vector.
- : an MLP on the pooled vector.
Why max pooling, and not sum or average?
- The paper tries average pooling and an attention-weighted sum as well; max pooling wins “by a large winning margin” (Fig. 5 of the paper).
Dive into Model Architecture & Key Components
PointNet, layer by layer
Tensor shapes for one object with points (classification network, Fig. 2 of the paper):
| Stage | Operation → purpose | Shape |
|---|---|---|
| Input | raw coordinates → the point set as it comes, in any order | |
| Input transform | T-Net predicts a matrix, multiply → align the cloud to a canonical pose | |
| Shared MLP (64, 64) | same MLP on every point → lift each point to a 64-d feature | |
| Feature transform | T-Net predicts a matrix, multiply → align the features too | |
| Shared MLP (64, 128, 1024) | same MLP on every point → rich 1024-d features per point | |
| Max pool | over the points → one global feature, independent of the point order | (global feature) |
| MLP (512, 256, ) | classifier, dropout (keep ratio 0.7) → map the global feature to class scores | class scores |
T-Net: learning to align the input
Builds on. Spatial Transformer Networks (Jaderberg et al., 2015), which learn a transform that aligns 2D images before the CNN — PointNet applies the same idea to points and to features.
- A mini-PointNet (shared MLP 64-128-1024, max pool, FC 512-256) that regresses a transform matrix, initialised to the identity.
- Input T-Net: , a learned “canonical pose” for the cloud.
- Feature T-Net: ; harder to optimise, so a regulariser keeps it near orthogonal:
- In hindsight: PointNet++ and later detectors drop the T-Nets; the max-pool idea is what lasted.
Segmentation head: local + global
- Per-point labels need both what a point is and what the whole shape is.
- Where the 1024 comes from: the shared MLP (64, 128, 1024) lifts every point to 1024 features (); max pooling keeps the largest value of each column → the global feature. 1024 is simply the width the authors chose for that last layer.
- Concatenate each point’s 64-d local feature with the 1024-d global feature → , then shared MLPs (512, 256, 128) and (128, ) → per-point scores.
Why max pooling is robust: critical points
- Each of the 1024 channels takes its value from a single point → only a small critical point set decides the global feature.
- Any cloud between the critical set and the upper-bound shape gives exactly the same feature → robust to missing points and outliers.
PointNet++: adding locality and hierarchy
- PointNet’s weakness: each point is processed alone until one global max pool — no neighbourhoods, no fine local structure. CNNs work because they build features from small patterns to large ones.
Builds on. PointNet itself, used as the local feature learner, and the CNN idea of building features hierarchically from small receptive fields to large ones.
- PointNet++ applies PointNet on local regions, then on regions of regions. One set abstraction level:
- Sampling — farthest point sampling (FPS) picks well-spread centroids.
- Grouping — ball query gathers the neighbours of each centroid within radius (at most points).
- PointNet — a small PointNet encodes each group (coordinates relative to the centroid) into one feature.
- Shapes: .
- Non-uniform density (LiDAR is dense near the sensor, sparse far away): multi-scale grouping (MSG, several radii per centroid), multi-resolution grouping (MRG, cheaper), and random input dropout during training.
- Feature propagation for segmentation: inverse-distance-weighted interpolation from the nearest points () plus skip links — the encoder–decoder later used as the backbone of PointRCNN.
Conclusion
Results
Shape classification on ModelNet40 (PointNet, Table 1):
| Method | Input | Avg. class accuracy ↑ | Overall accuracy ↑ |
|---|---|---|---|
| 3DShapeNets | volume | 77.3 | 84.7 |
| VoxNet | volume | 83.0 | 85.9 |
| Subvolume | volume | 86.0 | 89.2 |
| MVCNN | 80 images | 90.1 | – |
| PointNet | raw points | 86.2 | 89.2 |
Cost of the classification networks (PointNet, Table 6):
| Method | Parameters ↓ | FLOPs / sample ↓ |
|---|---|---|
| MVCNN | 60.0 M | 62,057 M |
| Subvolume | 16.6 M | 3,633 M |
| PointNet | 3.5 M | 440 M |
Segmentation (PointNet, Tables 2 and 3):
| Task | Method | mIoU ↑ |
|---|---|---|
| ShapeNet part segmentation | Yi et al. | 81.4 |
| 3D CNN baseline | 79.4 | |
| PointNet | 83.7 | |
| S3DIS semantic segmentation | baseline (hand-crafted features) | 20.12 |
| PointNet | 47.71 |
PointNet++ on ModelNet40 (PointNet++, Table 2):
| Method | Input | Accuracy ↑ |
|---|---|---|
| PointNet | points | 89.2 |
| PointNet++ | points | 90.7 |
| PointNet++ | points + normals | 91.9 |
Pros and Cons
- Pros
- Consumes raw points: no voxel quantisation, no rendering.
- Order-invariant by design (shared MLP + max pool), and robust to missing points (critical points).
- Small and fast: 3.5 M parameters vs 60 M for MVCNN.
- One architecture for classification and per-point segmentation.
- Cons
- PointNet has no notion of neighbourhoods — each point is processed alone until the global max pool.
- PointNet++ fixes that, but farthest point sampling and ball query are slow on 100k-point LiDAR scans.
- Shown on single objects and indoor rooms, not on detecting objects in outdoor driving scenes.
Future Work
- Scale point-based learning to full outdoor LiDAR scans, with fast neighbourhood search.
- Use the PointNet encoder as a building block inside 3D object detectors.