Nooit meer een valse melding van je ip-camera
Het is interessant om enkele ip-camera’s op te hangen, maar als de nieuwigheid eraf is, worden de beelden nog maar zelden bekeken. Bewegingsmeldingen kunnen helpen, maar worden door veel valse meldingen ook al snel genegeerd. Met Frigate NVR detecteer je veel nauwkeuriger personen, dieren en objecten, geholpen door een AI-model. Ook kun je handiger inspelen op meldingen door een integratie met Home Assistant.
In dit artikel laten we in enkele stappen zien hoe je Frigate NVR installeert en optimaliseert, zodat je alleen nog maar een melding van je ip-camera krijgt als dat echt nodig is.
- Installatie van Frigate NVR via Docker of Home Assistant
- Ip-camera instellen met de juiste streams
- Streams configureren
- Stream optimaliseren
- Personen en objecten detecteren
- Gebieden en zones aangeven die voor ongeweste detecties zorgen
Lees ook: Houd toezicht op je huis en tuin: 12 beveiligingscamera's met app getest
Code downloaden In deze workshop worden wat voorbeelden van stukken code gegeven. Omdat overtikken van code erg foutgevoelig is, kun je die code beter downloaden en daarna bekijken of kopiëren. Je vindt de code in het bestand frigcode.txt.
De meest praktische methode om beelden van ip-camera’s op te nemen, is een network video recorder (NVR). Alles wordt dan centraal én lokaal verwerkt. Bekende opties zijn Blue Iris, Synology Surveillance Station, Unifi Protect en Frigate NVR. Steeds vaker wordt AI toegepast. Niemand heeft immers zin om de hele dag naar camera-feeds te kijken. Liever ontvang je een melding als er echt iets interessants gebeurt, zonder overvloed aan valse meldingen natuurlijk.
Blue Iris biedt slimme detectie met CodeProject.ai of DeepStack. Maar de afhankelijkheid van Windows is voor velen een probleem. Frigate NVR is een andere bekende optie en werkt onder Linux. Recent verscheen een grote update naar 0.12.0 waar we in dit artikel mee aan de slag gaan. Aantrekkelijk is de detectie van objecten en personen die je kunt versnellen met onder meer een Google Coral Edge TPU: een kleine chip die machinelearning-taken kan uitvoeren voor een snellere en efficiëntere verwerking. Deze chip gaan we ook gebruiken. Optioneel zorgt een integratie met Home Assistant voor nog meer slimme bewakingsmogelijkheden.
01 Installatie via Docker
Een gebruikelijke manier om Frigate te installeren is via Docker met Compose. Voor je docker-compose.yml-bestand kun je het voorbeeld gebruiken dat je vindt op de installatiepagina van Frigate. Waar je vooral op moet letten, zijn de volumes voor het configuratiebestand (config.yml) en media, zoals opnames en snapshots. Voor media is om te beginnen een paar gigabyte genoeg. Daarna hangt de benodigde ruimte vooral af van het aantal dagen waarvan je opnames gaat bewaren.
Voordat we Frigate gaan starten, zorgen we eerst voor de juiste camerastreams. Als deze streams werken, gaan we verder met de detectie van personen en objecten.
02 Installatie via Home Assistant
Frigate kun je ook als add-on installeren onder Home Assistant OS. Let er in dat geval wel op dat singleboardcomputers, zoals de Raspberry Pi en Odroid N2+, die vaak voor Home Assistant worden gebruikt niet altijd snel genoeg zijn. Vooral bij objectdetectie met meerdere camerastreams kun je zonder extra hardware tegen beperkingen aanlopen.
Voor de installatie voeg je deze repository toe aan de add-on-winkel, waarna je Frigate eenvoudig kunt installeren: https://github.com/blakeblackshear/frigate-hass-addons.
Voor de configuratie van Frigate maak je een bestand frigate.yml in de configuratiemap (/config) van Home Assistant.
03 Welke ip-camera?
Voor Frigate gebruik je bij voorkeur een ip-camera die H.264 ondersteunt, wat gelukkig heel gangbaar is. Hoewel het nieuwere H.265 een betere compressie geeft, is de compatibiliteit met browsers en Home Assistant niet optimaal. Een camera sluit je voor de beste stabiliteit aan via een netwerkkabel. Voor het gemak kun je Power over Ethernet (PoE) gebruiken, waarbij de camera vanuit de switch of een PoE-injector voeding krijgt via diezelfde netwerkkabel.
Het is een pluspunt als de camera meerdere streams kan aanbieden met verschillende resoluties. Je kunt dan opnemen in de hoogste resolutie en voor objectdetectie een lagere resolutie gebruiken, zonder dat je deze streams hoeft om te zetten. Bekende merken die vaak worden aanbevolen, zijn Dahua, Hikvision en Amcrest.
In dit artikel gebruiken we een camera van Hikvision. Het is raadzaam een camera te kiezen die RTSP-streams ondersteunt. Daar gaan we in dit artikel ook mee werken. Controleer in andere gevallen de compatibiliteit van jouw camera. In de documentatie van Frigate vind je nog andere opties om streams op te halen van bekende camera’s.
04 Hoofdstream voor opnames
We gaan eerst de camera instellen zodat deze de juiste streams aanbiedt met de juiste resolutie en framerate. Open daarvoor de configuratie van jouw ip-camera. De camera van Hikvision kun je via de browser configureren. We gaan twee streams gebruiken: een hoofdstream voor het maken van opnames en een substream voor objectdetectie en snapshots. Voor de hoofdstream kiezen we de hoogst mogelijke resolutie (in dit geval 2688 × 1520 pixels) en een beeldfrequentie (framerate) van naar voorkeur 15 fps. Bij de optie i-frame-interval vullen we 30 in. Zorg dat H.264 is geselecteerd als je die keuze hebt en gebruik geen opties als H.264+.
05 Substream voor detectie
De camera van Hikvision ondersteunt naast de hierboven genoemde hoofdstream ook een substream. Standaard is de hoogste resolutie voor die substream 640 × 480 pixels. Optioneel kun je via de systeeminstellingen nog een derde stream instellen. Die biedt een hogere resolutie, tot 1280 × 720 pixels. Dat heeft onze voorkeur en daarom kiezen we ervoor deze derde stream in te schakelen. Hiermee verlies je wel opties als gezichtsherkenning door de camera zelf, H.264+ en H.265+, maar die zijn niet nodig voor deze toepassing. Verder selecteren we H.264. Voor de substream selecteren we een resolutie van 1280 × 720 pixels, en een beeldfrequentie en i-frame-interval van 6 fps. Meer is voor detectie niet nodig.
Test de cameraverbinding We raden je aan om met een programma als VLC media player de verbinding met je camera via RTSP te controleren. Hiervoor installeer je www.videolan.org. Kies dan onder Media de optie Netwerkstream openen en blader naar de url. Voor onze camera van Hikvision is dat rtsp://gebruiker:wachtwoord@ipadres:554/Streaming/Channels/101 voor de hoofdstream. De derde stream is beschikbaar via rtsp://gebruiker:wachtwoord@ipadres:554/Streaming/Channels/103. Zulke streams zijn voor elke ip-camera anders.
06 Configuratie
We beginnen met het toevoegen van de detectiestream. Daarvoor zetten we de onderstaande regels in het configuratiebestand config.yml. We geven hierin de camera een naam (oprit), configureren we de RTSP-stream en definiëren we de resolutie, maar zetten we de detectie nog even uit:
Je kunt Frigate nu starten met dit commando in dezelfde map als het bestand docker-compose.yml:
docker compose up
Met dit commando krijg je in de terminal meldingen te zien. Als alles werkt, kun je Frigate ook als achtergrondproces starten met deze opdracht:
docker compose up -d
De parameter -d staat voor daemon. Je krijgt dan geen meldingen te zien. Je kunt dan de terminal sluiten zonder Frigate te stoppen. Als je na het starten met een browser naar http://ipadres:5000 bladert, zie je als het goed is de beheerdersomgeving met een beeld van de camera. Verander als het werkt achter detect de optie enabled naar True en herstart je container. Hierna zullen personen worden gedetecteerd.
07 Optimalisaties toepassen
Als de stream werkt, kun je enkele optimalisaties gaan toepassen. Bij de huidige configuratie zal ffmpeg de processor gebruiken voor het (softwarematig) decoderen van de streams. Het is verstandig hardwareversnelling te gebruiken als je die mogelijkheid hebt. Hoewel een losse grafische kaart kan worden gebruikt, is een geïntegreerde gpu meer dan toereikend. Voor de negende generatie Intel-processor die we in dit artikel gebruiken, voegen we de parameter preset-vaapi toe als parameter onder ffmpeg.
Vanaf de tiende generatie gebruik je preset-intel-qsv-h264. In de documentatie van Frigate vind je nog aanwijzingen voor verschillende andere systemen. Na het maken van de aanpassing zul je de Docker-container opnieuw moeten starten. Als je daarna via de beheerdersomgeving naar System gaat, zie je of een gpu wordt gebruikt voor hardware-versnelling.
08 Detecteren personen en objecten
Frigate zal bij elke detectie een gebeurtenis maken met daarbij een clip en/of snapshot. Op het snapshot zie je een afbeelding van de gedetecteerde persoon met een kader eromheen en een percentage dat aangeeft hoe zeker het model is dat het een persoon is.
Behalve personen kun je ook bijvoorbeeld honden, katten, paraplu’s, auto’s, fietsen of paarden laten detecteren via sleutelwoorden die je aan de configuratie toevoegt. In de documentatie bij Frigate vind je een enorme lijst met opties. Ook deze opties worden als gebeurtenis toegevoegd en je kunt hier eventueel op filteren. Daarnaast kun je bijvoorbeeld ook op camera en datum filteren.
Standaard zal Frigate de processor gebruiken voor detectie. Dit gaat doorgaans prima met enkele streams, afhankelijk van de resolutie van de detectiestream en de snelheid van de processor. Een speciale detector kan de taken wel enorm versnellen. Bekende opties zijn TensorNT voor grafische kaarten van Nvidia en OpenVINO die werkt op niet al te oude Intel-systemen. De tijd die het AI-model nodig heeft om uitvoer te genereren, ook wel inference speed genoemd, is, afhankelijk van je opstelling, veel korter met zulke detectors. Een Google Coral Edge TPU (zie het gelijknamige kader), onder meer verkrijgbaar in usb-uitvoering, is een van de populairste opties. Alleen is de beschikbaarheid soms beperkt door de snelle opmars van AI.
Google Coral Edge TPU Bij machinelearning worden vaak krachtige servers in de cloud gebruikt. Erg snel en efficiënt is dat echter niet en er zijn voor bepaalde toepassingen zorgen over privacy. Met een zogeheten Edge TPU kun je lokaal je machinelearning-taken versnellen. De Google Coral Edge TPU is een populaire optie, verkrijgbaar als usb-dongel of mini-PCIe-adapter.
Hij is ontwikkeld voor het TensorFlow-platform van Google, een opensource-softwarebibliotheek. Frigate gebruikt die bibliotheek voor het detecteren en identificeren van personen en objecten. Het achterliggende model is daarbij getraind voor bijvoorbeeld personen, auto’s, dieren of andere objecten. De Edge TPU zal de detectie enorm versnellen, waardoor de processorbelasting in Frigate tot een minimum beperkt kan blijven. Dit merk je zeker in het stroomverbruik en daarmee de kosten voor 24x7-gebruik. Helaas is met name de usb-variant soms lastig te verkrijgen en al wat prijziger dan voorheen. De uitvoering met mini-PCIe is eenvoudiger te verkrijgen, maar let op: deze past niet in elk M.2-slot.
09 Coral Edge TPU toevoegen
Voor dit artikel gaan we de usb-uitvoering van de Coral Edge TPU gebruiken. Je hoeft op de host in principe geen drivers te installeren voor de detector, omdat je deze doorgeeft aan de Docker-container, zoals je in docker-compose.yml kunt zien. De container bevat alle vereiste drivers. In de configuratie van Frigate voeg je de volgende regels toe:
Het is overigens wel handig wat drivers en software te installeren op je Docker-systeem, zodat je kunt testen of het apparaat werkt. Zeker als je zoals in onze situatie een Linux-container in Proxmox gebruikt en de hardware voor die container beschikbaar wil maken, wat soms een uitdaging kan zijn. Voor het testen kun je de instructies van Coral volgen. Merk op dat de gebruikte PyCoral-bibliotheek beschikbaar is voor ten hoogste Python 3.9. Debian 11 en Ubuntu 20.04 hebben een nieuwere Python-versie. Eventueel kun je de oudere Python-versie dan via pyenv installeren om de test te doen. Na enkele installatiestappen kun je een model testen met de afbeelding van een papagaai.
10 Gebieden maskeren
Het is nuttig om bepaalde gebieden op het camerabeeld die ongewenste detecties geven te maskeren om de systeembelasting te beperken. Denk bijvoorbeeld aan een overhangende struik die beweegt in de wind.
Je kunt zien welke gebieden veel detecties geven. Open hiervoor het camerabeeld, klik op Show options en zet een vinkje bij Motion boxes. Je ziet nu rode vakjes op het camerabeeld rond plekken weer beweging werd gedetecteerd. Klik op Mask & Zone creator. Klik op Add om een eerste masker toe te voegen. Klik op het camerabeeld op plekken waar je een punt toe wil voegen of houd een punt ingedrukt om deze te verslepen. Je ziet nu een hele reeks coördinaten die je handmatig aan je configuratie moet toevoegen bij de betreffende camera, bijvoorbeeld:
Hierna moet je Frigate herstarten. Je kunt meerdere maskers toevoegen voor verschillende gebieden in het beeld. Uiteraard kun je dit ook bij andere camera’s doen.
Zones aanwijzen
Binnen je beheeromgeving kun je zones aanmaken voor delen van je camerabeeld. Dat werkt vergelijkbaar met het maskeren van gebieden. Op het beeld van je oprit wijs je bijvoorbeeld een apart gedeelte aan met daarin de voordeur. Vaak zul je immers extra geïnteresseerd zijn in personen die voor de voordeur staan.
Zones helpen je ook om ongewenste meldingen tegen te gaan. Neemt de camera bijvoorbeeld een stukje van de weg mee, dan helpen zones je om auto’s die langsrijden of personen die langslopen te negeren, door jouw terrein als zone in te stellen. In je configuratie voeg je de zones dan weer toe bij de betreffende camera:
11 Opnames en snapshots
Voor opnames in hoge kwaliteit kun je voor de betreffende camera een extra stream toevoegen met onder roles de optie record. Als je geen aparte stream hebt, kun je eventueel de stream die je voor detectie gebruikt deze extra rol geven. Verder zetten we opnames (onder record) aan met enabled: True. Voor snapshots doen we hetzelfde onder snapshots. Hier wordt de detectiestream voor gebruikt.
Let op: als bepaalde opties in het configuratiebestand uitstaan, heeft het geen effect als je ze via de beheerdersomgeving aanzet! Dat geldt onder meer voor opnames en snapshots. De totale configuratie voor de bewuste camera ziet er dan als hieronder uit:
Standaard zal Frigate gebeurtenissen van de laatste tien dagen bewaren, maar je kunt dit op allerlei manieren aanpassen.
Geavanceerde opties benutten Frigate geeft je ook nog diverse geavanceerde opties. Zo kun je met wat parameters de detectie nog wat verbeteren, om de incidentele valse melding ook nog tegen te gaan. Ook kun je go2rtc gebruiken, zodat andere systemen zoals Home Assistant de RTSP-streams bij Frigate zelf op kunnen vragen en niet bij de camera (die dat vaak niet aankan).
Ook is integratie met Home Assistant mogelijk. Je kunt dan eenvoudig via Blueprints automatiseringen maken, die zorgen dat je bijvoorbeeld voor bepaalde zones een notificatie ontvangt met clip en snapshot van de gedetecteerde persoon. Merk op dat je voor die integratie een MQTT-broker nodig hebt (bijvoorbeeld de Mosquitto-broker-add-on van Home Assistant), die je dan ook in je configuratie van Frigate moet opnemen.