Neurale netwerken op de Raspberry Pi met de Google Coral USB Accelerator

Neurale netwerken zijn een belangrijke techniek in machinaal leren, maar helaas ook rekenintensief en energieverslindend. Met de Coral USB Accelerator biedt Google een handig versnellerbordje aan. Je gebruikt het op je laptop of een Raspberry Pi 4.

Het hart bestaat uit een Edge TPU-coprocessor, die slechts 2 W verbruikt, een heel laag verbruik voor dit soort berekeningen. De Edge TPU is geoptimaliseerd voor TensorFlow Lite, een uitgeklede versie van het opensourceplatform TensorFlow voor machinaal leren.

/images/rpi4-coral-usb-accelerator.jpg

Modellen

Google heeft op één webpagina al zijn modellen voor de Edge TPU geplaatst, waar je ze eenvoudig kunt downloaden. Vooral voor beeldclassificatie zijn er veel modellen beschikbaar. Zo zijn er drie versies van EfficientNet, waarmee je 1000 types objecten kunt herkennen in kleine, gemiddelde of grotere afbeeldingen. Ook van MobileNet zijn er diverse varianten: om 1000 objecten te herkennen, 1000 insecten, 2000 planten en 900 soorten vogels. Ook van Inception, dat 1000 types objecten herkent, zijn er vier versies beschikbaar.

/images/edge-tpu-modellen.png

Ook voor objectherkenning zijn er meerdere modellen. Objectherkenning doet meer dan beeldclassificatie: bij die laatste krijg je gewoon een label "vogel" als er een vogel in het beeld staat. Een model voor objectherkenning vertelt je niet alleen dat er een vogel te zien is, maar toont je ook de locatie. Dat kun je dan visualiseren met een kader rond het object. Er zijn twee versies van MobileNet SSD die de locatie van 90 types objecten kunnen herkennen, en één versie die de locatie van een menselijk gezicht detecteert.

Als je wat verder zoekt, vind je ook elders nog wel andere modellen. Maar je moet er altijd zeker van zijn dat ze voor de Edge TPU zijn gecompileerd. En welk model voor jouw toepassing geschikt is, hangt af van de beelden die je wilt verwerken. Ik raad aan om verschillende modellen te testen.

Aan de slag met de Coral USB Accelerator

In een artikel in Linux Magazine leid ik je door de installatie van de Coral USB Accelerator op Raspberry Pi OS en enkele voorbeelden van machinaal leren:

  • Vogelsoorten herkennen in afbeeldingen.

  • Sleutelwoorden herkennen in een audiostroom van de microfoon.

  • Bestaande modellen voor beeldclassificatie hertrainen met transfer learning om nieuwe klassen objecten te herkennen.

  • Objecten en hun locatie herkennen in afbeeldingen.

Er zijn vele voorbeeldprogramma's in Python te vinden voor de Edge TPU. Bekijk zeker eens de officiële pagina met voorbeelden. Maar ook op GitHub vind je allerlei interessante third-party projecten. Je kunt ook realtime de beelden van een Raspberry Pi Camera Module analyseren.

Dankzij de Google Coral USB Accelerator komen krachtige AI-toepassingen binnen handbereik van de Raspberry Pi waarvoor je vroeger toegang tot krachtige servers in de cloud nodig had.

Simuleer elektronische schakelingen met Qucs

Begrip in elektronica krijg je pas door veel elektronische schakelingen uit te proberen en het gedrag te observeren. Dat kan met fysieke elektronische componenten, maar ook met simulaties.

In academische middens en de industrie wordt er veel gebruikgemaakt van de simulatiesoftware Multisim van National Instruments (NI). Dat is propriëtaire software, je hebt er een licentie voor nodig en ze draait alleen op Windows. Gelukkig bestaat er ook opensourcesoftware om elektronische schakelingen te simuleren onder Linux. Een van die programma’s is Qucs (Quite Universal Circuit Simulator).

Het duurde even voor ik doorhad hoe Qucs werkte, want het programma heeft niet de meest gebruiksvriendelijke interface en de documentatie is nogal fragmentarisch, op specialisten gericht en vaak verouderd. Maar zodra je de basis onder de knie hebt, werkt het programma vrij consistent.

