• No results found

Automatiskt genererade dataset med SfM: En undersökning av SfM och dess egenskaper

N/A
N/A
Protected

Academic year: 2022

Share "Automatiskt genererade dataset med SfM: En undersökning av SfM och dess egenskaper"

Copied!
51
0
0

Loading.... (view fulltext now)

Full text

(1)

Jonas Elmesten joel1803@student.miun.se

Type of document – Computer Engineering (C), Final Project Main field of study: Computer Engineering

Credits: 15 hp

Semester/Year: VT 2021

Supervisor: Roger Olsson, roger.olsson@miun.se Examiner: Patrik Österberg, patrik.osterberg@miun.se Course code/registration number: DT099G

Degree programme: (optional)

(2)

Sammanfattning

Fler och fler industrier vänder blickarna mot A.I. (artificiell intelligens) för att undersöka om och hur det kan användas för att effektivisera olika processer. Men för att träna upp en A.I. krävs oftast stora mängder data där man kan behöva förbereda väldigt mycket manuellt innan man ens kan påbörja träningsprocessen. SCA Skog AB ser dock många fördelar med att göra A.I. till en naturlig del av sin digitaliseringsprocess, där man bland annat är intresserad utav visuella bedömningar av träd.

Dataset för visuella bedömningar kan se ut på olika sätt, men i detta fall var det relevant att skapa dataset i form av konturer för trädstammar.

Med hjälp av en A.I. som skulle kunna visuellt segmentera och klassificera träd så skulle man öppna upp för många nya möjligheter inom skogsindustrin.

Under detta projekt har jag undersökt hur man skulle kunna automatisera processen för skapandet av dataset i skogsmiljöer för just visuella bedömningar. Som ett resultat av att försöka uppnå detta, så fick jag experimentera med bildbaserade punktmoln som på olika sätt tillät projektet att avancera framåt.

Ur dessa punktmoln kunde jag sedan segmentera träden för att i nästa process skapa konturer längs alla träd med hjälp av utvunnen data ur segmenteringen. Jag tittade först och främst på hur man automatiskt skulle kunna skapa konturer för alla träd i bildsekvensen, för att sedan låta en användare gå in och finjustera konturerna.

I resultatet kan man sedan tydligt se skillnaden i tidsåtgång för att använda programmet och inte. Programmet kan skapa och uppdatera pixel-masker snabbare än vad jag manuellt kunde utföra samma arbete, där jag dock hade önskat på en mer markant skillnad i tidsåtgång jämfört med den rent manuella insatsen.

Under projektets gång så kunde jag identifiera några större problem som förhindrade detta, där man med lämplig utrustning skulle kunna uppnå ett mycket bättre resultat än vad som gjordes under detta projekt. Resultaten talar ändå för att det kan vara lönt att undersöka metoden mer ingående.

Nyckelord: A.I, LiDAR, SfM, punktmoln, dataset.

(3)

Abstract

More and more industries are turning their eyes towards A.I. (artificial intelligence) and its rapid development, in hope of utilizing it to remove labor intense operations. But large amounts of manually processed data is often required before starting the learning process, which can be a huge problem to deal with. SCA Skog AB is still very curious in how they could use A.I. in forestry, where visual inspection of trees is of particular interest.

There are many visual problems that modern A.I. can solve, where in this case it’s a matter of finding contours of trees and classify them. If this would be possible, a lot of interesting opportunities would open up to be experimented with.

During this project I’ve examined the possibility of reducing the time it takes to manually create datasets of forest environments for this particular visual problem. As a result of trying to achieve this, I had to examine image-based point clouds and their properties to find out how they could be used in this process.

From the SfM-point cloud I was able to segment all visible trees with an segmentation algorithm and isolate these points to extract the 2D→3D- connection. I could then use that connection to create pixel masks and apply it to the image sequence to paint out all the contours of the segmented trees. A method to automatically update these pixel masks in terms of adding and removal was also implemented, where any update would propagate through the image sequence and reduce the time for manual adjustment.

From testing the program, it’s clear that time could be saved doing various kinds of contour updating-operations. The program could by itself create pixel masks that then could be updated in a way that a lot of need for manual updating was reduced, though the result in terms of time saved was not as substantial as one would have hoped for.

Issues with the point cloud caused some major problems due to it’s low precision. Using better equipment for image gathering would most likely be the best way to improve the results of this project. The result still tells us that this method is worth researching further.

Keywords: A.I, LiDAR, SfM, point could, dataset.

(4)

Förord

Jag vill tacka SCA Skog AB för detta otroligt givande och utmanande projekt. Vill även rikta ett stort tack till André Wästlund som försåg mig med ett stort antal länkar och resurser som på olika sätt hjälpte mig genom projektet.

Sedan så vill jag även tacka min handledare Roger Olsson för all värdefull input, som hjälpte mig mycket med att identifiera viktiga problem under hela processen.

(5)

Innehållsförteckning

Sammanfattning...ii

Abstract...iii

Förord...iv

Terminologi...vi

1 Inledning...1

1.1 Bakgrund och problemmotivering...1

1.2 Övergripande syfte...2

1.3 Konkreta och verifierbara mål...3

1.4 Avgränsningar...4

1.5 Översikt...4

2 Teori...5

2.1 Punktmoln...5

2.2 Bildbaserade punktmoln i skogsindustrin...10

2.3 COLMAP...12

2.4 Trädsegmentering i punktmoln...13

2.5 A.I...14

3 Metod...18

3.1 Tillvägagångssätt...18

3.2 Utvärdering av funktion...19

4 Konstruktion...20

4.1 Skapande av punktmoln och trädsegmentering...21

4.2 Inläsning av skapat punktmoln...22

4.3 Justeringsmöjligheter för pixel-masker...27

4.4 Uppdatering av PointObject...29

4.5 Spara resultat...32

5 Resultat...34

5.1 Exekveringstid...35

5.2 Tidmätning av manuell korrigering...36

6 Slutsatser...39

6.1 Förbättring av punktmoln...40

6.2 Etiska och smhälleliga aspekter...41

6.3 Fortsatt arbete...41

6.4 Slutliga ord...42

Källförteckning...43

Bilaga A: Grafer...46

(6)

Terminologi

Förkortningar och akronymer A.I. Artificiell intelligens SfM Structure-from-motion

CNN Convolutional Neural Network DTM Digital Terrain Model

DSM Digital Surface Model

CHM Canopy Height Model

DEM Digital Elevation Model

(7)

1 Inledning

Att nya tekniker letar sig in i olika typer av industrier ter sig naturligt, där man jämt och ständigt är ute efter att effektivisera och automatisera processer som tidigare utförts manuellt. Skogsindustrin var tidigare präglad av mycket manuellt arbete, där man i takt med den teknologiska utvecklingen lyckats effektivisera många delar av sin verksamhet. Ett tämligen nytt fält som är av intresse för i princip hela världen är frammarschen av A.I. där man på olika sätt lyckats automatisera bort tidigare väldigt arbetsintensiva processer.

1.1 Bakgrund och problemmotivering

Inom SCA Skog AB så har man stort intresse av att kunna kartlägga varje träd i sina skogar. Man använder sig flitigt av punktmoln som är en form av 3D-representation av ett visst område/skogsparti, där enskilda träd i dessa punktmoln rent visuellt inte är lämpliga för någon vidare detaljerad visuell bedömning.

Det vore därmed önskvärt att göra bedömningar genom tagna bilder, för att sedan ha möjlighet att reflektera resultatet tillbaka in i punktmolnet. Detta skulle underlätta vid skapandet av mer detaljerade rapporter vad avser volymberäkning och annan relevant data man skulle kunna utvinna.

Vare sig man tittar på trädtoppen eller på stammen hos ett specifikt träd så kan man rent visuellt utvinna intressant och värdefull data.

CNN (convolutional neural network) [1] har på senare år blivit så pass utvecklade att de numera kan identifiera/bedöma bilder till en gräns som snuddar på nära mänsklig förmåga (där man i vissa fall/användningsområden skulle kunna argumentera för att förmågan t.o.m. är övermänsklig).

