Exjobb Ngulia – Vad gör vi

Växlingen mellan att vara medveten om varje timme till att tappa koll på veckodag gick snabbt alltså. Vi har redan 3 av 20 veckor bakom oss men jag skulle också säga att vi kommit rätt långt på den tiden. Det lutar åt att vi åker till Kenya i mitten av maj, så ambitionen att ha ett fungerande system tills dess hjälper nog mycket! Jag har inte förklarat tidigare exakt vad det är vi gör så här kommer en liten översyn på hur planen ser ut just nu. Tänken är alltså att kamerafällor utplacerade på savannen i Kenya ska kunna detektera noshörningar, ett antal andra stora djur och männniskor (potentiella tjuvjägare..😞). Om kameran upptäcker något intressant ska information om detta samt bilder på detta till en server. I jämförelse med att bara lagra allt som filmas på ett minneskort som kollas igenom långt senare så hoppas man kunna agera snabbt om en kritisk situation verkar vara på gång med detta system. En del i det hela är att skapa ett neuralt nätverk för objektdetektion, som upptäcker ifall en bild  innehåller objekt av en viss klass och isåfall vart i bilden. Utöver det behöver vi hantera resultatet från alla enskilda bilder på ett vettigt sätt, då det inte är relevant att skicka upp hundratals bilder från samma tillfälle för att djuret syntes framför kameran i en längre stund. Vi vill alltså kunna avgöra om det är samma individ som syntes i de föregående bilderna, vilket brukar kallas object tracking (se t ex denna video). En annan utmaning är att vår objektdetektion ska köras på en microkontroller, troligen en Raspberry Pi, och då har vi plötsligt många begränsningar angående RAM-minne och hur stor vår detektionsmodell kan vara. När vi tränar vår modell har vi däremot tillgång till TensorFlow och gott om GPU via Google Colaboratory.

I figuren med alla ikoner nedan har jag försökt att visualisera vår process och hittills kan man säga att vi har rört alla delar förutom de längst till höger. Vi har lagt en hel del tid på att samla bilder och förbehandlat+annoterat dem, för att sedan träna en modell med dessa. Denna del i arbetet är en iterativ process och vi kommer fortsätta träna om vår modell då och då när vi har mer/bättre träningsbilder och med olika inställningar. Just nu genererar den mestadels vettiga resultat men det finns helt klart utrymme för förbättring, t ex kan en människa med svart- och vitmönstrad tröja ge utslag för att vara en zebra. Vi hade ett par kämpiga dagar med dels att behöva göra om delar av förbehandlingen av bilderna samt att konvertera vår detektionsmodell till ett format som kan köra på just Raspberry Pi och andra små enheter. Men vi kämpade på och det känns som att vi tar oss framåt igen. När vi kodar i Colab så kan vi testa att ladda upp filmsnuttar eller bilder men för att kunna testa objektdetektionen i realtid (som när vi är på Kolmården) så har vi lagt in modellen i en Andorid-app. Det gick rätt smidigt att ladda ner denna kod som är open source från TensorFlow och exportera appen med vår modell från Android Studios. 

Dagens tips: testa lite machine learning i Colab här (klicka på play-ikonen till vänster i alla celler) 💻

Ett ungefärligt flöde av vårt exjobb

Här intill är en skärminspelning från mobilappen, riktad mot datorn där en video från Kolmården spelas – och ovan en gammal bild på mig som klarade testet! 

Fler inlägg om exjobbet:
Exjobbsstart
Reka exjobb i djurparken
Mina drömmars exjobb. händer det??

Drömma om kod

Ni vet hur man kan känna sig helt uppjagad efter en dag av många nya intryck. Lite så har jag kännt mig nu de senaste dagarna, men nördigt värre så har intrycken handlat om kod. Igår hade jag signat upp mig på GDG East Sweden, ett meetup med syftet att lära sig mer om utvecklingsverktyg från Google. Visste inte riktigt vad jag skulle vänta mig men gick ändå och var glad för det sen! Lärde mig lite om programmeringspråket Go och blev taggad på att fortsätta. Först och främst längtar jag dock till att fortsätta programmera nya Campuskost vilket jag planerar ha tid med nästa vecka (yay!) och då är det React.js som gäller. Under dagarna blir det mycket Python och inför pass som labbassistent uppdaterar jag mina Javakunskaper.. vilken kombo. Det här med att vara exhalterad över kodandet verkar vara på gott och ont – när jag försöker somna så har det snurrat runt siffror och kodrader i huvudet (efter att ha sysslat med annotering i samband med exjobbet I guess) och sen vaknar jag tidigare än vanligt. Ändå lyxigt att få ägna sig så fokuserat åt programmering under en period, så jag ska njuta. 

