Gå til hovedinnhold

Maskinlæring og dyrket kornåker - sommer 2019

Maskinlæring og dyrket kornåker – sommer 2019

Vi er AI-teamet, og dette er vår første (og siste) bloggpost. Vi tenkte å fortelle litt om hvem vi er, hvilket problem vi forsøker å løse, utfordringer vi har støtt på underveis og ulike løsninger vi har utprøvd.

Teamet består av tre personer: Bjørn, Erling og Arild (fra venstre til høyre på bilde). Vi har alle fullført 4. årstrinn i studieprogrammet Datateknologi ved NTNU, og vi går alle samme retning innenfor dette programmet: kunstig intelligens. Slett ingen dårlig match i og med at vi er AI-teamet.


AI sommer19

Da jeg skrev at vi var tre personer på teamet var ikke dette egentlig hele sannheten. Jeg har hatt nok en kumpan som fortjener en hederlig omtale, nemlig Beistet. Beistet? Hvem i alle dager er Beistet, og hvem går velvillig med på å gi barnet sitt et slikt navn? Gode spørsmål. Fortvil dog ikke, for Beistet er ingen person som sådan. Nei, Beistet er litt mer metallisk i natur. Beistet er faktisk en datamaskin (helt til høyre på bildet). En ganske kraftig en også, med et grafikkort som kalles for Titan Xp — i Galactic Empire edition, så klart. Beistet er kanskje ikke den av oss som snakker mest, men klager aldri, uansett hvor mye data som dyttes inn. Transistorene arbeider fortsatt like jevnt og trutt. I dette teamet surrer vi ikke rundt grøten, så la oss hoppe uti det med hodet først.

Åpne satellittdata + dyrket korn & gress + nevrale nett = ?


Problemstillingen vi er tildelt er, kort oppsummert,

«gitt disse åpne satellittdataene og disse annoteringene, kan dere designe en maskinlæringsmodell som kan segmentere et hvilket som helst område på kartet inn i dyrket gress eller korn?»

Denne beskrivelsen er nok litt vag, så la meg utdype.
Det er kanskje mest naturlig å starte med å forklare hva segmentering er, for det er kanskje ikke kjent for allmennheten. De fleste har hørt om klassifisering. Klassifisering, i bildesammenheng, er å gjette hvilken kategori et bilde tilhører. Disse kategoriene kan være så mangt — det klassiske eksempelet er å gjette om et bilde er en katt eller ikke.

Segmentering kan minne om klassifisering, men når man segmenterer et bilde er man ute etter å gjette hvilken klasse én bestemt piksel tilhører. Istedenfor at man vil gjette om et bilde er av en katt, vil man nå gjette om én bestemt piksel tilhører en katt. Det man ender opp med når man segmenterer et bilde er et nytt bilde som er like stort, men der hver piksel har en verdi som svarer til hvilken kategori den tilhører.

ok. Forhåpentligvis har vi alle nå en felles forståelse av hva segmentering er. Tilbake til problemstillingen.



Vi skal segmentere åpne satellittbilder (fra Sentinel 2, for de som er interesserte i sånt), basert på annoteringer vi ble tildelt. Man trenger en fasit for dataprøvene sine når man trener en maskinlæringsmodell, og dette er vår fasit. Annoteringene forteller oss hva i satellittbildene som er dyrket korn og gress.

Vi ble tildelt en skisse for en løsning på problemet i Python. Skissen anvendte et nevralt nett med en arkitektur basert på U-Net, som er et kjent segmenteringsnett. Dette nettet produserte svært lovende resultater for noen andre annoteringer kalt AR5, som står for «arealressurskart i målestokk 1:5000», så jeg tenkte at det skulle være en smal sak å produsere like lovende resultater for de andre annoteringene. Så feil kan man ta…

Hva gjør man når fasiten er uferdig?


Det viste seg raskt at det å produsere like lovende resultater for de nye annoteringene som for AR5 skulle bli vanskeligere enn vi antok. Vi antar at mye av grunnen til dette er mangelfulle annoteringer. Annoteringene i mange av bildene er mangelfulle, i den forstand at det mangler annoteringer for dyrket korn og gress selv om det åpenbart er flere områder med korn og gress i bildene. Vi kunne annotert manuelt, men det er veldig mange områder det er vanskelig å si om området faktisk er korn eller gress, om gresset er dyrket eller ei, og så videre.

Vi har prøvd flere løsninger for å få bukt med disse manglende annoteringene, i varierende grad av suksess.

Den kanskje mest interessante foreslåtte løsningen for problemet har vært å trene en maskinlæringsmodell opp på piksler vi er helt sikre på er riktig annotert (dette kunne vi gjøre ved hjelp av AR5-annoteringene), og så få modellen til å gjette annoteringen selv. Modellen vi har brukt til dette kalles på engelsk for «Gaussian mixture model», og er en slags klyngealgoritme som tar hensyn til varians når den skal bestemme hvilken klynge en dataprøve tilhører. Noen annoteringer av modellen har vært gode, mens andre dårlige — om denne «løsningen» gjør mer godt enn vondt er vanskelig å si.

En annen ting vi har prøvd å gjøre er å svarte ut de områdene i satellittbildene der vi ikke er sikre på om annoteringene er riktige. Problemet med denne tilnærmingen er at svært mye av bildet kan bli svartet ut. Likevel virker dette å være tilnærmingen som gir de beste resultatene.

Mer rigorøs testing må til for å finne ut hvilken metode for å håndtere de manglende annoteringene som er best, og er derfor naturlig nok en av de tingene som står på agendaen fremover.

Resultater og veien videre

På bildet under kan du se noe resultat fra maskinlæringsmodellen vår. Bildet er fra en klient som en av veilederne våre laget, som sender en spørring som inneholder et polygon til et API vi har skrevet i Flask. Fra spørringen får klienten GeoJSON med polygoner samt tilhørende kategori som geografisk ligger innenfor spørringen.


AI sommer19

Resultatene er ikke så fryktelig gode akkurat nå, selv etter finjustering av modellparametre. Vi tror likevel at resultatene kan bli betraktelig bedre dersom vi hadde hatt komplette annoteringer — man ser tydelig at segmenteringen for AR5 er overlegen, og vi tror at dette er mye på grunn av (nærmest) komplette annoteringer. Det hjelper heller ikke at satellittbildene har liten oppløsning, med ti meter per piksel som høyeste oppløsning. Én piksel vil da svare til et område på 100 kvadratmeter, som er ganske grovkornet.

Det ser dog ut som at vi ikke er helt på bærtur. Dette kan nok bli veldig bra, og det er mange muligheter for forbedringer, som for eksempel ved å annotere bedre eller å få mer høyoppløste satellittbilder, eller å inkorporere satellittbilder fra flere måneder i en modell som opererer på tidsserier, slik at man kan fange hvordan dyrket korn og gress forandrer seg over tid. Kode for prosjektet kan sees her! 


Selv om sluttresultatene ikke er så fryktelig gode akkurat nå, og de sannsynligvis ikke vil være det innen vi er ferdige for sommeren, har det vært veldig gøy og lærerikt å jobbe for Norkart. Vi føler at sommerjobben har vært særdeles relevant for studiet vårt.
Takk for denne gang!



Les mer om Norkart Sommer her