In een artikel dat ik voor Linux Magazine schreef, simuleer ik enkele elektronische schakelingen met Qucs:

  • een spanningsdeler, als voorbeeld van een DC-simulatie;

  • een bruggelijkrichter, als voorbeeld van een transiënte simulatie;

  • een RC-filter, als voorbeeld van een Bodediagram om de frequentieafhankelijkheid van schakelingen te bestuderen.

Die laatste ziet er dan zo uit:

/images/qucs-filter.png

Ik ben geen professioneel elektronicus, maar al met al vind ik Qucs heel geschikt om de occasionele elektronische schakeling die ik maak te simuleren, en ik ga het programma zeker nog gebruiken. En dan heb ik nog maar een fractie van de mogelijkheden uitgeprobeerd. Zo ondersteunt Qucs ook heel wat wiskundige functies en laat het je zelfs toe om scripts met GNU Octave uit te voeren.

GANisme: algoritmische kunst met een hoek af

In 2018 werd het schilderij Edmond de Belamy verkocht bij veilinghuis Christie’s in New York. De koper betaalde maar liefst 432.500 dollar, veel meer dan de 7.000 tot 10.000 dollar die men voor de veiling verwachtte. Was het omdat het Parijse kunstenaarscollectief Obvious zo goed was? Nee, het was omdat de werkelijke kunstenaar een computer was, zoals te zien aan de handtekening rechts onderaan het schilderij.

Edmond de Belamy (bron: Obvious)

Edmond de Belamy was het resultaat van een generative adversarial network (GAN) en de handtekening maakte onderdeel uit van het algoritme. Het werd getraind op een verzameling van 15.000 portretten van de 14de tot de 19de eeuw uit de online kunstencyclopedie WikiArt. Daarna kon je met het systeem naar believen kunstwerken creëren in dezelfde stijl. Een van die resultaten was een wat vaag portret van een man in iets wat een kostuum lijkt, met een misvormd gezicht. Edmond de Belamy was het eerste door AI (artificial intelligence) gecreëerde kunstwerk dat bij Christie’s werd geveild. Obvious maakte nog andere portretten op dezelfde manier, in de collectie La Famille de Belamy.

In een artikel dat ik voor PC-Active schreef in mijn rubriek Denkwerk ga ik dieper in op computerprogramma's die schilderijen maken in deze kenmerkende stijl die GANisme genoemd wordt. Ik kijk ook naar enkele kunstenaars die neurale netwerken trainden op hun eigen kunstwerken om zo nog betere kunst te maken. Het levert fascinerende resultaten op!

CryptPad: samen documenten bewerken zonder pottenkijkers

Met clouddiensten zoals Google Docs, Office 365 of Collabora Online kun je met meerdere personen tegelijk aan een document werken, maar de server heeft toegang tot de inhoud van het document. Dat is nodig voor de werking, zou je denken, maar niets is minder waar: met CryptPad kan het ook zonder dat de server kan meekijken.

CryptPad gebruikt end-to-end encryptie

CryptPad is een opensource (AGPLv3) realtime collaborative editor voor het web. Je kunt hiermee dus samen met anderen aan teksten werken, maar uniek is dat dit end-to-end encryptie gebruikt. Daardoor kan zelfs de server waarop CryptPad draait je data niet inzien: alle encryptie gebeurt client-side in de webbrowser van de gebruikers. Dat betekent ook dat CryptPad je documenten niet kan herstellen als je je wachtwoord vergeet.

Je kunt gratis gebruikmaken van de server op cryptpad.fr om de software te evalueren. Een gratis account aanmaken volstaat; je hoeft zelfs geen e-mailadres op te geven. De beschikbare opslag is in principe beperkt tot 50 MB, maar momenteel is dat tijdelijk verhoogd tot 1 GB om thuiswerken vanwege COVID-19 te ondersteunen. Voor meer opslagruimte kun je bijbetalen, waarmee je dan ook de ontwikkeling van het project steunt, die gebeurt door het Franse bedrijf XWiki SAS. Uiteraard kun je ook je eigen CryptPad-server opzetten, al dan niet via Docker.

