DeepLab v1 to v3 Plus
DeepLab keeps resolution high with spaced-out atrous filters, sees many scales at once with ASPP, and sharpens edges with a small decoder in v3 Plus.
Why Does This Exist?
A classification backbone downsamples by , which is fine when the answer is one label and fatal when the answer is a label per pixel. Semantic segmentation needs boundaries where they actually are, not where a coarse grid guesses. The second problem is scale: one fixed filter cannot cover a distant pedestrian and a nearby bus in the same pass.
The DeepLab line (Chen and colleagues, 2015 to 2018) attacked both without exploding compute. Hold the output stride at or with spaced-out filters instead of striding, then probe every location at several fields of view at once. This page traces v1 through v3 Plus as one arc. The filter operation itself gets full treatment in dilated convolution, and the plain upsampling alternative lives in fully convolutional networks.
Think of It Like This
A surveyor with a zoom rake
You must map pebbles and boulders in one pass. A normal rake touches adjacent soil only. An atrous rake skips teeth: same handle weight, wider reach. ASPP hands you four rakes at once with gaps of , and inches plus one glance over the whole field, then merges the readings. v3 Plus adds a fine brush for the pebble outlines.
Where it stops: wider gaps sample sparsely, so very thin structures can fall between the teeth.
How It Actually Works
Atrous convolution
A filter with dilation rate inserts gaps between taps, reaching across pixels with the same weights. Rate covers ; rate covers . DeepLab replaces striding in the last backbone blocks with dilation, so the output stride stays at (v1 and v2) or (v3) instead of collapsing to . No extra weights, no extra downsampling, just a wider view per parameter.
ASPP and the version ladder
One scale is never enough, so v2 introduced Atrous Spatial Pyramid Pooling: parallel branches at rates , , and plus a branch, concatenated and fused with a final convolution. Each location votes at several fields of view at once.
The versions stack like this. v1 pairs atrous convolutions with a dense CRF that snaps labels to image edges. v2 adds ASPP. v3 drops the CRF, adds image-level pooling to the pyramid, and modernizes training. v3 Plus adds a light decoder: upsample the ASPP output , fuse it with low-level backbone features, then stretch more to full resolution. The decoder is what recovered the sharp boundaries the CRF used to provide.
Worked example
Take a image through a backbone at output stride . The map is . An ASPP branch at rate spans map pixels, which is input pixels across: enough to cover a bus. The rate- branch spans pixels for cars. The branch reads local texture. Concatenated, one location combines the bus vote, the car vote and the road texture, and the v3 Plus decoder re-snaps the winning vote onto the low-level edge map.
Code
The point here is the reach check: rate on a kernel always spans map pixels, scaled by the output stride into input pixels.
def reach(rate: int) -> int: return 2 * rate + 1 # map pixels spanned by a 3x3 kernel
rates = [1, 6, 12, 18]print([(r, reach(r), reach(r) * 16) for r in rates])# -> [(1, 3, 48), (6, 13, 208), (12, 25, 400), (18, 37, 592)]Read the last triple as: rate sees map pixels, which is input pixels at stride , wider than the -pixel image itself. That is your cue that the rate is too large for this stride.
Watch Out For
Gridding artefacts at large rates
Rates past about on a stride- map sample isolated pixels with dead gaps between taps. Symptom: striped misses on thin rails and wires while large regions look fine. Fix it by capping rates near the map size, keeping the image-pooling branch, or switching the output stride to .
Shipping v1 CRF settings with v3
The dense CRF helped v1 but v3 Plus is accurate without it, and stale CRF sigmas blur the sharp edges the decoder just recovered. Symptom: boundaries get worse after adding post-processing that was supposed to help. Fix it by retuning the CRF from scratch or dropping it when moving to v3 or v3 Plus.
The Quick Version
- Atrous convolution widens the receptive field with no extra weights and no extra downsampling.
- ASPP probes each location at rates , and plus image pooling, so one pass covers many object scales.
- v1 used a dense CRF, v2 added ASPP, v3 modernized training, and v3 Plus added a light edge decoder.
- Output stride or keeps maps dense enough for real boundaries.
- A rate- branch at stride sees input pixels across, enough for a bus; the rate- branch sees for cars.
- Over-large dilation rates cause gridding on thin structures.