Dagens tips! här kan du testa Go i en interaktiv tutorial. 💻

Från GDG Meetup i Norrköping

Låt mig presentera Leon, den procedurella kameleonten

Yaay så var även mitt sista kursprojekt klart! Jag som egentligen hade tänkt att vara klar innan nyår, men det var svårt att överge själva kodandet för att skriva på rapporten så det tog sin lilla tid. Nu i efterhand känns det bra att jag inte övergav min idé om att skapa en kameleont-textur som projekt i kursen Procedurella Metoder För Bilder, med det var minsann någon dag i början som det kändes lite överväldigande. Det blev ju kul!

3D-objektet är egentligen så här simpelt!

Kortfattat: Låt mig presentera kameleonten Leon. Han bor i en virtuell 3D-miljö skapad i Unity och kan kamouflera sig till sin omgivning. Egentligen har han ingen färg eller något speciellt mönster, utan illusionen av höjdskillnader skinnet skapar jag genom kod. Detsamma gäller cellmönstret som styrs av matematiska funtioner. 

Utförligt: För att slippa upprepa mig.. se https://procedural-chameleon.com 🦎👀

Tidigare inlägg från kursens gång:

React starter kit: React redux with hooks

Från och till kodar jag mycket i React.js vilket jag tycker är superkul. Från början lärde jag mig det inför att vara assistent i kursen Kommunikation och användargränssnitt på LiU – och sedan valde jag att fortsätta använda det på sommarjobb och i egna projekt. Nu är jag inne på en ny runda som assistent i samma kurs och satte ihop detta exempel i samband med det. Det är helt enkelt en liten utbyggnad av ett starterkit som React erbjuder, där jag har lagt till enkel routing samt datahantering med Redux. Själv tänkte jag spana in dessa starter-kits och fortsätta justera på en eller flera setups som passar mig bäst.

Lära sig koda ’Progressive Web Applications’

Nu när vi utvecklar en ny version av Campuskost frågade vi oss själva om vi ville börja med hemsidan eller mobilappen. Då tänkte vi oss apputveckling på de sätt som vi kände till, att programmera en native app (t ex i Java mot Android eller Objective-C alternativt Swift för iOS) eller en cross-platform App med webbspråk som HTML5, CSS, och Javascript. Det finns trade-offs mellan alla dessa val (läs t ex här) men för vårt projekt tänkte v att cross-platform passar bäst, i och med att smidig utvecklig är i prioritet för oss snarare än t ex skillnader i prestanda. Speciellt när vi fick höra om progressive web apps (PWA) så lät valet ännu mer självklart. Kortfattat så ser en sådan applikation ut som en mobilapp och körs i webbläsaren, men som kan sparas på hemskärmen och fungera offline, osv. Detta gör att den inte behöver laddas ner från t ex Google Play Store utan kan nås direkt via en sökmotor, och så fort vi uppdaterar koden på servern så uppdateras användarnas installerade applikationer också! Det här konceptet används tydligen av företag som Pinterest, Uber, Starbucks och Twitter. Jag kände mig först rätt förvirrad angående hur man får en app att bli en PWA så det innebar några timmar av att sätta mig in i det. Det handlar ju ofta om att hitta bra hemsidor som förklarar det på ett enkelt sätt, så jag har sparat några av de som gav mest här nedan. När det lilla meddelandet ”Lägg till Campuskost på startskärmen” dök upp på mobilen, och att det gick att använda appen utan uppkoppling, så var det en bekräftelse på att det fungerade. Så kul! Nu finns det mycket att jobba vidare på – bland annat att få push-notiser att fungera och att kunna ladda upp bilder från mobilen.

Genom att uppfylla kraven för en progressive web app kan man även göra sitt webbprojekt till en skrivbordsapp som också kan användas offline. Hur nice!?

Några länkar som hjälpte att förstå konceptet och få till de praktiska steg som behövdes:

