Wie Glimt dein Kind erkennt – auf dem iPhone

Peter Theill · 4. November 2026

Glimt macht aus einer Sekunde jedes Tages einen Film. Das Spannende daran: Du musst diese Sekunde nicht filmen. Glimt findet sie in den Videos, die du schon aufgenommen hast, und wählt die Sekunde, in der dein Kind im Bild ist – selbst in einem vollen Geburtstagsvideo mit fünf anderen Kindern. Alles läuft auf dem iPhone: kein Server, kein Account, kein Upload. So funktioniert es, mit den Modellen, der Mathematik und echten Messwerten.

Die Pipeline

Glimts Pipeline von der Kamerarolle bis zur zugeschnittenen Sekunde, in acht Schritten1Deine KamerarollePhotoKit: Videos und Live Photos des Tages, Videos zuerst, höchstens 162Frames entnehmenetwa 2 pro Sekunde, max. 16 pro Video (6 pro Live Photo), 1024 px3Gesichter findenVision: Gesichtsboxen + Qualität, Gesichter unter 36 px entfallen4Gesichter ausrichtenVision-Landmarks: Augen, Nase, Mundwinkel → 112 × 112, aufrecht5EmbeddingSFace (MobileFaceNet, Core ML): 128 Zahlen pro Gesicht, etwa 2 ms6VergleichenKosinus-Ähnlichkeit zu jedem Referenzfoto, das beste zählt7Bewerten und wählenKind 60 %, Optik + Schärfe + Gesicht 40 %, bestes 1-Sekunden-Fenster8Bildausschnittdem Gesicht des Kindes folgen, hineinzoomen, wenn es klein ist
Die Schritte 4–6 sind die Gesichtserkennung; alles andere dient dazu, eine gute Sekunde zu wählen und den Bildausschnitt festzulegen.

Warum nicht einfach Apples Vision?

Vision übernimmt hier einiges: Es findet Gesichter (VNDetectFaceCaptureQualityRequest, das auch bewertet, wie scharf und frontal jedes Gesicht ist), ihre Landmarks (VNDetectFaceLandmarksRequest) und unter iOS 18, wie gut ein Frame aussieht (CalculateImageAestheticsScoresRequest, das auch Kassenbons und Screenshots erkennt). Was es nicht bietet, ist wer ein Gesicht ist. Das Personen-Album in Photos weiß es, aber dieser Index ist für Apps nicht zugänglich.

Die erste Version von Glimt nutzte VNGenerateImageFeaturePrintRequest auf einem Ausschnitt des Gesichts. Das ist ein allgemeiner Bild-Fingerabdruck: Er vergleicht Haare, Licht, Farben und Hintergrund genauso stark wie das Gesicht selbst. In der Praxis hielt er bereitwillig Geschwister für dieselbe Person, ebenso jedes Kind, das im selben Raum zur selben Tageszeit fotografiert wurde. Es war das falsche Werkzeug.

Das Gesichtserkennungsmodell

Glimt bringt inzwischen ein eigenes mit: SFace (Zhong et al., 2021, „Sigmoid-Constrained Hypersphere Loss for Robust Face Recognition“), ein MobileFaceNet-Backbone, veröffentlicht im OpenCV Zoo unter der Lizenz Apache 2.0. Es erreicht 99,40 % auf LFW. Es nimmt ein Gesicht mit 112 × 112 Pixeln und gibt 128 Zahlen zurück, ein Embedding; zwei Fotos derselben Person ergeben Embeddings, die in dieselbe Richtung zeigen.

Die Konvertierung lief ONNX → PyTorch (onnx2torch) → Core ML (coremltools, ML Program, float16), danach eine lineare 8-Bit-Quantisierung der Gewichte. Das Ergebnis ist 9,8 MB groß, lädt beim ersten Mal in etwa 0,5 s, und seine Ausgabe stimmt bei einer Testeingabe mit Kosinus 0,998 mit dem ursprünglichen ONNX-Modell überein. Die Normalisierung der Eingabe steckt im Graphen, die App übergibt also einfache RGB-Pixel von 0–255.