Genom att låta en CNN-modell sköta bedömningen av träd så kan man skapa stora mängder av data över skogspartier, som kan vara till underlag för olika beslut inom verksamheten. CNN-modeller är väldigt lämpliga att använda när det kommer till bedömning/inlärning av problem med visuell karaktär, där det i detta fall är relevant att finna konturer och samtidigt bestämma klasstillhörighet för träd.

CNN-modeller är som många andra typer av A.I.-modeller oerhört datahungriga. För att producera goda resultat efter inlärning är det inte ovanligt att man kan behöva tusentals bilder med tillhörande manuellt bearbetad data, där man dock i många fall kan återanvända tillgängliga modeller som är tränade på liknande data som det man avser använda

(8)

för inlärning. Genom att återanvända en annan modells redan inlärda egenskaper kan man reducera storleken på det dataset man behöver för att uppnå god precision efter inlärning. Det som oftast är problemet för att uppnå precision är att man har ett för litet dataset att träna sin modell på.

Sällan är dock problemet enbart att man saknar för lite data i form av bilder, då man med enkelhet kan samla ihop stora mängder data av träd genom en drönare eller att på annat sätt fotografera i skogen – förutsatt att det är just ett problem som bara har att göra med simpla bilder på träd.

Problemet kräver att man skulle ha en CNN-modell som kan segmentera ut konturerna hos varje enskilt träd på en given bild, vilket kräver annoterings-data som är i form av polygoner. Man behöver bara föreställa sig hur pass tidskrävande det skulle vara att manuellt markera ut konturerna för varje enskilt träd på hundratals (kanske upptill tusentals) bilder, så inser man tämligen snabbt att detta vore en väldigt arbetsintensiv väg att gå.

Allting som på något sätt skulle underlätta processen för den manuella bearbetningen skulle vara till stor nytta. Man skulle då snabbare kunna träna upp en CNN-modell för att använda i just detta syfte. Det skulle även gå snabbare att skapa ett nytt dataset i de fall man önskar använda modellen på tidigare inte inlärda träd.

1.2 Övergripande syfte

Projektets syfte är att se hur pass mycket av processen för skapandet av dataset som kan automatiseras, där objekt av särskilt intresse är de synliga träden i bilderna. Optimalt så kunde man automatisera hela processen till 100%, men där allting som på något sätt underlättar den manuella bearbetningsprocessen i senare steg även är av intresse.

Resultatet av en framgångsrikt hanterad bild ska bestå av en samling av pixelkoordinater som med hög precision följer konturerna av de synliga träden i bilden. Förekommer ett träd i flera bilder så bör man kunna gruppera samtliga pixel-masker till trädet i fråga, för att underlätta en eventuell förändring av klasstillhörighet/objekt-id eller liknande.

Alla pixel-masker med dess innehållande pixlar bör även ha en bestående koppling till sina motsvarande punkter i punktmolnet för att enkelt kunna sätta en klasstillhörighet på samtliga punkter som masken innehåller. Detta för att när man väl låter sin tränade CNN-modell bedöma bilderna vill man kunna spegla det resultatet direkt till punktmolnet. CNN-modellen skapar då pixel-masker för alla objekt

(9)

den lärt sig att urskilja och segmentera, där man sedan tar maskernas alla innehållande pixlar som har en 2D→3D-kopplig och reflekterar resultatet genom det.

1.3 Konkreta och verifierbara mål

Programmet ska automatiskt kunna skapa pixel-masker av synliga träd i bildsekvensen, där bildsekvensen består av samma bilder som användes vid skapandet av punktmolnet. Efter programmet har skapat de initiala pixel-maskerna av träden, så ska man kunna ladda valfri bild och få dess resultat synligt markerat över bildens träd.

Om man inte är nöjd med någon automatiskt skapad pixel-mask, ska man kunna uppdatera denna och få förändringen att propagera genom sekvensen med hjälp av 2D→3D-kopplingen, som då skall underlätta eller eller helt ta bort behovet att göra ytterligare förändringar. Så alla typer av manuella pixel-maskuppdateringar skall propagera genom bildsekvensen och på så vis minimera arbetsbördan mer eller mindre.

Önskar man uppdatera någon pixel-mask så gör man detta genom att manuellt markera ut ytan för förstoring/förminskning på valt träd.

Programmet tar sedan över och uppdaterar trädets alla pixel-masker genom bildsekvensen på ett sådant sätt att det ska stämma överens med den manuella markeringen från användaren.

Projektet har följande mål, där skillnaden i tidsåtgång skall vara så pass stor att man tydligt kan dra slutsatsen att man sparade in tid genom att använda programmet för skapande av dataset:

 Tiden det tog för en testperson att korrigera ett bestämt antal automatiskt skapade pixel-masker i en bestämd bildsekvens till en god precision, kontra tiden det tog för samma person att skapa alla pixel-masker från grunden till samma precision.

 Tiden det tog för en testperson att lägga till mer yta till en redan befintlig pixel-mask för ett visst träd, sedan korrigera den propagerade uppdateringen genom bildsekvensen till en god precision, kontra tiden det tog för samma person att manuellt lägga till samma uppdatering genom hela bildsekvensen för ett visst träd.

 Tiden det tog för en testperson att ta bort volym för en redan befintlig pixel-mask för ett visst träd och korrigera den propagerade uppdateringen genom bildsekvensen till en god precision, kontra tiden det tog för samma person att manuellt ta bort ytan för samtliga bilder i bildsekvensen för trädet.

(10)

Sedan ska alla programmets operationer exekveras så pass snabbt att man rimligtvis kan dra slutsatsen att en användare av programmet inte skulle uppleva någon vidare fördröjning under användning.

1.4 Avgränsningar

Som ovan nämnt så är just träden av särskilt intresse för SCA Skog AB i det här projektet, så all typ av undersökning utfördes med just träd i åtanke.

1.5 Översikt

I kapitel 2 går man igenom all relevant teori i sådan ordning att man som läsare sedan ska kunna förstå resterande delar av rapporten.

Kapitel 3 presenterar projektets arbetsgång och hur man gick tillväga för att successivt arbeta fram en lösning för att uppnå de utsatta målen.

Kapitel 4 handlar om själva konstruktionen av programmet, där man går igenom hur alla de olika funktionerna rent tekniskt och även hur man skulle kunna förbättra vissa lösningar. I kapitel 5 så presenteras resultaten av de olika mätningarna av tidsåtgång. Slutligen så går man igenom slutsatserna i kapitel 6, där man tar upp de identifierade flaskhalsarna i projektet och tar upp potentialen för fortsatt arbete.

(11)

2 Teori

I detta kapitel kommer all relevant teknik tas upp för att man som läsare enkelt ska kunna bilda sig en helhetsuppfattning av projektet och dess omfattning.

2.1 Punktmoln

Ett punktmoln är precis som namnet antyder ett moln av punkter där samtliga består som minst av x, y och z-koordinater. Allt som oftast används dessa för att skapa den externa ytan av objekt existerande i verkligheten så som hus i stadsmiljöer eller separata träd i skog. Utöver koordinater så kan varje punkt även ha ett RGB-värde (färgdata) och GPS-koordinater och även andra värdefulla attribut. Det gör att dessa har ett väldigt brett användningsområde för många typer av industrier, då möjligheterna är stora för diverse utvinning av data. I stadsmiljö skulle det till exempel kunna användas för stadsplanering, rivningsprojekt och en rad andra olika typer användningsområden [2].

Nedan kan vi se hur ett punktmoln över en stadsmiljö kan se ut [3].

Inom skogsindustrin har man även mycket stora möjligheter att använda sig av punktmoln på ett fördelaktigt sätt. Man kan samla in stora mängder information på ett enkelt sätt som tidigare inte var möjligt.

Bild 1: Punktmoln över stadsmiljö.

(12)

När det kommer till skapandet av punktmoln så finns det en del olika tekniker, där LiDAR är en vanlig teknik som används. LiDAR är ett aktivt system i den bemärkelsen att systemet själv genererar energi i form av ljus för att mäta bland annat avståndet till allt i miljön. Man skannar av områden genom att skjuta ut laser över miljön som sedan studsar tillbaka till en sensor som mäter tiden det tog för ljuset att återvända. Med den tiden kan man sedan kalkylera hur långt ljuset färdades och man kan slutligen kombinera all data för att skapa en 3D- rekonstruktion av miljön som ljuset träffat – ett punktmoln [4].

