← CS Lab AI & Machine Learning / Viola-Jones Detector Open standalone ↗

Viola-Jones was the first face detector fast enough for live video (2001) — and it uses no neural network at all, just rectangle contrasts, a boosted vote, and a cascade of quick tests. The workhorse of face detection before deep learning.

Where you meet it

What it does

It answers one narrow question — "is this square patch a face?" — but so cheaply that it can ask it for every position and size in a video frame, many frames per second.

Almost every patch of an image is background, so the real trick isn't recognising faces quickly — it's rejecting non-faces quickly.

How it works

A Haar feature lays a bright and a dark rectangle on the patch and subtracts the average brightness of one from the other — a single number that grows large when the image matches that light/dark pattern (eyes darker than cheeks). One feature alone is barely better than a coin flip, so AdaBoost picks a few thousand useful ones and weights them into a strong vote. The cascade then orders them cheap-first: a tiny early stage rejects most background instantly, and only patches that survive reach the expensive later stages.

feature = mean(bright box) − mean(dark box)   # one rectangle contrast
weak    = "face" if feature > threshold        # ~a coin flip on its own
strong  = weighted vote of many weak features  # AdaBoost picks them
cascade = cheap stages first → reject early, verify late

In the paper the full detector is 38 stages and about 6,000 features, yet because most patches die in the first stage it checks only ~10 features per patch on average — that is what buys real time (15 frames a second on 2001 hardware). The very first stage uses just two features, keeps nearly 100% of faces and already throws out about 60% of background.

Watch out

  • Frontal and upright only. It's trained on straight-on, level faces — tilt your head or turn to profile and it simply misses. It has no notion of a rotated face.
  • Lighting breaks the contrasts. The whole thing rests on "eyes darker than cheeks"; harsh side- or back-light flips those brightnesses. It normalises each patch for brightness, but heavy shadow still fools it.
  • It hallucinates faces in busy texture. Any patch with the right dark-over-bright layout can trip a detection, so you tune the detector (in OpenCV, minNeighbors / thresholds) to trade a few missed faces for far fewer false alarms.

A detector that spends nearly all its effort saying "not here" — and is fast precisely because that answer is almost always right.

Go deeper

Viola-Jones war der erste Gesichtsdetektor, der schnell genug für Live-Video war (2001) — ganz ohne neuronales Netz, nur mit Rechteck-Kontrasten, einer geboosteten Abstimmung und einer Kaskade schneller Tests. Das Arbeitspferd der Gesichtserkennung vor dem Deep Learning.

Wo es vorkommt

Was es tut

Es beantwortet eine enge Frage — „ist dieser quadratische Bildausschnitt ein Gesicht?" — aber so billig, dass es sie für jede Position und Größe in einem Videobild stellen kann, viele Bilder pro Sekunde.

Fast jeder Bildausschnitt ist Hintergrund — der eigentliche Trick ist nicht, Gesichter schnell zu erkennen, sondern Nicht-Gesichter schnell zu verwerfen.

Wie es funktioniert

Ein Haar-Merkmal legt ein helles und ein dunkles Rechteck auf den Ausschnitt und zieht die durchschnittliche Helligkeit des einen von der des anderen ab — eine einzige Zahl, die groß wird, wenn das Bild zum Hell-Dunkel-Muster passt (Augen dunkler als Wangen). Ein Merkmal allein ist kaum besser als Münzwurf, also wählt AdaBoost ein paar tausend nützliche aus und gewichtet sie zu einer starken Abstimmung. Die Kaskade ordnet sie billig-zuerst: eine winzige frühe Stufe verwirft den meisten Hintergrund sofort, und nur was überlebt, erreicht die teuren späteren Stufen.

Merkmal = mean(helle Box) − mean(dunkle Box)   # ein Rechteck-Kontrast
schwach = „Gesicht", wenn Merkmal > Schwelle   # allein ~Münzwurf
stark   = gewichtete Abstimmung vieler Merkmale # AdaBoost wählt sie
Kaskade = billige Stufen zuerst → früh verwerfen, spät bestätigen

Im Paper hat der volle Detektor 38 Stufen und rund 6.000 Merkmale — doch weil die meisten Ausschnitte schon in der ersten Stufe sterben, prüft er im Schnitt nur ~10 Merkmale pro Ausschnitt. Genau das bringt Echtzeit (15 Bilder pro Sekunde auf 2001er-Hardware). Die allererste Stufe nutzt nur zwei Merkmale, behält fast 100% der Gesichter und wirft schon etwa 60% des Hintergrunds weg.

Worauf achten

  • Nur frontal und aufrecht. Es ist auf gerade, waagerechte Gesichter trainiert — neig den Kopf oder dreh dich ins Profil, und es verfehlt schlicht. Es hat keine Vorstellung von einem gedrehten Gesicht.
  • Licht bricht die Kontraste. Alles ruht auf „Augen dunkler als Wangen"; hartes Seiten- oder Gegenlicht kehrt diese Helligkeiten um. Es normalisiert jeden Ausschnitt auf Helligkeit, aber tiefer Schatten täuscht es trotzdem.
  • Es halluziniert Gesichter in unruhiger Textur. Jeder Ausschnitt mit dem richtigen Dunkel-über-Hell-Layout kann eine Detektion auslösen, also stellst du den Detektor ein (in OpenCV: minNeighbors / Schwellen), um ein paar verpasste Gesichter gegen weit weniger Fehlalarme zu tauschen.

Ein Detektor, der fast seine ganze Arbeit darauf verwendet, „hier nicht" zu sagen — und schnell ist, gerade weil diese Antwort fast immer stimmt.

Mehr dazu

Next up
AI & Machine LearningKLT Tracking AI & Machine Learningk-Fold Cross-Validation All concepts →