Här kommer lite mer praktiska detailjer om hur detta gick till. Vi programmerar vår frontend med React.js och som många andra använder jag nästan alltid modulen create-react-app vilket genererar en robust setup. Det är bara att byta ut deras standardinnehåll och börja med det roliga. Man får med några filer som jag förut inte förstått vad de är till för, t ex serviceWorker.js. Nu förstår jag att den filen finns där för att enkelt kunna göra appen till en PWA, det är den som exempelvis tillåter offline-läge samt cachar data så att appen kan ladda snabbare nästa gång. I index.js är det bara att ändra serviceWorker.unregister() till serviceWorker.register(). En annan fil som skapas via create-react-app är manifest.json som behöver specificera sådant som ikon och startsida. De krav som en applikation behöver uppfyllas för att vara en PWA finns listade via den sista länken ovan. Ett bra hjälpmedel är även Lighthouse (tillägg för webbläsaren) där man kan se vilka krav som uppfylls genom att inspektera en sida. Tips tips testa testa!

3 shades of raspberry

Vi fortsätter med shaderprogrammering i plugget och nu senast var det OSL shaders med i 3ds Max som gällde. Jag och Samuel gav oss på att göra ett hallon. Det visade sig vara klurigt att få till mönstret när vi jobbade med shaders i just 3D på en sfär så vissa av de små runda utbuktningarna blev mycket mindre. Men från en helrund sfär, till det taggiga första försöket, till något som iallafall kan tolkas som ett hallon så blev vi nöjda! 

Vi använde oss av Voronoi noise för displacement mapping samt variation av färgnyans över ytan.

Äntligen får jag rita och modellera med kod

Nu läser jag en kurs som jag alltså har längtat efter sedan årskurs ett! Då fick jag se att man kunde programmera för att dynamiskt bygga upp t ex 3D-modeller och textur istället för att göra allt för hand. Som att kunna dra i en slider för att justera antalet träd i ett landskap och att de då placeras ut i olika storlekar på positioner som ser naturligt ut. I slutet av kursen ska vi göra individuella projekt med väldigt fria tyglar, så jag klurar på idéer! Hittills har vi haft en första labb som gick ut på att skriva en procedurell shader vilket var superkul när polletten föll ner. Det som först kändes klurigt var att denna shaderfunktion bara tar emot pixelns position, men att det ändå skulle kunna bli ett sammanhängande mönster.. Här intill är några mina favoritresultat. Hörs!

Resultat av programmeringslabb med användning av Perlin noise. Varje pixel får sin färg av samma funktion!

Veckans kluring: Bästa sätt att driftsätta app och hemsida?

Den här veckan har jag och Ronja klurat mycket på hur vi ska driftsätta vår uppgradering av Campuskost. Den nuvarande hemsidan ligger uppe som en WordPress-installation på webbhotellet Binero och att det blev så var mest för att min mamma hade det webbhotellet när vi körde igång. Som jag minns det visste jag nog inte heller vilka andra alternativ till traditionella webbhotell det fanns och definitivt inte hur saker hängde ihop. Ett tag visste jag inte ens vad jag skulle googla på eller hur jag skulle formulera mina frågor till andra. Det var nog något i stil med ”How to deploy..” som jag letade efter. Jag önskar att jag hade kunnat säga att men nu är det glasklart men oh jag har fortfarande en hel del kvar att lära om den biten. Jag blir fortfarande extra imponerad när någon fått upp sin app för nerladdning eller sin hemsida up and running med databaser och allt, det blir väl så när något känns svårt och lite mystiskt. Som jag nämnde i förra inlägget så testade vi att driftsätta vår applikation i Microsoft Azure som verkar vara en typiskt bra grej att kunna. Att skapa en webbsida med statisk html tog bara några minuter men när vi ville ladda upp applikation som vi bygger med node.js blev det lite krångligare. Med node.js har vi nämligen möjlighet att använda moduler med kod från exempelvis npm (node package manager) och då behöver vi kunna konfigurera detta för att kunna köras när vi laddat upp till någon annans server. Två sätt att lösa det på som jag förstått det är att bygga ihop filerna via kommandotolken innan vi laddar upp filerna, eller att vi konfigurerar servern att köra rätt kommandon automatiskt åt oss när vi skickar upp ny kod. Det andra sättet är smidigare när det väl fungerar men samtidigt klurigt då felmeddelanden inte alltid är lika lättåtkomliga på målserven jämfört med när vi jobbar mot localhost på våra datorer. Hur som helst, när vi väl fick det att fungera på Azure kollade vi närmre på vad det skulle kosta oss efter det att provperioden är över – och då strök vi det alternativet haha. Lite kunskap rikare iallafall. Nu är vi mer inne på att använda Netlify (rätt likvärdigt GitHub Pages tror jag) verkar passa våra behov bättre –  wiho tack för tips Pontus! Det var hyffsat enkelt att sätta upp så att wehbsidan nu uppdateras så fort vi skickar upp kod. På många tjänster för att driftsätta sina applikationer finns möjligheten att ladda upp allt som en zip-fil men på det sättet förlorar man en hel del kontroll, t ex av versionshantering, så det kändes viktigt för oss att koppla till Git. Vi har stött på begreppet Continuous deployment som vi ska undersöka vidare vad det innebär och så har vi fått tips om Progressive Web App​s som alltså kan låta oss ha en och samma applikation för både mobil och webb men att det ändå ser ut som en mobilapp. Val av databas är annars nästa steg för oss. Jag har tidigare nästan enbart använt SQL när det kommer til databaser men nu ska vi kika på Firebase och MongoDB som alternativ. Vad vi får lära oss va! Vi har skapat en prototyp i verktyget Figma och denna ska vi nu använda som stöd när vi programmerar, och utveckla vidare vartefter. Sneak peak nedan! Var beredd att bli haffad som användartestade snart. Tills dess, ha det fint och nörda gärna ner dig i något du med.

