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>
This commit is contained in:
Scarriffle
2026-09-05 21:06:06 +02:00
co-authored by Claude Opus 5
parent f289d02c37
commit 3da673662f
17 changed files with 1536 additions and 4 deletions
+48
View File
@@ -0,0 +1,48 @@
# 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.