Kattendetector

Hoe ik een indringer uit mijn huis verjoeg met behulp van neurale netwerken.

Artificial intelligence, big data, deep learning, neural networks... Termen die veel gebruikt worden en weinig begrepen. In veel organisaties wordt gedacht dat het toepassen van geavanceerde data-analyse technieken te moeilijk is, te duur, of enkel voorbehouden aan de grote techbedrijven.

In deze blogpost laat ik zien hoe ik een alledaags probleem kleinschalig aanpakte met geavanceerde data science. Als ik met behulp van deep learning een specifieke kat weg kan jagen uit mijn keuken, dan is er vast ook een praktisch probleem in uw organisatie dat opgelost kan worden met data analytics zonder dat u dat voor mogelijk hield.

Toen ik uit mijn werk kwam was het een zooitje in mijn woonkamer. De plant uit de vensterbank lag op de grond, het drinkbakje van de katten lag op zijn kop, het stonk naar kattenpis en onze twee poezen leken erg gestrest. Dat was al de zoveelste keer die week. Toen we op een zondagochtend ruw gewekt werden door gekrijs in huis en ik in mijn boxershort een enorme rooie kater op de gang aantrof begrepen we eindelijk hoe het zat: Er kwam een vreemde kat in ons huis.

Na het plaatsen van een webcam in de keuken had ik al snel beet: hier is te zien hoe de rode kat ons huis betreedt, ons eten eet, onze poes Zoey het huis uit jaagt en het waterbakje omgooit.

Ik besloot deze kater te gaan verjagen met behulp van data science.

Er bestaan katteluiken die selectief katten in het huis toelaten op basis van hun chip. Zo een luik is best wel prijzig en doet er ook enkele seconden over om een kat te herkennen. Mijn vrees was dat onze poezen, al wachtend tot het luik hen toelaat, alsnog door die grote rode kater gemolesteerd worden. Om die reden (en omdat ik een beetje een nerd ben) besloot ik te proberen deze rooie kater uit mijn huis te weren met data analytics.

Dit pakte ik aan als een echt project, met de volgende fasen:

1. Functionele vereisten

2. Ontwerp

3. Gegevensverzameling

4. Modelbouw

5. Implementatie

Direct naar het resultaat

1. Functionele vereisten

Mijn eisen waren simpel: De rooie kater moest mijn huis uitgejaagd worden, zonder dat mijn eigen katten daar last van hadden en zonder dat wij er in ons dagelijks leven door gehinderd werden. Daarnaast moesten de kosten laag zijn: minder dan de 90 euro die een luik met chip kost.

2. Ontwerp

Ook al weet je soms van tevoren nog niet hoe alles precies gaat lopen, je kan wel een voorlopig design maken. Ik wilde een zogeheten convolutional neural network trainen dat de rode kat moest gaan herkennen. Als de indringer eenmaal geïdentificeerd was moest er een geluid afgespeeld worden. Ik had dus nodig: een camera, een computer en een speaker. Zie onderdeel a) van de afbeelding onderaan dit artikel.

3. Gegevensverzameling

Om een neuraal netwerk te bouwen dat een specifieke kat kan herkennen, moest ik mijn ‘kunstmatige intelligentie’ leren hoe deze kat eruitziet. Daarvoor had ik afbeeldingen nodig, heel veel afbeeldingen. De gegevensverzameling was daarom veruit het meeste werk. Kort samengevat nam ik de volgende stappen:

Beelden verzamelen: Met het Linux pakket Motion werd mijn laptop met webcam een beveiligingscamera die beelden maakte als er beweging gedetecteerd werd.

Interesse regio selecteren: Door te identificeren welke pixels in de foto gewijzigd waren kon ik geautomatiseerd vierkanten uit de foto’s knippen waar de beweging plaats had gevonden. In de volgende afbeelding zie je hoe dat werkt.

Categoriseren: Met de hand sorteerde ik de afbeeldingen in verschillende klassen; onze katten, de roodharige indringer, de robotstofzuiger, lege afbeeldingen en mensen.

Verveelvoudigen: Om een grote en robuuste dataset te krijgen vermeerderde ik het aantal afbeeldingen door ze te verschuiven, te spiegelen en te verstoren. Hierdoor had ik circa 40x zoveel gegevens ter mijn beschikking. In de volgende afbeelding zie je een voorbeeld.

Splitsen en combineren: Voor elke klasse splitste ik de dataset op in een train-, validatie- en testset. Daarna maakte ik een gecombineerde dataset met voor elke categorie ongeveer evenveel afbeeldingen.

4. Modelbouw

Convolutional neural networks zijn deep-learning modellen die goed in staat zijn afbeeldingen in groepen in te delen op basis van kenmerken. Om dat te realiseren moet het model getraind worden. Bij een training laat je het netwerk afbeeldingen zien waarvan het label bekend is. Tijdens het trainen worden de gewichten in het model voortdurend aangepast. Na één trainingsronde wordt op de validatiedata getest hoe goed het model werkt en worden op basis van het resultaat overkoepelende modelinstellingen aangepast. Dit proces wordt herhaald tot het model weinig beter meer wordt. Ten slotte wordt met de testset, met afbeeldingen die het model nooit eerder heeft gezien, de kwaliteit van het model gemeten.

Techniek: Voor de data scientists onder ons; Ik schreef mijn code in Python en bouwde mijn modellen met behulp van Keras (met de TensorFlow backend). Ik trainde meerdere modellen met verschillende architecturen, instellingen en datasets. Meestal gebruikte ik 30.000-35.000 afbeeldingen, circa 80% (25.000) voor de trainingsset, 20% (5.000) voor de validatieset en ik hield ongeveer 1000 afbeeldingen apart als validatieset. De trainingstijd per model liep op tot 8 uur op de CPU, maar werd gereduceerd tot 30-60min toen ik Keras van mijn NVIDIA GPU gebruik liet maken. De globale modelarchitectuur is te zien in onderdeel c) van de afbeelding onderaan dit artikel.

Kwaliteit: Alle geslaagde modellen waren meer dan 95% accuraat in het indelen van afbeeldingen in de juiste klasse. Echter kampte ik in eerste instantie wel met bias: mijn AI was een racist! (Zie blok) Daarnaast was de accuraatheid voor de rode kater niet hoog genoeg. Het is goed dat mijn model de katten kan onderscheiden, maar het is veel belangrijker dat hij de rooie kater herkent én dat hij niet onterecht mijn eigen katten wegjaagt. Ik wilde de false positives ten aanzien van de rode kater zo veel mogelijk minimaliseren.

Zowel de bias als de false positives loste ik op door drie neurale netwerken achter elkaar te zetten. De eerste controleerde of er een kat in de afbeelding zat, de tweede en derde controleerden of deze kat de rooie kater was. Zie onderdeel b) van de afbeelding onderaan dit artikel. Op deze wijze werd in mijn testset geen enkele keer één van mijn eigen katten verward met de rode kater (0% false positives). De accuraatheid waarmee ik de rode kater identificeerde ging wel omlaag naar 85%, dit was echter ruim voldoende voor mijn doel.

Een bevooroordeelde artificial intelligence

Een machine learning model wordt getraind voor een specifieke taak op basis van daarvoor geselecteerde data. Maar als er bij het trainen een bepaald type informatie ontbreekt zal het model hier in de praktijk niet goed mee omgaan. Hij heeft bias. Als een voetballer bij de training nooit op zijn linkerbeen aangespeeld wordt zal hij hier tijdens de wedstrijd ook moeite mee hebben.

Mijn eerste model had niet zomaar bias, hij was een racist! Hij was getraind met de afbeeldingen van drie katten en was heel goed in staat hen te onderscheiden. Kreeg hij een lege afbeelding, robotstofzuiger of mens voorgeschoteld, werd deze ook ingedeeld naar één van deze drie categorieën. Mensen en robotstofzuigers werden daardoor regelmatig onterecht gelabeld als rode kater!

