Dit project beschrijft de ontwikkeling van een zelfvoorzienend systeem voor verkeersmonitoring, gecreëerd als bachelorproject aan de Universiteit van Cyprus. Het systeem maakt gebruik van een Raspberry Pi 5 en een USB-webcam om voertuigen in real-time te detecteren, te tellen en hun rijrichting te bepalen.
Technische kernpunten:
- Machine Vision: Het systeem gebruikt het YOLOv8 Nano-model voor detectie, gecombineerd met Kalman-filters en een Greedy IoU-algoritme voor het nauwkeurig volgen van voertuigen.
- Data-opslag: Geaggregeerde tellingen worden periodiek geüpload naar een externe MySQL-database.
- Optimalisaties: Om het stroomverbruik met 37% te verlagen en de prestaties met 35% te verbeteren, zijn diverse hardware-aanpassingen (zoals onderklokken van CPU/GPU) en software-optimalisaties (zoals model-fusie en headless mode) doorgevoerd.
- Energievoorziening: Het apparaat is volledig autonoom dankzij een 100W zonnepaneel en een 600Wh loodzuurbatterij, met een gemiddeld verbruik van 5,6W.
- Privacy: Alle beeldverwerking vindt lokaal plaats in het vluchtige geheugen; enkel anonieme totalen worden verzonden.
Het systeem behaalde een nauwkeurigheid van 96,6% bij detectie en classificatie, met een verwerkingssnelheid van circa 10 frames per seconde.
Zonne-energie aangedreven oplossing voor verkeersmonitoring
Voor de volledig gedetailleerde versie kunt u mijn thesisrapport lezen:
- [Thesisrapport - Webversie](#)
- [Thesisrapport - PDF-versie](#)
Hardware
Voor het draaien van de software is gekozen voor een Raspberry Pi 5 (4GB) met Raspberry Pi OS en een standaard 720p USB-webcam. Dit platform is gekozen vanwege het brede gebruik, wat resulteert in goede documentatie en aangepaste software (zoals het besturingssysteem) die een hoog niveau van compatibiliteit met drivers garanderen.
De 2GB-versie van de Raspberry Pi 5 is even tevoren in staat om deze software zonder problemen uit te voeren.
Software
Configuratie
Om de software correct te laten functioneren en de richting van de voertuigen te detecteren, moeten eerst enkele parameters per scène worden aangepast:
POINTA en POINTB: Dit zijn de twee richtingen waarnaar voertuigen kunnen bewegen. Uitgaande van een weg die horizontaal in het camerabeeld ligt, bevindt punt A zich links in het beeld en punt B rechts. De scheidingslijn van de weg kan hierbij als referentie dienen.
CROP_RECT: Een array van vier elementen waarmee kan worden gespecificeerd hoeveel pixels er aan elke zijde (boven, onder, links, rechts) uit het beeld moeten worden verwijderd voordat de verwerking begint. Dit kan worden gebruikt om parkeerplaatsen die het algoritme kunnen verwarren, of andere onbelangrijke delen van de scène te verwijderen.
Opstarten
Tijdens het opstarten controleert het programma of er een camera is aangesloten op het systeem en of de externe MySQL-database online is en de opgegeven inloggegevens accepteert.
De hoofdloop van het programma
In eerste instantie maakt het apparaat een frame via de aangesloten camera en cropt dit op basis van de configuratie. Vervolgens wordt het gecropte frame doorgegeven aan het YOLOv8 Nano machine vision-model, dat bounding boxes genereert voor elk element dat tot een voertuigklasse behoort (auto, vrachtwagen, bus, motorfiets). Elke van deze bounding boxes wordt een "detectie" genoemd.
Daarna gebruikt de software een Kalman-filter om de huidige positie van eerder gevolgde voertuigen te voorspellen op basis van hun laatst bekende posities en snelheden. Vervolgens gebruikt het programma een Greedy IoU (Intersection over Union) algoritme om de detecties uit het huidige frame te koppelen aan de voorspelde posities van bestaande tracks. Hierdoor wordt een voertuig in het huidige frame geïdentificeerd als hetzelfde voertuig uit het vorige frame, waardoor hetzelfde ID behouden blijft.
Als een track niet kan worden gekoppeld aan een detectie (wat betekent dat er geen voertuig is gedetecteerd waar voorspeld was dat het zou zijn), blijft het programma het Kalman-filter bijwerken met voorspelde posities voor een vastgesteld aantal frames, totdat het object als verloren wordt gemarkeerd en de track wordt verwijderd. Als een detectie niet overeenkomt met een bestaande track, maakt het programma een nieuw track-object aan en kent hier een uniek ID aan toe.
Om de richting te bepalen waarin een track beweegt, moet de software een object gedurende een vastgesteld aantal frames hebben gevolgd. Zodra dit aantal is bereikt, berekent het programma de projectie van de positie van de track op de lijn tussen POINTA en POINTB. Door te analyseren hoe deze projectie in de loop van de tijd is veranderd, wordt bepaald of het voertuig richting POINTA of POINTB is bewogen. Wanneer een track is geclassificeerd en is toegevoegd aan de teller, wordt deze gemarkeerd als 'geteld' om dubbeltellingen te voorkomen.
De bounding box is aanvankelijk cyaan-gekleurd voor objecten die nog niet zijn geclassificeerd. Zodra het programma de richting bepaalt, wordt de kleur bijgewerkt naar rood (voor beweging naar links) of groen (voor beweging naar rechts).
Data-upload
Indien ingeschakeld in de configuratie, uploadt het programma periodiek het aantal getelde voertuigen naar de in de configuratie opgegeven online MySQL-database. Elke upload creëft een nieuw record in de databel, bestaande uit een UTC-tijdstempel, het aantal voertuigen dat richting POINTA bewoog en het aantal voertuigen dat richting POINTB bewoog. Na elke upload worden de tellers gereset naar nul voor de volgende periode.
Optimalisaties
Om de doelstellingen voor prestaties en stroomverbruik te behalen, zijn er aanpassingen gedaan aan de software en hardware. De volgende instellingen zijn gebruikt:
Hardware:
- Bluetooth uitgeschakeld
- PCIe-slot uitgeschakeld
- Audio uitgeschakeld
- Beide HDMI-poorten uitgeschakeld
- CPU ondergeklokt naar 2000MHz
- GPU ondergeklokt naar 400MHz
- CPU ondergevolt met behulp van het -2 preset
- CPU-governor ingesteld op "conservative"
Software:
- YOLOv8 Nano-model gefuseerd
- Gebruik van memory pre-allocation
- Toevoeging van een headless mode
- Rendering van niet-geziene objecten overgeslagen
- Resolutie van de cameracapture verlaagd
- Onbelangrijke delen van het frame verwijderd in plaats van enkel gemaskeerd
Deze optimalisaties verbeterden de prestaties met 35% en verminderden tegelijkertijd het stroomverbruik met 37%.
Stroomvoorziening
Om het apparaat volledig zelfvoorzienend te maken, is gekozen voor een combinatie van zonne-energie en een batterij. De definitieve configuratie bestaat uit een 100W zonnepaneel (geplaatst in een hoek van 45° op het zuiden) en een 600Wh 12V loodzuurbatterij. Om deze opstelling te verifiëren, is gebruikgemaakt van data van een residentiële zonne-installatie en het Photovoltaic Geographical Information System (PVGIS). De resultaten tonen aan dat het systeem, zelfs in het slechtste scenario, ten minste drie winterdagen zelfvoorzienend zou moeten zijn.
Het apparaat heeft een gemeten gemiddeld stroomverbruik van 5,6W, wat resulteert in een dagelijks energieverbruik van 134Wh. De opstelling is zo eenvoudig mogelijk gehouden: het opladen stopt automatisch wanneer de batterij 13,5V bereikt, wat ruim binnen de veilige limiet voor een loodzuurbatterij ligt. Het apparaat heeft standaard prioriteit over het opladen van de batterij. Het enige nadeel is dat er geen mechanisme is om te voorkomen dat de batterij te ver ontlaadt; dit is niet catastrofaal, maar kan de batterij beschadigen als dit te vaak gebeurt.
Privacy en persoonlijke gegevens
De gegevensverzameling is tot een minimum beperkt en alles wordt zo snel mogelijk verwijderd, zowel om privacyredenen als voor efficiënt beheer van resources. Alle verwerking vindt lokaal op het apparaat plaats en de vastgelegde beelden worden alleen in het vluchtige geheugen (RAM) opgeslagen totdat de machine vision inference is voltooid, waarna ze worden gewist. De enige gegevens die naar de cloud worden geüpload, zijn tijdstempels samen met het geaggregeerde en geanonimiseerde aantal voertuigen dat in die periode door de straat is gereisd.
Testen en validatie
Met behulp van een vooraf opgenomen video als gestandaardiseerde testcase, behaalde de software een nauwkeurigheid van 96,6% bij detectie en classificatie. Deze oplossing werkt ook 's nachts, mits de straat voorzien is van straatverlichting.
Het apparaat verbruikt ongeveer 5,6W tijdens gebruik en verwerkt ongeveer 10 frames per seconde (FPS).
Opmerking: Vanwege privacyregels op de universiteitscampus kan de gebruikte testvideo niet worden gepubliceerd, maar er zal een nieuwe video worden opgenomen en gedeeld.
***
[Thesisrapport - Webversie](#) [Thesisrapport - PDF-versie](#)
Zonne-energie aangedreven oplossing voor verkeersmonitoring
Voor de volledig gedetailleerde versie kunt u mijn thesisrapport lezen:
- [Thesisrapport - Webversie](#)
- [Thesisrapport - PDF-versie](#)
Hardware
Voor het draaien van de software is gekozen voor een Raspberry Pi 5 (4GB) met Raspberry Pi OS en een standaard 720p USB-webcam. Dit platform is gekozen vanwege het brede gebruik, wat resulteert in goede documentatie en aangepaste software (zoals het besturingssysteem) die een hoog niveau van compatibiliteit met drivers garanderen.
De 2GB-versie van de Raspberry Pi 5 is even tevoren in staat om deze software zonder problemen uit te voeren.
Software
Configuratie
Om de software correct te laten functioneren en de richting van de voertuigen te detecteren, moeten eerst enkele parameters per scène worden aangepast:
POINTA en POINTB: Dit zijn de twee richtingen waarnaar voertuigen kunnen bewegen. Uitgaande van een weg die horizontaal in het camerabeeld ligt, bevindt punt A zich links in het beeld en punt B rechts. De scheidingslijn van de weg kan hierbij als referentie dienen.
CROP_RECT: Een array van vier elementen waarmee kan worden gespecificeerd hoeveel pixels er aan elke zijde (boven, onder, links, rechts) uit het beeld moeten worden verwijderd voordat de verwerking begint. Dit kan worden gebruikt om parkeerplaatsen die het algoritme kunnen verwarren, of andere onbelangrijke delen van de scène te verwijderen.
Opstarten
Tijdens het opstarten controleert het programma of er een camera is aangesloten op het systeem en of de externe MySQL-database online is en de opgegeven inloggegevens accepteert.
De hoofdloop van het programma
In eerste instantie maakt het apparaat een frame via de aangesloten camera en cropt dit op basis van de configuratie. Vervolgens wordt het gecropte frame doorgegeven aan het YOLOv8 Nano machine vision-model, dat bounding boxes genereert voor elk element dat tot een voertuigklasse behoort (auto, vrachtwagen, bus, motorfiets). Elke van deze bounding boxes wordt een "detectie" genoemd.
Daarna gebruikt de software een Kalman-filter om de huidige positie van eerder gevolgde voertuigen te voorspellen op basis van hun laatst bekende posities en snelheden. Vervolgens gebruikt het programma een Greedy IoU (Intersection over Union) algoritme om de detecties uit het huidige frame te koppelen aan de voorspelde posities van bestaande tracks. Hierdoor wordt een voertuig in het huidige frame geïdentificeerd als hetzelfde voertuig uit het vorige frame, waardoor hetzelfde ID behouden blijft.
Als een track niet kan worden gekoppeld aan een detectie (wat betekent dat er geen voertuig is gedetecteerd waar voorspeld was dat het zou zijn), blijft het programma het Kalman-filter bijwerken met voorspelde posities voor een vastgesteld aantal frames, totdat het object als verloren wordt gemarkeerd en de track wordt verwijderd. Als een detectie niet overeenkomt met een bestaande track, maakt het programma een nieuw track-object aan en kent hier een uniek ID aan toe.
Om de richting te bepalen waarin een track beweegt, moet de software een object gedurende een vastgesteld aantal frames hebben gevolgd. Zodra dit aantal is bereikt, berekent het programma de projectie van de positie van de track op de lijn tussen POINTA en POINTB. Door te analyseren hoe deze projectie in de loop van de tijd is veranderd, wordt bepaald of het voertuig richting POINTA of POINTB is bewogen. Wanneer een track is geclassificeerd en is toegevoegd aan de teller, wordt deze gemarkeerd als 'geteld' om dubbeltellingen te voorkomen.
De bounding box is aanvankelijk cyaan-gekleurd voor objecten die nog niet zijn geclassificeerd. Zodra het programma de richting bepaalt, wordt de kleur bijgewerkt naar rood (voor beweging naar links) of groen (voor beweging naar rechts).
Data-upload
Indien ingeschakeld in de configuratie, uploadt het programma periodiek het aantal getelde voertuigen naar de in de configuratie opgegeven online MySQL-database. Elke upload creëft een nieuw record in de databel, bestaande uit een UTC-tijdstempel, het aantal voertuigen dat richting POINTA bewoog en het aantal voertuigen dat richting POINTB bewoog. Na elke upload worden de tellers gereset naar nul voor de volgende periode.
Optimalisaties
Om de doelstellingen voor prestaties en stroomverbruik te behalen, zijn er aanpassingen gedaan aan de software en hardware. De volgende instellingen zijn gebruikt:
Hardware:
- Bluetooth uitgeschakeld
- PCIe-slot uitgeschakeld
- Audio uitgeschakeld
- Beide HDMI-poorten uitgeschakeld
- CPU ondergeklokt naar 2000MHz
- GPU ondergeklokt naar 400MHz
- CPU ondergevolt met behulp van het -2 preset
- CPU-governor ingesteld op "conservative"
Software:
- YOLOv8 Nano-model gefuseerd
- Gebruik van memory pre-allocation
- Toevoeging van een headless mode
- Rendering van niet-geziene objecten overgeslagen
- Resolutie van de cameracapture verlaagd
- Onbelangrijke delen van het frame verwijderd in plaats van enkel gemaskeerd
Deze optimalisaties verbeterden de prestaties met 35% en verminderden tegelijkertijd het stroomverbruik met 37%.
Stroomvoorziening
Om het apparaat volledig zelfvoorzienend te maken, is gekozen voor een combinatie van zonne-energie en een batterij. De definitieve configuratie bestaat uit een 100W zonnepaneel (geplaatst in een hoek van 45° op het zuiden) en een 600Wh 12V loodzuurbatterij. Om deze opstelling te verifiëren, is gebruikgemaakt van data van een residentiële zonne-installatie en het Photovoltaic Geographical Information System (PVGIS). De resultaten tonen aan dat het systeem, zelfs in het slechtste scenario, ten minste drie winterdagen zelfvoorzienend zou moeten zijn.
Het apparaat heeft een gemeten gemiddeld stroomverbruik van 5,6W, wat resulteert in een dagelijks energieverbruik van 134Wh. De opstelling is zo eenvoudig mogelijk gehouden: het opladen stopt automatisch wanneer de batterij 13,5V bereikt, wat ruim binnen de veilige limiet voor een loodzuurbatterij ligt. Het apparaat heeft standaard prioriteit over het opladen van de batterij. Het enige nadeel is dat er geen mechanisme is om te voorkomen dat de batterij te ver ontlaadt; dit is niet catastrofaal, maar kan de batterij beschadigen als dit te vaak gebeurt.
Privacy en persoonlijke gegevens
De gegevensverzameling is tot een minimum beperkt en alles wordt zo snel mogelijk verwijderd, zowel om privacyredenen als voor efficiënt beheer van resources. Alle verwerking vindt lokaal op het apparaat plaats en de vastgelegde beelden worden alleen in het vluchtige geheugen (RAM) opgeslagen totdat de machine vision inference is voltooid, waarna ze worden gewist. De enige gegevens die naar de cloud worden geüpload, zijn tijdstempels samen met het geaggregeerde en geanonimiseerde aantal voertuigen dat in die periode door de straat is gereisd.
Testen en validatie
Met behulp van een vooraf opgenomen video als gestandaardiseerde testcase, behaalde de software een nauwkeurigheid van 96,6% bij detectie en classificatie. Deze oplossing werkt ook 's nachts, mits de straat voorzien is van straatverlichting.
Het apparaat verbruikt ongeveer 5,6W tijdens gebruik en verwerkt ongeveer 10 frames per seconde (FPS).
Opmerking: Vanwege privacyregels op de universiteitscampus kan de gebruikte testvideo niet worden gepubliceerd, maar er zal een nieuwe video worden opgenomen en gedeeld.
***
[Thesisrapport - Webversie](#) [Thesisrapport - PDF-versie](#)