Exjobbsnytt: VPN, RTSP, threading, Raspberry Pi..

.. med mera! De senaste veckorna av exjobb har bjudit på många nya tekniker och kluringar. Projektet innehåller många delar som ska kopplas samman (se detta inlägg) och vissa av dem har känts lite abstrakta fram tills nyss. Exempelvis så visste vi att det fanns en Axis-kamera på plats på Kolmården. Däremot visste vi inte riktigt vilken funktionalitet den hade och hur vi skulle kunna komma åt videoströmmen. När något känns abstrakt är det ju ibland också svårt att formulera de frågor man behöver svar på.. Nu är vi glada över att ha ersatt flera frågetecken med spännande resultat 😀

Livedetektion av Zebror på Kolmården - från kontoret!

Förra veckan var vi iväg på två besök som gjorde saker och ting klarare för oss. Vi spenderade en heldag på Kolmården och fick lära oss om den hårdvara som används för projektet. Eftersom målet är att få ut kameran mitt på savannen så jobbas det på ett elskåp som drivs på solceller. Skåpet är fyllt med batterier, spänningsmätare, nätverksswitch m.m. och var också något som kändes abstrakt förut (iallafall för mig som inte har så bra koll på ellära hehe). Lyckligtvis fick vi en bra genomgång på Kolmården och närmare förståelse av kopplingen mellan kameran, skåpet och den Raspberry Pi som vår kod ska in på.

Att koppla upp till kameran var minsann klurigt ändå. Dels så behövde vi koppla upp oss via Kolmårdens VPN och därefter skicka en request för en specifik url för att komma åt videoströmmen via RTSP (Real Time Streaming Protocol) som inte var helt lätt att hitta. Tydligen så spelade det roll vilken webbläsare vi satt i och vart vi skrev vår kod, så ibland kunde vi tro att vi fastnat fast vi var på rätt väg.. tur att vi är envisa 💪

Dagen efter var vi på besök hos Axis Communications och fick mer koll på deras kameror och en del övriga tips. Hem från Linköping fick vi även med oss en Raspberry med kameramodul som vi kunde lägga in vår detektionsmodell på och testa i realtid på kontoret. I tidigare projekt där vi använt en Raspberry så har någon annan haft det ansvaret, så det var kul att vara med i trixandet den här gången och lära sig mer! 

Ytterligare nytt är att vi börjat med Dropbox for Python SDK för att skicka vidare resultat från vår Raspberry och då vi testar livestreamen från Kolmården på datorn. Sedan (puh!) för att kunna detektera djur i videoströmmen i realtid så dök jag idag in i threading-djungeln. Kortfattat så skickar vi nu iväg en viss frame för detektion, och ser om den föregående är klar. Innan denna ändring så laggade videon då vår modell behöver ca 300 millisekunder att hitta eventuella objekt, medan nu upplevs det som att videoströmmen detekteras live.

Fler inlägg om exjobbet:
Exjobb Ngulia – Vad gör vi
Exjobbsstart
Reka exjobb i djurparken
Mina drömmars exjobb. händer det??

Amanda meckar med elskåpet på Kolmården!

Utveckling av Campuskost: Att använda Firebase

Grundläggande funktionalitet för nya Campuskost börjar falla på plats! Fram tills igår har t ex bilderna som används i recepten varit testbilder som legat i samma mapp som projektet. Nu kan en användare ladda upp en bild från sin mobil eller dator och den lagras istället på Firebase. Jag tänkte att det kan vara intressant att berätta lite mer om hur just Firebase kan användas. 🔥🧐

Via Firebase kan man bland annat skapa en databas för sitt projekt och lagra filer online. Deras molntjänster är gratis för mindre applikationer så det är perfekt att använda för att lära sig. Det finns alltså begränsningar i gratisnivån, t ex en maxgräns på att läsa data från databasen max 50 tusen gånger/dag och att lagra max 1 GiB filer totalt – men det räcker ju långt! 