Nedan kan vi se ett exempel på hur ett punktmoln kan se ut i skogsmiljö [5].

2.1.1 Vanliga LiDAR dataprodukter

Från LiDAR punktmoln kan man även utvinna andra datamodeller som är användbara för olika typer av beräkningar. Vi har digital terrain model (DTM), digital surface model (DSM) och canopy height model (CHM) [6].

Bild 2: Punktmoln i skogsmiljö.

(13)

På bilden ovan [7] kan vi ser hur DSM bildar som ett täcke av de högsta punkterna i punktmolnet, och där DTM ger oss en yta av terrängen.

Genom DSM och DTM kan vi sedan med utvinna CHM som då även ger oss de lägsta punkterna mellan olika upphöjd objekt.

2.1.2 Structure-from-Motion

Structure-from-Motion (SfM) är en teknik som använder sig av en samling av överlappande 2D-bilder som tillsammans kan skapa en 3D- miljö av det fotograferade området. Med SfM kan man precis som med LiDAR skapa punktmoln, där denna relativt nya teknik kan ses som ett mer konsumentvänligt alternativ då det enda som behövs är någon form av digitalkamera.

SfM är baserat på samma principer som stereoskopisk fotogrammetri, vilket innebär precis likt våra ögon kan uppfatta ett djup genom att observera något från mer än en vinkel. Detta gör att man genom triangulering, där man kan beräkna den relativa 3D-positionen i x, y och z-koordinater genom överlappande bilder.

Bild 3: Dataprodukter från LiDAR.

(14)

I bilden ovan [8], är punkterna P och Q är synliga på båda bilder, vilket gör att man genom att uppskatta en stråle till de båda punkterna i vardera bild kan man genom triangulering bestämma vart dessa punkter befinner sig i en 3D-rymd [9].

Man kan dela upp alla processer för ett typiskt SfM-system enligt följande:

Feature detection and extraction

Första steget består av att man gör en korrespondentsökning där man är ute efter att finna överlappning hos bilderna, där man sedan vill identifiera projektioner av samma punkter i överlappande bilder. Dessa valda punkter bör vara av sådan karaktär att de är lätt att identifiera i de andra bilderna samma punk förekommer i [10]. I bilden [11] nedan kan vi se hur samma identifierade punkter återfinns i två olika bilder.

Bild 4: Triangulering av punkter.

Bild 5: Punkter identifierats i två olika bilder av samma objekt/miljö.

(15)

Feature matching and geometric verification

När man identifierat och extraherat punkter så skapar man ett set av potentiellt överlappande bildpar med tillhörande punktkorrespondent.

Det senare steget är då att man går igenom och verifierar de potentiellt överlappande bildparen. Eftersom att processen som finner punkterna baseras helt och hållet på att visuellt inspektera bilderna så finns det en överhängande risk att dessa inte egentligen inte matchar alls - därav krävs en verifiering. SfM försöker verifiera matchningar genom att uppskatta en transformation som mappar till de identifierade punkterna bilderna emellan genom projicerande geometri [10].

Nedan kan vi se ett visuellt exempel på hur man projicerar från ett plan till ett annat [12].

Structure and motion reconstruction

Slutligen så påbörjas processen av en iterativ rekonstruktion av all data man samlat in genom processen. Man initierar då processen genom att välja ett lämpligt första par med bilder, där dessa helst ska vara bilder som med stor överlappning, man bör till exempel inte försöka starta processen med de sista bilderna tagna i sekvensen, som då skulle ha ett litet antal överlappande bilder jämfört med ett par som befinner sig i mitten av bildsekvensen.

Bild 6: Man skapar ett nytt plan genom att projicera till ett annat.

(16)

Ovan [13] kan vi se en grafisk representation för de olika processerna sker under rekonstruktionen av punktmolnet.

2.2 Bildbaserade punktmoln i skogsindustrin

Skulle man önska använda bildbaserade punktmoln skapade genom vertikalt tagna bilder så uppstår några olika problem som man annars inte har hos LiDAR. Projektet i sig har sitt huvudfokus på horisontellt tagna bilder inifrån skogen, men där man från SCA Skog AB:s sida även uttryckte intresse för ett system som även fungerar med bilder tagna ifrån drönare.

I en studie [14] där man jämförde LiDAR med bildbaserade-punktmoln för användning i skogsindustrin så kunde man identifiera både styrkor och svagheter hos båda systemen. I detta underkapitel kommer vi titta närmare på vad som gör just bildbaserade punktmoln sämre eller bättre kandidater för användning inom skogsindustrin.

Med LiDAR kan man med hög precision skapa sig en tredimensionell struktur av skogspartier, där man även kan skapa digital elevation model (DEM) och även utvinna andra attribut över det fångade området så som höjd och volym med mera. Det finns även andra sätt att utvinna liknande information genom bildbaserade punktmoln, där denna metod innebär en mindre kostnad att operera jämfört med LiDAR, där det även erbjuder möjligheter att extrahera information som till exempel mognad och hälsa, som kan vara problematiska för att utvinna från LiDAR-punktmoln.

En av begränsningarna hos bildbaserade punktmoln är att man kräver en DEM för att kunna normalisera höjderna på träden, detta leder till att man eventuellt kan behöva ett LiDAR-punktmoln för att skapa en DEM så att man kan använda det bildbaserade punktmolnet fullt ut.

Utöver denna nackdel så blir man begränsad till att bara kunna skapa den yttre delen av skogen – själva skalet, där LiDAR har förmågan att tränga igenom ända ner till marken så att man även får med stora delar av marken under alla träd i sitt punktmoln.

Genom en CHM kan man titta på hur pass väl punktmolnet når ned till yta/objekt som ligger intill/under höga objekt. Skillnaden blir väldigt Bild 7: Arbetsflödet för SfM.

(17)

tydlig om man tittar på hur väl de olika teknikerna lyckades skapa en CHM för ett givet skogsparti [15]:

Utöver detta så presenteras även en rad andra specifika problem för bildbaserade punktmoln så som :

 Träd och skuggor kan röra sig flera meter och åt olika håll vid suboptimala förhållanden, som försvårar rekonstruktion av punktmoln.

 Kräver helst ett konsekvent ihållande ljusförhållande under insamling av bildsekvensen.

 Kan kräva väldigt hög överlappning av bilder som kan öka kostnaden för användning.

 Ytor med lite textur kan vara svåra att återskapa.

Bild 8: Skillnad i CHM för LidAR och SfM.

(18)

 Många generella problem för tekniken blir ytterligare försvårade om bilderna tas när träden saknar löv.

Givet alla problem nämnda ovan och begränsningarna hos de bildbaserade punktmolnen, så förstår man att en hypotetisk övergång från vertikalt skapade punktmoln med LiDAR till bildbaserade inte skulle vara något man gör utan omfattande experimentering. Men som ovan nämnts så skulle man förmodligen behöva komplettera de båda teknikerna om man önskar använda bildbaserade-punktmoln fullt ut för att till exempel göra visuella bedömningar i kombination med trädsegmentering och volymberäkningar.

2.3 COLMAP

COLMAP [16] använder sig av SfM för att skapa punktmoln där man erbjuder användaren stora möjligheter att justera olika parametrar för att få önskat resultat hos sina skapade punktmoln. COLMAP kan användas som en självständig applikation genom att ladda ned pre- built binaries på Windows eller genom att installera källkoden. Man kan använda sig av båda kommandotolk och GUI (Graphical user interface) vid skapandet av punktmoln. Här kan vi till exempel se resultatet av en rekonstruktion av Rom [17]:

För att skapa 3D-strukturer så går COLMAP genom en rad olika processer som alla är gemensamma för ett typiskt SfM-system, där man bland annat går igenom alla bilder för att identifiera överlappande bilder för att iterativt skapa punktmolnet.