Die Ausrichtung zählt mehr, als man denkt

SFace wurde mit Gesichtern trainiert, die auf eine feste Vorlage ausgerichtet sind: Augen, Nasenspitze und Mundwinkel an bekannten Stellen im Quadrat von 112 × 112. Ein geneigtes oder verschobenes Gesicht ergibt ein spürbar schlechteres Embedding. Visions Landmarks liefern die fünf Punkte (Pupillen, die Mitte der Nasenregion, die äußersten Lippenpunkte); Glimt sucht dann die Rotation, gleichmäßige Skalierung und Verschiebung, die sie am besten auf die Vorlage bringt. In zwei Dimensionen hat dieses Kleinste-Quadrate-Problem eine geschlossene Lösung, wenn man die Punkte als komplexe Zahlen behandelt:

a = Σ conj(zᵢ − z̄) · (wᵢ − w̄) / Σ |zᵢ − z̄|²      // rotation + scale, one complex number
w = a · z + (w̄ − a · z̄)                          // the transform for any point z

Core Image wendet sie an (eine affine Transformation, Software-Renderer, 112 Pixel Ausgabe), und der Ausschnitt geht an das Modell. Referenzfotos werden zweimal eingebettet, einmal unverändert und einmal gespiegelt, und die beiden werden gemittelt: eine etwas stabilere Referenz, ganz umsonst.

Ist es dasselbe Kind? Den Schwellenwert kalibrieren

Die App vergleicht das Embedding jedes Gesichts per Kosinus-Ähnlichkeit mit den Referenzfotos und behält den besten Treffer. Wo die Grenze liegen soll, wurde gemessen, nicht geraten, und zwar an gemeinfreien Porträts des Weißen Hauses (offizielle Porträts im Abstand von Jahren und ein Familienporträt mit beiden Eltern und zwei Töchtern):

Kosinus-Ähnlichkeit zwischen Gesichts-Embeddings: dieselbe Person 0,70 bis 0,85, Familienmitglieder 0,20 bis 0,43, Fremde 0,01 bis 0,25. Ab 0,45 zählt ein Frame als das Kind.0,45 = das KindDieselbe Person0,830,850,790,70Familie, gleiches Foto0,430,410,370,270,20Familie, anderes Foto0,300,26Fremde0,250,180,150,140,120,080,060,030,0100,250,50,751
Jeder Punkt ist ein Paar Gesichter; „dieselbe Person“ heißt dieselbe Person auf einem anderen Foto. Im schattierten Band steigt Glimts „Ähnlichkeit“ von 0 (0,30) auf 1 (0,60); ab 0,45 zählt ein Frame als das Kind.

Derselbe Mann auf Porträts, die vier Jahre auseinanderliegen, erreicht 0,83; dieselben Personen, aus dem Familienfoto herausgesucht, 0,70–0,85. Fremde bleiben unter 0,25. Der schwierige Fall ist die Familie: Zwei Schwestern auf demselben Bild erreichen untereinander 0,43, Mutter und Töchter bis zu 0,41 (gleiches Licht und gleiche Pose lassen Verwandte ähnlicher aussehen), während die Mutter im Vergleich zu ihren Töchtern auf einem anderen Foto auf 0,26–0,30 fällt. Deshalb liegt die Grenze bei 0,45: über den Schwestern, deutlich unter derselben Person. Fünf Fotos sind ein Plausibilitätscheck, keine Evaluation, und die Grenze wird an echten Familienvideos nachjustiert.

Zwei weitere Regeln halten Doppelgänger draußen: In einem Video reicht ein glücklicher Frame nicht (es braucht zwei Frames mit 0,45 oder einen deutlich darüber mit 0,57), und wenn mehrere Gesichter in einem Frame sind, zählt nur das mit dem besten Treffer.

Mehrere Referenzfotos