I bilden nedan har jag monterat ihop en bild av hur jag använder ett några av molntjänsterna som finns på Firebase för dig som är nyfiken. Funktionalitet för att skapa ett konto och logga in sköts av Firebase Authentication och de hanterar även lösenord. Än så länge har vi att man skapar konto med sin email med det ska också gå att ordna så att man kan logga in via Facebook eller sitt Google-konto, vilket ju känns proffsigt. Database är en NoSQL databas och dess struktur är som ett JSON-objekt, dvs en trädstruktur. I databasen kan man lagra dokument med ett antal datatyper att välja mellan, exempelvis strings, numbers, booleans och arrays. Bilder och andra filer däremot lagras med fördel i Storage. När man öppnar Storage ser det ut lite som en vanlig mappstruktur på sin dator. 

En utmaning som jag arbetat med är att koppla ihop dessa tjänster. T ex att det ska skapas en nytt dokument i databasen när när en ny användare skapat ett konto. I databasen ska nämligen all information lagras om vilka recept en användare har, vilka recept som sparats, användarnamn och så vidare. Sen gällande att ladda upp ett nytt recept så lagras bilden i Storage medan listan av ingredienser, titel och annat lagras i Database. Då gjorde jag så att ett receptdokument i databasen har ett attribut, img_url, vilket kan kopplas till bilden i Storage. Detta fick jag lösa genom att i koden först ladda upp bilden till Storage och hämta vilken url den fick, för att sedan skapa dokumentet till databasen. 

Snart är en betaversion redo för testning. Den första versionen innehåller troligen buggar och kan sakna vissa en del detaljer. Så vi kommer vilja att ett gäng börjar använda appen/hemsidan och meddelar oss alla buggar, samt önskemål eller förslag inför vidare utveckling. Hör gärna av dig till mig eller Ronja om du är taggad på detta! 😀

Läs mer om utvecklingen av Campuskost här:
– Lära sig koda ’Progressive Web Applications’
Veckans kluring: Bästa sätt att driftsätta app och hemsida?
– Campuskost

Skiss på hur vi använder Firebase i vårt sidoprojekt
Exempel på hur vi kommunicerar med Firebase via JavaScript. (Det känns nog lätt lite abstrakt annars..) Här är den kodsnutten som laddar upp en bild och väntar på att få veta vilken url bilden fick.
Sneak peak!

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 av exjobbet 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å 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

Exjobbsstart

Den här veckan började jag och Amanda vårt exjobb på riktigt! Fram tills i måndags har vi mest läst teori och skrivit på en planeringsrapport som ska lämnas in, men nu har vi börjat arbeta heltid. Vi gör alltså exjobbet för Projekt Ngulia men får sitta på HiQ i Norrköping då HiQ ansvarar för utvecklingen av programvara för projektet. Det känns snabbt mer seriöst och fokuserat att ha en plats att gå till och kan efterlikna vanliga arbetstider. Liksom: kaffemaskin, fredagsfrukost, vara kollega. Samtidigt tillräckligt nära campus för att kika förbi och att säga hej ibland eller slinka in på en lunchföreläsning. (Undrar om jag blir för bortskämd med närhet till allt för att kunna lämna Norrköping en dag..). Den här första veckan har vi samlat data, skrivit mer på planeringsrapporten och börjat kika på implementering. Vi har fnissat och känt oss viktiga när vi mailat med researchfolk på Microsoft, och av andra mail blivit besvikna för att inte få tillgång av en viss samling noshörningsbilder. Det känns både spännande och lite läskigt att vara beroende av andras beslut och engagemang i projektet, vi får hålla tummarna för att allt rullar på helt enkelt. Drömscenariot om att få åka ner till Kenya och sätta det hela i drift verkar kunna ske ändå (!!). I övrigt har det varit kul att vi lyckats koda ihop små program för att göra sånt som är annars är omständigt, typ som när Amanda hittade samband i excel-filer för att ladda ner bilder från nätet automatiskt. Snart hoppas vi på att kunna visa några bilder där där vår CNN-modell känner igen en noshörning.

Innan vi tränat modellen på noshörningar: ett objekt är upptäkts men klassifieras som N/A. Snart så!

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:

Tankar efter 5 år av schemalagda kurser.

