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>
49 lines
2.0 KiB
Markdown
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.
|