Files
onyx/docs/spikes/G-gesichtsmerkmal.md
ScarriffleandClaude Opus 5 3da673662f Zwischenablage, Notizen und der Gesichtsvergleich
Drei neue Module nach dem Bauplan von `ShelfProvider`: reine Regeln getrennt vom
Zustand, versionierte Indexdatei, Inhalte in Dateien statt in `UserDefaults` —
was dort steht, liest jedes Programm mit `defaults read` mit.

Die Zwischenablage achtet `ConcealedType`, `TransientType` und
`AutoGeneratedType`. Diese Marken sind eine Verabredung zwischen Programmen und
kein Systemdienst; wer sie missachtet, sammelt fremde Passwörter ein.

Der Gesichtsvergleich stand im Plan als der eine echte Unsicherheitsfaktor. Ein
Spike hat ihn erledigt: `VNGenerateFaceprintRequest` gibt es nicht, aber
`VNGenerateImageFeaturePrintRequest` ist öffentlich, liefert 768 Elemente und
ein Abstandsmaß — Faktor 3,5 Trennschärfe. Kein eigenes CoreML-Modell nötig.

`FaceMatcher` entscheidet über mehrere Posen, mehrere Einzelbilder und eine
Sperre nach Fehlversuchen. Die Schwelle liegt bewusst nicht mittig: ein falsches
Ja ist ein Fremder am entsperrten Rechner, ein falsches Nein nur ein Passwort,
das man ohnehin kennt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 21:06:06 +02:00

49 lines
2.0 KiB
Markdown

# Spike G — Gesichtswiedererkennung
> Im Plan heißt dieser Spike „F". Der Buchstabe war in `docs/spikes/` schon an die
> Frequenzmessung vergeben; hier läuft die vorhandene Reihe weiter.
**Frage.** Vision liefert öffentlich Rechtecke und Landmarken, aber sagt damit nur,
*wo* ein Gesicht ist — nicht *wessen*. Für einen Vergleich braucht es einen Vektor
mit Abstandsmaß. Gibt es den, oder braucht es ein eigenes CoreML-Modell?
**Gemessen am 05.09.2026**, `Spikes/faceprint-probe.swift`.
## Ergebnis
| Weg | Befund |
|---|---|
| `VNGenerateFaceprintRequest` | **existiert nicht** — auch nicht über `NSClassFromString` erreichbar |
| `VNFaceprintObservation` | **existiert nicht** |
| `VNGenerateImageFeaturePrintRequest` | **öffentlich und benutzbar** |
Der öffentliche Merkmalsvektor hat **768 Elemente** und bringt `computeDistance`
mit. An zwei synthetischen Mustern:
- ähnliche Bilder: Abstand **0,134**
- deutlich verschiedene: Abstand **0,473**
Also Faktor 3,5 Trennschärfe. Ein eigenes CoreML-Modell ist **nicht** nötig.
## Was das für die Bauform heißt
1. `VNDetectFaceLandmarksRequest` findet das Gesicht und seine Landmarken.
2. Daraus wird ausgerichtet und zugeschnitten — ohne Ausrichtung misst man die
Kopfhaltung mit, nicht die Person.
3. `VNGenerateImageFeaturePrintRequest` auf dem Ausschnitt gibt den Vektor.
4. Verglichen wird über `computeDistance` gegen die hinterlegten Vektoren.
## Die Einschränkung, die bleibt
Ein **allgemeiner Bildmerkmalsvektor ist kein Gesichtsmerkmal.** Er reagiert auf
Beleuchtung, Kopfhaltung und Hintergrund mit, nicht nur auf die Person. Deshalb:
- mehrere Posen beim Anlernen, nicht eine,
- Bestätigung über mehrere Einzelbilder, nicht eines,
- eine Schwelle, die lieber ablehnt als falsch zulässt,
- Sperre nach mehreren Fehlversuchen, Rückfall aufs Passwort.
Und die Aussage aus dem Plan bleibt in voller Schärfe: **das ist Bequemlichkeit,
keine Sicherheitsgrenze.** Ein Foto vor die Kamera zu halten genügt — Face ID hat
dafür einen Tiefensensor, die Mac-Webcam hat keinen.