Vår prototyp i Figma

Sommarjobb – update

Nu har jag varit på Gaia och kodat i fyra veckor. Jag som tänkte uppdatera redan efter första dagarna men datorn hemma har mest stått och dammat. Det kan den gott få göra under sommaren, fast samtidigt finns det så många fritidsprojekt jag skulle vilja grotta ner mig i. Jag vill koda om den här hemsidan lite, göra ett uppswing med Campuskost, prototypa appidéer och leka runt med frameworks och kodbibliotek jag inte testat förr. Dras mellan det och att ge mig ut i sommaren och sommaren har fått prioritet. En helg åkte jag upp till Hälsingland för att hälsa på farmor, bli myggbiten i kantarellskogen och fiska med lillebror i den spegelblanka sjön intill stugan. Nu senast följde jag med Samuel till ett torp småland och hade det mysigt. Kom hem mätt och belåten efter en massa god mat, trötta ben efter fina löpturer i skogen och inte minst ett par liter bär. Vardagskvällar har fyllts med promenader, vänner och mysiga konserter. Andra kvällar har jag ringt upp blivande MT-studenter eller så har det plötsligt blivit läggdags innan jag hunnit gjort något vettigt alls. Försöker att inte hänga allt för mycket på mobilen och jämföra min sommar med andras.

Åter till sommarjobbet. Som jag nämnde i ett tidigare inlägg jobbar jag med ett projekt som rör kollektivtrafiken. Min uppgift i stora drag är att generera linjesegment utifrån listor av koordinater för alla busslinjer, med målet att kunna göra bättre uppskattningar av när en buss är framme vid en viss hållplats. Detta för att när är busslinjerna defineras av bara punkter är det svårt att plocka ur information om medelhastighet på en viss sträcka eller vart flera bussar går parallellt. Så det här problemet har jag klurat på, skissat, testat och gjort om fram och tillbaka. Det kändes lite frustrerande att tiden flyg förbi lite väl snabbt de första veckorna utan att jag fick till ett resultat jag var nöjd med. Lösningarna såg så enkla ut på skisspappret men när den rikiga datan kom in i bilden blev det allt krångligare. När linjerna gick parallellt bara för en kort stund i en rondell eller när den ena linjen svänger av på ett ställe där den andra inte ens har en punkt. Är väl inte helt nöjd i skrivande stund heller men det går framåt och jag är glad över att lära mig mer om Microsoft Azure. Lär mig om virtuella maskiner, build och release pipelines, stream-data och serverlösa funktioner. Jag börjar få en klarare bild om hur vilka steg man kan ta för att driftsätta sina projekt från att sitta och koda lokalt, sånt vi inte riktigt fått lära oss i programmeringskurserna. När det gäller segmenteringen av busslinjer har det krävt mycket tankekraft gällande datastrukturer och geospatial analys (avancerat begrepp tjoho). Nu får det vara läggdags så jag orkar tänka imorgon också. Hörs!