FaceRec
Technik und Hintergründe
Ergänzung zur README. Der Dienst (Port 8191) bekommt beim Klingeln das Bild der Klingel aus Home Assistant, erkennt die Gesichter und gibt das Ergebnis zurück („Anna steht vor der Tür.“). Unbekannte Gesichter landen unter „Offen“ und werden per Push-Knopf oder in der Oberfläche einer Person zugewiesen – damit lernt der Dienst dazu.
- Erkannte Gesichter werden gemeldet und nur
FACEREC_(48 h) als Ausschnitt + Abdruck aufgehoben, damit sich Verwechslungen korrigieren lassen; danach automatisch gelöscht.RECENT_ HOURS - Falsch erkannt: Push-Knopf „Falsch erkannt“ (Texteingabe) oder „Falsch?“ im Verlauf. Name = richtige Person
lernt das Gesicht (neu, falls nötig), leer/„?“ = unbekannt (kommt nach „Offen“). Ereignis, Satz und
sensor.werden mitkorrigiert; die Oberfläche zeigt das Lernbild, mit dem verwechselt wurde, und bietet an, es zu entfernen.klingel_ besucher - Unbekannte: Ausschnitt + Standbild bleiben, bis zugewiesen oder verworfen; danach ist das Standbild weg, der Ausschnitt wird zum Lernbild der Person. Ähnliche Unbekannte werden gruppiert und gemeinsam zugewiesen.
- Ein vorhandener Name (Groß/klein egal) ordnet zu, ein neuer legt die Person an. Personen lassen sich auch per Foto anlernen, umbenennen (gleicher Name = zusammenlegen), falsche Gesichter verschieben oder entfernen.
- Alles lokal; nur im eigenen Netz betreiben (optional Schlüssel
FACEREC_).TOKEN
Modelle und Leistung
InsightFace buffalo_ (offizielles Release v0.7, Prüfsumme im Dockerfile): det_ (SCRFD, Gesichter + 5
Merkmalspunkte) und w600k_ (ArcFace, 512er Gesichtsabdruck). Ohne das insightface-Paket, direkt über ONNX Runtime
(engine.). Lizenz der Modelle: nur nicht-kommerziell.
Gemessen auf einem Ryzen AI Max+ 395 (CPU): ~90 ms pro Bild. Mit erzeugten Testbildern: gleiche Person 0,83–0,92
Ähnlichkeit (auch 640×360-JPEG mit 92-px-Gesicht), verschiedene Personen 0,23–0,31. Schwellen: erkannt ab
FACEREC_ 0,32, Vorschlag ab FACEREC_ 0,28. Echte Klingelbilder (Nacht/IR, schräg) sind oft schlechter –
mehrere Aufnahmen pro Person zuweisen hilft am meisten. Lernen: Sichere Erkennungen (≥ FACEREC_, 0,45, in
mindestens zwei Bildern) werden als zusätzliche Lernbilder übernommen.
GPU (AMD, ROCm 7.2 + ONNX Runtime MIGraphX, fp16) mit -: Gesichtssuche 2,6 ms (CPU
25,8 ms), Abdruck 1,8 ms (CPU 11,9 ms); im Stream-Scan 4 ms/Bild statt 60 ms. Abdrücke zu 99,9 % gleich wie auf der CPU.
Der erste Start kompiliert die Modelle (~2 min) nach data/, danach startet der Dienst in ~3 s.
Startet die GPU nicht oder scheitert der erste Lauf, läuft der Dienst mit CPU weiter (/ zeigt das Rechenwerk).
Basis-Image rocm/ (wie ComfyUI in ImageGen, Schichten geteilt), onnxruntime- von repo.radeon.com.
GPU-Gruppen des Hosts: RENDER_/VIDEO_ in facerec..
NPU (amdxdna, /): bräuchte AMDs Ryzen-AI-Paket (XRT + VitisAI-Execution-Provider,
quantisierte Modelle) und bringt bei einem Bild pro Klingeln nichts Messbares. Vorbereitet über FACEREC_
und einen auskommentierten Geräte-Eintrag in docker-.
Stream-Scan (POST /api/stream_scan )
Home Assistant startet z. B. beim Öffnen der Haustür {"entity_. Der Dienst liest
den MJPEG-Stream – direkt von der Kamera, wenn FACEREC_ eine Adresse für die Entität hat (z. B. ESP32-CAM),
sonst über Home Assistant (/) – und meldet erkannte Personen als HA-Ereignis
flur_ (names, unknown, unknown_, faces, event_), am Ende flur_.
tracker.:
- Verfolgung statt Einzelbild: Jedes Gesicht bekommt eine Spur über die Bildposition. Entschieden wird pro Spur:
bekannt ab einem Bild ≥ 0,40 oder zwei Bildern ≥
FACEREC_; Vorschlag nach 4 guten Bildern abMATCH FACEREC_; unbekannt nach 4 guten Bildern unter 0,22 (bzw. 8 Bildern unterSUGGEST FACEREC_).SUGGEST - Eindeutig: pro Bild bekommt jede Person höchstens ein Gesicht, und eine Person, die schon einer anderen sichtbaren Spur gehört, keiner zweiten. Ein Gast neben einer bekannten Person wird so nicht als deren Bewegung verschluckt, und mehrere Unbekannte werden einzeln gezählt.
- Sammelfenster nach Zustand: startet mit der ersten Entscheidung, endet sobald keine sichtbare Spur mehr offen ist (frühestens 1,5 s, jede neue Spur +1 s), spätestens nach 4 s. Wer später kommt, wird als Nachzügler gemeldet; wer kurz aus dem Bild geht, nicht doppelt.
- Immer das neueste Bild: Ein Leser behält nur das jüngste Bild, die Auswertung läuft nie hinterher. Abdrücke nur für offene Spuren (höchstens 15 je Spur), Lernbild-Abdrücke im Speicher.
Einstellungen: FACEREC_ (12), FACEREC_ (640; 480 ist ~40 % schneller bei der Gesichtssuche),
FACEREC_ (0 = automatisch), FACEREC_ + FACEREC_ (JSON). Beim Start werden beide
Modelle einmal aufgewärmt (der erste Aufruf war ~2,5× langsamer).
Home Assistant
Paket homeassistant/facerec.yaml (rest_command + Sensoren) nach /,
FACEREC_ darin ersetzen. Die Automationen (homeassistant/automations.yaml)
sind eine Vorlage: Entitäten der eigenen Klingel und des Handys eintragen und in HA übernehmen. Das letzte Ereignisbild
einer Akkuklingel kann auch von Bewegung stammen; nachts (IR) wird nur erkannt, wer zur Klingel schaut.
rest_schicktcommand. facerec_ recognize {"entity_; der Dienst holt das Bild mitid": "image. xxx"} HA_überTOKEN /(bzw.api/ image_ proxy/ . . . camera_beiproxy camera.).xxx - Automation „Klingel: Gesicht erkennen“: Klingel-Sensor → bis 10 s auf neues Ereignisbild warten → erkennen → Push mit
Bild und
sentence, optional Sprachansage. Bei Unbekannten Knöpfe „Ist“, „Name eingeben“, „Verwerfen“. - Automation „Gesicht zuweisen“ verarbeitet die Knöpfe (
mobile_).app_ notification_ action - Entitäten:
sensor.(z. B. „Anna“ / „eine unbekannte Person“, Attributeklingel_ besucher satz,namen,bekannt,unbekannte,gesichter,zeitpunkt) undsensor.(REST, alle 5 Min. und sofort nach Klingeln/Zuweisen/Verwerfen).klingel_ offene_ gesichter
Antwort von /: sentence, text, names, known, unknown_, face_, faces[]
(known, name, score, unknown_, suggestion, crop), snapshot.
API
| Methode | Pfad | Zweck |
|---|---|---|
| POST | / | Bild (Formularfeld image, Rohdaten) oder {"entity_ |
| POST | / | {"entity_ – Stream einige Sekunden auswerten |
| GET | / | offene Gesichter, gruppiert, mit Vorschlag |
| POST | / | {"name"} oder {"person_, "group": false = nur dieses |
| POST | / | verwerfen (Standard: ganze Gruppe) |
| POST | / | falsch erkannt: {"name"} richtige Person, leer = unbekannt |
| GET/POST | / | Personen mit Gesichtern / anlegen {"name"} |
| PATCH/DELETE | / | umbenennen (zusammenlegen) / löschen |
| POST | / | per Foto anlernen |
| DELETE | / | falsches Gesicht entfernen |
| POST | / | Gesicht anderer Person geben {"name"} |
| GET | / | Verlauf |
| GET | /, / | Modul-Schnittstelle für den OllamaProxy |
Tests
. (braucht nur Docker): baut das Image und lässt tests/ mit einem nachgebauten Erkenner laufen
(34 Tests: Erkennen, Zuweisen, Gruppieren, Korrigieren, Aufräumen, Verfolgung im Stream-Scan, Modul-Schnittstelle).