De functionaliteit is uiteraard niet te vergelijken met de hierboven vermelde clouddiensten, maar voor eenvoudige documenten werkt CryptPad verrassend goed. CryptPad ondersteunt ook Markdown-syntax, en daarmee kun je tekst, presentaties en zelfs polls aanmaken. Allemaal volledig end-to-end versleuteld. Wil je meer weten? Lees dan mijn artikel over CryptPad in Linux Magazine waarin ik meer aandacht schenk aan de mogelijkheden.

Zet je eerste stappen in programmeren

Als je je computer inschakelt, je smartphone ontgrendelt of je thermostaat bijstelt, treedt er op de achtergrond een heel proces in werking. Iemand (meestal een heel team) heeft de processor die in deze apparaten zit geprogrammeerd: minutieus aan de processor uitgelegd welke instructies die moet uitvoeren.

Computers en algoritmes overheersen steeds meer ons leven. Er gaan zelfs stemmen op om kinderen op de lagere school al te leren programmeren. Maar hoe begin je daaraan? En welke van de vele programmeertalen kies je?

De Arduino Uno, een gebruiksvriendelijk bordje om microcontrollers te leren programmeren. (Bron: Arduino)

Voor Linux Magazine schreef ik het artikel Zet je eerste stappen in programmeren. Ik bespreek er machinetaal, computationeel denken, visuele programmeertalen zoals Scratch en Node-RED, algemene programmeertalen zoals JavaScript en Python en hun ecosystemen, en tot slot het Arduino-platform voor wie meer met microcontrollers en elektronica aan de slag wil.

Uiteindelijk is de beste manier om te leren programmeren het in de praktijk doen en veel oefenen. Zoiets houd je alleen vol als je het interessant vindt. Ik raad dan ook niet aan om een specifieke programmeertaal te kiezen omdat ze populair is of veel gevraagd is op de arbeidsmarkt.

Kies gewoon een taal die goed geschikt is voor iets waarin je geïnteresseerd bent, of dat nu games ontwikkelen, websites bouwen of mobiele apps maken is. En begin dan gewoon al lerend dit te programmeren. Nadat je de basis van een eerste taal onder de knie hebt, leer je heel snel een andere programmeertaal.

Bouw je eigen Raspberry Pi-cluster

Het aantal Raspberry Pi's in mijn huis begon onhandelbaar te worden en het kluwen van kabels en voedingsadapters was me al even een doorn in het oog. Ik besloot een aantal van deze Raspberry Pi's op elkaar te stapelen in een clusterbehuizing, aangesloten op één voeding en één netwerkswitch.

De belangrijkste componenten van de configuratie die ik koos, zijn:

Clusterbehuizing

Deze behuizing met zes lagen vond ik voor € 20 op Amazon:

Een clusterbehuizing voor Raspberry Pi's met acrylplaatjes

De Raspberry Pi's zijn hiermee niet volledig beschermd, want er zit alleen boven en onder elk processorbordje een acrylplaatje. Maar een voordeel van deze opstelling is dat ze gemakkelijk uit te breiden is. Je kunt er ook eenvoudig een laag uitnemen als je die Raspberry Pi tijdelijk elders nodig hebt.

Voeding

Als voeding koos ik voor het € 29 kostende Anker PowerPort 12 A 60 W laadstation met 6 poorten:

Het Anker PowerPort 12 A 60 W laadstation kan 6 Raspberry Pi's voeden.

Belangrijk bij de keuze voor de voeding is dat ze per poort voldoende vermogen kan leveren voor je Raspberry Pi's. Ik ging daarvoor uit van het vermogensverbruik van zes Raspberry Pi 4's op volle kracht. Uit een benchmark van MagPi blijkt dat dit model in een stresstest tot 7 W verbruikt.

Een set van laadkabels (usb-c voor de Raspberry Pi 4, usb-a voor de eerdere modellen) vult dit aan.

Netwerkswitch

Voor de netwerkverbinding kies je een switch met één poort meer dan het aantal Raspberry Pi's in je cluster. Een eenvoudige unmanaged gigabit-ethernetswitch is voldoende. Ik koos voor een TP-Link LS108G 8-poorts gigabit-ethernetswitch van € 25:

De TP-Link LS108G 8-poorts gigabit-ethernetswitch voorziet de Raspberry Pi's van een netwerkverbinding.

Voor de netwerkkabels koos ik voor een set van 7 platte Cat7-ethernetkabels.

Statusleds

Ik wilde de status van mijn Raspberry Pi's eenvoudig kunnen tonen, maar kant-en-klare oplossingen vond ik te duur of met een te klein schermpje. Ik vond een leuke lowtech-oplossing in het Mini Battery Display van Open-Smart. Voor € 1,30 per stuk vind je dit kleine printplaatje met leds op AliExpress. Het bevat een ledbalk met tien segmenten, die je kunt aansturen om bijvoorbeeld de processorbelasting of cpu-temperatuur aan te duiden:

Het Mini Battery Display van Open-Smart is perfect voor statusleds voor je Raspberry Pi.

Ik heb zes van deze printplaatjes op een breadboard geprikt en elk printplaatje is met vier jumperwires met zijn Raspberry Pi verbonden. Ik heb dan een Python-programma geschreven om de leds aan te sturen op basis van de processorbelasting: rpi-mini-battery-display.

Het resultaat

Als je dit alles dan in elkaar steekt, ziet dat er als volgt uit:

Mijn cluster van zes Raspberry Pi's.

Ik koos voor de horizontale plaatsing omdat die het minste problemen met de te korte kabels oplevert, en het zorgt ook voor een gelijkmatige warmteafvoer. Je ziet op de achtergrond wel nog het laadstation in de lucht 'zweven' door de te korte voedingskabels...

Voor PCM beschreef ik uitgebreid hoe je zelf zo'n cluster maakt. Het artikel gaat alleen in op de hardwarekant, maar daar komt al heel wat bij kijken. Meer tips en gedetailleerdere instructies vind je in het artikel.

Al met al ben ik hier tevreden mee. Ik probeer nu sneller nieuwe zaken op mijn Raspberry Pi's uit omdat ik er geen werkloze Raspberry Pi's meer voor uit een doos hoef te halen of een vrij stopcontact moet zoeken. En mijn bureau ziet er heel wat netter uit!

Hulp gevraagd om Nederlandse spraaksynthese te verbeteren

Een opensource stemassistent zoals Rhasspy die volledig offline werkt, is een hele krachttoer. Een zwak punt van Rhasspy is dat de Nederlandse spraaksynthese nogal robotachtig klinkt. Dat is te wijten aan het standaard gebruikte TTS-systeem eSpeak. Probeer dit maar eens uit:

$ espeak -v nl "Welkom in de wondere wereld van spraaksynthese"

Het doet me altijd wat denken aan Howard die in The Big Bang Theory de computerstem van Stephen Hawking imiteert. Leuk voor een keer, maar daar wil je niet de hele dag naar luisteren...

Rhasspy ondersteunt voor het Nederlands ook Google WaveNet, maar dat vereist een Google-account en stuurt elke nieuwe zin die je wilt laten uitspreken naar Google. Dat past dus niet in een offline oplossing.

Buiten wat onderzoeksprojecten waarvan me niet duidelijk is of ze nog onderhouden worden, ken ik geen ander opensource offline spraaksyntheseprogramma dat out-of-the-box Nederlands ondersteunt en een goede kwaliteit haalt.

Hulp gevraagd

Michael Hansen, de hoofdontwikkelaar van Rhasspy, wil aan een oplossing werken door een model voor Mozilla TTS te trainen voor het Nederlands. Maar voor zo'n model heb je een audiocorpus nodig van tekst met de overeenkomstige spraak. En Michael roept daarom nu de hulp in van vrijwilligers met als moedertaal Nederlands.