Man kan har stora möjligheter att påverka alla de processerna som sker i varje delsteg, där det finns massivs med justerbara parametrar för att skapa ett bra punktmoln utifrån sitt dataset.

Man kan med stor fördel utnyttja det faktum att vid Sparse Reconstrction så kan man se vilken data som användas vid skapandet Bild 9: Punktmoln över Rom, skapat av 21000 bilder i COLMAP.

(19)

för varje enskild punkt – man kan se vilka bilder och vilka pixlar som användes under SfM-processen för att skapa varje enskild punkt.

Ovan [18] kan vi se data för två exempelbilder (P1180141.JPG och P1180142.JPG) och vilka attribut som är möjliga att utvinna. Vi kan bland annat se hur vi genom POINTS2D för en specifik bild kan utvinna alla pixel-koordinater för bilden i fråga. Varje pixel-koordinat har sedan också ett separat id för dess motsvarande 3D-punkt.

Vi har även tillhörande data för samtliga punkter [18]:

Ovan ser vi hur varje enskild punkt har ett specifikt id där man sedan kan utvinna dess xyz-koordinater, image-id och motsvarande 2D- punkt. Tillsammans kan detta ge oss 2D→3D-kopplingen för samtliga punkter i ett punktmoln skapat genom COLMAP.

2.4 Trädsegmentering i punktmoln

Att kunna segmentera träd i punktmoln har sedan länge varit mycket intressant för de som verkar inom skogsindustrin. Man har då ytterligare möjlighet att kartlägga skogsområden i detalj och man kan då exempelvis göra uppföljningar under avsatta perioder för enskilda träd vad gäller höjd, volym och annan intressant data.

Det finns numera många olika algoritmer och mjukvarupaket som är skapade för just segmentering av träd, men i just Treeseg [19] så har Bild 10: Struktur på images.txt i COLMAP.

Bild 11: Struktur på points3D.txt i COLMAP.

(20)

man stora möjligheter att dela upp processen i flera steg på ett enkelt sätt.

Treeseg har utvecklats för att kunna automatisera större delen av processen vad gäller segmenteringen av träd från punktmoln av större områden. Processen består i grova drag av följande steg:

1. Identifiering av individuella stammar

2. Segmentera varje stam upp till den första förgreningen 3. Isolera varje trädkrona

Resultatet kan se ut på följande vis [20]:

Resultatet blir då att man har isolerat och grupperat ihop alla punkter i punktmolnet som tillhör ett specifikt träd för samtliga identifierade träd.

Givet projektets fokus så blev det främst segmenteringen av stammar som var av intresse, där även denna processen i sig sker i flera olika steg.

2.5 A.I.

Termen A.I (artificial interlligence) är egentligen en väldigt bred term som omfattar väldigt mycket, där man i en artikel från IBM [21] gör följande avgränsningar för att göra de olika termerna som A.I.

inkluderar enklare att begripa och urskilja:

 A.I. – Denna term omfattar egentligen alla typer av teknologier som avser försöka härma mänsklig intelligens och tankeförmåga.

Det kan egentligen inkludera allt från en simpel applikation som Bild 12: Segmenterade träd i Treeseg.

(21)

på något sätt gör egna bedömningar utifrån komplexa regler, till att vara det vi ibland kan se i filmer i populärkultur.

 Maskininlärning – Applikationer som genom ett visst indata försöker lösa en specifik uppgift genom att matcha det mot en förväntad output, där modellen förbättras genom att att justera sig själv för att komma närmare den förväntade outputen.

 Djupinlärning – Maskininlärnings modeller med flera än ett hidden layer.

Rent visuellt ser det ur enligt följande [22]:

2.5.1 Maskininlärning och dess träningsprocess

En maskininlärningsmodell försöker att genom en algoritm som kallas för SGD (Stochastich gradient decent) förbättra sig själv genom att minska ett värde som man kallar för loss genom att uppdatera sina parametrar – som man kallar för vikter – som finns i modellens hidden layers. För ett visst input så kommer det att passera genom nätverkets alla lager, där vikterna som finns i lagren kommer att förändra värdet för input:en, så att man till nästa lager kan skicka vidare en ny representation av input-datat. Denna process upprepas tills man når det sista output-lagret där beräkningen av loss-värdet kommer att utföras.

Bild 13: Vad som inkluderas i A.I.

(22)

SGD kommer då genom en process som kallas för backwards propagataion försöka att uppdatera nätverkets vikter på ett sätt som skulle innebära att om samma process upprepades igen för samma input, så skulle man ha ett lägre loss-värde än innan. För att kunna beräkna loss-värdet krävs dock ett from av facit som nätverket kan basera sin beräkning på, så med andra ord kan beskriva loss-värdet som ett värde som representerar hur långt ifrån nätverket var från en korrekt bedömning/gissning av input-datat.

Hur detta facit kan se ut beror helt på vad det är för problem man försöker att lösa. Det kan vara så simpelt som ett enda heltal, där 0 skulle kunna motsvara en viss klasstillhörighet och där 1 en annan – det vill säga, ett binärt klassificeringsproblem. Låt säga att man skulle vilja kunna bedöma om viss bild är av en man eller en kvinna, där 0 är man och 1 är kvinna, där för en viss bild på en kvinna ger ett loss-värde på 0.75 i output-lagret – det skulle då ge nätverket ett loss-värde på 0.25.

Detta eftersom att man var 0.25 ifrån en perfekt gissning givet facit- värdet. SGD skulle då använda sig att detta värde för att på ett lämpligt sätt uppdatera nätverkets vikter för att minska loss-värdet.

På följande bild [23] kan vi se hur allting hänger ihop:

Det är emellertid inte alltid så simpelt att bedöma loss-värdet. Om man vill ha en modell som skall finna pixel-koordinater för ett visst – eller flera – objekt i en bild så ser processen för hur loss-värdet beräknas ut

Bild 14: Arkitektur för djupinlärnings-modell.

(23)

på ett annorlunda sätt, men principen är densamma, vilket är det viktiga i detta sammanhang.

Då ovan beskrivna process bara kan uppdatera nätverket i rätt riktning väldigt lite åt gången vid inlärning så kräver maskininlärningsmodeller tämligen stora mängder data, då det kräver väldigt många iterationer för att dessa små uppdateringar ska nå ett gott resultat med hög precision i slutändan. Det finns många olika tekniker man kan utnyttja för att minska mängden data som krävs för att nå goda resultat, bland annat att genom att utnyttja modeller som löser samma/liknande problem som man själv avser lösa. Man kan då dra nytta av dess redan inlärda kunskap, men även i dessa fall kan stora mängder data komma att behöva förberedas.

Själva skapandet av facit till sitt data är en manuell process, som kan bestå av att man helt enkelt behöver sätta en klasstillhörighet på en bild (0 eller 1 som i exemplet ovan), markera olika objekt och skapa polygoner som sedan används av nätverket vid inlärning. Allting som skulle kunna förenkla denna process är väldigt önskvärt då det ofta kan vara själva flaskhalsen i hela processen i sig.

Bild 15: Hur det kan se ut när man skapar ett dataset. Fönsterna är manuellt markerade.

(24)

3 Metod

Detta kapitel beskriver metoderna som använts under projektet för att ta fram lösningar och dra slutsatser.

3.1 Tillvägagångssätt

För att på ett djupare plan först skapa sig förståelse för problemet och dess omfattning kommer en litteraturstudie främst rörande SfM-system att utföras. Efter detta kan man sedan dra slutsatser gällande vad som är viktigt i ett SfM-system för att kunna bearbeta dess resultat och hur man kan dra nytta av de speciella egenskaper SfM har jämfört med LiDAR.

3.1.1 Undersökning av SfM

Ett lämpligt SfM-system för ett projekt av denna karaktär bör producera ett punktmoln med hög precision. Man vill på något sätt kunna utvinna konturer ur punktmolnet, således är ett system där man enkelt kan ändra parametrar för rekonstruktionen att föredra, så att man kan experimentera fram en uppsättning av inställningar som producerar ett resultat som uppnår detta. Man vill även titta på hur punktmolnet sparas, så att all data för varje skapad punkt är lättillgänglig och enkel att läsa in för manipulation.

