Thomas Piacentini
← Workshop

Cheat sheet

Computer Vision

Original text · English

Preprocess, convolve, classify, fine-tune, detect, segment and patchify images. PyTorch and NumPy from the lessons.

Mask R-CNN pipeline

featurestop KInput imagelist of (3, H, W)ResNet backbonestrides 4, 8, 16, 32FPNtop down + lateralRPNabout 1000 proposalsRoIAlignbilinear, no roundingBox headclass + refineMask head28x28 per classNMSboxes, labels, masks
Nodes and connections
NodeRoleKind
Input imagelist of (3, H, W)
ResNet backbonestrides 4, 8, 16, 32
FPNtop down + lateral
RPNabout 1000 proposals
RoIAlignbilinear, no rounding
Box headclass + refine
Mask head28x28 per class
NMSboxes, labels, masks
FromToConnection
Input imageResNet backbone
ResNet backboneFPN
FPNRPN
FPNRoIAlignfeatures
RPNRoIAligntop K
RoIAlignBox head
RoIAlignMask head
Box headNMS
Sources

Preprocess for a pretrained model

  1. Decode the file becomes uint8 HWC in [0, 255].
  2. Colour convert to RGB. BGR input costs about ten points.
  3. Float and layout divide by 255, then HWC to NCHW.
  4. Resize shorter side to 256, bilinear.
  5. Crop center crop to 224x224.
  6. Standardize subtract the ImageNet mean, divide by the std.
  7. Model the input now matches the training input.
Sources

Key formulas

Output size
H_{\text{out}} = \left\lfloor \frac{H - K + 2P}{S} \right\rfloor + 1
Same padding
P = (K - 1) / 2 for odd K and S = 1
Conv params
C_{\text{out}} \cdot C_{\text{in}} \cdot K \cdot K + C_{\text{out}}
Receptive field
1 + L \cdot (K - 1) for L stacked convs, stride 1
Residual
y = F(x) + x
IoU
\mathrm{IoU}(A, B) = \frac{\mathop{\mathrm{area}}(A \cap B)}{\mathop{\mathrm{area}}(A \cup B)}
Dice
\frac{2 \sum (p \cdot y)}{\sum p + \sum y + \epsilon}, and \text{Dice} = 2 \cdot \text{IoU} / (1 + \text{IoU})
YOLO decode
x = (\sigma(t_x) + \text{cell}_x) \cdot \text{stride}, w = \text{anchor}_w \cdot \exp(t_w)
Sources

Tasks in code

TaskCode
HWC to CHWimg_hwc.permute(2, 0, 1)
Same size 3x3 convnn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)
Loss with label smoothingnn.CrossEntropyLoss(label_smoothing=0.1)
Replace a ResNet headmodel.fc = nn.Linear(model.fc.in_features, num_classes)
Pretrained backbone, any familytimm.create_model("resnet50", pretrained=True, num_classes=10)
Deduplicate boxesnms(boxes, scores, iou_threshold=0.45)
U-Net with a pretrained encodersmp.Unet(encoder_name="resnet34", encoder_weights="imagenet", in_channels=3, classes=3)
Pretrained ViTtimm.create_model("vit_base_patch16_224", pretrained=True, num_classes=10)
Sources

ViT forward

self.proj = nn.Conv2d(in_channels, dim, kernel_size=patch_size, stride=patch_size)
self.cls_token = nn.Parameter(torch.zeros(1, 1, dim))one learned token
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, dim))learned
x = self.proj(x)(N, dim, 14, 14) at 224 px
x = x.flatten(2).transpose(1, 2)(N, 196, dim) tokens
cls = self.cls_token.expand(x.size(0), -1, -1)
x = torch.cat([cls, x], dim=1)(N, 197, dim)
x = x + self.pos_embedadd position
normed = self.ln1(x)pre-LN
a, _ = self.attn(normed, normed, normed, need_weights=False)
x = x + aresidual
x = x + self.mlp(self.ln2(x))D to 4D to D, GELU
return self.head(self.ln(x[:, 0]))classify from [CLS]
Sources

Shapes

