Beerificial Intelligence: bieren herkennen met de hulp van machine learning

Een van mijn voornemens voor 2017 is om meer met machine learning aan de slag te gaan. Eind 2016 heb ik op Coursera de Machine Learning cursus voltooid, die overigens een zeer goede intro is over machine learning. Over het algemeen is het een heel technische cursus waar Andrew Ng de slides vol wiskundige formules niet schuwt, maar hij is wel zeer succesvol in het uitleggen van technieken achter verschillende concepten zoals “support vector machines” en “neural networks”.

Mijn eerste machine learning (test)project is bierificial intelligence geworden, een image recognition app die aan de hand van een flesje herkent van welk biermerk het is. Een beetje zoals Vivino, maar dan voor bier. Om het in Silicon Valley termen te zeggen. 🙄

Bierificial Intelligence zonder machine learning

Bierflesjes herkennen lijkt op het eerst zicht een simpele opdracht waar je eigenlijk helemaal geen fancy technieken zoals machine learning voor nodig hebt. Neem nu volgend Duvelflesje:

Standaard Duvel flesje.

Hoe zou je code kunnen schrijven om na te gaan of dit al dan niet een Duvelflesje is?

Zonder machine learning is dit eigenlijk een onmogelijke opdracht zo blijkt. Oplossingen waar je misschien aan dacht zoals “kijken of er Duvel op het flesje staat”, “kijken of de vorm van de fles overeen komt” of “kijken of de verhouding tussen wit (de achtergrond van het etiket) en rood (het logo) overeen komt” blijken gewoon geen goede oplossingen te zijn, daar de echte wereld niet altijd zo perfect is.

Zo ontkracht volgende foto de vorige 3 ideeën in 1 keer:

  1. Het Duvel logo staat veel schuiner en kleiner op deze foto. Het is onmogelijk om voor elke variant van het logo te kijken of het ergens op de foto te vinden is.
  2. Daar dit een zwart-wit foto is kunnen we niet nagaan wat de verhouding tussen rood en wit is. Daar bovenop komt nog eens dat er aan de rechterkant wel veel wit te zien is, wat voor een verkeerde verhouding tussen rood en wit kan zorgen.
  3. Vanuit deze hoek is de typische vorm van het Duvelflesje niet zo herkenbaar meer.

Hoe doen we het dan wel? Met machine learning!

Bierificial Intelligence mét machine learning

De techniek achter image recognition is iets te technisch en te ingewikkeld om in een blogpost uit te leggen, maar in se komt het hier op neer:

Verzamel trainingdata

Je verzamelt trainingsdata en voorziet alles van labels. In dit geval is de data de foto’s van flesjes bier. Ik haalde de data van Google Image Search en Untappd. Zo zag mijn trainingsdata van de Duvelflesjes er als volgt uit:

Zoals je kan zien zijn dit geen “stock foto’s” maar foto’s uit de echte wereld, met close-ups, zwart-wit afbeeldingen, van dichtbij genomen, van ver genomen, vanuit een schuine hoek, etc. Dit is belangrijk, want hoe meer variaties je hebt, hoe beter je netwerk traint.

Kies een manier/algoritme

Op het moment van schrijven is het GoogLeNet (paper op arxiv) algoritme echt state of the art wat betreft image recognition en labeling, dus uiteraard koos ik hiervoor. Het GoogLeNet ziet er zo uit:

Er komt sowieso nog wel eens een blogpost aan om uit te leggen wat er net gebeurt in het diagram hierboven, maar het komt er op neer dat er lang de linkerkant een afbeelding wordt ingevoerd en het CNN (convolutional neural network) in elke neuron de afbeelding zo gaat bewerken en andere features gaat accentueren. Zie volgende album op imgur:

80 different GoogLeNet layers…on a giraffe

Je laat al je trainingsdata door dit netwerk gaan. Dit is het gedeelte dat eigenlijk het meeste tijd (en geld) kost. Op mijn homeserver – zonder GPU – duurde het een kleine 2 uur om het netwerk te trainen. En dat was dus voor slechts 5 biermerken te kunnen onderscheiden. Laat staan dat je het netwerk wilt trainen om duizenden of miljoenen objecten te herkennen. Dat is echt onbegonnen werk op een kleine homeserver, en daarvoor zul je ofwel een server met een paar GPU’s voor moeten aanschaffen, ofwel een p2.8xlarge ec2 instance (of beter) gebruiken op AWS, dat met zijn $7.776/uur best prijzig is.

Het resultaat na al die uren trainen is een model van 84MB dat gebruikt kan worden om bierflesjes te herkennen.

Testen, trainen, testen, trainen

Het model is eigenlijk nooit perfect. Ik ben er zeker van dat er onder zij die dit lezen wel enkelen een foutief resultaat gekregen zullen hebben toen ze bierificial intelligence testten. Of dat er wel enkelen een al dan niet schunnige foto hebben geupload dat als resultaat Duvel (69%) gaf 😉. Vandaar dat het zaak is om het model te blijven trainen. Des te meer mensen beerificial intelligence testen, des te meer trainingdata (foto’s) ik krijg. Deze nieuwe foto’s gebruik ik dan om het model te hertrainen en beter te maken.

Feedback?

Ik heb eind 2016 besloten om met een blog te starten om hier en daar wat projectjes uit te schrijven en uitleg te geven omdat ik daar wel wat vragen over kreeg (zeker over de bots). Is een blogpost zoals deze op zich al interessant of dien ik er nog verder op in te gaan (en bvb uit te leggen waarom GoogLeNet net zo goed is in het herkennen van objecten in afbeeldingen)? Zou een echte how-to of een tutorial leuker zijn? Laat het me zeker weten in de comments.

Als je geïnteresseerd bent in zulke blogposts over AI/Machine Learning, kan ik je aanraden om je in te schrijven op de grote Jelle Van de Vliet mailinglijst. Ik stuur maximaal 1 keer per maand een mailtje met de nieuwste blogposts en exclusieve extra’s enkel voor de nieuwsbrief.

Schrijf je in op de Grote Jelle Van de Vliet mailinglijst.

* verplicht veld


Summary
Article Name
Beerificial Intelligence: bieren herkennen met de hulp van machine learning
Description
In deze blogpost onderzoek ik of we machine learning kunnen gebruiken om bieren te herkennen aan de hand van een foto. Spoiler: ja, we kunnen dat gebruiken. 😀
Author
Publisher Name
Van de Vliet

Eén reactie, RSS

  1. Wallie 16 januari 2017 @ 03:03

    interessant

JE emailadres wordt niet getoond. Required fields are marked *

*