3.1.2 Skapande av SfM

När man har ett lämpligt SfM-system så vill man basera skapandet av punktmolnet på den inhämtade kunskapen från litteraturstudien gällande SfM. Vid rekonstruktionen använder man då bilder som är av sådan karaktär att de bidrar till att skapa ett punktmoln med hög precision. Man undersöker också de olika funktionerna i systemet för att uppnå maximala resultat med de bilder man har tillgodo.

3.1.3 Undersökning av trädsegmentering

Med ett punktmoln av sådan precision att man med enkelhet kan urskilja separata träd så kan man börja undersöka olika trädsegmenterings-algoritmer. Även här bör man ha stor möjlighet till att justera de olika relevanta parametrarna för att kunna påverka slutresultatet. Man skulle med stor fördel även kunna dela upp processen i flera steg i algoritmen för att uppnå optimala resultat.

(25)

3.1.4 Utformning av program

När man har ett punktmoln med tillhörande segmenterade träd så kan man börja titta på hur man ska utforma programmet. Det bör utformas på ett sådan sätt att man inte blir låst till varken horisontellt eller vertikalt tagna bilder. Programmet ska automatiskt skapa pixel-masker utifrån de segmenterade träden, där man sedan som användare skall kunna gå in och utföra vissa manuella justeringar, där dessa ska dra fördel av punktmolnets bild→punktmoln-koppling så operationerna bidrar till mer effektiv redigering av pixel-masker.

3.2 Utvärdering av funktion

För att utvärdera det skapade programmet måste man titta på exekveringstider och hur mycket manuellt efterföljande arbete som måste utföras för att skapa konturer längs träden av hög precision.

Eftersom om inte programmet automatiskt kan generera pixel-masker av sådan precision att konturerna exakt följer träden, så kommer någon form av manuell justering behövas. Därav kommer följande saker att behöva mätas för en rättvis utvärdering:

 Exekveringstid för de olika manuella operationerna som kan äga rum i programmet, tillsammans med tidsåtgång för efterföljande justering som kan komma att behövas.

 Tidsåtgång för rent manuell skapande av pixel-masker för att se arbetsinsatsen som krävs utan programmet.

 Uppstartstid för programmet, då vid extrem tidsåtgång för detta bör vara någonting man har i åtanke vid slutsatser.

(26)

4 Konstruktion

I detta kapitel kommer allting vad gäller programmets uppbyggnad och konstruktion tas upp, där jag även kommer beskriva hur och varför vissa implementeringslösningar valdes och hur de kan påverka framtida utveckling av systemet.

Man kan summera hela arbetsflödet i bottom-up, då jag ständigt var tvungen att basera alla ytterligare framsteg i programmets funktionalitet på tidigare upptäckter/implementeringar som gjordes från start.

För att förstå konstruktionsprocessen kan man dela in programmets mer eller mindre implicita krav på följande sätt:

 Skapa pixel-masker för redan i förväg segmenterade objekt i punktmolnen (efter trädsegmentering av punktmolnet).

 Uppdatera en specifik pixel-mask i en bild, där sedan dessa förändringar propagerar genom bildsekvensen.

Ska man försöka uttrycka vad dessa innebär så blir det att man för en viss bild måste ha vetskap om vilka punkter som är synliga i bilden och punkternas motsvarande pixlar.

En förändring i en viss bild, låt säga borttagning av en del av en viss pixel-mask, ska då alltså propagera genom sekvensen. Detta innebär att pixlarna måste vara knutna till punkter i punktmolnet. För tar man då bort en viss pixel som finns synlig i en viss bild, där denna pixel har en motsvarande punkt, så kan man då även ta bort denna punkt i alla andra bilder den är synlig i.

Detta resulterar i följande logiska flöde: En pixel-mask som är synlig i en bild är egentligen en representation av alla dess synliga punkter som har en punkt→pixel-koppling. Samlar man ihop dessa kan man skapa en konvex mask som blir dessa punkters 2D-representation – pixel- masken.

När man då tar bort ett antal pixlar så tar man således också bort dess motsvarande punkter. Med de återstående pixlarna skapar man en uppdaterad pixel-mask, den nya 2D-representationen. För att få denna förändring att propagera genom sekvensen så går man igenom samtliga bilder som punkt-objektet är synligt i och uppdaterar dess nya 2D- representation med punkterna som finns tillgodo.

(27)

Detta leder då till att man genom en justering i en viss bild kan få denna att påverka 3D-representation och låta detta vara grunden för hur punkt-objektet representeras i 2D. På detta vis bör man få en liknande uppdatering av masken i bildsekvensen.

Med detta sagt så kommer detta kapitel gå igenom hur programmet går från att börja med inläsning, till realtids-manipulation av pixel-masker som automatiskt uppdaterar andra bilder i sekvensen.

4.1 Skapande av punktmoln och trädsegmentering

Jag var tvungen att skapa ett eget punktmoln, genom att helt sonika gå ut i skogen och ta bildsekvenser med stor överlappningen utav bilderna. Jag testade flera olika miljöer med ett varierande antal träd för att se vad som skulle ge det bästa resultatet vid rekonstruktion. Till godo så hade jag bara en simpel iPhone-kamera för att samla ihop dessa bildsekvenser, vilket förmodligen hade stor påverkan på slutresultatet, vilket diskuteras i senare kapitel.

Sedan skapades flera olika punktmoln genom COLMAP, där jag till slut fick till ett som hade tydligt identifierbara träd, som är ett måste för att påbörja segmentering. Nedan är en bild på mitt skapade punktmoln.

Bild 16: Punktmoln skapat i COLMAP. Det röda representerar kameravinkel och dess position.

(28)

För segmentering så använde jag Treeseg och dess stamsegmentering för att segmentera ut och isolera så många punkter som möjligt. Detta för att öka antalet punkter att utgå ifrån när man sedan ska skapa pixel- masker. Efter en del justeringar så lyckades jag segmentera merparten av alla synliga träd i punktmolnet, där dock många hade dålig precision på grund av punktmolnet i sig.

Då denna justeringsprocess av både punktmoln och segmentering var väldigt omfattande och tog mycket tid så valde jag att fortsätta med inläsningen punktmolnet och de segmenterade träden.

4.2 Inläsning av skapat punktmoln

Formatet för punktmoln skapade genom COLMAP består av ett par filer där främst points3D.txt och images.txt var av intresse.

Bild 17: Segmenterade träd av varierande kvalité.

(29)

Points3D:

 POINT3D_ID

 X, Y, Z

 R, G, B

 ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX) Images:

 IMAGE_ID

 QW, QX, QY, QZ

 TX, TY, TZ

 CAMERA_ID

 NAME

 POINTS2D[] as (X, Y, POINT3D_ID)

Eftersom att jag på något sätt behöver hålla reda på alla kopplingar mellan punkterna i 3D och pixlarna i 2D för varje existerande bild som användes vid skapandet av punktmolnet – där även denna information måste var lättillgänglig när det kommer till hastighet för hämtning och manipulation – så var jag tvungen att skapa mig en mer eller mindre omfattande samling av datastrukturer.

Tittar man på attributen som points3D innehåller så kunde man skapa följande sätt att hålla informationen:

Hash table: { point_id : [x,y,z, ...] }

Man har då möjlighet att hämta en specifik punkts’ koordinater i 3D givet dess point_id.

Utöver det så skapade jag även följande efter inläsning av points3D:

Hash table: { point_id : [image_id_1, image_id_2, …] }

Vilket då ger oss möjlighet att hämta alla bilder som en viss punkt är synlig i, vilket blev relevant för många delar av programmet.

(30)

Sedan för inläsning av images skapades ytterligare datastrukturer, där även { point_id : [x,y,z] } användes i processen för att beräkna varje punkts’ avstånd från kameran i varje enskild bild. Detta användes aldrig för någon funktion i programmet, men ansågs nödvändigt för framtida utveckling, utifall man på något sätt vill basera uppdateringar eller modifikationer av pixel-masker på hur långt ifrån punkterna i fråga är från kameran.