TensorShape
Decoded image(H, W, 3), uint8
Model input(N, 3, 224, 224), float32
Conv weight(C_out, C_in, K, K)
YOLO head output(N, H, W, num_anchors, 5 + C)
Segmentation logits(N, C, H, W), target (N, H, W)
Mask R-CNN masks(N, 1, H, W) in [0, 1]
ViT tokens at 224 px(197, 768) with [CLS]
Sources

Defaults and numbers

SettingDefaultNote
ImageNet mean0.485, 0.456, 0.406on [0, 1] pixels
ImageNet std0.229, 0.224, 0.225per channel
NMS iou_threshold0.45RPN uses 0.7
conf_threshold0.25objectness times class score
lambda_noobj0.5lambda_coord is 5.0, YOLOv1 ratios
Mixup alpha0.2lam from Beta(alpha, alpha)
ViT patch size16196 tokens at 224 px
MAE mask ratio75%encoder sees 25%
Sources

Backbones

ModelSize and idea
LeNet-561,706 params. Conv, pool, dense
AlexNet60M. ReLU, dropout, depth
VGG-16138M. Only 3x3 convs
ResNet-1811.7M. Identity skips, 69.8% top-1
ViT-B/1686M. 12 blocks, 12 heads, dim 768
Mask R-CNN R50 FPN46M. 91 COCO classes
Sources

Troubleshooting

SymptomCauseFix
Garbage output, no errorraw uint8 into the modeldivide by 255, then standardize
First conv sees height as channelsHWC inputpermute(2, 0, 1) to CHW
Wrong gradient, no errorsoftmax before cross-entropypass raw logits
Unstable lossno zero_grad() each stepcall it before backward()
Fine-tuned worse than linear probeLR or BN bugdiscriminative LR, freeze_bn_stats
99% pixel accuracy, useless masksclass imbalanceadd Dice to the loss
Checkerboard artifactstransposed convbilinear upsample + 3x3 conv
Head has one class too fewbackground not countednum_classes = classes + 1
Sources

Abbreviations

IoU
Intersection over Union. Overlap of two boxes or masks.
NMS
Non-maximum suppression. Keeps the top box, drops overlaps.
mAP@0.5:0.95
COCO AP. Mean over IoU 0.5 to 0.95, step 0.05.
mIoU
mean IoU over classes. The segmentation metric.
FPN
Feature Pyramid Network. Semantic features at every stride.
RPN
Region Proposal Network. Object or no object per anchor.
ViT
Vision Transformer. Patches as tokens.
MAE
Masked Autoencoder. Mask 75% of patches, reconstruct.
Sources

Questions

Why 3x3 everywhere?
Two 3x3 convs see 5x5 with 18C^2 params, not 25C^2.
Why residuals?
A block can learn identity, so depth stops hurting.
Why RoIAlign over RoIPool?
No rounding. It adds 3 to 4 mask AP on COCO.
Why anchors?
The head predicts small deltas from a prior box.
Why pre-LN in ViT?
It trains deep stacks without warmup.
Sources

Tips

  • Compute mean and std on your own training set.
  • Use nearest resize for masks and label maps.
  • Print linear probe and fine-tuned accuracy for every transfer run.
  • Rebuild the optimizer when the set of trainable parameters changes.
  • Report IoU per class, not only mIoU.
  • Report precision, recall, AP@0.5 and mAP@0.5:0.95 together.
Sources
Original source
---
id: computer-vision
title: Computer Vision
code: CV
subtitle: Preprocess, convolve, classify, fine-tune, detect, segment and patchify images. PyTorch and NumPy from the lessons.
hue: 5
sources: phases/04-computer-vision/01-image-fundamentals, phases/04-computer-vision/02-convolutions-from-scratch, phases/04-computer-vision/03-cnns-lenet-to-resnet, phases/04-computer-vision/04-image-classification, phases/04-computer-vision/05-transfer-learning, phases/04-computer-vision/06-object-detection-yolo, phases/04-computer-vision/07-semantic-segmentation-unet, phases/04-computer-vision/08-instance-segmentation-mask-rcnn, phases/04-computer-vision/14-vision-transformers
source_hash: 39d79137b3c784bf
---

