Maskinlæring og datakvalitet i praksis: case soppidentifisering

Oppdatert: 11. aug. 2019



Vi i Cloudberries elsker multer og anser det selvsagt som skogens gull! Nå som sensommeren er her og vi er inne i august nærmer det seg høysesong for skogens sølv, nemlig sopp. Men hva gjør man hvis man skal på sopptur og rød fluesopp er det eneste man med 100% sikkerhet vet man er i stand til å identifisere?

Opplysningskontoret for frukt og grønt kan betrygge oss med at kantarellen er «den sikre soppen som ikke kan forveksles med noen annen». Samtidig advares det flere steder om at nettopp kantarellen kan forveksles med den såkalte giftslørsoppen. For oss sopp-noobs kan UiO opplyse om at denne potensielt dødelige soppen gir symptomer først etter én til tre uker: I begynnelsen noe lignende en ufarlig influensa, men oppsøker man ikke lege oppstår snart nyresvikt og transplantasjon er nødvendig for å unngå den sikre død. «Fun» fact: Denne soppen sto opprinnelig oppført som spiselig i soppbøker helt frem til 1952, da den polske legen Dr. S. Grzymala oppdaget en sammenheng mellom giftslørsoppen og 10 plutselige dødsfall, samt over 100 sykdomstilfeller.


Så hvordan i det hele tatt våge å nærme seg en soppskog..? Maskinlæring og

bildegjenkjenning kommer til unnsetning! Fagområdet mønster/bildegjenkjenning har opplevd en eksplosiv utvikling de senere årene på grunn av dype nevrale nettverk («deep learning») i kombinasjon med stadig kraftigere grafikkprosessorer (GPU). ImageNet Large-Scale Visual Recognition Challenge (ILSVRC) er en konkurranse som går ut på å klassifisere bilder inn under én av 1000 kategorier, slik som seilbåt, giraff, lastebil, lampe, etc. I 2012 knuste Alex Krizhevsky (et al.) konkurrentene ved å bruke en modell basert på et «convolutional» nevralt nettverk (CNN). Flere nye CNN-baserte modeller har deretter blitt utviklet og slike regnes som 'de facto'-standarden innen bildegjenkjenning.

For å lage en prototype på en maskinlæringsbasert soppidentifikator tok jeg utgangspunkt i

biblioteket fastai, som er bygd på toppen av PyTorch. Med fastai kan man raskt utvikle state-

of-the-art-modeller, siden «best practices» er ferdig implementert, både i form av ferdigtrente modeller og forhåndsvalgte parametere I tillegg er det gode muligheter for å tilpasse når man trenger å skreddersy modellen.



Overordnet CNN-arkitektur for klassifisering av bilde.


Et nevralt nettverk i denne sammenheng er kort fortalt en matematisk funksjon som omgjør et input (her: et bilde = en samling piksel-verdier) til et output (tilhørighet til én klasse). Trening innebærer å gi nettverket en samling ferdigklassifiserte bilder (treningssett) og i flere runder justere funksjonens koeffisienter, slik at den gradvis blir flinkere til å klassifisere. For hver treningsrunde evalueres modellen opp mot et annet sett ferdigklassifiserte bilder

(valideringssett), som kan gi informasjon om når treningen er ferdig. Til slutt testes modellen

mot helt ukjente bilder (testsett).

I korte trekk laget jeg følgende plan:

  1. Datafangst og rensing: Samle bilder for hver sopptype og verifisere/rense data

  2. Trene en modell med utgangspunkt i rensede data

  3. Teste og evaluere modellen

  4. Gå på sopptur!


1. Lage treningsdata

Et lærebokeksempel innen bildegjenkjenning går ut på å identifisere om et bilde enten

inneholder en hund eller en katt, dvs 50% sjanse for riktig klassifisering gjennom gjetting. For

identifisering av sopptyper blir det nødvendigvis mer utfordrende – jeg inkluderte følgende 9 klasser:

God matsopp:

  • Kantarell

  • Gul trompetsopp

  • Sort trompetsopp

  • Steinsopp


Ikke spiselig:

  • Seig kusopp


Svært giftig:

  • Giftslørsopp

  • Rød fluesopp

  • Hvit fluesopp

  • Grønn fluesopp


Vill gjetting gir med andre ord ca 11% sjanse for å klassifisere et soppbilde korrekt. Det

finnes en rekke bildedatabaser med ferdig klassifiserte bilder som er åpent tilgjengelige, blant annet OpenImages, COCO, Caltech, samt databasen til nevnte ImageNet. Jeg fant imidlertid bare noen få av sopptypene jeg var ute etter og valgte å gjøre datafangsten selv. Jeg utførte dermed ni Google bildesøk, ett for hver av de respektive soppenes latinske navn, og lastet ned 100+ bilder for hver sort. Jeg bladde deretter raskt gjennom bildene for å se om noen var feilaktig klassifisert. Da slo det meg at grunnen til at jeg trengte dette verktøyet var nettopp på grunn av min manglende evne til å gjenkjenne sopptyper. Ironisk nok satt jeg og måtte gjøre nettopp dette. For de fleste bildene måtte jeg derfor stole på Google-søkene. I UiO-artikkelen ble det forøvrig nevnt at et tilfelle av giftslørsoppforgiftning delvis skyldtes «dårlige bilder av kantarell på internett»..!

Man må også foreta andre vurderinger: Skal bilder av sopp som ligger i en kurv inkluderes?

Eller sopp som er hakket opp, eller i kjøkkensituasjoner? Jeg valgte å fjerne bilder av sopp

