# Schedule {.unnumbered}
*Computer Vision · Semester 2, 2026 · 21 Jul – 27 Oct 2026 · 14 weeks*
Lectures are Tuesdays 14:15–17:00 in LB145; labs are Fridays 10:15–12:00 in
MSL006. Sessions marked **MSc** are for MSc students only. Everything below
filters live — nothing is sent anywhere, it all runs in your browser.
```{=html}
<div class="sched">
<div class="sched-bar">
<div class="chips">
<span class="lbl">view</span>
<button class="chip view active" data-v="agenda">agenda</button>
<button class="chip view" data-v="calendar">calendar</button>
</div>
<input id="schedSearch" class="sched-search" type="search"
placeholder="search sessions, topics, venues…" aria-label="Search the schedule">
</div>
<div class="chips sched-filters">
<span class="lbl">show</span>
<button class="chip f" data-t="Lecture">lectures</button>
<button class="chip f" data-t="Lab">labs</button>
<button class="chip f" data-t="Test">tests</button>
<button class="chip f" data-t="Journal Club">journal club</button>
<button class="chip f" data-t="Presentation">presentations</button>
<button class="chip f" data-t="Milestone">milestones</button>
<button class="chip c" data-c="MSc">MSc only</button>
<button class="chip" id="schedClear">clear</button>
</div>
<div id="schedCount" class="sched-count"></div>
<div id="schedBody"></div>
</div>
<script type="application/json" id="schedData">{"meta":{"code":"CV","title":"Computer Vision","term":"Semester 2, 2026","span":"21 Jul – 27 Oct 2026","weeks":14},"schedule":[{"id":"w1-lec","week":1,"date":"2026-07-21","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Images, Filters & Hand-Crafted Vision","shortTitle":"Filters & Features","details":"Edges, Gabor/MR8, textons to BoVW; ethics: Tiny Images"},{"id":"w1-lab","week":1,"date":"2026-07-24","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"Convolution & classical filtering","shortTitle":"Classical Filtering","details":"Convolution stepper, filter playground, noise film-strip; Canny & SIFT on noisy images"},{"id":"w2-lec","week":2,"date":"2026-07-28","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Learning the Filters: CNNs","shortTitle":"CNNs","details":"Opens on MR8 next to AlexNet learned first-layer filters"},{"id":"w2-lab","week":2,"date":"2026-07-31","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"CNN from scratch (CIFAR)","shortTitle":"CNN Lab","details":"W&B mandatory, seed-everything, overfit-one-batch"},{"id":"w3-milestone","week":3,"date":null,"day":null,"time":null,"venue":null,"type":"Milestone","cohort":"All","title":"Project brief + curated topic/paper lists released","shortTitle":"Project Brief","details":"","calDate":"2026-08-04","approx":true},{"id":"w3-jc","week":3,"date":null,"day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Journal Club","cohort":"MSc","title":"Journal Club kicks off; reproduction paper list released","shortTitle":"JC Kickoff","details":"Three-pass reading protocol; PaperBlitz begins","calDate":"2026-08-04","approx":true},{"id":"w3-lec","week":3,"date":"2026-08-04","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Architectures & Transfer Learning","shortTitle":"Transfer Learning","details":""},{"id":"w3-lab","week":3,"date":"2026-08-07","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"Custom Dataset/DataLoader + transfer learning","shortTitle":"DataLoader Lab","details":"Augmentation pipelines, LR schedulers, checkpointing, AMP"},{"id":"w4-jc","week":4,"date":null,"day":null,"time":null,"venue":null,"type":"Journal Club","cohort":"MSc","title":"Reproduction paper confirmed","shortTitle":"Paper Confirmed","details":"","calDate":"2026-08-11","approx":true},{"id":"w4-lec","week":4,"date":"2026-08-11","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Object Detection: the Two-Stage Lineage","shortTitle":"Two-Stage Detection","details":"R-CNN to Fast to Faster R-CNN; ethics: Gender Shades"},{"id":"w4-lab","week":4,"date":"2026-08-14","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"Two-stage detector; IoU/mAP by hand","shortTitle":"Detection Lab","details":"Hand-annotation (CVAT/Roboflow) begins"},{"id":"w5-milestone","week":5,"date":null,"day":null,"time":null,"venue":null,"type":"Milestone","cohort":"All","title":"Project proposals due","shortTitle":"Proposals Due","details":"","calDate":"2026-08-18","approx":true},{"id":"w5-jc","week":5,"date":null,"day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Journal Club","cohort":"MSc","title":"Journal Club","shortTitle":"Journal Club","details":"","calDate":"2026-08-18","approx":true},{"id":"w5-lec","week":5,"date":"2026-08-18","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"One-Stage Detection","shortTitle":"One-Stage Detection","details":"SSD/YOLO/RetinaNet/FCOS; no-anchors/no-NMS teaser"},{"id":"w5-lab","week":5,"date":"2026-08-21","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"Annotate a dataset; fine-tune YOLO","shortTitle":"Annotation Lab","details":"Inter-annotator agreement; conf/NMS sweep; speed against Lab 4"},{"id":"w6-jc","week":6,"date":null,"day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Journal Club","cohort":"MSc","title":"Journal Club","shortTitle":"Journal Club","details":"","calDate":"2026-08-25","approx":true},{"id":"w6-lec","week":6,"date":"2026-08-25","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Segmentation (CNN era)","shortTitle":"Segmentation","details":"FCN, U-Net, DeepLab, Mask R-CNN; a U-Net is what you train it to predict"},{"id":"w6-lab","week":6,"date":"2026-08-28","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"U-Net segmentation + same U-Net as denoiser","shortTitle":"U-Net Lab","details":"W&B artifacts/checkpointing"},{"id":"w7-lec","week":7,"date":"2026-09-01","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Sequences to Attention to Transformers to ViT","shortTitle":"Transformers & ViT","details":"Captioning worked example, positional encodings in full, Swin"},{"id":"w7-jc","week":7,"date":null,"day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Journal Club","cohort":"MSc","title":"Referee report assigned","shortTitle":"Referee Report","details":"One recent preprint, to be defended orally","calDate":"2026-09-01","approx":true},{"id":"w7-test","week":7,"date":"2026-09-04","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Test","cohort":"All","title":"Test 1 (in lab slot)","shortTitle":"Test 1","details":""},{"id":"w7-lab","week":7,"date":null,"day":null,"time":null,"venue":null,"type":"Lab","cohort":"All","ongoing":true,"title":"Lab 8 (take-home): BLIP warm-up, sinusoidal PEs, ViT fine-tune","shortTitle":"ViT Fine-tune Lab","details":"Runs around Test 1","calDate":"2026-09-01","approx":true},{"id":"break-midterm","week":null,"date":null,"day":null,"time":null,"venue":null,"type":"Break","cohort":"All","title":"Mid-term break (7–13 Sep)","shortTitle":"Mid-term Break","details":"Rosh Hashanah 12–13 Sep falls in the break"},{"id":"w8-jc","week":8,"date":null,"day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Journal Club","cohort":"MSc","title":"Journal Club","shortTitle":"Journal Club","details":"","calDate":"2026-09-15","approx":true},{"id":"w8-lec","week":8,"date":"2026-09-15","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Detection & Segmentation, Transformed","shortTitle":"Transformer Det.","details":"DETR, Mask2Former, SAM/SAM2, open-vocab; ethics: SA-1B claims. Term 4 begins"},{"id":"w8-lab","week":8,"date":"2026-09-18","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"DETR query viz; SAM prompting; Grounding DINO","shortTitle":"DETR & SAM Lab","details":""},{"id":"w9-milestone","week":9,"date":null,"day":null,"time":null,"venue":null,"type":"Milestone","cohort":"All","title":"Scope-refinement check-in; MSc reproduction progress","shortTitle":"Scope Check-in","details":"Both cohorts refine scope; MSc report progress in the JC tail","calDate":"2026-09-22","approx":true},{"id":"w9-pres","week":9,"date":"2026-09-22","day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Presentation","cohort":"MSc","title":"JC Presentation session 1 — 4 papers (the authors + Reviewer 2)","shortTitle":"JC Papers 1","details":"Each paper presented in role by its author, with its assigned Reviewer 2"},{"id":"w9-lec","week":9,"date":"2026-09-22","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Self-Supervised Learning","shortTitle":"Self-Supervised","details":"SimCLR/MoCo, BYOL/DINO, MAE, DINOv2; denoising-as-pretext. Yom Kippur Mon 21 Sep"},{"id":"w9-lab","week":9,"date":"2026-09-25","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"Linear-probe 4 feature sets; HPO sweep","shortTitle":"Linear Probe Lab","details":"W&B Sweeps/Optuna (supervised, SimCLR, DINOv2, Wk-6 denoiser)"},{"id":"w10-pres","week":10,"date":"2026-09-29","day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Presentation","cohort":"MSc","title":"JC Presentation session 2 — 4 papers (the authors + Reviewer 2)","shortTitle":"JC Papers 2","details":"The other four; everyone presents once and reviews once"},{"id":"w10-lec","week":10,"date":"2026-09-29","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"CLIP & Vision-Language Pretraining","shortTitle":"CLIP & VLP","details":""},{"id":"w10-lab","week":10,"date":"2026-10-02","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"CLIP zero-shot; inspect text embeddings; find a bias","shortTitle":"CLIP Zero-shot","details":"ethics: CLIP bias; Sukkot (minor)"},{"id":"w11-jc","week":11,"date":null,"day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Journal Club","cohort":"MSc","title":"Journal Club","shortTitle":"Journal Club","details":"","calDate":"2026-10-06","approx":true},{"id":"w11-lec","week":11,"date":"2026-10-06","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Vision-Language Models","shortTitle":"VLMs","details":"LLaVA"},{"id":"w11-test","week":11,"date":"2026-10-09","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Test","cohort":"All","title":"Test 2 (in lab slot)","shortTitle":"Test 2","details":""},{"id":"w11-lab","week":11,"date":null,"day":null,"time":null,"venue":null,"type":"Lab","cohort":"All","ongoing":true,"title":"Lab 12 (take-home): VLM inference/fine-tune","shortTitle":"VLM Lab","details":"Runs around Test 2","calDate":"2026-10-06","approx":true},{"id":"w12-lec","week":12,"date":"2026-10-13","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Diffusion: the Mechanism","shortTitle":"Diffusion Mechanism","details":"DDPM, DDIM, classifier-free guidance"},{"id":"w12-jc","week":12,"date":"2026-10-13","day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Journal Club","cohort":"MSc","title":"Oral PaperBlitz","shortTitle":"Oral PaperBlitz","details":"An unseen paper, three-pass triage under time pressure"},{"id":"w12-lab","week":12,"date":"2026-10-16","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"DDPM from scratch (MNIST) + class-conditional + CFG sweep","shortTitle":"DDPM Lab","details":"Reuses Wk-6 denoiser & Wk-7 PEs"},{"id":"w13-lec","week":13,"date":"2026-10-20","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"Diffusion: the Systems","shortTitle":"Diffusion Systems","details":"Latent diffusion, DiT, flow matching"},{"id":"w13-jc","week":13,"date":"2026-10-20","day":"Tue","time":"14:15–17:00 (tail)","venue":"LB145","type":"Journal Club","cohort":"MSc","title":"Reproduction vivas + report-back","shortTitle":"Repro Vivas","details":"Defend reproduction on own code; what-didn't-reproduce write-up due"},{"id":"w13-lab","week":13,"date":"2026-10-23","day":"Fri","time":"10:15–12:00","venue":"MSL006","type":"Lab","cohort":"All","title":"Stable Diffusion inference; guidance/steps sweep; img2img; LoRA","shortTitle":"Stable Diffusion Lab","details":"ethics: C2PA provenance; last Friday lab"},{"id":"w14-lec","week":14,"date":"2026-10-27","day":"Tue","time":"14:15–17:00","venue":"LB145","type":"Lecture","cohort":"All","title":"3D Vision & Neural Rendering","shortTitle":"NeRF & 3DGS","details":"NeRF + Gaussian Splatting; live splat demo; ethics: capture consent. Last teaching day"},{"id":"w14-pres","week":14,"date":null,"day":null,"time":"TBC","venue":"TBC","type":"Presentation","cohort":"All","title":"Project presentations — extra session","shortTitle":"Project Pres.","details":"Honours + MSc; short live Q&A carries part of project mark; no Friday lab this week (30 Oct is study break)","calDate":"2026-10-27","approx":true},{"id":"break-study","week":null,"date":null,"day":null,"time":null,"venue":null,"type":"Break","cohort":"All","title":"Study break (28 Oct – 1 Nov); Exams (2–27 Nov)","shortTitle":"Study Break","details":"Diwali Sun 8 Nov falls in the exam period"}]}</script>
<script>
(() => {
const DATA = JSON.parse(document.getElementById("schedData").textContent);
const EVENTS = DATA.schedule;
const $ = id => document.getElementById(id);
const MONTHS = ["January","February","March","April","May","June","July",
"August","September","October","November","December"];
const SHORT = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
const HOLIDAYS = { "2026-08-10": "Women's Day (observed)", "2026-09-24": "Heritage Day" };
const PERIODS = [
{ start: "2026-07-20", end: "2026-09-04", kind: "term", label: "Block 3" },
{ start: "2026-09-07", end: "2026-09-13", kind: "break", label: "Block break" },
{ start: "2026-09-14", end: "2026-10-27", kind: "term", label: "Block 4" },
{ start: "2026-10-28", end: "2026-11-01", kind: "break", label: "Study break" },
{ start: "2026-11-02", end: "2026-11-27", kind: "exam", label: "Exams" },
];
const periodFor = k => PERIODS.find(p => k >= p.start && k <= p.end);
const cls = t => "ev-" + t.toLowerCase().replace(/ /g, "-");
const esc = s => (s ?? "").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
let view = "agenda", types = new Set(), mscOnly = false, query = "";
const matches = e => {
if (types.size && !types.has(e.type)) return false;
if (mscOnly && e.cohort !== "MSc") return false;
if (query) {
const hay = [e.title, e.details, e.venue, e.type, "week " + e.week]
.join(" ").toLowerCase();
if (!hay.includes(query)) return false;
}
return true;
};
// ---------------- agenda ----------------
function agenda(list) {
const weeks = [...new Set(list.map(e => e.week).filter(w => w != null))]
.sort((a, b) => a - b);
let rows = "";
for (const w of weeks) {
list.filter(e => e.week === w).forEach((e, i) => {
rows += row(e, i === 0 ? w : null, i === 0);
});
}
list.filter(e => e.week == null).forEach(e => { rows += row(e, null, true); });
if (!rows) return '<p class="sched-empty">No sessions match those filters.</p>';
return `<table class="cv-schedule">
<colgroup><col style="width:2.8rem"><col style="width:6.8rem"><col style="width:10rem"><col><col style="width:8.5rem"></colgroup>
<thead><tr><th>Wk</th><th>Date</th><th>Type</th><th>Session</th><th>Time / venue</th></tr></thead>
<tbody>${rows}</tbody></table>`;
}
function row(e, weekNo, isFirst) {
const date = e.date
? `${e.date.slice(8)} ${SHORT[+e.date.slice(5, 7) - 1]}` +
(e.day ? ` <span class="day">${esc(e.day)}</span>` : "")
: "—";
return `<tr class="${cls(e.type)}${isFirst ? " week-start" : ""}">
<td class="wk">${weekNo != null ? "<b>" + weekNo + "</b>" : ""}</td>
<td class="dt">${date}</td>
<td class="ty"><span class="tag">${esc(e.type)}</span>${
e.cohort === "MSc" ? '<span class="tag msc">MSc</span>' : ""}</td>
<td class="ti"><b>${esc(e.title)}</b>${
e.details ? `<div class="dl">${esc(e.details)}</div>` : ""}</td>
<td class="vn">${esc(e.time || "")}${e.venue ? "<br>" + esc(e.venue) : ""}</td>
</tr>`;
}
// ---------------- calendar ----------------
const key = d => d.toISOString().slice(0, 10);
const mondayIndex = d => (d.getDay() + 6) % 7;
function calendar(list) {
const byDate = new Map();
for (const e of list) {
const k = e.date || e.calDate;
if (!k) continue;
if (!byDate.has(k)) byDate.set(k, []);
byDate.get(k).push(e);
}
let html = `<div class="cal-legend">
<span><i class="sw ev-lecture"></i>lecture</span>
<span><i class="sw ev-lab"></i>lab</span>
<span><i class="sw ev-test"></i>test</span>
<span><i class="sw ev-journal-club"></i>journal club</span>
<span><i class="sw ev-presentation"></i>presentation</span>
<span><i class="sw ev-milestone"></i>milestone</span>
<span><i class="sw sw-holiday"></i>public holiday</span>
<span><i class="sw sw-out"></i>weekend / out of block</span>
<span><i class="sw band-term"></i>block</span>
<span><i class="sw band-break"></i>break</span>
<span><i class="sw band-exam"></i>exams</span>
<span class="approx-key">~ during that week, no fixed slot</span>
</div>`;
for (let m = 6; m <= 10; m++) { // July … November 2026
const first = new Date(Date.UTC(2026, m, 1));
const cursor = new Date(first);
cursor.setUTCDate(1 - mondayIndex(first));
let cells = "";
for (let i = 0; i < 42; i++) {
const k = key(cursor);
const inMonth = cursor.getUTCMonth() === m;
const evs = inMonth ? (byDate.get(k) || []) : [];
const p = periodFor(k);
const weekend = mondayIndex(cursor) >= 5;
const hol = inMonth ? HOLIDAYS[k] : null;
const state = !inMonth ? "out"
: hol ? "hol"
: (weekend || !p || p.kind !== "term") ? "dim" : "";
const bandStart = p && k === p.start;
const bandEnd = p && k === p.end;
const showLabel = inMonth && p && (bandStart || cursor.getUTCDate() === 1);
cells += `<div class="cal-cell ${state}">
${p && inMonth ? `<div class="cal-band band-${p.kind}${
bandStart ? " band-start" : ""}${bandEnd ? " band-end" : ""}"></div>` : '<div class="cal-band"></div>'}
${showLabel ? `<div class="cal-period">${esc(p.label)}</div>` : ""}
<div class="cal-num">${cursor.getUTCDate()}</div>
${hol ? `<div class="cal-hol">${esc(hol)}</div>` : ""}
${evs.map(e => `<div class="cal-ev ${cls(e.type)}${e.approx ? " approx" : ""}" title="${
esc(e.type)} · ${esc(e.title)}${e.approx ? " (during this week)" : ""}">${
e.approx ? "~ " : ""}${esc(e.shortTitle || e.title)}</div>`).join("")}
</div>`;
cursor.setUTCDate(cursor.getUTCDate() + 1);
}
html += `<section class="cal-month">
<h3>${MONTHS[m]} 2026</h3>
<div class="cal-grid">
${["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
.map(d => `<div class="cal-dow">${d}</div>`).join("")}
${cells}
</div></section>`;
}
const undated = list.filter(e => !e.date && !e.calDate);
if (undated.length) {
html += `<section class="cal-month"><h3>No fixed date</h3>` +
undated.map(e => `<div class="cal-undated ${cls(e.type)}">
<span class="tag">${esc(e.type)}</span> <b>${esc(e.title)}</b>
${e.week != null ? `<span class="wkno">week ${e.week}</span>` : ""}
</div>`).join("") + "</section>";
}
return html;
}
// ---------------- wiring ----------------
function render() {
const list = EVENTS.filter(matches);
$("schedBody").innerHTML = view === "agenda" ? agenda(list) : calendar(list);
const total = EVENTS.length;
$("schedCount").textContent = list.length === total
? `${total} sessions`
: `${list.length} of ${total} sessions`;
$("schedClear").hidden = !(types.size || mscOnly || query);
}
document.querySelectorAll(".view").forEach(b => b.addEventListener("click", () => {
view = b.dataset.v;
document.querySelectorAll(".view").forEach(x => x.classList.toggle("active", x === b));
render();
}));
document.querySelectorAll(".f").forEach(b => b.addEventListener("click", () => {
const t = b.dataset.t;
types.has(t) ? types.delete(t) : types.add(t);
b.classList.toggle("active", types.has(t));
render();
}));
document.querySelectorAll(".c").forEach(b => b.addEventListener("click", () => {
mscOnly = !mscOnly;
b.classList.toggle("active", mscOnly);
render();
}));
$("schedSearch").addEventListener("input", e => {
query = e.target.value.trim().toLowerCase();
render();
});
$("schedClear").addEventListener("click", () => {
types.clear(); mscOnly = false; query = "";
$("schedSearch").value = "";
document.querySelectorAll(".f, .c").forEach(x => x.classList.remove("active"));
render();
});
render();
})();
</script>
```
::: {.callout-note icon=false collapse=true}
## Dates worth noting
- **Test 1** (written) and **Test 2** (practical) both run in the Friday lab slot; that week's lab work continues as take-home.
- Week 14 has no Friday lab — 30 October falls in the study break — so project presentations run in an extra session, timing to be confirmed.
- The mid-term break falls between Weeks 7 and 8.
:::