Strax innan jul hade jag min sista schemalagda vecka efter fyra och ett halvt år av studier, eller fem om man räknar med de kompletterande gymnasiekurserna. Tänkte då att det borde kännas stort, för det är ju stort, jag har slitit som *** och kan nu checka av alla labbar, föreläsningar, lektioner, allt sånt som har att göra med att hänga med och bli godkänd på en kurs. Tänkte att jag borde ha ett behov av att skriva av mig en massa, men allt jag kunde få ur mig var att – ja.. det är blandade känslor – skönt att det är över men också tråkigt att snart lämna studentlivet. Tankarna vill gå vidare mot nästa mål, ger mig inte utrymme att njuta ordentligt först. Jag älskar den här underliga källan av driv som ger mig så mycket stimulans, men tänk om man kunde välja andra inställningar. Något som fick mål att kännas mer stimulerande när man väl är där. För en del av mig känner nu att det inte är en så big deal att bli klar med alla kurser, men jag inser att det är baserat på att min sista period var rätt lugn, det sista året. Glömmer liksom bort alla timmar av slit och när deadlines känts omöjliga. Nu är jag förvirrad över att plötsligt gå i femman och försöker kartlägga mina år och vad jag gjort, tänkt och känt under åren. Kanske är det egentligen bara utlandsåret som har förvirrat mig, för från år tre och tills nu i somras har det varit i fokus. Inte konstigt att femman kom plötsligt när det var svårt att inse att min tid på LiU också tickade på under tiden jag var i USA. Dilemmat är alltså den här förvirringen om att allt gått så snabbt när jag ändå kännt att jag haft en balans i mitt studieliv. Jag tar mig tid för återkoppling, fest, umgänge. Varvar yogapass med promenader och TV-soffan. Det här senaste året har jag dock insett att jag nog varvar lite väl mycket, liksom mixar ihop produktivitet med fritid så att sinnet får svårt att skilja på vad som är vad, och det blev visst ett problem. Jag gillar att få saker gjort och vill därför göra allt på en gång tanken slår mig. Paus från plugg för att boka tågbiljetter. Paus från gympass för att svara på ett meddelande. Växlande mellan kockarnas kamp och rapportskrivande varje gång det blir reklam. Tror att min kära mulitasking har blivit en bov. I kombination med det så har något så härligt som ett glest schema varit jobbigt det här året. Så många dagar har varit helt eller delvis schemafria och resultatet av det blev ett sånt velande om hur jag ska spendera min tid. Det må låta hur banalt som helst men när den rastlösheten slår in är så jobbigt kliande. Då vill jag ut och springa, bara lägga mig i sängen, plugga fokuserat eller gå och jobba samtidigt. Men varken ork, ro eller fokus för något av det, så fort jag beslutar mig för något av det känns det bara fel och jag väljer något annat, men så säger kroppen nej då också. Det som har funkat rätt bra har varit att helt enkelt planera de där dagarna i förväg och hålla mig till det. Jag ser verkligen fram emot att ha mer fasta tider nu när exjobbet drar igång och alltid veta att det projektet är rätt fokus, samt att vara två om det.

Glad att jag valt att skriva av mig då och då, det låter saker sjunka in bättre. Hm. Jag fick idén nu om att skicka en massa bilder till utskrift och pyssla ihop en personlig tidslinje, som visar på att alla veckor varit speciella på sitt sätt. Vill liksom inte att hela den här studietiden bara buntas ihop i minnet. För wow, vad det har varit roligt. Fjantigt, seriöst, svårt frustrerande. Enkelt, spännande, stressigt, mysigt. En rapport ska lämnas in och vi har ett exjobb att göra, men jag tar ut segern i förskott för att jag behöver bli bättre på att fira. Så igen, alltså wow.

Dagar när man står och trampar

Det är sällan tanken slår mig att updatera bloggen för att berätta att jag inte fått så mycket gjort. På ett sätt är det ju sjukt ointressant att läsa, men på ett annat sätt viktigt att veta om. Vi får ju en så skev bild om vad som skulle vara normal nivå eller inte annars. Ska det kännas jobbigt när saker har gått segt i fem dagar? i tre timmar? i en halvtimme? Den senaste veckan har det känns som att det gått långsamt framåt med plugget. Samtidigt har jag inte koll riktigt på hur många timmar jag faktiskt satt ner med det. Idag vet jag iallafall att mellan 9 och 17 var jag i plugget och trixade med samma 10 rader kod fram och tillbaka, tills jag tillslut kommenterade bort det mesta igen.