som i stor grad er bearbeidet, men beholde sopp som kun er plukket og ligger i en kurv. Andre grensetilfeller er svært naturtro (men ikke fotografiske) motiver av sopp – f.eks malerier og tegninger. Her valgte jeg å inkludere de mest naturtro. For den hvite fluesoppen med det latinske navnet Amanita virosa og «destroying angel» på engelsk fikk jeg spesielt mange feiltreff, i hovedsak på grunn av et finsk metal-band med samme navn.


Bilder som trygt kan inkluderes ved trening og validering av modellen.

Bilder som muligens kan vurderes inkludert ved trening og validering av modellen.

Bilder som ikke bør inkluderes ved trening og validering av modellen.

Til slutt satt jeg igjen med ca 100 bilder for hver sopptype som ble delt opp i trenings-

/validerings-/testsett i en 60/20/20-fordeling.

2. Trening av modell

For trening av modellen tok jeg utgangspunkt i Resnet34, en variant av den ferdigtrente

ResNet-modellen, som vant ILSVRC i 2015. Mine 60 bilder per sopptype er relativt små

datamengder og man kan med fordel bruke langt flere, men jeg var nysgjerrig på hvor bra

modellen kunne bli selv med manuelt håndterbare datamengder. (En av mytene rundt

maskinlæring er at det alltid er nødvendig med store datamengder.) ResNet-modellen har

riktignok allerede blitt trent på over 1 million bilder, noe som illustrerer kraften i det som

kalles «transfer learning»:

Gjennom «transfer learning» beholder jeg de første lagene til det nevrale nettverket – de som er trent opp til å gjenkjenne bestemte former, mønstre og farger - men endrer de siste lagene slik at modellen blir spesialisert til å klassifisere mine 9 sopptyper (istedenfor de 1000

opprinnelige klassene - seilbåt, giraff, lastebil, osv.) Dette gjøres ved å bruke en varierende

læringsrate, dvs at jeg trener de første lagene i mye mindre grad enn de senere.


3. Testing og evaluering av modell

Jeg avsluttet treningen da korrekt klassifisering for valideringsbildene så ut til å stagnere på

90%. Deretter prøvde jeg modellen på testsettet bestående av ca 20 ukjente bilder per

sopptype. Resultatet ble korrekt predikering for 82% av bildene. I forvirringsmatrisen

(«confusion matrix») kan vi langs diagonalen se hvor mange korrekte prediksjoner vi har per

sopp.


Grønn fluesopp ble oftest feilaktig klassifisert som hvit fluesopp (åtte ganger), noe som er en

«trygg» klassifisering selv om den er feil, siden vi da uansett ikke ville ha plukket denne

soppen. Hvit og rød fluesopp blir korrekt klassifisert hver gang. Sort og gul trompetsopp ble

forvekslet fem ganger, som også er ok siden begge er gode matsopper. De farligste

klassifiseringene får vi for giftslørsoppen, som i to tilfeller blir klassifisert som gul

trompetsopp.

Klassifiseringen innebærer egentlig å rangere sannsynligheten for å tilhøre de forskjellige

klassene. Noen eksempler (fet skrift gir fasit, med predikerte sannsynligheter under):


Korrekt klassifisert.

Feilaktig klassifisert.

Prøv det ut selv - Slik fungerer sopp-identifikatoren >>


4. Gå på sopptur!

Modellen er nok ennå ikke et fullgodt alternativ til soppbøker og praktisk erfaring, men med

noen forbedringer vil den kunne ha potensiale som et hjelpemiddel, spesielt hvis man tar de

oppgitte sannsynlighetene i betraktning.

Noen lærdommer fra caset:

  • Domenekunnskap er svært viktig under utviklingen av en maskinlæringsalgoritme.

  • Maskinlæring må ikke nødvendigvis innebære «big data», men..:

  • Datakvalitet går aldri av moten!

Forbedringer av modellen kan f.eks. gjøres gjennom ytterligere trening på et større

datamateriale og en utvidelse av det nevrale nettverket med flere lag. Videreutvikling kan

innebære multiklassifisering (forskjellige sopptyper i samme bilde), objekt-detektering (hvor i

bildet befinner soppen(e) seg) og detektering i sanntid gjennom f.eks. en app som tar i bruk

mobilkameraet.

Dette caset illustrerer samtidig den lave terskelen for å kunne teste ut en idé, til tross for at

den underliggende teknologien er svært avansert. Kommersielle løsninger som drar nytte av

nevrale nettverk inkluderer alt fra medisinsk diagnostisering, oljeboring, finansiell

svindeldetektering til chatbotter.

Prøv det ut selv - Slik fungerer sopp-identifikatoren >>


Om skribenten Simen Eidsmo Barder er partner og seniorkonsulent i Cloudberries. Han har jobbet med prosjekter innen maskinlæring, og med analyser og visualisering som BI-utvikler. Tidligere har Simen jobbet med komplekse datasimuleringer innen oljebransjen, som dannet grunnlaget for beslutninger av svært stor økonomisk og samfunnsmessig betydning.

Er du interessert i å høre hvordan maskinlæring og bildegjenkjenning kunne hjelpe din organisasjon? Ta kontakt med Simen for å høre mer: simen.eidsmo.barder@cloudberries.no.

Org. nr. 921957319

Tel. +47 459 16 666

Besøksadresse: Arbins gate 2, 0253 Oslo
Postadresse: Postboks 115, 2027 Kjeller 

©2019 by Cloudberries AS.