Voor een goed functionerend machine learning toepassing is een onbevooroordeelde dataset (gevuld met alle soorten realistische praktijksituaties) een vereiste.

5. Implementatie

Als we ’s ochtends het huis verlieten zette ik de opstelling aan. In mijn keuken stond de laptop (later vervangen door een Raspberry Pi) met webcam en geluid. De motion bibliotheek maakte van mijn webcam een beveiligingscamera. Er draaide een script dat de afbeeldingen uit de beveiligingscamera aanbood aan mijn model als er beweging had plaatsgevonden.

Praktijktest: De afbeelding van het bewegend object werd door de neurale netwerken geclassificeerd. Pas als alle drie de modellen het eens waren vond ik de identificatie geslaagd. Omdat mijn webcam 6 beelden per seconde maakte vond ik het niet erg dat de rode kater maar in 85% van de gevallen herkend werd. Ik vond het belangrijker om niet mijn eigen katten weg te jagen. Na een week testen bleek de rode kater elke keer dat hij het huis betrad binnen 2 seconden geïdentificeerd te worden. Geen enkele keer werd één van mijn eigen katten onterecht als rode kater aangemerkt. Test geslaagd!

Wegjaagmechanisme: Er ontbrak nog één ding: Een methode om de kat weg te jagen. Daarom maakte ik samen met mijn vriendin een aantal geluidsopnamen waarin wij schreeuwden en in onze handen klapten. Als de rode kat betrapt werd, activeerde het script willekeurig een aantal van deze geluidsopnamen. Die werden dan zo luid mogelijk afgespeeld. Zie onderdeel b) van de volgende afbeelding.

Resultaat

Voor minder dan €70 aan investering in nieuwe materialen (webcam, raspberry PI, behuizingen en kabels) bouwde ik een systeem dat real-time één specifieke rode kater wist te onderscheiden van mijn eigen katten en robotstofzuiger. Als de indringer geïdentificeerd was werd een wegjaag mechanisme geactiveerd. Hiervoor trainde ik met deep learning technieken een neuraal netwerk dat de afbeeldingen van de webcam classificeerde: Een ‘artificial intelligence’ die onder variërende omstandigheden de rode kater wist te herkennen. Dit deed ik op mijn eigen laptop en volledig met open source software. Bekijk de schematische voorstelling van deze oplossing.

Binnen twee dagen nadat ik deze opstelling live bracht kwam de rode kater mijn keuken binnen. Je ziet hier de beelden en de acties van het geautomatiseerde script. De eerste iteratie werd de rode kater niet als kat herkend (false negative). Daarna werd hij door mijn 'kunstmatige intelligentie' geïdentificeerd en de woedende kreten van mij en mijn vriendin klonken door de speakers. Verschrikt keek de rode kater één moment recht in de webcam. Je zag hem denken “Waar komt dat geluid vandaan?” Daarna vluchtte hij de keuken uit.

Missie geslaagd!

Dit proces herhaalde zich de dagen daarna. De kat kwam binnen en werd verjaagd door mijn opstelling. Helaas, eerlijkheid gebiedt mij te zeggen, het succes duurde niet voort. Er waren vele avonden werk en duizenden afbeeldingen nodig om deze AI te leren de kat te herkennen. Deze slimme kat had maar een week nodig om te leren dat deze opstelling niets meer deed dan herrie maken. Ik had geleerd met deep learning gespecialiseerde neurale netwerken te trainen om afbeeldingen te classificeren en autonoom een wegjaag mechanisme te activeren. De kat had geleerd het resultaat te negeren.

Na een week werd mijn 'kunstmatige intelligentie' verslagen door een kat... misschien maar goed ook.

Wil je meer weten over hoe je geavanceerde data analyse technieken toe kan passen in de praktijk of wil je weten wat ik voor jouw organisatie kan betekenen? Neem dan contact op.

Informatie

Rechten

Deze site is gebouwd met Open Source code, rechtenvrije content en eigen werk. Neem echter niet zomaar wat over; Het eigen werk is beschermd en de bronnen staan geen herdistributie toe.

Bronnen