Hij ziet de volgende opties:

  1. Gebruik een audiocorpus met vrije licentie dat voor elke zin een audiobestand met de overeenkomstige spraak aanbiedt. Audioboeken zoals die van LibriVox zijn dus niet geschikt omdat die per hoofdstuk opgesplitst zijn.

  2. Maak zelf een geschikt audiocorpus aan. Michael bezorgt je dan een fonetisch gebalanceerde verzameling zinnen die je voorleest, samen met een programma dat je spraak op de correcte manier opneemt. Je hebt wel een kwalitatieve microfoon nodig.

Ken je een geschikt audiocorpus of wil je je stem uitlenen om de Nederlandse stem van Rhasspy te worden? Reageer dan zeker in het forum van Rhasspy of spreek me via e-mail of Twitter aan.

Stembesturing zonder luistervinken met Rhasspy

Met slimme assistenten zoals Google Assistant, Amazon Alexa en Apple Siri geef je opdrachten met je stem. Leuk, maar je stemopnames worden wel naar de cloud gestuurd voor verwerking. Met een Raspberry Pi en de opensourcesoftware Rhasspy kun je stembesturing volledig lokaal realiseren, zelfs zonder internet. Je stemopdrachten koppel je dan aan Node-RED of een domoticasysteem zoals Home Assistant, en dat zonder dat Google, Amazon of Apple de hele tijd meeluistert. Zelfs in het Nederlands.

Rhasspy is geen afgewerkte spraakassistent zoals voorgaande voorbeelden. Het is eigenlijk een toolkit waarmee je zelf je eigen spraakassistent ontwikkelt. Meer voor de doe-het-zelvers dus, maar als je al een eigen domoticasysteem zoals Home Assistant hebt draaien, zal dit je zeker niet afschrikken. Na de configuratie heb je een systeem dat audio omzet in gestructureerde JSON-gegevens:

/images/rhasspy-audio-to-json.svg

Je bedoeling herkennen

Rhasspy herkent niet zomaar alles wat je zegt. Je dient zelf te definiëren welke zinnen Rhasspy moet verstaan en welke bedoeling (intent) hij daaraan geeft. Omdat deze herkenning specifiek op maat van jouw vereisten gebeurt, vereist dit geen clouddienst met grote verwerkingskracht, maar kun je Rhasspy perfect op een Raspberry Pi draaien.

Zo definieer je bijvoorbeeld een intent LightState die een toestand kent: aan of uit. Je vult dan zinnen in die deze intent weergeven, zoals "doe het licht aan". Als je dan die zin uitspreekt, komt de hele machinerie van Rhasspy in gang en krijg je als resultaat het JSON-fragment dat de herkende bedoeling op een gestructureerde manier weergeeft.

Daarop kun je dan Home Assistant, Node-RED of je eigen software laten reageren en bijvoorbeeld je apparaten via je stem laten aansturen. Rhasspy maakt gebruik van MQTT (Message Queuing Telemetry Transport) om boodschappen op je netwerk rond te sturen wanneer je hem geactiveerd hebt, wanneer hij een zin heeft herkend, wanneer een sessie voorbij is enzovoort. Je kunt dus in gelijk welke programmeertaal of gelijk welk domoticasysteem op die MQTT-boodschappen reageren en zelf MQTT-boodschappen sturen om functionaliteit van Rhasspy aan te spreken.

Aan de slag met Rhasspy

Wil je ook met Rhasspy aan de slag? Op de website van Computer!Totaal leg ik in het artikel Zo krijg je stembesturing op de Raspberry Pi uit hoe je met Rhasspy begint op een Raspberry Pi met luidspreker en microfoon. Op het einde van het artikel kun je spraakopdrachten in het Nederlands geven aan Rhasspy en kun je Node-RED daarop laten reageren (zie ook mijn artikel Node-RED: apparaten en diensten koppelen zonder code). Loop je tegen problemen aan? Bezoek dan zeker Rhasspy's forum eens, waar talloze behulpzame communityleden actief zijn (waaronder ikzelf).

Heeft de mogelijkheid om zonder clouddienst aan stembesturing te doen je geprikkeld? Lees dan zeker mijn boek Control Your Home with Raspberry Pi: Secure, Modular, Open-Source and Self-Sufficient. Zoals de ondertitel al zegt, is het zelfvoorzienende aspect een belangrijk principe van mijn aanpak in dit boek. Ik vind dat een domoticasysteem niet mag afhangen van externe diensten van bedrijven die er van de ene op de andere dag de brui aan kunnen geven, of die continu kunnen zien wat ik thuis doe. Voor stembesturing geldt dat nog meer: je wilt niet dat Google of een ander bedrijf meeluistert met wat er in je huis gebeurt, ook al is het per ongeluk.

