Hvordan bruke maskinlæring til å klassifisere bilder

Vi hører mye om maskinlæring, men utover at det involverer maskiner som trenes til å løse oppgaver er det ikke helt intuitivt hvordan det fungerer. I forsøk på å avmystifisere begrepet vil vi se på hvordan vi med maskinlæring kan lage en bildeklassifikator som kan skille hunder og katter.

 

Algoritme

For å lage klassifikatoren vår skal vi bruke en maskinlæringsmetode som heter veiledet læring (Supervised Learning), hvor algoritmen blir trent opp på et datasett med fasit, med andre ord et sett med bilder hvor vi vet hvilke bilder som er av hunder og hvilke som er av katter. Algoritmen vi skal bruke er et nevralt nettverk (Artificial Neural Network), som er godt egnet til supervised learning.

Nevrale nettverk er inspirert av virkemåten til biologiske nevroner, som er koblet sammen i store nettverk. Nevroner er tredelte, med en inngangsdel, en utgangsdel og en aktiveringsdel. Inngangsdelen tar imot elektriske signaler, og om summen av elektriske signaler som blir mottatt kommer over en viss grense aktiveres nevronet, som generer et nytt elektrisk signal og sender dette til andre nevroner via utgangsdelen. Nevrale nettverk behandler matematiske verdier i stedet for elektriske pulser, men virkemåten er mye den samme.

For at det skal bli litt lettere å sette dem opp og justere nettverkene våre pleier man å putte nevronene i lag, hvor utgangsdelen til nevronene i det første laget er koblet til inngangsdelen til nevronene i det neste. Det er vanlig å skille mellom inngangslag, utgangslag og skjulte lag. Inngangslag er eksponerte for omverdenen, og det er her inngangsverdiene blir gitt til nettverket, mens utgangslaget er hvor sluttresultatet vil ende opp etter å ha blitt propagert gjennom nettverket. De skjulte lagene er mellom inngang og utgangslagene, og er derfor skjult for omverdenen. Det er her mesteparten av nettverkets databehandling foregår.

For å klassifisere bilder trenger nettverket vårt et stort inngangslag. Hvis bildene er i gråskala trenger vi et nevron for hver piksel, dersom bildene er i farger trenger vi tre nevroner for hver piksel for å representere RGB-verdier. Utgangslaget må ha like mange nevroner som antall klasser vi ønsker å klassifisere, så i vårt tilfelle trenger vi bare to, ett for hund og ett for katt.

Hvor stort nettverket må være avhenger av oppgaven det skal løse. Enkle læringsproblemer trenger kanskje bare et skjult lag, mens mer kompliserte problemstillinger krever større nettverk. Dybden, eller antall lag i ett nettverk, og antall nevroner i hvert lag pleier å være en avveining mellom opplæringstid og hvor kompliserte problemer nettverket er i stand til å lære seg å løse. En måte å redusere opplæringstiden på er å bruke konvulsjon nettverk, som er spesialisert på å å behandle bilder, og er svært mye brukt til bildegjenkjenning og klassifisering.

Opplæring

Når vi skal lære opp det nevrale nettverket vårt ønsker vi at nettverket skal lære sammenhengen eller “mappingen” mellom inngangsdata og utgangsdata, med andre ord at om vi gir nettverket et bilde av en hund, så vil vi at den skal aktivere utgangsnevronet for “hund” og ikke det for “katt”. For at dette skal være mulig må nettverket lære seg hvilke egenskaper i et bilde som tyder på at det er en hund i bildet, og hvilke som tyder på at det er en katt. Hunder og katter har mange egenskaper til felles, de er begge to mindre enn mennesker, går på fire ben og er dekket av pels, men det er også forskjeller mellom dem som nettverket vårt kan se etter. Hunder er gjerne litt større enn katter, mange hunderaser har ører som henger ned mens katteører stikker opp, og hunder har en munn som stikker ut med en svart snute. I tillegg tar øynene opp en mye større del av fjeset hos de fleste katter enn hos hunder.

Å lage en algoritme som kan oppdage alle disse egenskapene i ett bilde ville vært enormt tidkrevende og upraktisk, så derfor ønsker vi å sette ut hele læringsprosessen til det nevrale nettverket, slik at det selv kan lære seg egenskapene den skal se etter. Til dette brukes læringsalgoritmer.

En vanlig algoritme for å lære opp kunstige nevrale nettverk er “Backpropagation“. Nettverket får et input-signal, og man sammenligner nettverkets utgangssignaler med fasiten til inngangssignalet. Differansen mellom disse to verdiene blir så sendt bakover i nettet, hvor man justerer koblingene mellom nevronene ut fra hvor stort avviket er. Over mange iterasjoner vil grupper av nevroner i de skjulte lagene begynne å identifisere forskjellige egenskaper i bildene, mens utgangslaget vil for eksempel lære seg at utstikkende munn, hengeører og svart snute er mer korrelert med hunder enn med katter.

Treningsdata

For å oppnå en høy treffrate med bildeklassifikatoren er det viktig at treningsdatasettet dekker hele problemområdet som bildeklassifikatoren vil møte senere. For eksempel kan et nettverk som bare er trent på Golden Retrievere få problemer med å korrekt klassifisere Chihuahuaer og Grand Danoiser som hunder.

 

Når det kommer til størrelsen på datasettet så vil et større datasett kunne føre til høyere nøyaktighet og en mer robust klassifikator, mens et lite datasett vil lettere kunne føre til overtrening, hvor nettverket ikke er i stand til å generalisere kunnskapen fra treningsdatasettet til den ekte situasjonen. Et eksempel på dette kunne vært om alle hundene i treningsdatasettet var svarte, mens alle kattene var hvite, så ville nettverket vårt lært denne sammenhengen i stedet for å lære de “ekte” egenskapene til hunder og katter som i større grad lar seg generalisere.

Tolking av resultatet

Nå som bildeklassifikatoren vår er ferdig opplært er det på tide å si noe om utgangsdataene til nettverket. I utgangspunktet er det vi som bestemmer dataformatet til nettverkets utgangslag, siden nettverket vil følge fasiten vi bruker under opplæringen, men det er vanlig å normalisere utgangsdataene til å være et tall mellom null og en, hvor tallet sier noe om hvor sikker nettverket er på at bilde tilhører denne klassen.

Om vi bruker klassifikatoren vår på et hundebilde med høy likhet av det som fantes i treningssettet vårt ville vi få høy konfidens for hund og lav konfidens for katt, og visa versa for kattebilder.

Til slutt:

I dagens bildeklassifikatorer blir det i stor grad brukt ferdigsnekrede nettverk, hvor alt som trengs er å trene opp utgangslaget til nettverket til å passe klassene du ønsker å finne. Til de som er interessert i å lære mer om temaet og prøve det selv har jeg lagt inn noen linker under til et mulig startpunkt. Lykke til!

Visma Consulting har høy kompetanse innen maskinlæring og leverer tjenester innen tekstanalyse, clustering-oppgaver, syntetiske testdata, chatbotter og andre intelligente systemer. Kontakt oss for en uforpliktende prat om maskinlæring eller andre intelligente systemer.

Håvard Svoen jobber som konsulent i Visma. Han har en mastergrad i Teknisk kybernetikk fra NTNU, og jobber som fullstack utvikler på Microsoft avdelingen.
Connect with Håvard: