ROB 498 / 599 · Fall 2026 · Unit 0
Bridge modules
Everything this course assumes from classical computer vision and deep learning. This material is taught in class, across the first five lectures; these notes are the written reference that goes with them, the full derivations, the traps, and the self-checks the diagnostic is built from.
00 · How these work
Read for the interface, not for the derivation
These modules are not a computer vision course in miniature. They cover the specific results this course uses, and each topic says plainly where it gets used, which lecture, which lab, which line of the starter code. If a classical result does not show up later, it is not here, however beautiful it is.
Every topic has the same four parts: the content, a Used by box tying it to something concrete in this course, a Trap box for the mistake people actually make, and two or three self-checks. The self-checks are the diagnostic's difficulty. If you can answer them without looking anything up, you are ready.
These notes were previously assigned as asynchronous modules. They are now lectured, and the notes are what you read alongside: self-contained, with the derivations worked at a pace a slide cannot manage. Where a lecture moves faster than you want, the corresponding topic below is the place to slow down.
Which lecture covers what
| Lecture | Topics |
|---|---|
| L01 · Mon Aug 31 | A1, pinhole camera, intrinsics and extrinsics, the camera matrix, distortion, calibration as estimation |
| L02 · Wed Sep 2 | Rigid-body state on SE(3). Not a module topic, but the conventions fixed here are assumed by all of them |
| L03 · Wed Sep 9 | A2, rigid-body state on SO(3) and SE(3), epipolar geometry and the eight-point algorithm, which points can be matched |
| L04 · Mon Sep 14 | A4, A5, A6, then A3: features and matching, RANSAC, triangulation, structure from motion and bundle adjustment, visual SLAM, then stereo |
| L05 · Wed Sep 16 | The rest of A3, LiDAR and metric versus relative depth, then an introduction to neural networks: gradient descent and backpropagation, activations, softmax, training and validation, normalisation, and convolutional networks. Module B goes further than this lecture: reverse-mode cost and memory in B1, sparse convolution in B2, attention in B3, and training at scale in B4 |
If you have taken EECS 442, CMU 16-385, or an equivalent, read for the Used by and Trap boxes. They are the parts a general vision course would not have told you. If you have not, read the topic before or after its lecture rather than the night before the quiz. Module A carries Lab 1 almost entirely.
01 · What to skip
If you took EECS 442
Fall 2025 mapping. Where a topic is covered, the module is revision and you can go straight to the self-checks; where it is not, read it properly.
| Bridge topic | EECS 442 (F25) | Read it? |
|---|---|---|
| A1 Camera model, calibration | Lec 5, Image formation | Skim. 442 does not cover distortion estimation or extrinsic calibration; A1's second half is new. |
| A2 Two-view geometry | Lec 6, Multi-view geometry | Skim. |
| A3 Stereo and depth error | Lec 6, Stereo vision | Read the error analysis. 442 does not dwell on the Z² result, and depth sensing leans on it. |
| A4 Features and descriptors | Lec 7, Lec 9, Correspondences, keypoints | Skim. |
| A5 RANSAC | Lec 7, Fitting geometric models | Skim. |
| A6 Triangulation, PnP, BA | Lec 7, Lec 8, Triangulation, SfM, visual SLAM | Read the factor-graph framing. It is how the course poses SLAM. |
| B1 Autograd and backprop | Lec 13, Optimization | Skim. |
| B2 CNNs | Lec 14, Convolutional networks | Read the sparse-convolution part. Dense 3D convolution is not viable at the resolutions Lab 1 uses. |
| B3 Attention and transformers | Lec 18, Transformer | Read the permutation-equivariance part. It is why transformers took over point-cloud processing. |
| B4 Training practicalities | Lec 11–13, Sec 8, SGD, PyTorch | Skim, then read the reproducibility part, the labs grade you on it. |
Nothing in Module A or B requires 442. The mapping exists so that people who took it do not sit through material twice.
Geometric vision
How a 3D point becomes a pixel, and how to invert that when you have more than one view. Six topics, ending where this course begins: estimating many poses and many points jointly from noisy measurements.
The pinhole camera and calibration
A camera maps a world point to a pixel by a rigid transform into the camera frame, a perspective divide, and an affine map into pixels:
Four intrinsic parameters that matter: focal lengths fx, fy in pixels and the
principal point cx, cy. The principal point sits a few pixels off the image
centre. It is usually within a few pixels of it, and assuming otherwise puts a small
systematic bend in every reconstruction you build.
Real lenses are not pinholes. The standard correction is radial plus tangential, applied
in normalised coordinates before K:
Calibration estimates all of this from images of a known target. Zhang's
method uses a planar checkerboard at several orientations: each view gives a homography
between the board plane and the image, each homography constrains the image of the absolute
conic, and enough of them determine K. Then everything is refined by minimising
reprojection error over intrinsics, distortion, and the per-view board poses.
K is right; a bad calibration does not announce itself,
it just puts your Part D mesh slightly through the wall.ReadSzeliski §2.1.4 (projective camera), §11.1.4 (calibration). CMU 16-385 Camera models, both lectures.
- A camera has
fx = 600 pxand images a 10 cm object at 3 m. How many pixels wide is it? - You halve the image resolution by binning 2×2. What happens to
fx, fy, cx, cy? - Why does an RMS reprojection error of 3 px mean you should look for bad frames rather than accept the calibration?
Two-view geometry
Given the same scene point in two images, the two rays must intersect. That single constraint is the whole of two-view geometry. In pixels it is the fundamental matrix; in calibrated normalised coordinates it is the essential matrix:
The rank-2 condition is not decoration: it is what makes every point in one image map to a
line in the other rather than a point. Estimating F without enforcing
it gives epipolar lines that fail to meet at a common epipole.
Decomposing E by SVD gives four candidate (R, t)
pairs: two rotations times two translation signs. Only one puts triangulated points in
front of both cameras; that cheirality test is how you pick it. Triangulate a single
point and check the sign of both depths.
t comes out of E as a unit vector.
A monocular pipeline has no metric scale, and this is where it goes missing: not in
some later approximation. Lab 2 D2 asks what the recovered scale factor means for a robot
that needs metres; the honest answer starts here.ReadHartley & Zisserman ch. 9–11 is the reference; Szeliski §11.3 is faster. CMU 16-385 Two-view geometry. TUM Multiple View Geometry lectures 5–7 if you want it derived slowly on video.
- Why does
Fhave 7 degrees of freedom and not 8, given it is a 3×3 matrix defined up to scale? - Both cameras translate purely along their optical axis. What do the epipolar lines look like?
- You decompose
Eand all four candidates put some points behind a camera. What went wrong?
Stereo and the depth error that follows from it
Rectify two views so epipolar lines are corresponding image rows, and matching becomes a
1D search along a row. Disparity d, the horizontal shift of the match, gives depth directly:
Differentiate. This is the most consequential equation in Module A:
Disparity error is roughly constant across the image. It is a matching problem, not a distance problem. Depth standard deviation therefore grows with the square of range, and depth variance with the fourth power. A stereo rig accurate to a centimetre at 1 m is accurate to about 25 cm at 5 m, with nothing changed but the distance.
The same shape holds, for different reasons, across the depth sensors in Unit 0: structured light degrades with range as the projected pattern spreads; time-of-flight is more nearly constant in range but fails on dark and specular surfaces; and every one of them is worse at grazing incidence.
w ∝ 1/Z⁴; many published systems use w ∝ 1/Z²
instead, which is a deliberate softening rather than the principled choice. Either is
defensible, state which you used and why, and note that grazing incidence deserves a
factor too.ReadSzeliski §12.1–12.4. CMU 16-385 Stereo. Nguyen et al., Modeling Kinect Sensor Noise (3DIMPVT 2012) for a measured axial-noise model of a real depth camera.
- A rig has
f = 700 px,B = 12 cm, and matches good to 0.25 px. What is σ_Z at 2 m? At 6 m? - You double the baseline. What improves, and what gets worse?
- Why does a textureless white wall break stereo but not time-of-flight?
Features, descriptors, and matching
Detection finds repeatable points. The Harris criterion looks at the structure tensor of local gradients: two large eigenvalues means a corner, one means an edge, none means flat, and a corner is exactly the case where a small shift in any direction changes the patch, which is what makes it locatable.
Description summarises the neighbourhood so it can be recognised from another viewpoint. SIFT builds a gradient-orientation histogram over a scale- and rotation-normalised patch; ORB pairs a FAST detector with a binary BRIEF descriptor compared by Hamming distance, which is far cheaper and is what you find inside real-time SLAM systems. Learned front-ends (SuperPoint, and the detector-free matchers that followed) now beat both on hard viewpoint change.
Matching is where the errors come from. Two standard filters: Lowe's ratio test, rejecting a match when the best and second-best distances are too close (≈ 0.8), and mutual nearest neighbour, keeping a pair only if each is the other's best. Both are cheap and both remove far more bad matches than they cost you good ones.
ReadSzeliski §7.1–7.2. CMU 16-385 Feature and corner detection and Feature descriptors and matching.
- Why does a corner localise well while an edge does not, in terms of the structure tensor's eigenvalues?
- What does the ratio test do that a plain distance threshold cannot?
- Your matcher returns 2,000 matches of which 400 are correct. Which of the two filters above would you reach for first, and why?
RANSAC and robust fitting
Least squares assumes every measurement is a measurement. Correspondence sets violate that badly: a wrong match is not a noisy measurement of the right answer, it is a measurement of something else entirely, and one of them can drag a fit arbitrarily far.
RANSAC handles this by hypothesis and verification: draw the minimum number of points that
determine a model, fit, count how many of the rest agree, keep the best, refit on its
consensus set. The iteration count follows from wanting to draw one all-inlier sample with
probability p:
Note how violently N depends on s and w. This is why
minimal solvers matter: a 4-point solver is tractable where an 8-point one is not, at the same
inlier rate.
The continuous cousin is a robust loss, Huber, Tukey, which down-weights large residuals instead of hard-classifying them. Robust losses need an initialisation good enough that inliers already dominate; RANSAC does not. In practice you use RANSAC to get there and a robust loss to refine.
ReadSzeliski §8.1.4. CMU 16-385 Image homographies covers RANSAC in the setting it is usually first met.
- Recompute
Nforp = 0.99,w = 0.5,s = 7. Why is the jump froms = 4so large? - Why refit on the consensus set instead of returning the minimal-sample model?
- When would you prefer a Huber loss over RANSAC outright?
Triangulation, PnP, and bundle adjustment
Three estimation problems, distinguished by what is known and what is being solved for.
Triangulation, poses known, find the point. Two rays never quite meet under noise, so the linear (DLT) solution minimises an algebraic residual and the optimal one minimises reprojection error in both images. Always check cheirality: a triangulated point behind a camera is a sign the correspondence is wrong, not that the point is unusual.
PnP, points known, find the pose. Three correspondences give up to four solutions (P3P) and a fourth point disambiguates. Wrapped in RANSAC, this is how a system relocalises against an existing map.
Bundle adjustment, solve for everything at once, minimising total reprojection error over all poses and all points:
The problem is enormous and almost entirely sparse: pose i and point
j interact only if j was seen in view i. Exploiting
that structure, eliminating the points via the Schur complement and solving the much
smaller pose system, is what makes it tractable at all.
The modern framing is a factor graph: variables are poses and landmarks, factors are measurements, and each factor carries a noise model. Marginalising the landmarks out leaves a pose graph, poses connected by relative-pose constraints. That is exactly the structure of Lab 1 Part E, and it is why the loop-closure covariance you supply there is not a formality: it sets how the correction is distributed around the loop.
(ω, v) while this course uses (v, ω), the starter code says so twice because it is silent when you get it wrong.ReadSzeliski §11.4. Dellaert & Kaess, Factor Graphs for Robot Perception §1–3, the reference for Unit 1, listed under Resources. CMU 16-822 covers the geometry end in depth.
- Why is bundle adjustment sparse, and which matrix block does the Schur complement eliminate?
- What does marginalising landmarks out of a factor graph leave you with?
- You add a loop closure and the trajectory error gets worse. Give two explanations and say how you would tell them apart.
Deep learning
Four topics, chosen for what the labs actually require: a working mental model of autograd, enough about convolution to understand why the 3D version is sparse, enough about attention to understand why it took over point clouds, and the practical knowledge that separates a training run you can report from one you cannot.
Autograd and backpropagation
A network is a composition of differentiable operations. Evaluating it builds a
computation graph whose nodes are operations and whose edges carry
intermediate values. Backpropagation is the chain rule applied to that graph in reverse
topological order: seed ∂L/∂L = 1 at the loss and push gradients
backward, each node turning the gradient of its output into the gradient of its inputs.
Why reverse mode? Cost scales with the number of outputs, not inputs. Forward mode costs one pass per input variable; reverse mode costs one forward and one backward pass regardless of how many parameters there are. With a scalar loss and ten million parameters, that difference is the entire field.
The price is memory: the backward pass needs values cached from the forward pass, so activation memory grows with depth and batch size. That is what gradient checkpointing trades back, recompute instead of store, and it is usually the first thing to reach for when Lab 2 runs out of GPU memory.
When a hand-written gradient is wrong, check it numerically before debugging anything else:
ReadOlah, Calculus on Computational Graphs, the clearest short treatment. Szeliski §5.3.5–5.3.6. PyTorch's autograd tutorial for the mechanics.
- Why is reverse-mode preferred for a scalar loss and forward-mode for a scalar input?
- Your gradient check gives a relative error of 0.3 for one parameter and 1e-9 for the rest. What kind of bug is that?
- What exactly does gradient checkpointing trade away?
Convolutional networks, and why 3D breaks them
A convolution slides a small learned kernel over the input, sharing weights across position. That weight sharing buys two things: far fewer parameters than a dense layer, and translation equivariance, shift the input, and the output shifts with it. For images, where a cat is a cat wherever it appears, that is exactly the right prior.
Receptive field grows linearly with depth at stride 1, and multiplicatively once you stride or dilate. Normalisation matters more than it looks: batch norm computes statistics across the batch, which breaks without warning when the batch is small or when examples have different numbers of elements, both of which are true for point clouds. Group and layer norm do not have that dependence, which is why you see them in 3D architectures.
Now make it 3D. A dense 3D convolution over a 10×10×3 m room at 1 cm is 3×10⁸ voxels, of which the observed surface occupies well under one percent. Nearly all the compute is spent multiplying zeros, and memory is worse.
Sparse convolution is the answer: store only occupied voxels in a hash table, and define the convolution to produce output only where there is input. MinkowskiNet is the standard implementation, and point transformers are the attention-based alternative. The speedup in practice is smaller than the occupancy ratio suggests, gather/scatter over a hash table has poor memory locality compared to a dense tensor, and that gap is a real cost, not an implementation defect.
ReadSzeliski §5.4. Stanford CS231n's convolutional-networks notes are still the best introduction. Then Choy et al., 4D Spatio-Temporal ConvNets, which is on the Unit 1 reading list.
- Input 64, kernel 3, stride 2, padding 1. What is the output size?
- Why does batch norm misbehave on point clouds in a way it does not on images?
- At 1% occupancy a sparse conv should be ~100× cheaper. Give two reasons the measured speedup is smaller.
Attention and transformers
Attention lets every element look at every other element and decide what to take:
Queries ask, keys advertise, values carry content. The √d_k is not
cosmetic: without it the dot products grow with dimension, the softmax saturates, and
gradients vanish. Multiple heads run this in parallel in different learned subspaces so one
head can track geometry while another tracks appearance.
The property that matters for this course is that self-attention is permutation-equivariant. Reorder the inputs and the outputs reorder identically; nothing in the operation assumes a grid, a sequence, or any neighbourhood structure. A point cloud is an unordered set, so attention fits it natively where convolution has to be told what "adjacent" means. Positional information is then injected explicitly, and in 3D that means encoding coordinates, which is a modelling choice rather than a given.
The cost is O(n²d) in the number of elements. A room at useful resolution
has far too many points for that, which is why practical point transformers restrict attention
to neighbourhoods or serialise points along a space-filling curve to get locality back
cheaply. Recognising that these are all workarounds for one quadratic is most of what you need
to read the architectures in Units 1 and 4.
ReadVaswani et al., Attention Is All You Need, then The Annotated Transformer, which walks the paper line by line as runnable code. Dive into Deep Learning ch. 11 if you want it worked more slowly.
- What breaks if you drop the
√d_kscaling? - Why is permutation equivariance an advantage for point clouds and a problem for language?
- Two ways to avoid the
O(n²)cost on a large point cloud, and what each gives up.
Training practicalities
Optimisers. SGD with momentum still generalises best on vision tasks given a tuned schedule; AdamW is more forgiving and is what you should reach for first on an unfamiliar problem. The "W" matters, decoupled weight decay behaves as regularisation should, whereas Adam's original L2 term interacts with the adaptive scaling in ways that make the decay coefficient mean something different at every parameter.
Learning rate is the hyperparameter worth your tuning time; nothing else is close. Warm up over the first few hundred steps, then decay, cosine is a reasonable default. If a run diverges in the first epoch, the learning rate is too high before it is anything else.
Reading a curve. Training loss falling while validation rises is overfitting: more augmentation, more regularisation, or early stopping. Both flat and high is underfitting or a learning rate far off. Loss spiking irregularly usually means the rate is too high or a few batches contain something pathological, and in 3D, "pathological" is often a scan with almost no points in it.
Reproducibility. Seed Python, NumPy, and Torch, and record the seed. Note that seeding gives you reproducibility, not determinism: several CUDA kernels are nondeterministic regardless, and forcing determinism costs speed. Report which one you had.
rob498.report.Table will refuse to render a table whose conditions
are unset. The starter code does the bookkeeping; you have to have run the thing.torch.cuda.synchronize() before you stop the clock, or you are timing kernel
launches rather than kernels and your numbers will be implausibly good.
reset_peak_memory_stats before the region you care about, or peak memory reflects
something earlier in the run.ReadPyTorch's Learn the Basics for the mechanics. Dive into Deep Learning ch. 12 for optimisation. Michigan's ROB 498 DeepRob has a practical treatment aimed at robotics specifically.
- Why does AdamW's decoupled decay behave differently from Adam with an L2 penalty?
- Training loss is flat from step 0 and validation never moves. Name three causes and the order you would check them.
- Why is a seeded run not necessarily a bit-identical run on a GPU?
02 · Diagnostic
What the diagnostic asks
Two Canvas quizzes, ten questions each, both due Sunday Sep 27. 5% of the course grade, 2.5% each.
Twenty questions in total, two per topic: at the difficulty of the self-checks above for Module A, and of the lecture's worked examples for neural networks. Short numeric answers, multiple choice, and a few multiple-select "which of these are true" items. Open notes, unlimited attempts, and no time limit beyond the deadline. Nothing on either quiz requires a derivation you have not been shown.
The split follows what has been lectured, not the module letters. Quiz 1 covers A1, A2, A4, A5 and A6, plus this course's pose conventions, all of it taught by the first half of the Sep 14 lecture. Quiz 2 covers A3, lectured in the second half of Sep 14 and at the start of Sep 16, which is why the depth questions are on the second quiz and not the first. It also covers the introduction to neural networks from Sep 16: gradient descent and backpropagation, activations and classification, training and generalisation, and convolutional layers. Attention (B3) was not lectured, so it is not on the quiz.
Unlimited attempts exist because the diagnostic is meant to tell you what to reread, not to sort you. If you score badly, the feedback names the topics; reread those and take it again. The only way to lose the 5% is to not take it.
Two things it deliberately checks, because they cause trouble later: whether you can state how depth error scales with range, and whether you can say what a pose actually maps to what under this course's conventions. Both appear in Lab 1 within a fortnight.
Staff
The question bank is written: twenty items, two per topic, with an answer key, a rationale per question, and a per-question “if you missed this, reread…” pointer that Canvas shows as general feedback. The authoring copy is here; the two Canvas QTI packages are generated from the same source, so the quizzes and this page cannot drift apart.
03 · Going deeper
If you want the full course
These modules are deliberately narrow. If a topic caught your interest, these are where to take it further, all free and all complete courses rather than isolated lectures.
| Resource | What it is | Good for |
|---|---|---|
| Szeliski, Computer Vision: Algorithms and Applications | The standard text, free online | Every topic in Module A; the reference this course cites |
| CMU 16-385 Computer Vision | Undergraduate course, full slide decks | Camera models, two-view geometry, stereo, features, the clearest slides for Module A |
| CMU 16-822 Geometry-based Methods in Vision | Graduate geometry course | Module A taken seriously: projective geometry, multi-view reconstruction |
| Hartley & Zisserman, Multiple View Geometry | The reference book | A2 and A6 in full rigour, when you need the actual theorem |
| TUM Multiple View Geometry | Cremers' lecture series, recorded | Two-view geometry derived slowly, on video |
| Stanford CS231A | Computer vision from 3D reconstruction to recognition | The bridge between Modules A and B, in one course |
| Stanford CS231n | Convolutional networks for visual recognition | B1 and B2; the notes outlast the lectures |
| Dive into Deep Learning | Interactive book with runnable code | All of Module B, worked slowly with executable examples |
| The Annotated Transformer | The paper as runnable code | B3, if the equation did not land |
| Olah, Calculus on Computational Graphs | Short essay | B1, and the best half hour you can spend on backprop |
| Michigan ROB 498 DeepRob | Deep learning for robotics | Module B aimed at robot problems rather than image classification |
| PyTorch, Learn the Basics | Official tutorial | B4, if you have not written a training loop before |