Het hele hoofdstuk over stembesturing in mijn boek gaat dan ook over Rhasspy. Het gaat iets dieper in op enkele aspecten die in het artikel in Computer!Totaal minder of niet aan bod kwamen. Zo leg ik er uit hoe je één Raspberry Pi als basis opzet en één of meerdere als satellieten, zodat je op meerdere plaatsen in huis met Rhasspy kunt spreken. Ook andere manieren dan Node-RED om de opdrachten die je geeft te verwerken komen aan bod, zoals met Python (onder andere via AppDaemon). Het boek is in het Engels en de voorbeelden dus ook, maar dezelfde aanpak werkt ook perfect in het Nederlands.

Zware lectuur

/images/heavy_reading.jpg

Ik wist dat ik zware lectuur in mijn boekenkast had staan, maar dit beeld in mijn thuiskantoor verraste me zonet. Toevallig was het een van de boekenplanken met wiskundeboeken. [1]

Monitor en beperk het netwerkverkeer van je IoT-apparaten met SPIN

Het Internet of Things (IoT) is wat uit de hand aan het lopen, en cybercriminelen maken dankbaar misbruik van al die goedkope apparaatjes in je thuisnetwerk. Maar je hoeft het kind niet met het badwater weg te gooien. Hoe houd je je IoT-apparaten in het oog en, beter nog, hoe blokkeer je hun netwerktoegang selectief, zodat je met een geruster hart kunt gaan slapen?

Het SIDN (Stichting Internet Domeinregistratie Nederland) biedt met SPIN (Security and Privacy for In-home Networks) opensourcesoftware voor je thuisrouter aan waarmee je de verkeersstromen van al je IoT-apparaten in beeld brengt en kunt ingrijpen als een van je apparaten gecompromitteerd is.

In het februari/maartnummer van PCM van dit jaar schreef ik een artikel over SPIN. Je kunt dit nu online lezen, in twee delen:

Monitor en beperk netwerkverkeer

Er bestaan kant-en-klare routers met SPIN ingebouwd, maar je kunt het ook op OpenWrt installeren of op Valibox, een OpenWrt-gebaseerd besturingssysteem van SIDN. Het apparaat zet een draadloos netwerk op, en daarmee verbind je de IoT-apparaten die je wilt analyseren. Ik heb SPIN getest door de Valibox-firmware op een Raspberry Pi 3B te installeren.

Uit mijn test bleek dat SPIN ook prima geschikt is om het netwerkverkeer van een smartphone in het oog te houden. Onmiddellijk nadat je op je met de SPIN-router verbonden smartphone naar een website surft of een app opent, zie je in het live overzicht van SPIN allerlei verbindingen, verrassend meer dan je op het eerste gezicht zou verwachten:

/images/spin-nodes.png

Je kunt ook het netwerkverkeer van een apparaat dat je niet meer vertrouwt blokkeren, of je kunt het netwerkverkeer in een pcap-bestand opslaan. Dat pluis je daarna dan met een packet sniffer zoals Wireshark uit.

Een veiliger internet

IoT-apparaten worden steeds populairder, maar fabrikanten besteden helaas niet altijd voldoende aandacht aan de beveiliging ervan. Er is zeker een mentaliteitswijziging bij IoT-fabrikanten nodig, zodat hun apparaten een veilige standaardconfiguratie hebben, van veilige programmeermethodes gebruikmaken, regelmatig updates krijgen enzovoort.

Maar ondertussen hebben gebruikers ook een verantwoordelijkheid: geef niet elk willekeurig IoT-apparaat in je huis volledige toegang tot je netwerk. SPIN is daarbij een handig hulpmiddel: installeer het op je thuisrouter of, beter nog, op een afzonderlijk draadloos toegangspunt voor je IoT-apparaten.