Så jag gjorde att programmet vid inläsning skapar en distance.txt-fil, om den inte redan är skapad sedan tidigare, för att inte behöva göra om avståndsberäkningarna vid varje uppstart, då avståndet för punkterna är konstant.

Jag behövde även för varje image_id ha möjlighet att kunna få fram punkt→pixel- och pixel→punkt-kopplingen på ett smidigt sätt, så jag skapade följande:

Hash table: { image_id : [ImageData, ImageData, ...] } Där ImageData är en klass som ser ut på följande sätt:

Så för varje bild har man då möjlighet att få fram pixel→punkt- kopplingen eller tvärtom. Vi ser även qvec och tvec, som innehåller QW, QX, QY, QZ och TX, TY, TZ som används för att beräkna varje punkts avstånd.

Jag behövde även möjlighet att ha en koppling mellan image_id och bildens riktiga filnamn, så datastrukturer för detta skapades även:

Hash table: { image_id : image_name } Hash table: { image_name : image_id }

Slutligen för att skapa de initiala pixel-maskerna för samtliga träd i alla bilder i bildsekvensen så använde jag mig av följande datastrukturer som skapades ovan:

(31)

List: [ [tree1_point_1, tree1_point_2 ... ] …]

Listan ovan skapas genom att man går igenom alla segmenterade träd, som är lagrade i filer innehållande alla punkter som trädet består av.

Alla punkter som ett träd består av återfinns i punktmolnet som de segmenterades från.

Hash table: { image_id : [ImageData, ImageData ...] } Hash table: { point_id : [image_id_1, image_id_2 …] }

Med all denna data kunde jag då börja gruppera ihop allting i objekt av klassen PointObject som ser ut på följande vis:

Så låt oss säga att man segmenterar ut 10 träd som man matar in under inläsningen i form av filer innehållande alla dess punkter. Genom alla datastrukturer ovan så kan man skapa 10 objekt av PointObject.

Varje objekt besitter då följande:

obj_name – Namnet på objektet.

Points – Samtliga punkter som objektet består utav.

img_polygon – Varje bild som objektet är synligt i och den skapade pixel-masken utifrån alla punkter som tillhör objektet i samtliga bilder.

(32)

img_pixels – Varje bild som objektet är synligt i med tillhörande samling av pixlar som har en pixel→punkt-koppling till objektets punkter.

img_points – Varje bild som objektet är synligt i och en samling av alla punkter som har en punkt→pixel-koppling till objektet.

img_update – Varje bild som kräver en uppdatering av sin pixel- mask efter att en uppdatering har skett hos någon av objektets alla pixel-masker.

Med denna gruppering av all relevant data både vad gäller 2D och 3D så kan man på ett enkelt sätt hämta all data för ett givet objekt i en given bild bara genom att veta img_id.

Varje PointObject skapas genom att man läser in alla segmenterade träd och tittar på deras point_id. Med denna data så kan man då genom datastrukturerna ovan finna alla bilder som punkterna är synliga i och deras motsvarande pixel-koordinater. Man har nu tillräckligt med data för att titta på exakt vilka pixlar som tillhör ett träd för alla bilder trädet är synligt i.

Bild 18: Automatiskt genererade pixel-masker genom bildsekvensen.

(33)

För varje bild och dess pixlar skapar man då en konvex pixel-mask, eftersom i alla pixlar som har motsvarande synliga punkter i trädet för en given bild, kommer att ha pixlar som existerar inom trädets egentliga konturer. Genom att ta samtliga pixlar och köra dessa genom en algoritm som skapar en konvex pixel-mask så har man slutligen trädets initial pixel-mask – den automatiskt genererade pixel-masken som sedan kan redigeras av användaren. Denna lagras då i img_polygon, där man enkelt kan hämta en pixel-mask genom ett img_id.

Den stora användningen av hash table och dess O(1) tidskomplexitet för hämtning av värdet i sina key-value-par gjorde att jag på ett väldigt snabbt sätt kan hämta samtliga träds’ pixel-masker för ett givet img_id.

Jag gjorde även bedömningen att det var värt att läsa in och bearbeta all data för alla segmenterade objekt direkt vid inläsning i stället för att låta vissa delar ske dynamiskt under användning av programmet. Då man får en förbättrad användbarhet om operationer sker snabbt vid användning.

4.3 Justeringsmöjligheter för pixel-masker

Eftersom att vissa pixel-masker som skapas i vissa bilder består av ett lågt antal pixlar (p.g.a. lågt antal synliga punkter) så valde jag även att implementera ett sätt att manuellt påverka hur pass vassa vinklar en skapad pixel-mask tillåts att ha vid skapandet.

När man samlat ihop alla punkter som tillhör ett visst objekt på en given bild och antalet för dessa är mycket lågt, eller om de någonstans skapar vassa vinklar i några hörn, så kan det vara lönt att inte räkna med ensamma punkter för att undvika en pixel-mask med många vassa vinklar. Då detta projekt främst avser trädstammar så kändes det som ett rimligt sätt att minimera korrigeringar av de automatiskt skapade maskerna.

Under skapandet av varje PointObject så skapas som sagt först en konvex mask av objektet för en given bild, för att sedan justera punkter som ligger nära kanten av bilden (ligger vissa punkter väldigt nära kanten så gör man bedömningen att objektet egentligen sträcker sig utanför, så slipper man finjustera punkter i masken som ligger precis vid kanterna).

(34)

Efter detta så uppdaterar man den konvexa maskens punkter i en rekursiv metod som efter varje uppdatering kollar så att man inte skapade nya vassa vinklar ända tills att varje vinkel i masken är inom ett visst intervall.

4.4 Uppdatering av PointObject

4.4.1 Förstora mask

En uppdatering av av viss mask börjar med att man markerar ut all extra yta man vill lägga till för ett viss PointObject. Efter ytan är vald så letar man fram alla pixlar som finns inuti denna mask och lägger in alla motsvarande punkter i en lista. Man har då en lista med alla pixlar vars motsvarande punkter inte redan är inkluderade i det givna PointObject objektet.

Man går sedan igenom alla dessa punkter för att se om PointObject är synligt i samma bilder som alla punkter. Punkter som är synliga i bilder där inte PointObject är synligt ignoreras (hittades inte ett tillräckligt antal med punkter för att skapa en pixel-mask i en given bild till att börja med så kommer inte dessa nya punkter bidra till att skapa nya användbara pixel-masker där trädet inte redan är synligt).

Bild 19: Restriktivt skapande av vassa vinklar.

(35)

Av denna genomgång av punkter så blir resultatet följande datastruktur:

Hash table: { image_id : [point_id, point_id] }

Det vill säga, alla bilder där en uppdatering av synliga punkter måste utföras.

Tittar vi på PointObject så ser vi en metoden update_polygons_add, som tar emot följande som parametrar:

Hash table: { image_id : [ImageData, ImageData ...] }

Där ImageData innehåller Pixel→Punkt-data (se ImageData s. 24).

Hash table: { image_id : [point_id, point_id] } Nya punkter att lägga till för varje bild.

Man går då igenom dessa för att uppdatera de synliga punkterna i varje bild, samtidigt som man gör beräkningar för hur den nya pixel-masken ska se ut för respektive bild givet de nya punkterna, som då ger oss nya punkt→pixel-kopplingar att basera masken på.

Bild 20: Yta att lägga till markeras. Uppdateringen propagerar sedan genom sekvensen.

(36)

4.4.2 Förminska mask

Processen för att förminska ett PointObject liknar den för förstoring, där man dock med hjälp av att skapa konvexa 3D-masker förbättrar uppsamlingen av punkter existerande inom en markerad pixel-mask.

Man börjar precis som ovan genom att markera området av en mask som man önskar redigera, i detta fall ta bort. Pixlar som har en punkt- representation i bilden som finns inom maskens gränser samlas upp, och utav dessa skapar man sig då en konvex 3D-mask från point→XYZ- kopplingen.

Man går igenom alla punkter i PointObject och ser om det finns ytterligare punkter som existerar i denna 3D-mask, om det finns så kommer de också att inkluderas till de som ska tas bort.

