De winnaar van Infinithon 2018: Project Jedi Candy

De winnaar van Infinithon 2018 hadden we natuurlijk al verklapt. Onze slimme snoepautomaat met gezichtsherkenning én gebarenherkenning. Maar je wilt natuurlijk weten hoe we dit voor elkaar hebben gekregen... Lees verder!

Een snoepautomaat kan altijd simpeler

Al enige tijd hebben wij een snoepautomaat bij Infi. Reuze handig om de blikjes cola gekoeld te houden, maar het bestellen moet via een klein toetsenbord waarop je het nummer van de tray ingeeft. Voor de Infinithon kwam het plan om dit te versimpelen: het moet zó simpel worden als voor de automaat gaan staan, een gebaar maken en je favoriete product komt uit de automaat.

We konden het project opdelen in vieren. Dat kwam mooi uit, want we waren ook met 4 personen. René ging werken aan de gezichtsherkenning en Peer aan de gebaarherkenning. Daniel verwerkte deze informatie en maakte de software om een beslissing te maken welk product er dan geselecteerd moest worden, en ik ging er voor zorgen dat de automaat dan ook daadwerkelijk een product ging uitgeven.

Leap motion en python facial recognition

De leap motion heeft heel wat tijd gekost om aan de praat te krijgen. Eerst moesten we erachter komen dat de sensoren een firmware reset nodig hadden voordat windows ze überhaupt kon herkennen. Daarna was het een hele poos trial en error met verschillende SDK versies, maar uiteindelijk konden we aan de slag met de SDK in .net4.5. We waren allemaal verrast hoe nauwkeurig de sensoren individuele vingerbewegingen kon detecteren, en daar hebben we dan ook gebruik van gemaakt in onze code. We hebben detectie van handgebaren van 1 of meer uitgestoken vingers ingebouwd. En als het gebaar matcht met in van onze gestures, dan wordt een signaal doorgestuurd.

Om een persoon te herkennen hebben we gebruik gemaakt van een Python script (gebaseerd op de blogpost van Adrian Rosebrock). Dit script maakt gebruik van opencv en de python facial recognition library. Deze moet getraind worden met een set fotos per te herkennen persoon. Vervolgens kan het programma op basis van visuele input de toegevoegde personen herkennen (in ons geval via een webcam). Zodra een persoon 5 frames consistent in beeld is geweest, wordt er een signaal verstuurd naar de API waar het signaal wordt gematched met mogelijke handbewegingen.

De centrale API ontvangt de herkende persoon en een gebaar. Wanneer deze qua tijd dicht bij elkaar liggen wordt er in de database opgezocht welke lade er bediend moet worden bij dat specifieke gebaar. Een request naar de automaat en het product wordt uitgegeven.

Arduino's maken het werk af

Maar met die simpele request alleen zijn we er niet. De automaat heeft geen WiFi of ethernet aansluiting. Dat moesten we dus zelf inbouwen. De verschillende spiralen met producten worden met individuele motortjes aangestuurd. Wat spanning op een motortje zetten en de spiraal draait. Dit is eenvoudig te doen door met een Arduino een relais te schakelen. En Arduino's kun je ook met een Ethernet shield op het netwerk aansluiten. Een klein stukje code haalt uit de GET request de juiste tray en stuurt dan het bijbehorende relais aan. Om de originele aansturing niet in de war te brengen, en vooral niet te slopen, werkt de oude methode van selectie via het toetsenbord niet meer, maar waarom zou je ook.

Voordeel van de constructie om de automaat aan het netwerk te hangen was ook dat andere projecten de API van de automaat konden gebruiken, waardoor ook project Snips een succes werd.
Wil je nog even meer weten of onze andere Infinithon projecten? Dat kan hier! 

[Henri is developer bij Infi]

Wil je op de hoogte blijven van updates over hippe tech, een kijkje achter de schermen, of upcoming events? Schrijf je in voor onze nieuwsbrief!

Wil je iets waarmaken met Infi?

Wil jij een eigen webapplicatie of mobiele app waarmee jij het bij anderen maakt?

Waargemaakt door de nerds van Infi.
Nerds met liefde voor softwareontwikkeling en die kunnen communiceren. En heel belangrijk: wat we doen, doen we met veel lol!

Wij willen het fixen. Laat jij van je horen?

Voor wie heb je een vraag?