| level | encoder output | decoder input (after concat) | decoder output |
|---|---|---|---|
| 1 | 64 × 256 × 256 | 64 + 64 = 128 × 256 × 256 | 64 × 256 × 256 |
| 2 | 128 × 128 × 128 | 128 + 128 = 256 × 128 × 128 | 128 × 128 × 128 |
| 3 | 256 × 64 × 64 | 256 + 256 = 512 × 64 × 64 | 256 × 64 × 64 |
| 4 | 512 × 32 × 32 | 512 + 512 = 1024 × 32 × 32 | 512 × 32 × 32 |
| bottleneck | 1024 × 16 × 16 | – | upsampled to 512 × 32 × 32 |
| output | 1 × 1 conv → C × 256 × 256 |
Read from the bottom up: each decoder level upsamples, concatenates the encoder map of the same size, then convolves. Padded convolutions keep the sizes aligned.
| variant | mAP (all) | recall, objects < 16 px | latency |
|---|---|---|---|
| baseline: ResNet-50, P3–P5 | 0.61 | 0.42 | 18 ms |
| + input 640 → 960 | 0.64 | 0.58 | 39 ms |
| + P2 level instead | 0.63 | 0.55 | 24 ms |
| + CBAM in the neck | 0.62 | 0.44 | 20 ms |
| ResNet-101 backbone | 0.62 | 0.43 | 29 ms |
Illustrative numbers. Change one thing per row, report quality and cost, and look at the metric that matches your problem — here, small-object recall.