How Can We Help?
Andlitsgreining í Home Assistant
Inngangur
Að finna og greina andlit er orðið mjög algengt hjá fyrirtækjum eins og Facebook, Google eða Apple. Tæknin bak við þetta er flókin en til er fullt af verkfærum sem við getum notfært okkur í Home Assistant. Þannig getum við gert allskonar sjálfvirkni eftir því hvort einhver andlit finnast í myndinni eða hvort einhver þekkt andlit eru á myndinni þar sem andlitið fannst.
Það eru vissulega margar aðferðir til og margar viðbætur sem keyra með Home Assistant til að notfæra sér þennan möguleika að greina og þekkja andlit í ljósmynd. Í þessari grein notum við tól sem kallast Deepstack. Við höfum prófað ýmislegt í gegnum tíðina en Deepstack er að okkar mati áreiðanlegasta tólið sem er einfalt í uppsetningu, tekur hæfilega mikið að resourcum og er frábær skjölun. En ef við segjum einfalt þá er vissulega átt við einfaldara þar sem allt ferlið getur verið flókið og valmöguleikarnir miklir reynum við að brjóta það niður í smáa bita og einbeitum okkar að grófu myndinni til þess að fá þetta að virka til að byrja með.
Ávinningur
Andlitsgreiningin nýtist einstaklega vel í aðgangsstýringum t.d. til að opna útidyrahurðina eða bílskúrshurðina. Allar aðgerðir í Home Assistant eru vistaðar með tímastimpli og er því auðvelt að rekja þær.
Hafa skala í huga að það er ekki mjög erfitt að plata andlitsgreininguna með andlitsmynd sem haldið er fyrir framan myndavélina og því skal ávallt setja upp annað þrep í auðkenningu. Það væri t.d. hægt með því að fá staðsetninguna í gegnum síma, láta senda skilaboð á annan aðila eða láta ekki afvirkja öryggiskerfið.
Íhlutir
Til þess að láta þetta allt saman virka þurfum við nokkra hluti
- Vélbúnað sem hægt er að keyra Deepstack á. Lágmarkskröfurnar eru: vélbúnaður með 64 bita stýrikerfi. Raspberry Pi 4 eða Odroid N2+ með amk 4GB vinnsluminni sem eru hæfileg í þetta verkefni en auðvitað er allur vélbúnaður „fyrir ofan“ þetta (t.d. Intel NUC, Mac Mini).
- Vélbúnaðurinn þarf að keyra Docker. Við förum ekki yfir uppsetningu á Docker hér en er í raun mjög einfalt (sudo apt-get install docker.io)
- Vefmyndavél/dyrabjalla sem er stutt af Home Assistant til þess að taka stöðumyndir (snapshot). Allar myndavélar með RTSP streymi eða ONVIF stuðning eru góð í þetta verkefni. Dyrabjallan frá Dahua er tilvalin í þetta verkefni þar sem hún er með virkan stuðning við Home Assistant í gegnum samþættingu frá RonnieRoller eða MyHomeIOT.
- Deepstack virkar alveg sjálfsstætt. Þannig að í raun gætum við notað Deepstack til að finna og greina andlit af myndunum okkar. En auðvitað viljum við fá virknina inn í Home Assistant. Besta leiðin til að setja upp Deepstack fyrir Home Assistant er í gegnum HACS. Við gerum ráð fyrir að þú ert með HACS viðbótinn en auðvitað er líka hægt að niðurhala kóðann beint og setja inn í „custom_component“ möppuna í Home Assistant.
Uppsetning á Deepstack
Þar sem Deepstack er augljóslega miðpúnkturinn í þessu þurfum við að setja hann upp. Þar sem það virkar vel með einni skipun!
docker run -d --name deepstack --restart unless-stopped -v /home/homeassistant/.homeassistant/deepstack:/datastore -e VISION-FACE=True -p 8088:5000 deepquestai/deepstack:arm64-2022.01.1
Það er ágætt að skoða mismunandi útgáfur á vefsíðu docker þar sem valda útgáfan gæti verið öðruvísi miðað við hvaða vélbúnað gámurinn er keyrður á.
Við þurfum að passa portnúmerið (ég valdi 8088 því að ég nota port 5000 í öðrum tilgangi) og hvar deepstack geymir gögnin sín. Það er gert með „-v“ skipun. Ef við gerum það ekki þá eru öll gögnin geymt inni í gámnum sem gerir það að verkum að þjálfun á andlitum tapast ef gámurinn er eyddur út. Ef allt hefur gengið vel þá ættum við sjá inn á vefvafra:
Við þurfum ekki að hafa áhyggjur af því að samskiptin fara ekki í gegnum dulkoðað ssl þar sem við notum Deepstack þjónustuna bara innanhús.
Uppsetning á Deepstack samþættingu
Að tengja Home Assistant og Deepstack saman er jafn auðvelt.
Gerfimyndavél
Deepstack getur einungis tekið við stökum myndum en ekki myndavélastraumum. Þess vegna þurfum við fyrst að búa til „gerfimyndavél“ sem tekur myndaskot af vefmyndavélinni okkar og vistar hana á tölvunni okkar. Til þess að gera það þurfum við að keyra sjálfvirknisreglu sem keyrir á x tíma fresti, tekur myndaskot og vistar það á tölvunni. T.d. svona:
alias: Doorbell snapshot
description: ''
trigger:
- platform: time_pattern
minutes: '1'
condition: []
action:
- service: camera.snapshot
target:
entity_id: camera.mycamera
data:
filename: /home/homeassistant/xxxx/Doorbell/snapshot/latest.jpg
mode: single
Auðvitað getum við gert þetta allt saman í Home Assistant án þess að „forrita“ eitthvað en þetta er bara svona vegna þess að skjáskotið kemst ekki hér fyrir. Í dæminu hér fyrir ofan tökum við skjámynd einu sinni á mínutu en auðvitað má gera þetta örara. Þetta aukir auðvitað bara álagið á tölvuna. Við mælum með því að myndavélastrauminn sem notast er við þetta sé í lágmarki. Gæðin á myndagreiningu (confidence) aukist ekki með að senda inn stærri mynd.
Núna búum við til gerfimyndavélina sem tekur alltaf síðast myndskot af myndavélinni okkar. Í Home Assistant stillingarskránni (configuration.yaml
)bætum við því við:
camera:
- platform: local_file
file_path: /home/homeassistant/xxxx/Doorbell/snapshot/latest.jpg
name: doorbell_latest
Stilling á Deepstack samþættingu
Núna þurfum við að bæta öðrum hlut við í stillingaskránni (configuration.yaml
) til að segja Deepstack hvaða mynd á að nota til að senda í greiningu og hvert á að vista myndirnar af andlitinum þegar hann finnur einhver andlit.
image_processing:
- platform: deepstack_face
ip_address: localhost
port: 8088
detect_only: False
save_file_folder: /home/homeassistant/xxxxx/FaceDetection
save_timestamped_file: True
save_faces: True
save_faces_folder: /home/homeassistant/xxxxxx/FaceDetection/Faces
show_boxes: True
source:
- entity_id: camera.doorbell_latest
name: doorbell_face_counter
Þá er kominn tími til að athuga hvort allt hefur verið skráð rétt og endurræsa.
Breytingar í Home Assistant
Þegar við höfum farið í gegnum öll skref hér fyrir ofan þá ættum við sjá nokkrar breytingar í Home Assistant. Til þess förum við í Þróunarverkfæri.
Undir Stöður sjáum við sensorinn sem hefur stofnast. Hann geymir upplýsingar um hversu mörg andlit hafa greinst, hver og með hvaða sjálfsöryggi (confidence). Til að byrja með sjáum við ekkert hér.
Undir þjónustur sjáum við tvær aðgerðir sem við gætum keyrt. Sú fyrsta er til að greina andlitin í mynd (service: image_processing.scan). Þegar við veljum þessa aðgerð fáum við valmöguleikann um að velja myndina sem við vorum að skilgreina.
Svo er önnur þjónusta sem heitir „Deepstack teach face“ (deepstack_face.teach_face). Með þessari aðgerð getur þú þjálfað Deepstack til að greina andlitin.
Deepstack vistar öll andlit sem hann greinir og getum við notað þessar myndir til þess að þjálfa andlitin okkar. Öll andlit er hægt að skoða undir Media browsernum.
Notkun á andlitsgreiningu
Ef við erum búin að þjálfa andlitin okkar þá getum við keyrt andlitsgreiningu í ákveðnum tilvikum. Til þess notum við aðgerðina „image_scan“ og notum myndina á gervimyndavélina sem við erum búin að skilgreina. Þá ætti sensorinn okkar að gefa okkur einhverjar níðurstöður.
Í þessu tilfelli fáum við til baka nafn á andlitinu sem hefur greinst og líkurnar á því að þetta er virkilega andlitið miðast við andlitin sem við höfum þjálfað Deepstack með. Til að fá áreiðanlegar niðurstöður ættu líkurnar að vera að lámarki í kringum 80-85%. En hvernig nýtum við okkur þessar upplýsingar?
Til þess búum við t.d. til sjálfvirknisreglu sem keyrir í hvert sinn sem dyrabjallan hefur verið ýtt á. Í þeim tilfellum búum við til stöðumynd (snapshot) af persónunini sem ýtir á bjölluna og sendum við þessa mynd í andlitsgreiningu.
alias: Doorbell ringing
description: ''
trigger:
- platform: state
entity_id: binary_sensor.doorbell_dahua_button_pressed
from: 'off'
to: 'on'
condition: []
action:
- service: camera.snapshot
target:
entity_id: camera.doorbell_dahua
data:
filename:>-
/home/homeassistant/Videos/Doorbell/latest/doorbell_latest.jpg
- service: camera.snapshot
target:
entity_id: camera.doorbell_dahua
data:
filename: >-
/home/homeassistant/Videos/Doorbell/{{ now().year }}/{{ now().month
}}/{{now().day}}/{{ as_timestamp(strptime(now(),'%dd %Hh
%Mm'))|timestamp_custom('%H:%M')}}.jpg
- service: image_processing.scan
target:
entity_id: image_processing.doorbell_ringing_face_counter
data: {}
Eins og þú hefur kannski tekið eftir þá tökum við alltaf tvær stöðumyndir. Ein með tímastimpli og ein sem er alltaf yfirskrifuð og er því með fasta „slóð“. Þessa mynd notum við alltaf til að greina möguleg andlit í myndinni.
Nú þurfum við að vinna úr gögnum sem við fáum til baka. Til að byrja með þá ætlum við að senda mismundandi texta í símann þegar andlitsgreiningunni er lokið og sendum mynd með tilkynninguna:
service: notify.mobile_b31
data:
message: >
{% set personatdoor= state_attr("image_processing.doorbell_ringing_face_counter","faces").0.name
%}
{% set personatdoorconfidence = state_attr("image_processing.doorbell_ringing_face_counter","faces").0.confidence|int
%}
{% if personatdoor=='xxxx' %} Snjallingur ehf is at the door with a confidence of
{{personatdoorconfidence}}
{% elif personatdoor=='xxxx' %} Snjallingur ehf 2 is at the
door with a confidence of {{personatdoorconfidence}}
{% elif
personatdoor=='snjallingur' %} Snjallingur ehf 3 is at the door with a confidence
of {{personatdoorconfidence}}
{% else %} A unknown person is in front of the
door
{% endif%}
title: Dyrabjallan var að hringja
data:
image: /media/homeassistant_videos/Doorbell/latest/doorbell_latest.jpg
Sama aðferðafræðina gætum við síðan notað til að opna útidyrahurðina eða bílsskúrshurðina ef líkurnar eru stærri en t.d. 85%.
Viltu vita meira um hvað hægt er að gera og nýta þér andlitsauðkenningu í öðrum tilgangi eða vantar þig einfaldlega aðstoð að setja þetta allt saman upp hjá þér? Hafðu þá samband við okkur í gegnum tölvupóst: [email protected].