sep 092019
 

Niet alleen PoE, waar ik gisteren over schreef, ook de Raspberry Pi 4 was zo’n onderwerp waarmee ik hoognodig aan de slag wilde.  En er was natuurlijk maar één ding dat meteen in me op kwam om al die extra paardenkrachten mee te testen: beeldherkenning op basis van video met behulp van OpenCV, Tensorflow of een van de vele andere opties.

Een van de use-cases die ik voor ogen heb is een systeem dat kan tellen hoeveel fietsers er op een dag voor het I/O-gebouw in Nijmegen voorbij komen. Dat zal geen gemakkelijke worden vrees ik. Ook dit jaar hebben we daar het verschijnsel van de fietsfiles, maar mogelijk verplaatsten die zich zó dicht op elkaar dat ook slim systeem die niet kan tellen.

Een probleem bij de Raspberry Pi en het gebruik van OpenCV of Tenserflow is dat het (meestal) niet een kwestie van installeren is, maar dat je aan de slag moet met het van broncode af compileren van de omgevingen. Dat duurt op een Raspberry Pi in de regel heel erg lang en dan kan het zijn dat je na een uur of langer wachten tóch nog opeens een foutmelding krijgt. Dat je op de Raspberry Pi zowel Python 2 als Python 3 hebt en moet opletten wat je waar voor installeert én het gegeven dat de Raspberry Pi 4 gebruik maakt van Debian Buster, OpenCV ook een versie 3 en 4 heeft en geen van alles zomaar met elkaar samenwerkt, helpt dan ook niet.

Gelukkig bleek er al een recente build te bestaan van OpenCV 4.1.0 voor Raspbian Buster. Samen met de installatie-instructies maakte dat de installatie al een stuk gemakkelijker.

Objecten tellen (domme manier)

Toen ik OpenCV eenmaal had draaien, wilde ik eerst dit voorbeeld uitproberen. Daarbij worden objecten herkend én geteld als ze een gebied binnen komen en/of weer buitengaan. De herkenning is heel rudimentair, objecten die voldoende van de achtergrond verschillen worden geteld, objecten die dicht bij de grenslijnen heen en weer bewegen worden vaak (té vaak) geteld.

Maar goed, het werkt en het was voor het eerst dat ik op basis van Python-code in staat was objecten te laten herkennen met de Raspberry Pi 4.

Mooi roze is niet lelijk 

Mocht je nou hele nauwkeurig naar bovenstaande screenshot gekeken hebben, dan is het je vast opgevallen dat het camerabeeld nogal roze is. Toen ik aan de slag ging met de Raspberry Pi 4 realiseerde ik me dat ik maar 1 ‘gewone’ camera in huis had. Die zat ingebouwd in deze ZeroView houder. En eigenlijk wilde ik de beeldherkenning daar ook gaan gebruiken (lijkt moeilijk te gaan worden want op basis van wat ik er tot nu toe over gelezen heb is de Raspberry Pi Zero daar écht te licht voor) en dan zou het een beetje zonde zijn die weer helemaal uit elkaar te halen.

De andere camera die ik had was een Raspberry Pi NoIR Camera Board V2 – 8MP – Infrarood Camera. Die doet het ook wel met gewoon licht, maar door het ontbreken van de infraroodfilter op die camera is het beeld een stuk roder (roze).

Objecten herkennen (slimmer)

Het eerste script had dus niet helemaal de gewenste kwaliteit. Tijd om een ander voorbeeld te proberen. Dat wordt op deze pagina beschreven en in onderstaande video (niet door mij):

Het installeren van TenserFlow was niet helemaal een kwestie van het eenvoudig knippen en plakken van de commando’s. Sowieso vanwege het reeds eerder genoemde verschijnsel van de snel verschijnende nieuwe versies van broncode.

Uiteindelijk bleken er nog wat packages te missen:

sudo apt-get install libilmbase-dev
sudo apt-get install libopenexr-dev
sudo apt-get install libgstreamer1.0-dev

pip3 install "picamera[array]"

Daarnaast moet ik in Object_detection_picamera.py de resolutie van de camera verlagen om hem goed te kunnen zien via de VNC-verbinding die ik met de Raspberry Pi 4 had.

En warempel. Zonder training wist de Raspberry Pi, zelfs met de IR-camera objecten te herkennen. Allemaal met dank aan het SSDLite-MobileNet model. Het gebruikte model lijkt overigens niet van fruit te houden. Zowel de banaan die ik had als de appel werden niet herkend.

Kan dat niet sneller/beter?

Het script dat ik hierboven heb draaien haalt ongeveer 1 beeld per seconde qua herkenning. En dat met een Raspberry Pi4 met 4GB intern geheugen. Dat is allemaal niet heel erg snel.

In bovenstaande video zie je dat het veel sneller kan, ruim 30 beelden per seconde. Aleen, dan moet je wel nog even 80 USD extra uitgeven voor de benodigde USB Accelerator

Een alternatief is de Intel Neural Compute Stick 2 die vergelijkbaar in prijs is.

(zie uitleg bij de video)

Dat gaat me wat ver, de Raspberry Pi wordt er ruim 2x zo duur van.  De eerstvolgende stap wordt het integreren van Tenserflow in de tel-toepassing zodat ik kan aangeven welk type objecten allemaal geteld moeten worden. Dan kan ik ook kijken of ik kan voorkomen dat bepaalde objecten meerdere keren geteld worden als ze dicht bij de “ingang”  of “uitgang” blijven.

Vervolg

Bovenstaande video hoort bij deze uitleg. Dit is een mensenteller die slimmer is dan de eerste teller uit deze blogpost. Ook die code is een mogelijkheid voor vervolg. Voor nu is het weekend echter weer voorbij, dus moet het allemaal even wachten.

p.s. het Cross-compilen van OpenCV voor de Raspberry Pi Zero met behulp van een docker image van Debian 10 x86-64 zoals hier beschreven is leverde niet veel op. Het compileren (“make -j16”) duurde de hele middag en avond voordat ik hem uiteindelijk afgebroken heb.

Deel dit bericht:

  2 reacties aan “Stoeien met OpenCV en Tensorflow op de Raspberry Pi 4”

Trackbacks (2)
  1. Stoeien met OpenCV en Tensorflow op de Raspberry Pi 4 https://t.co/Qmtd26YhsV

 Geef een reactie

Je kan deze HTML tags en attributen gebruiken: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(verplicht)

(verplicht)

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.