Computer Vision Pipelines
Follow an image all the way from raw photo to live prediction — collecting and labelling data, augmenting and preprocessing it, transfer-learning a pretrained backbone, running the train/validate loop, evaluating honestly, and deploying for inference.
Learn Computer Vision Pipelines in our free AI & Machine Learning course — a beginner-friendly interactive lesson with worked examples, a practice exercise…
Part of the free AI & Machine Learning course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
What You'll Learn in This Lesson
🏭 Real-World Analogy: An Assembly Line
A CV pipeline is an assembly line that turns raw photos into predictions. Picture a factory floor with stations in a row:
- Loading dock — photos arrive and get labelled (data collection & labeling).
- Copy station — make varied copies by flipping, cropping and re-colouring (augmentation, training only).
- Standardisation — every photo is resized and its pixels rescaled to the same range (preprocessing).
- Expert inspector — a pretrained backbone that already knows edges and textures examines each photo (transfer learning).
- Sorter — a small classifier head drops each photo into a labelled bin (prediction).
- Quality control — a held-back sample is scored honestly (evaluation), then the line ships (deployment).
If one station is mis-calibrated — say standardisation differs between the factory and the field — every later station produces junk. The whole point of a pipeline is that each stage is reliable and consistent from training through to deployment.
1 Collect, Label, and Split Your Data
Everything starts with labelled data — images paired with the correct answer (the label ). Before any training, you split that data into a train set the model learns from and a validation set you hold back to check progress honestly. A common split is 80/20.
The split below is the simplest possible version — slice a list. Run it and watch which samples land where.
2 Augmentation — Free Variety for Training
Augmentation creates safe, label-preserving copies of training images so the model sees more variety: horizontal flips , random crops , and colour jitter (brightness/contrast). A flipped cat is still a cat, so the label stays the same while the pixels change.
Here's the simplest augmentation — a horizontal flip — written in plain Python so you can see exactly what changes.
3 Preprocessing — Resize and Normalize
Preprocessing makes every image look the same to the model. Two steps dominate: resize (so all images share one width and height the model expects) and normalize (rescale pixels from 0..255 down to a small range like 0..1). Normalizing keeps training stable.
Run the example below to normalize a tiny "image" by hand — every pixel divided by 255.0.
In real projects you don't do this by hand — torchvision.transforms composes resize, crop, tensor-conversion and normalization into one reusable pipeline. The same recipe must run at training, validation, and inference time.
4 Transfer Learning with a Pretrained Backbone
Training a vision model from scratch needs millions of images. Transfer learning avoids that: you take a backbone (like ResNet-50) that already learned generic features — edges, textures, shapes — from ImageNet, and you only replace its final layer (the head ) so it outputs your classes.
Below, Albumentations builds the augmentation pipelines (note: train augments, val does not) and a pretrained ResNet-50 has its head swapped for 5 classes.
5 The Train / Validate Loop
Training runs in epochs — one full pass over the training data. Each epoch you let the model learn from the train set (compute loss, back-propagate, update weights), then validate on the held-back set without learning from it. Watching train loss fall while val accuracy rises tells you it's working; if val accuracy stalls or drops while train keeps improving, the model is overfitting .
6 Evaluate — Beyond Plain Accuracy
Accuracy alone lies on imbalanced data. If 95% of images are "not cancer", a model that always says "not cancer" scores 95% yet catches nothing. So you also look at precision (of the things I flagged, how many were right?), recall (of the things I should have caught, how many did I?), and F1 (their balance). A confusion matrix shows exactly which classes get mixed up.
Metric
Use when…
Accuracy
Classes are balanced
Precision
False positives are costly (spam filter)
Recall
False negatives are costly (medical)
F1
You want one balanced number
mAP
Object detection (IoU-based)
7 Deployment and Inference
Deployment means running the trained model on one new image at a time. The golden rule: apply the exact same preprocessing you used for validation — never the training augmentation — switch to model.eval() , and run a single forward pass. A softmax turns the raw scores into probabilities so you can report a confidence.
🎯 Your Turn 1: Normalize the Pixels
Fill in the blank so every pixel is scaled to the 0..1 range. Use the expected output to check yourself.
🎯 Your Turn 2: Split 75 / 25
Fill in the two slice indices so the first 25% becomes validation and the rest becomes training.
Common Errors (And How to Fix Them)
You normalize with one mean/std (or resize differently) at training but another at inference. The model sees inputs it was never trained on, so accuracy quietly collapses in production.
✅ Fix: define preprocessing once and reuse the identical transform everywhere — train, validate, and deploy.
Flips and crops on your val set make every run report a different, unrealistic score. You can no longer trust the number.
✅ Fix: keep a separate val transform with only Resize + Normalize — no random ops.
Near-duplicate frames of the same scene land in both train and val, or you compute normalization statistics over the whole dataset before splitting. Offline scores look amazing; real-world performance is poor.
✅ Fix: split first, then compute stats only on the train set; group related images so they never straddle the split.
Feeding raw 0..255 pixels makes loss spike to NaN or stall, because the gradients blow up.
✅ Fix: always scale pixels to a small range (0..1, then ImageNet mean/std) before the model.
📋 Quick Reference
Pipeline Stage
Tools
Key Decisions
Collect & label
Label Studio, CVAT
Class balance, label quality
Split
sklearn, slicing
Train/val ratio, no leakage
Augment (train only)
albumentations, torchvision
Flip, crop, colour jitter
Preprocess
torchvision.transforms
Resize, normalize (same everywhere)
Backbone
timm, torchvision.models
ResNet, ViT, EfficientNet
Train/validate
torch, optimizer, loss_fn
Epochs, watch overfitting
Evaluate
sklearn.metrics
F1, mAP, confusion matrix
Deploy
ONNX, TensorRT
Val transform, eval mode, latency
❓ Frequently Asked Questions
🎯 Mini Challenge: Flip an Image
Now with the support faded — only a comment outline is given. Write the augmentation yourself: mirror each row of a nested-list image left to right.
🎉 Lesson Complete!
You can now walk an image down the whole assembly line: collect and split data, augment the training set, preprocess by resizing and normalizing, transfer-learn a pretrained backbone, run the train/validate loop, evaluate beyond plain accuracy, and deploy for inference — all while keeping preprocessing consistent and avoiding leakage.
🚀 Up next: Object Detection — go from "what is in this image?" to "what is where?", drawing labelled boxes around every object.
Practice quiz
To normalise an 8-bit pixel to the 0..1 range, you:
- Multiply by 255
- Subtract 128
- Divide by 255.0
- Take the square root
Answer: Divide by 255.0. Dividing each pixel by 255.0 maps 0 to 0.0 and 255 to 1.0, the small fixed range models train best on.
Which set should data augmentation (flips, crops, colour jitter) be applied to?
- Training set only
- Validation set only
- Test set only
- All sets equally
Answer: Training set only. Augmentation adds variety for training only; the validation and test sets must stay fixed for an honest score.
Why must validation and test sets NOT be augmented?
- It is too slow
- Augmentation deletes images
- The model can't read flipped images
- So the score you read reflects real-world performance honestly
Answer: So the score you read reflects real-world performance honestly. Augmenting eval sets gives a different, unrealistic number each run, so it no longer reflects real performance.
What does transfer learning with a pretrained backbone like ResNet-50 let you do?
- Train from scratch with no data
- Reuse learned generic features and retrain only a small head for your classes
- Skip preprocessing entirely
- Avoid the train/validate loop
Answer: Reuse learned generic features and retrain only a small head for your classes. The backbone already learned edges/textures from ImageNet; you swap its head and retrain on far less data.
A common train/validation split ratio is:
- 80/20
- 50/50
- 99/1
- 10/90
Answer: 80/20. An 80% train / 20% validation split is a standard default for checking progress on held-back data.
Before validating or deploying a PyTorch model you should call:
- model.train()
- model.reset()
- model.eval()
- model.augment()
Answer: model.eval(). model.eval() freezes dropout and batch-norm behaviour so validation and inference scores are consistent.
What is the golden rule for preprocessing at inference time?
- Use the training augmentation
- Apply the exact same preprocessing used for validation
- Skip normalisation to go faster
- Resize to a random size each call
Answer: Apply the exact same preprocessing used for validation. Inference must use the same resize+normalize as validation — never training augmentation — to avoid skew.
What is data leakage in a CV pipeline?
- Running out of disk space
- Using a GPU
- Augmenting the training set
- Information from val/test sneaking into training (e.g. computing stats over all data before splitting)
Answer: Information from val/test sneaking into training (e.g. computing stats over all data before splitting). Leakage is when val/test info influences training — e.g. near-duplicate frames in both splits, inflating offline scores.
Why is accuracy alone misleading on imbalanced data?
- It is slow to compute
- A model that always predicts the majority class scores high yet catches nothing of the rare class
- It needs a GPU
- It only works for detection
Answer: A model that always predicts the majority class scores high yet catches nothing of the rare class. If 95% of images are 'not cancer', always saying 'not cancer' scores 95% but catches no real cases — use precision/recall/F1.
Inside the training loop, what does a softmax over the final logits produce?
- The raw weights
- The loss value
- Class probabilities that sum to 1
- The learning rate
Answer: Class probabilities that sum to 1. Softmax turns the raw output scores into probabilities (each 0..1, summing to 1) so you can report a confidence.
Continue this course
- Previous: Policy Gradient Methods
- Next: Object Detection