Download Resume
Approach
OpenCV's built-in pretrained Haar Cascade face detector — the Viola-Jones algorithm, 2001.

Haar wavelets are simple, fixed light/dark rectangular patterns — for example, checking whether a region is darker on top than below, which roughly matches eyebrow-to-cheek contrast. Those rectangle templates are hand-designed, not learned, and there's no neural network here. But the classifier itself is trained: AdaBoost selects which of thousands of candidate rectangle features are actually discriminative and chains them into a cascade of weak classifiers, using labeled face/non-face examples. So this isn't "no learning" — it's hand-designed features plus a learned classifier, the same category as Level 2's HOG+SVM, just with weaker features (raw intensity contrast vs. gradient orientation) and an AdaBoost cascade instead of an SVM.

This is also the pipeline's proof of concept: load an image, run detection, draw a box, save the result. Validating that end-to-end flow on the simplest possible case, before introducing any model weights, gives every later level a debugging baseline — if something breaks in Level 4 or Level 8, the problem is in the new logic, not the load/detect/draw/save loop itself.

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
Original, unannotated group photo of about ten people
Before — the original, unannotated photo.
Haar cascade face detection boxes on the same group photo
After — missed several faces with head tilt or partial occlusion from overlapping people; one false positive on fabric folds coincidentally matching the pattern.

Terminal output

Detected 8 face(s)
  Box: x=196, y=57, width=75, height=75
  Box: x=401, y=57, width=96, height=96
  Box: x=323, y=130, width=74, height=74
  Box: x=123, y=184, width=68, height=68
  Box: x=224, y=211, width=91, height=91
  Box: x=440, y=242, width=88, height=88
  Box: x=348, y=264, width=82, height=82
  Box: x=288, y=283, width=72, height=72
Saved annotated image as output.jpg
Limitations
Stated honestly, not hidden.