Anledningen till att detta resulterar i ett bättre resultat vad gäller uppsamling av punkter inom en 2D-mask, är att punkter som egentligen är synliga inom samma område om man tittar på tidigare eller nästkommande bild i bildsekvensen inte räknas som synliga (även om man tycker att de borde vara det eftersom de existerar inom samma Bild 21: Förminska ytan i en pixel-mask. Uppdateringen propageras genom bildsekvensen.

(37)

område). Detta resulterar i att punkter som egentligen har ett nära avstånd i 3D som borde inkluderas och räknas som synliga inte tas med i en simpel uppsamling likt för förstoringen av en mask.

Man hade även till fördel kunnat implementera samma uppsamlingsteknik för förstoringen också. Men anledningen till att det fungerade bra i detta fall är att man tar bort punkter från ett specifikt antal punkter i det segmenterade objektet – därav går genomsökningen snabbt av samtliga tillhörande punkter.

Skulle samma process utföras vid förstoring skulle man behöva gå igenom samtliga punkter i hela punktmolnet för att finna vilka som existerar inom en skapad 3D-mask. Vi hade planer för att skapa en form av dynamiskt uppdaterande datastruktur som skulle hålla reda på de lokala punkterna för en given bild, men i avsaknad av tid slopades implementeringen. Det kan dock vara värt att ha i åtanke utifall man önskar förbättra förstoringsprocessen ytterligare.

4.5 Spara resultat

Slutligen så ska det gå att kunna spara alla sina uppdateringar och de genererade pixel-maskerna för alla bilder så att de är redo att användas som träningsdata för en CNN-modell.

All data sparas i csv-format där man i alla bilder har pixel- koordinaterna för samtliga synliga träd i alla bilder. Utöver det så har Bild 22: Inläst exc-fil i ett annoterings-program.

(38)

man även möjlighet att i programmet byta namn på ett träd, där namnet kan vara en klasstillhörighet, som sedan följer med i csv-filen.

Namnet kommer då vara kopplat till trädets alla pixel-masker i bildsekvensen.

I samtliga annoterings-program för skapande av träningsdata så har man möjlighet att flytta pixlarna i sina pixel-masker för att göra finjusteringar. Programmet utformades med tanken att det skulle vara en potentiell back-end-lösning för ett annoterings-interface, där man vid finjusteringar snabbt får resultat och kan spara tid. Så att kunna spara resultatet för att sedan läsa in det i ett annoterings-program för att slutligen göra de sista finjusteringarna i ett annat program innan det är redo för att användas som ett dataset är inte den optimala vägen att gå. Man skulle då istället implementera programmet som en form av back-end-lösning för uppdateringar och automatiskt skapande av pixel- masker, där slutresultatet är det som blir dataset:et i sig.

(39)

5 Resultat

För att mäta nyttan i det utformade programmet så tittar man främst på två olika saker: exekveringstid för relevanta operationer och sparad tid per bild när det kommer till justeringar/skapande av masker.

Dessa två aspekter är speciellt viktiga då programmets huvudsyfte är att underlätta/automatisera bort en manuell process. Man bör då kunna mäta tiden det tar att använda programmet, både vad gäller den faktiska tidsåtgången för olika operationer att exekvera, och hur pass långt ifrån programmet var ifrån att automatiskt skapa pixel-masker av bra kvalitet.

Man mäter då tidsåtgången för att korrigera bristfälliga automatiskt genererade pixel-masker och tiden för efterföljande manuell korrigering. Skulle programmet skapa perfekta pixel-masker skulle man anse att det inte tog någon tid alls för användaren. Utan att mäta denna tidsaspekt blir det svårbedömt huruvida det är rimligt att lägga tid på framtida utveckling.

Alla mätningar vad gäller den manuella processen utfördes av mig, Jonas Elmesten. Detta på grund av brist på tid och att resultatet förmodligen hade blivit väldigt snarlikt.

Men låt säga att man till exempel frågade ett antal personer att rita ut konturerna för några bestämda trädstammar på en bild. Då skulle man förmodligen få ett väldigt snarlikt resultat för samtliga testpersoner, då uppfattningen av vad som rent visuellt markerar konturen för en trädstam på en bild är mer eller mindre densamma för alla personer.

Det betyder då att för en given testperson, så hade en justering av en icke korrekt pixel-mask tagit ungefär lika mycket tid som för alla andra testpersoner. Vilket förmodligen hade resulterat i väldigt snarlika tidsåtgång för alla mätningar.

Jag har heller inte någon fördel jämfört med någon annan person med datorvana, då det hela handlar om att flytta runt pixel-markeringar för att skapa en bättre kontur runt ett objekt, där alla skulle vara mer eller mindre överens om trädets konturer.

Därav anser jag att mätningarna i tidsåtgång är representativt även om jag var ensam testperson för mätningarna.

(40)

5.1 Exekveringstid

Det skapade punktmolnet för dessa tester bestod av 267633 punkter.

Från trädsegmenteringen fann man 22 st. trädstammar där varje träd i genomsnitt bestod av 1453 punkter.

Alla tidtagningar utfördes på en PC med följande specifikationer:

Tablell 1: Dator för utförda mätningar.

Specifikation Mjukvara/Hårdvara

Operativ sysem Ubuntu 20.04.2 LTS

GPU GeForce GTX 1650 SUPER

CPU AMD® Ryzen 5 3600 6-core

processor × 12

RAM 16 GB

Följande är samtliga operationer som behöver göras innan programmet är redo för användning och dess genomsnittliga exekveringstid under 10 uppstartsmätningar:

Tablell 2: Operationer som sker vid uppstart och inläsning av punktmoln.

Operation Sekunder

Läsa in segmenterade objekt 0.01

Läsa in points3D.txt 1.79

Läsa in images.txt 6.13

Skapa PointObject för alla segmenterade objekt

0.80/0.04 per träd.

Totalt: 8,75

Följande är ett genomsnitt av 100 uppdateringar av träd för att korrigera masken till en god kvalitet.

Tablell 3: Programmets två huvudoperationer - förstoring och förminskning.

Operation Sekunder

Förstora 2D-mask för objekt 0,09 Förminska 2D-mask för objekt 0.49

(41)

5.2 Tidmätning av manuell korrigering

För att justera resultatet av programmets automatiskt genererade pixel- masker användes VGG annotator [24] som är ett annoterings-program avsett för just detta syfte.

Csv-filen lästes först in i VGG, där för vi sedan justerade trädens pixel- masker till en kontur som följde trädstammarna. På grund av att vi tror att man skulle få ett större antal maskerade träd genom ett punktmoln av högre precision så valde vi att bara utföra just finjusteringar, inte att skapa helt nya pixel-masker för träd som inte blev maskerade i processen, men som ändå är fullt synliga på bilderna. Detta anser vi då kommer att reflektera programmets egentliga potential, eftersom att den nuvarande flaskhalsen är just punktmolnets precision, som resulterar i dålig segmentering, som resulterar i mindre bra pixel- masker.

De operationerna som mättes var följande:

 Finjustering av genererade pixel-masker, kontra manuellt skapande av pixel-masker från grunden. Motsvarar arbetet som sparas in genom att programmet automatiskt genererar de första konturerna, där användaren sedan korrigerar efter behov.

 Förstoring av pixel-mask och finjustering av alla automatiskt förstorade pixel-masker, kontra manuellt förstoring av pixel- masken på varje bild trädet förekommer i. Motsvarar arbetet som sparas in genom att programmet automatiskt propagerar en uppdatering genom flera bilder, där användaren sedan korrigerar de uppdaterade bilderna efter behov.

 Förminskning av pixel-mask och finjustering av alla automatiskt förminskade pixel-masker, kontra manuellt förminska masken för varje bild trädet förekommer i. Motsvarar tiden man sparar in genom att programmet automatiskt propagerar en förminskning av pixel-maskerna för ett viss träd genom flera bilder, där användaren sedan korrigerar de uppdaterade bilderna efter behov.

Detta resulterar i att man får ett mått på det automatiskt utförda arbetet tillsammans med tidsåtgången för de nödvändiga justeringarna som motsvarar den manuella insatsen.

(42)