Ein Referenzfoto ist ein Blickwinkel, ein Licht und ein Alter. Kinder verändern sich schnell. In Glimt kannst du bis zu fünf Fotos hinzufügen, und das Gesicht in einem Frame muss nur einem davon ähneln, sodass auch ein Profilbild oder das Gesicht vom letzten Winter noch erkannt wird. Sind auf einem Foto mehrere Personen, tippst du auf das richtige Gesicht; Glimt rät nie einfach „das größte“.

Die Sekunde wählen und den Ausschnitt festlegen

Jeder Frame bekommt eine Punktzahl: 35 % dafür, wie gut er aussieht, 20 % Schärfe (Varianz eines Laplace-Filters auf einer grauen 96 × 96-Kopie: unscharfe Frames ändern sich von Pixel zu Pixel nur langsam), 45 % dafür, ob ein klares Gesicht zu sehen ist. Mit Referenzfotos zählt diese ganze Punktzahl 40 % und „ist es das Kind“ 60 %: Ein gewöhnlicher Frame deines Kindes schlägt einen wunderschönen Frame von jemand anderem. Die gewählte Sekunde ist das Fenster mit dem besten Durchschnitt, damit nicht ein einzelner guter Frame neben einem verwackelten gewinnt.

Der Bildausschnitt für einen Film im Hochformat hatte einen eigenen Bug, der es wert ist, erzählt zu werden. Jeder Frame benannte das deutlichste Gesicht, und die App mittelte die Positionen über die Sekunde. Bei zwei Kindern wechselte das deutlichste Gesicht zwischen ihnen hin und her, und der Durchschnitt landete auf der Wand dazwischen. Jetzt benennt jeder Frame das Kind (oder das markanteste Gesicht: Größe × Qualität, was stabiler ist), und die App nimmt die größte Gruppe von Positionen, die nah beieinanderliegen, nicht den Mittelwert. Ist das Gesicht klein, zoomt der Ausschnitt hinein, bis es etwa ein Fünftel der Bildhöhe einnimmt, bei Video höchstens 1,6×.

Wie schnell ist es?

Median in Millisekunden pro Schritt auf einem iPhone 15 Pro: Das Dekodieren des Frames dauert 30 ms, das Erkennen eines Gesichts 2 msFrame dekodieren (1024 px)30 msÄsthetik-Score (Vision)7,2 msGesichter finden + Qualität5,4 msSchärfe (Laplace)2,1 msEin Gesicht erkennen (SFace)2 msGesichts-Landmarks1,5 ms
Median pro Frame, iPhone 15 Pro, iOS 27.2, 12 Videos, 167 Frames. Ein ganzer Frame dauert 47 ms, ein ganzes Video (16 Frames plus Laden) 0,9 s.

Die Überraschung: Ein Gesicht zu erkennen ist der günstige Teil, etwa 2 ms auf der Neural Engine. Das Dekodieren des Videoframes kostet fünfzehnmal so viel. In der Praxis arbeitet sich Glimt in wenigen Sekunden durch einen Tag voller Videos und in wenigen Minuten durch einen Monat.

Im Hintergrund

Ein Jahr mit fehlenden Tagen aufzufüllen dauert eine Weile, also soll es weiterlaufen, wenn du die App verlässt. Genau dafür gibt es in iOS 26 BGContinuedProcessingTask: iOS zeigt den Fortschritt in der Dynamic Island und auf dem Sperrbildschirm. Drei Dinge haben wir auf die harte Tour gelernt, alle aus einem kleinen Log auf dem Gerät:

Datenschutz

Glimt hat keinen Netzwerkcode. Gesichter, Embeddings und Auswahlen bleiben im eigenen Speicher der App auf dem iPhone. Das Einzige, was das Netzwerk berühren kann, ist Photos selbst, wenn es deine eigenen Videos aus deinen eigenen iCloud Photos holt, wenn sie nicht auf dem Telefon liegen.

Danksagung: SFace von Yaoyao Zhong und Kollegen; ONNX-Konvertierung von Chengrui Wang; OpenCV Zoo (Apache 2.0). Fragen oder Ideen: glimt@theill.com.