Witam,
Właśnie skończyłem konfig, czy jest zainteresowanie tematem?
Jeżeli tak to mogę zrobić tutorial.
Witamy na forum.
Zainteresowanie takim tematem jest, moim zdaniem duże. Myślę, że nie ma potrzeby pytać. Każdy przewodnik na tym forum jest bardzo mile widziany, zwłaszcza autorski. Jest sporo osób używających Frigate, sam do nich należę.
Celem tego mini tutorialu jest przeanalizowanie konfiguracji kontenerów Frigate + Coral TPU, double-take i Compreface pod kątem wysokiej wiarygodności rozpoznawania twarzy. Na tyle wiarygodnej, żeby powierzyć Home Assistantowi np. otwieranie furtki wejściowej do domu.
Nie będę zagłębiał się w szczegóły instalacji samych kontenerów i samego procesu prawidłowego ich uruchomienia. Chodzi mi wyłącznie o przedstawienie takiej konfiguracji, żeby uzyskać coś w rodzaju namiastki (?) FaceID Apple’a.
Na początek parę słów o kamerce - na pewno ma znaczenie jakość optyki w klasycznym znaczeniu, tutaj mam mieszane uczucia odnośnie soczewki typu “rybie oko” (praktycznie 100% doorbells), podobnie znaczenie będzie miała jakość obrazu w trybie nocnym (odpowiedni kontrast) oraz rozdzielczość/bitrate. Im więcej danych na klatkę - tym lepiej.
Osobna sprawa to punkt mocowania samego urządzenia. Jako, że zakładamy określoną wyżej funkcjonalność i wysoką wiarygodność, tzn. że musimy zbliżyć twarz do obiektywu, urządzenie znajduje się na słupku ogrodzenia. Z tego wynika, że raczej odpadają kamery, skupiamy się na urządzeniach typu door-bell. Ważna jest wysokość: mój problem jest taki, że mam małe dzieci, a sam mam prawie 2m wzrostu i muszę się schylać do obiektywu - trzeba to samemu zaplanować stosownie do sytuacji.
Zacznijmy od Frigate:
https://github.com/blakeblackshear/frigate
Musimy tutaj sprawdzić/zmienić kilka parametrów w konfiguracji:
- uruchomić kanał MQTT do HA
- rozdzielczość detekcji ustawić na maksymalną wartość (chyba, że host na to nie pozwala)
- jakość snapshota na konkretnej kamerze ustawić na 100%
- konieczny Coral TPU albo odpowiednik
CompreFace:
https://github.com/exadel-inc/CompreFace
W tym kontenerze odpowiedzialnym za właściwy proces rozpoznawania twarzy musimy po utworzeniu konta użytkownika i zalogowaniu (port 8000) utworzyć aplikację typu recognition i uzyskać API Key. Kontener rezerwuje około 6 GB RAM.
double-take:
https://github.com/jakowenko/double-take
Doskonały kontener umożliwiający spięcie i automatyzację procesu rozpoznawania twarzy.
Ale od początku, bo tutaj dopiero, będzie się decydować sukces przedsięwzięcia.
Po prawidłowym uruchomieniu, logujemy się w dashboardzie (port 3000), przechodzimy do zakładki Config, gdzie nie ma nic. Config tworzymy w ten sposób, że po kolei przeklejamy z adresu https://github.com/jakowenko/double-take?tab=readme-ov-file#configuration kolejne sekcje configu, dokonując odpowiednich zmian.
Teraz parę słów komentarza na temat struktury procesu:
Frigate wykrywa i klasyfikuje obiekty w polu widzenia, nas interesują obiekty typu “person”. Informacje o obiektach są propagowane równolegle na paru kanałach:
- kanał MQTT: wiadomośći z danymi meta nt obiektu
- snapshot: pojedyńcze klatki wyciągnięte ze strumienia video kamery w formacie .jpg
- record: fragmenty strumienia video - nie interesuje nas.
DoubleTake nasłuchuje na odpowiednim topicu MQTT i sprawdza katalog …/frigate/media/clips gdzie zapisywane są snapshoty z Frigate. W chwili gdy pojawia się odpowiedni snapshot, importuje go, skaluje i wysyła do CompreFace, gdzie następuje analiza porównawcza, wynik wraca do double-take, który to generuje wiadomość MQTT z tymi wynikami. Tą ostatnią wiadomość po pewnej obróbce możemy wykorzystać w automatyzacji w HA jako trigger (u mnie uchylenie bramy wjazdowej na 10 sek.).
Problem w tym, że Frigate tworzy obiekty “person” taśmowo, wystarczy, że gdzieś w kącie obiektywu mignie jakaś mikroskopijna postać, co więcej double-take takie obiekty prześle dalej, a CompreFace dokona jego oceny, więc wyniki czasami zadziwiają (i nie wzbudzaja zaufania). Czyli podsumowując: trzeba dokonać drastycznej selekcji obiektów, do takich, które rokują dużą wiarygodność “recognition”.
Przechodzimy do zakładki config w double-take i wklejamy:
uruchamiamy komunikację mqtt
mqtt:
host: 192.168.1.38
username: *****
password: *****
topics:
# mqtt topic for frigate message subscription
frigate: frigate/events
# mqtt topic for home assistant discovery subscription
homeassistant: homeassistant
# mqtt topic where matches are published by name
matches: double-take/matches
# mqtt topic where matches are published by camera name
cameras: double-take/cameras
konfiguracja CompreFace
detectors:
compreface:
url: http://192.168.1.17:8000
key: ******************************
# number of seconds before the request times out and is aborted
timeout: 15
# minimum required confidence that a recognized face is actually a face
# value is between 0.0 and 1.0
det_prob_threshold: 0.8
# require opencv to find a face before processing with detector
opencv_face_required: false
# comma-separated slugs of face plugins
# https://github.com/exadel-inc/CompreFace/blob/master/docs/Face-services-and-plugins.md)
# face_plugins: mask,gender,age
# only process images from specific cameras, if omitted then all cameras will be processed
# cameras:
# - front-door
# - garage
Parametr key znajdziemy w dashboardzie CompreFace.
konfiguracja połączenia z Frigate + selekcja danych z snapshota
frigate:
url: http://192.168.1.38:5000
# if double take should send matches back to frigate as a sub label
# NOTE: requires frigate 0.11.0+
update_sub_labels: false
# stop the processing loop if a match is found
# if set to false all image attempts will be processed before determining the best match
stop_on_match: true
# ignore detected areas so small that face recognition would be difficult
# quadrupling the min_area of the detector is a good start
# does not apply to MQTT events
min_area: 200000
# object labels that are allowed for facial recognition
labels:
- person
attempts:
# number of times double take will request a frigate latest.jpg for facial recognition
latest: 0
# number of times double take will request a frigate snapshot.jpg for facial recognition
snapshot: 15
# process frigate images from frigate/+/person/snapshot topics
mqtt: false
# add a delay expressed in seconds between each detection loop
delay: 1
image:
# height of frigate image passed for facial recognition
height: 640
# only process images from specific cameras
cameras:
- dzwonek
# - garage
Tutaj z istotnych rzeczy: Parametr min_area, oznacza minimalną ilość pixeli składających się na obiekt typu person na klatce snapshota pochodzącej z Frigate. Np snapshot o rozdzielczości 1920*1080 posiada 2 073 600 pixeli. Czyli obiekt (box) musi zajmować minimum 10% powierzchni snapshota - eliminujemy obiekty małe (z małymi twarzami). Tutaj doświadczalnie można iść tylko w górę. Należy pamiętać, że te pobieżne kalkulacje są powiązane z rozdzielczością snapshota - dla kamery 4K wartości w pixelach będą odpowiednio wyższe, etc.
Parametr height to rozmiar cropa z obiektem person wyciętego oraz przeskalowanego ze snapshota i wysłanego do analizy do CompreFace. Jest to podobno maksymalna sensowna wartość. Gdzieś czytałem dyskusję na githubie współtwórcy CompreFace i tak stwierdził.
minimalne parametry snapshota spełniającego łącznie kryteria “match”
detect:
match:
# save match images
save: true
# include base64 encoded string in api results and mqtt messages
# options: true, false, box
base64: false
# minimum confidence needed to consider a result a match
confidence: 90
# hours to keep match images until they are deleted
purge: 96
# minimum area in pixels to consider a result a match
min_area: 50000
unknown:
# save unknown images
save: false
Parę słów komentarza: parametr confidence (pewność rozpoznania) - tutaj nie zalecam schodzenia w dół, raczej trzeba dążyć do 100%, jeżeli nie da się z jakiś względów uzyskiwać takich wyników, to trzeba zadać sobie pytanie czy to jest w ogóle możliwe w moim przypadku.
Parametr min_area oznacza min ilość pixeli (co przekłada się na powierzchnie na snapshocie), z których musi się składać “strefa twarzowa” wyznaczona i przeanalizowana przez CompreFace. Przypomnijmy, że operujemy na tym etapie na cropie ze snapshota o rozmiarze 640*640 pixeli, czyli łącznie 409600 pixeli. Czyli dalsza eliminacja zbyt małych obiektów. Ogólnie wyniki “match” są tym bardziej wiarygodne, im przy wyższych wartościach opisanych parametrów są spełnione.
reszta minimalnego configu
opencv:
scale_factor: 1.05
min_neighbors: 4.5
min_size_width: 30
min_size_height: 30
labels:
- person
W najbliższym czasie zamierzam poczytać, potestować czy OpenCV wnosi coś do jakości procesu, na ten moment ta część configu po prostu “jest”. OpenCV do preselekcji “części twarzowej” na snapshocie przed wysłaniem do CompreFace i tym samym lepszy crop 640*640 można włączyć w sekcji detectors (zmiana na true).
Teoretycznie w tym momencie mamy skonfigurowany double-take - zapisujemy config (ikona dyskietki), kontener restartuje i zaczyna pracę. Wszystkie kontrolki na górze ekranu powinny być zielone. Przechodzimy do wgrania zdjęć z podobizną osoby do poźniejszego “recognition”.
Przechodzimy do zakładki Train, tworzymy nowy album, wgrywamy zdjęcia i wybieramy Sync. Intuicyjnie mogę napisać, że im więcej zdjęć, w wyższej jakości i różnych ujęciach danej osoby, tym lepiej. Na zdjęciu może występować tylko jedna twarz, przy zdjęciach grupowych, przed wgraniem do systemu, pozostałe twarze wymazujemy w programie do obróbki zdjęć. System zaczyna normalną pracę wg. zadanych parametrów.
W momencie gdy jeden z analizowanych snapshotów spełnia kryteria, zostaje wyświetlony w zakładce Matches i jednocześnie zostaje wygenerowana powiązana z nim wiadomość mqtt na topicu double-take/matches/%nazwa_albumu%
Ostatnią kwestią, którą chcę opisać to stworzenie triggera w HA, który umożliwi zbudowanie automatyzacji wykorzystujących pozytywną identyfikację, poszczególnych osób (poszczególne nazwy albumów).
Jak pisałem powyżej w przypadku pozytywnej identyfikacji mamy wiadomość w takim formacie:
{
"id": "1623906078.684285-5l9hw6",
"duration": 1.26,
"timestamp": "2021-06-17T05:01:36.030Z",
"attempts": 3,
"camera": "living-room",
"zones": [],
"match": {
"name": "%nazwa_albumu%",
"confidence": 66.07,
"match": true,
"box": { "top": 308, "left": 1018, "width": 164, "height": 177 },
"type": "latest",
"duration": 0.28,
"detector": "compreface",
"filename": "2f07d1ad-9252-43fd-9233-2786a36a15a9.jpg",
"base64": null
}
}
Dane w wiadomości otrzymujemy w formacie JSON, musimy wyciągnąć wartość zmiennej match w podzbiorze match i sprawdzić czy ma wartość logiczną true. Jeżeli tak to mamy triggera i zostaje wykonana sekcja action.
Na tej podstawie tworzymy w HA automatyzację, w której wykorzystamy MQTT trigger:
alias: double-take %nazwa_albumu%
description: ""
trigger:
- platform: mqtt
topic: double-take/matches/%nazwa_albumu%
condition:
- condition: template
value_template: "{{ trigger.payload_json.match.match }}"
enabled: true
action:
To tyle ode mnie, sam korzystam od paru dni i być może optymalne wartości parametrów trochę się zmienią, ale myślę, że to będzie dobry punkt wyjścia, żeby skalibrować swój system.
Witam, rozmyślam nad tym jak dalej rozgryźć rozpoznawanie twarzy w frigate. Przeglądam podane projekty i pewna ilość osób twierdzi, że te projekty są już martwe, choćby przez brak jakiejkolwiek aktualizacji od sporego czasu. Chciałbym spytać o Twoje zdanie w tej kwestii, czy nadal korzystasz z tego projektu i jesteś zadowolony?
Cały czas działa mi to, aktualizacje Frigate nie miały wpływu na konfig. Najsłabszym ogniwem jest hardware: w moim przypadku połączenie wifi dzwonka, tryb nocny pogarsza parametry, bezpośrednie słońce w obiektyw, rozpoznawanie tablic rejestracyjnych przy oświetleniu samochodu również przeszkadza.