## Mask R-CNN pipeline
type: architecture
from: phases/04-computer-vision/08-instance-segmentation-mask-rcnn/docs/en.md

```arch
node | img | 1,1 | Input image | list of (3, H, W)
node | bb | 2,1 | ResNet backbone | strides 4, 8, 16, 32
node | fpn | 3,1 | FPN | top down + lateral
node | rpn | 4,1 | RPN | about 1000 proposals
node | roi | 3,2 | RoIAlign | bilinear, no rounding
node | box | 2,2 | Box head | class + refine
node | mask | 4,2 | Mask head | 28x28 per class
node | nms | 1,2 | NMS | boxes, labels, masks
edge | img | bb |
edge | bb | fpn |
edge | fpn | rpn |
edge | fpn | roi | features
edge | rpn | roi | top K
edge | roi | box |
edge | roi | mask |
edge | box | nms |
```

## Preprocess for a pretrained model
type: flow
from: phases/04-computer-vision/01-image-fundamentals/docs/en.md

1. **Decode**: the file becomes `uint8` HWC in `[0, 255]`.
2. **Colour**: convert to RGB. BGR input costs about ten points.
3. **Float and layout**: divide by 255, then HWC to NCHW.
4. **Resize**: shorter side to 256, bilinear.
5. **Crop**: center crop to 224x224.
6. **Standardize**: subtract the ImageNet mean, divide by the std.
7. **Model**: the input now matches the training input.

## Key formulas
type: concepts
from: phases/04-computer-vision/02-convolutions-from-scratch/docs/en.md, phases/04-computer-vision/03-cnns-lenet-to-resnet/docs/en.md, phases/04-computer-vision/06-object-detection-yolo/docs/en.md, phases/04-computer-vision/07-semantic-segmentation-unet/docs/en.md, phases/04-computer-vision/04-image-classification/docs/en.md

- **Output size**: $H_{\text{out}} = \left\lfloor \frac{H - K + 2P}{S} \right\rfloor + 1$
- **Same padding**: $P = (K - 1) / 2$ for odd $K$ and $S = 1$
- **Conv params**: $C_{\text{out}} \cdot C_{\text{in}} \cdot K \cdot K + C_{\text{out}}$
- **Receptive field**: $1 + L \cdot (K - 1)$ for $L$ stacked convs, stride 1
- **Residual**: $y = F(x) + x$
- **IoU**: $\mathrm{IoU}(A, B) = \frac{\mathop{\mathrm{area}}(A \cap B)}{\mathop{\mathrm{area}}(A \cup B)}$
- **Dice**: $\frac{2 \sum (p \cdot y)}{\sum p + \sum y + \epsilon}$, and $\text{Dice} = 2 \cdot \text{IoU} / (1 + \text{IoU})$
- **YOLO decode**: $x = (\sigma(t_x) + \text{cell}_x) \cdot \text{stride}$, $w = \text{anchor}_w \cdot \exp(t_w)$

## Tasks in code
type: task-table
from: phases/04-computer-vision/01-image-fundamentals/docs/en.md, phases/04-computer-vision/02-convolutions-from-scratch/docs/en.md, phases/04-computer-vision/04-image-classification/docs/en.md, phases/04-computer-vision/05-transfer-learning/docs/en.md, phases/04-computer-vision/06-object-detection-yolo/docs/en.md, phases/04-computer-vision/07-semantic-segmentation-unet/docs/en.md, phases/04-computer-vision/14-vision-transformers/docs/en.md

| Task | Code |
|---|---|
| HWC to CHW | `img_hwc.permute(2, 0, 1)` |
| Same size 3x3 conv | `nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)` |
| Loss with label smoothing | `nn.CrossEntropyLoss(label_smoothing=0.1)` |
| Replace a ResNet head | `model.fc = nn.Linear(model.fc.in_features, num_classes)` |
| Pretrained backbone, any family | `timm.create_model("resnet50", pretrained=True, num_classes=10)` |
| Deduplicate boxes | `nms(boxes, scores, iou_threshold=0.45)` |
| U-Net with a pretrained encoder | `smp.Unet(encoder_name="resnet34", encoder_weights="imagenet", in_channels=3, classes=3)` |
| Pretrained ViT | `timm.create_model("vit_base_patch16_224", pretrained=True, num_classes=10)` |

