Three releases since the RAM post, and the first one matters most if you have ever had
FaceID call the wrong name.
v0.15.0 — one bad reference photo caused a misidentification, and the old check missed it
A different person walked in here and was published under my name at 0.576, well over
the threshold. The cause was a single photo in my own gallery: taken from above, showing
mostly the back of a head.
Version 0.14 already checked references against the other people in the gallery. That
check saw this photo and let it pass at 0.368, just under its limit — and it was not
wrong. It compares stored photo against stored photo, while a live face comes far
closer than any stored photo of the same person does. Gallery-vs-gallery is a lower bound
on the real risk, and this case shows the gap: 0.368 measured, 0.576 in reality.
The stronger signal needed no second person at all:
| that photo’s average similarity to its own person’s other 49 photos | −0.011 |
| normal for that person | 0.265 |
| its rank among those 49 photos | last |
A reference that barely resembles the person it belongs to holds almost no face
information — and an embedding without face information matches everyone a little. It
cannot help its own person; it can only attract other people’s faces.
So FaceID now checks both directions in one pass — on new photos, at startup, and via
Settings → Keeping the gallery clean → check gallery now. Replayed against the real
event: with that photo set aside, the same face no longer matches me at all (I drop out of
the top three) and is correctly recognised as the right person.
The limit is relative to each person (self_outlier_ratio, default 0.25 of that person’s
median, minimum 5 photos), because how alike someone’s photos normally are varies a lot —
0.23 to 0.47 across the people here. Unusual angles land around 0.10–0.20 and are kept
on purpose; what falls out is the range where there is no face left to compare. Across 188
photos of 13 people it set aside 3. Nothing is deleted — they land in the set-aside pile
with the numbers, and one click restores them.
If you have ever seen a wrong name, run the check once. It costs nothing and it is
reversible.
v0.16.0 — faceid/event now carries the Frigate zones (thanks @phipe for the use case)
{"person": "unknown", "score": 0.446, "camera": "entrance",
"event_id": "1787041175.591208-sg2em5", "ts": 1787041180.7, "zones": []}
Deliberately data rather than a filter — details a few posts up. An example automation
(alert for strangers, but only in a chosen zone) is in
docs/ha-automation-example.yaml.
That payload above is a real one from this morning, and it is worth a closer look: it is an
unknown person, with an empty zone list, forty seconds after a known person at the same
camera came through with the zone filled in. Exactly the case a zone filter would have
silently dropped — and the one you actually want an alert for. Write conditions as zone is
present, not zone is absent.
v0.16.1 — correcting something I wrote here
I said the same payload also appears as the last attribute on the presence sensor. True,
but it used to survive only as long as the presence window: after that the finalizer
rewrote the retained topic without it, so for most of the day the attribute was simply
empty. Found while verifying the release — all four sensors here had no last hours after
correct recognitions.
It now persists until the next recognition replaces it. The sensor state still falls back
to nobody; last keeps answering who was seen there most recently. Automations
triggering on faceid/event were never affected — only templates reading the attribute.