Nedan presenteras resultatet efter att ha utfört respektive operation för 100 slumpmässigt valda bilder och träd per operation, där genomsnittet presenteras i sekunder

Tablell 4: Samtliga utförda tidmätningar. Se bilaga för grafisk representation.

Operation Sekunder

Justera automatiskt genererade pixel-masker. 10

Skapa pixel-masker manuellt. 17

Förstora pixel-mask och justera automatiskt genererade förstoringar.

324

Lätt till förstoring på pixel-mask manuellt. 456 Förminska pixel-mask och justera

automatiskt förminskade pixel-masker.

222

Förminska pixel-mask för träd manuellt. 338

Värt att förtydliga är att just operationerna för förstoring och förminskning involverar manuella justeringar för alla bilder som trädet är synligt i/uppdaterades i. Därför blir en tilltänkt uppdatering till vissa avgränsande punkter i startbilden till en justering som måste äga rum för alla bilder som trädet är synligt i. Då ett och samma träd är synligt i ett stort antal bilder så resulterar det i att många bilder måste justeras, eftersom att uppdateringen kommer att propagera genom alla dessa (förutsatt att det räknas som synligt i programmet, vilket nästan alltid är fallet).

Bild 23: Manuell justering. Korrigering av konturer längs träden och nära marken.

Före och efter.

(43)

För just förstoring och förminsknings-operationerna så valde jag att göra stora slumpmässigt valda justeringar, där jag valde ut några kringliggande saker nära marken för trädet att ha som en referens för vad som bör ingå i samtliga pixel-masker för alla andra bilder som samma träd är synligt i. Vid finjustering av den propagerade uppdateringen har man då de utvalda sakerna att utgå ifrån, så att man kan bedöma om förstoringen blev korrekt eller ej, sedan justera efter behov. Detta kan verka som ett märkligt sätt att mäta på, men på grund av punktmolnets låga täthet vad gäller punkter, så var jag tvungen att ta till denna metod för att mäta just förstorings-operationen.

För mindre finjusteringar vid förstoring så har nämligen inte punktmolnet en tillräcklig täthet för att låta programmet finna punkter nära de ursprungliga innan förstoringen. Detta ledde till att det i vissa fall knappt blev någon uppdatering alls vid minimala förstoringar, därav valde jag att mäta på detta sätt.

Man har till exempel inte samma problematik vid förminskning, där programmet helt enkelt tar bort punkter från ett PointObject.

Bild 24: Förstoring av pixel-mask. Stenar i marken som referens för förstoring.

(44)

6 Slutsatser

I det stora hela så lyckades man uppnå sitt mål med att automatisera delar av processen för att skapa pixel-masker för trädstammar i en bildsekvens. Man utnyttjade hur SfM-system skapar en koppling mellan pixel→punkt i 3D-rekonstruktionen, där man sedan genom att segmentera och identifiera träd i punktmolnet kunde utvinna 2D- representationer i form av pixel-masker som existerar genom hela bildsekvensen.

Genom detta kunde man sedan manuellt manipulera vilka punkter i punktmolnet som tillhör de olika segmenterade träden, där detta sedan har en effekt på trädens 2D-representation och hur pixel-maskerna förändras. Dessa förändringar propagerar då genom sekvensen och minskar det manuella arbetet för justering av pixel-masker.

Med det sagt så lyckades följande operationer för uppdatering av trädens pixel-masker implementeras:

 Automatiskt skapande av masker.

 Propagerande förstoring av valt träd och dess pixel-masker i bildsekvensen.

 Propagerande förminskning av valt träd och dess pixel-masker i bildsekvensen.

Exekveringstiden för samtliga operationer och uppstart av programmet kan man anse är inom ramen för vad man som användare inte skulle uppfatta som långsamt, med tanke på att det långsammaste av alla operationerna tog ungefär en halv sekund i genomsnitt. Uppstarten på ungefär 8 sekunder får också anses vara inom ramen för vad som anses vara en snabb uppstart av ett program.

Värt att nämna är att dessa exekveringstider påverkas av punktmolnets storlek, antalet segmenterade träd och antalet punkter i träden. Det är mycket möjligt att vid ett för stort punktmoln/för hög punkttäthet skulle uppstå en avsevärd försämring av exekveringstiderna. Man skulle då möjligtvis kunna utföra någon form av uppdelning av punktmolnet i sektioner, för att hålla exekveringstiderna inom vissa intervall.

Gällande tidsåtgången för de olika operationerna: Tittar man på tiden man ändå behövde lägga ned på manuell justering efteråt programmet utfört de olika operationerna, så kan det verka som att en stor del av det

(45)

manuella arbetet ändå fortfarande är kvar. Men då man vanligtvis behöver väldigt stora mängder data för just maskininlärningsmodeller så kan man ändå argumentera för det vore lönt att använda programmet vid skapandet av dataset.

Speciellt om man till exempel skulle behöva skapa pixel-masker för 1000 bilder för att uppnå god precision med sin CNN-modell, så är varje sekund man kan spara in något som är väldigt önskvärt.

Sett till hur mycket tid man faktiskt lyckades spara in på dessa operationer så kan man observera en tydlig skillnad för samtliga uppdateringsoperationer, där man mätte tidsåtgången mellan det rent manuella arbetet, kontra det automatiskt genererade resultatet med efterföljande manuell justering.

Man kan därav dra slutsatsen att genom användning av programmet så kunde man faktiskt spara in tid för de uppsatta målen för tidsåtgång.

Skillnaderna i tidsåtgångsmätningarna är emellertid tydliga, men där man som sagt hade önskat en ännu större skillnad.

Detta för oss till de – under projektet identifierade – flaskhalsarna för programmet i sin nuvarande form. Man kan gruppera in dem i tre olika kategorier, där ordningen på dessa är hur pass stor inverkan de hade på slutresultatet.

6.1 Förbättring av punktmoln

 Man skapade punktmolnet som användes i projektet med undermålig utrustning (i form av iPhone-kamera) som är väldigt långt ifrån en tänkbar industristandard för vad skall/borde användas vid SfM. Utöver detta så besatt man inga speciella kunskapar vad gäller de olika parametrarna man kan justera vid skapande av punktmolnet, där det finns en hel uppsjö av olika saker som skulle gått att justera.

Resultatet blev ett väldigt spretigt punktmoln, där trädens punkter spreds ut på ett sätt som inte representerade verkligheten med någon vidare precision.

Då punktmolnets densitet och kvalitet är helt avgörande för programmets samtliga funktioner så anser vi att det vore lönt att utvärdera ytterligare med punktmoln av bättre kvalitet, skapade med bättre utrustning och kunskap.

 På grund av punktmolnets dåliga kvalitet och överensstämmelse med verkligheten så hade trädsegmenterings-algoritmen stora

References

Related documents

Material våg med en eller två decimaler, vatten, brustabletter (typ C-vitamintabletter), sockerbitar, bägare eller liknande kärl, mätglas, större skål som rymmer mätglaset

Under en utomhusövning hjälps barn och vuxna åt med att räkna träd: riktigt små träd (barn), mellanstora träd (tonåringar), stora träd (föräldrar) och

Vi har använt oss av en kvalitativ undersökningsmetod med djupintervjuer som tillvägagångssätt. Vi delade in aktörerna i ett externt och ett internt perspektiv utifrån deras

Vi försöker ju då att de ska använda datorn som ett verktyg, som kan rätta deras berättelser, så de kan se att här är något som är fel. Sen kan de ju som sagt använda sig

Särskilt vid tillfällen då läraren själv inte är närvarande, till exempel på raster, är det viktigt att de andra lärarna har en medvetenhet om elevens diagnos och

Faktorerna som påverkar hur lätt vagnen är att manövrera är vikten, val av hjul och storleken på vagnen. Val av material påverkar vikten i stor utsträckning och då vagnen ska

Ridning är inte bara en hobby, sport eller spel utan fungerar även som ett alternativ behandlingsmetod för både psykologiska och fysiska sjukdomar till exempel genom

Då det gäller att integrera eleverna i den ordinarie klassen anser båda speciallärarna att det skulle vara bättre för eleven om den kunde gå i sin ordinarie klass, men de