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.
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:
Datafangst og rensing: Samle bilder for hver sopptype og verifisere/rense data
Trene en modell med utgangspunkt i rensede data
Teste og evaluere modellen
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.
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):
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.
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.
Comments