## ViT forward
type: annotated-code
lang: python
from: phases/04-computer-vision/14-vision-transformers/code/main.py, phases/04-computer-vision/14-vision-transformers/docs/en.md

```python
self.proj = nn.Conv2d(in_channels, dim, kernel_size=patch_size, stride=patch_size)
self.cls_token = nn.Parameter(torch.zeros(1, 1, dim))  # one learned token
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, dim))  # learned
x = self.proj(x)                                 # (N, dim, 14, 14) at 224 px
x = x.flatten(2).transpose(1, 2)                 # (N, 196, dim) tokens
cls = self.cls_token.expand(x.size(0), -1, -1)
x = torch.cat([cls, x], dim=1)                   # (N, 197, dim)
x = x + self.pos_embed                           # add position
normed = self.ln1(x)                             # pre-LN
a, _ = self.attn(normed, normed, normed, need_weights=False)
x = x + a                                        # residual
x = x + self.mlp(self.ln2(x))                    # D to 4D to D, GELU
return self.head(self.ln(x[:, 0]))               # classify from [CLS]
```

## Shapes
type: command-table
from: phases/04-computer-vision/01-image-fundamentals/docs/en.md, phases/04-computer-vision/02-convolutions-from-scratch/docs/en.md, phases/04-computer-vision/06-object-detection-yolo/docs/en.md, phases/04-computer-vision/07-semantic-segmentation-unet/docs/en.md, phases/04-computer-vision/08-instance-segmentation-mask-rcnn/docs/en.md, phases/04-computer-vision/14-vision-transformers/docs/en.md

| Tensor | Shape |
|---|---|
| Decoded image | `(H, W, 3)`, uint8 |
| Model input | `(N, 3, 224, 224)`, float32 |
| Conv weight | `(C_out, C_in, K, K)` |
| YOLO head output | `(N, H, W, num_anchors, 5 + C)` |
| Segmentation logits | `(N, C, H, W)`, target `(N, H, W)` |
| Mask R-CNN masks | `(N, 1, H, W)` in [0, 1] |
| ViT tokens at 224 px | `(197, 768)` with [CLS] |

## Defaults and numbers
type: defaults
from: phases/04-computer-vision/01-image-fundamentals/docs/en.md, phases/04-computer-vision/06-object-detection-yolo/docs/en.md, phases/04-computer-vision/04-image-classification/docs/en.md, phases/04-computer-vision/14-vision-transformers/docs/en.md, phases/04-computer-vision/08-instance-segmentation-mask-rcnn/docs/en.md

| Setting | Default | Note |
|---|---|---|
| ImageNet mean | 0.485, 0.456, 0.406 | on [0, 1] pixels |
| ImageNet std | 0.229, 0.224, 0.225 | per channel |
| NMS iou_threshold | 0.45 | RPN uses 0.7 |
| conf_threshold | 0.25 | objectness times class score |
| lambda_noobj | 0.5 | lambda_coord is 5.0, YOLOv1 ratios |
| Mixup alpha | 0.2 | lam from Beta(alpha, alpha) |
| ViT patch size | 16 | 196 tokens at 224 px |
| MAE mask ratio | 75% | encoder sees 25% |

## Backbones
type: command-table
from: phases/04-computer-vision/03-cnns-lenet-to-resnet/docs/en.md, phases/04-computer-vision/14-vision-transformers/docs/en.md, phases/04-computer-vision/08-instance-segmentation-mask-rcnn/docs/en.md

| Model | Size and idea |
|---|---|
| LeNet-5 | 61,706 params. Conv, pool, dense |
| AlexNet | 60M. ReLU, dropout, depth |
| VGG-16 | 138M. Only 3x3 convs |
| ResNet-18 | 11.7M. Identity skips, 69.8% top-1 |
| ViT-B/16 | 86M. 12 blocks, 12 heads, dim 768 |
| Mask R-CNN R50 FPN | 46M. 91 COCO classes |

## Troubleshooting
type: troubleshooting
from: phases/04-computer-vision/01-image-fundamentals/docs/en.md, phases/04-computer-vision/04-image-classification/docs/en.md, phases/04-computer-vision/05-transfer-learning/docs/en.md, phases/04-computer-vision/07-semantic-segmentation-unet/docs/en.md, phases/04-computer-vision/08-instance-segmentation-mask-rcnn/docs/en.md

| Symptom | Cause | Fix |
|---|---|---|
| Garbage output, no error | raw uint8 into the model | divide by 255, then standardize |
| First conv sees height as channels | HWC input | `permute(2, 0, 1)` to CHW |
| Wrong gradient, no error | softmax before cross-entropy | pass raw logits |
| Unstable loss | no `zero_grad()` each step | call it before `backward()` |
| Fine-tuned worse than linear probe | LR or BN bug | discriminative LR, `freeze_bn_stats` |
| 99% pixel accuracy, useless masks | class imbalance | add Dice to the loss |
| Checkerboard artifacts | transposed conv | bilinear upsample + 3x3 conv |
| Head has one class too few | background not counted | `num_classes` = classes + 1 |

## Abbreviations
type: glossary
from: phases/04-computer-vision/06-object-detection-yolo/docs/en.md, phases/04-computer-vision/07-semantic-segmentation-unet/docs/en.md, phases/04-computer-vision/08-instance-segmentation-mask-rcnn/docs/en.md, phases/04-computer-vision/14-vision-transformers/docs/en.md

- **IoU**: Intersection over Union. Overlap of two boxes or masks.
- **NMS**: Non-maximum suppression. Keeps the top box, drops overlaps.
- **mAP@0.5:0.95**: COCO AP. Mean over IoU 0.5 to 0.95, step 0.05.
- **mIoU**: mean IoU over classes. The segmentation metric.
- **FPN**: Feature Pyramid Network. Semantic features at every stride.
- **RPN**: Region Proposal Network. Object or no object per anchor.
- **ViT**: Vision Transformer. Patches as tokens.
- **MAE**: Masked Autoencoder. Mask 75% of patches, reconstruct.

## Questions
type: qa
from: phases/04-computer-vision/02-convolutions-from-scratch/docs/en.md, phases/04-computer-vision/03-cnns-lenet-to-resnet/docs/en.md, phases/04-computer-vision/08-instance-segmentation-mask-rcnn/docs/en.md, phases/04-computer-vision/06-object-detection-yolo/docs/en.md, phases/04-computer-vision/14-vision-transformers/docs/en.md

- **Why 3x3 everywhere?** Two 3x3 convs see 5x5 with $18C^2$ params, not $25C^2$.
- **Why residuals?** A block can learn identity, so depth stops hurting.
- **Why RoIAlign over RoIPool?** No rounding. It adds 3 to 4 mask AP on COCO.
- **Why anchors?** The head predicts small deltas from a prior box.
- **Why pre-LN in ViT?** It trains deep stacks without warmup.

## Tips
type: tips
from: phases/04-computer-vision/04-image-classification/docs/en.md, phases/04-computer-vision/05-transfer-learning/docs/en.md, phases/04-computer-vision/07-semantic-segmentation-unet/docs/en.md, phases/04-computer-vision/06-object-detection-yolo/docs/en.md, phases/04-computer-vision/01-image-fundamentals/docs/en.md

- Compute mean and std on your own training set.
- Use nearest resize for masks and label maps.
- Print linear probe and fine-tuned accuracy for every transfer run.
- Rebuild the optimizer when the set of trainable parameters changes.
- Report IoU per class, not only mIoU.
- Report precision, recall, AP@0.5 and mAP@0.5:0.95 together.
Code and artifacts 1
What you take away

Saved in your notebook on this device.

Sources and limits

Reading checkpoints are self-reported. Test results are recorded separately and apply to the executed cases.

AI Engineering from Scratch · 3f9715c · MIT

Download this file ↓