2008-10-31

Vecka 44

Jag skriver för fullt på rapporten i detta skedet, vilket gör att det inte finns så mycket att skriva om här. Dock har jag några nya bilder från rapporten. Den första demonstrerar konceptet av kopplade komponenter, vilket är ett bra exempel på något som är enkelt nog att beskriva för att ett barn skulle förstå det, men trots det blir ganska komplicerat att implementera från scratch.
Övriga bilder är utvecklingen av en snake, vilka jag skrivit om förut, som bara påverkas av continuity energy, med resultatet att punkterna placerar sig så att vinkeln mellan linjerna till dess grannar blir identisk. Första bilden visar den (slumpvisa) positionen som ormen ursprungligen placeras i, där de röda gradienterna visar grannskapen för de två vita punkterna (motsvarande energigrannskap beräknas för alla punkterna, men hade jag ritat ut alla hade det inte gått att se något alls):
De nya positionerna är de med lägst energivärde i grannskapet, vilket inte överraskande visas i nästa bild, där formen blivit betydligt mer cirkellik:
Den sista bilden visar vad som hänt efter sju uppdateringar, vilket demonstrerar anledningen till att en snake som bara använder kontuitetsenergi är ganska meningslös - den krymper snabbt mot en enda punkt:
När jag beskrev PCA i rapporten hittade jag två missar jag gjort när jag härledde uttrycken för egenvektorerna, vilket var det som orsakade de sporadiska felen som jag beskrev förra veckan. Komiskt nog var slutresultatet korrekt, med undantag för ett teckenfel som uppstod eftersom jag bara beräknade en kvot x/y för att senare beräkna x och y separat. Detta ger inte oväntat samma resultat som -x/-y, vilket jag inte hade tänkt på. Lösningen var ganska enkel och nu fungerar min PCA som den borde.

Nästa vecka är nummer 20. Jag ska göra allt jag kan för att avsluta ihop rapporten, med undantag för försöket att klassificera tecken vilket jag inte hunnit utföra ännu. Under veckan ska jag fatta beslutet om jag ska försöka hinna med det eller inte, men att avsluta rapporten får högre prioritet eftersom klassificeringen till största del är till för att göra presentationen mer intressant (det vore i och för sig också en trevlig avslutning av projektet..). Jag har en vecka till efter nästa vecka innan rapporten behöver lämnas in till kursansvarrig inför presentationstillfället den 28/11, så eventuellt kommer jag utnyttja delar av den också.

2008-10-24

Vecka 43

18 veckor har gått och 2 är kvar nu! Tiden går faktiskt snabbt ibland, som under de sista veckorna av ett större projekt.. utöver att beskriva några kvarvarande koncept teoretiskt i rapporten (Morfologi och snakes, för att vara exakt) har jag under veckan också testat hur pass bra hudklassificeringen givet färgmodellen egentligen är. Den här gången tränade jag först hudmodellen under bra ljusförhållanden, sen tog jag några statiska bilder med handgester och segmenterade manuellt (vilket var snabbare än det låter tack vare roipoly i Matlab) ut händerna:
Bakgrunden var sedan helt enkelt den inversa masken (efter en liten dilation för att slippa eventuella missade handpixlar):
Det enda som återstod var nu att faktiskt klassificera alla pixlar i bilden vid olika tröskelvärden för Mahalanobisavstånd som räknades som hud. Resultatet kan plottas i en ROC-kurva där andelen korrekta positiva klassificeringar (hudpixlar som identifieras mot hud) plottas mot andelen falska positiva (bakgrundspixlar som klassificeras som hud):
För alla klassificerare är det en avviktning mellan hur många falska positiva man är villig att leva med, men säkerheten är bättre ju närmare det övre vänstra hörnet linjen går. I detta fallet är den något vilseledande, eftersom jag nämnt tidigare räcker färg i regel inte till för någon säker klassificering. Jag upprepade samma försök med bilden som nedanstående mask segmenterades från:
Bakgrund:
Samt ROC-kurva, som visar aningen andra resultat den här gången:
Linjen lyckas till och med dyka under den streckade diagonalen som svarar mot ren chans vid ett tillfälle, vilket är ganska imponerande. Anledningen till de vitt spridda resultaten var att
formen på handen och därmed det registrerade färgvärdet och utseendet var helt annorlunda än den första bilden, som kraftigt liknade de bildrutor som färgmodellen tränats på.

Jag implementerade också Hotelling-transformen (aka PCA) under veckan, men det är fortfarande något som krånglar. Det jag har hittils är en metod som givet en binär mask bildar en positions- och avståndsoberoende representation, vilket förenklat beskrivit ger resultatet att föremålet roteras längst sin huvudaxel, trycks ihop så att den minsta rektangel som innesluter föremålet blir en kvadrat och skalas om till en bestämd storlek. Så långt är allt väl, men tanken är också att representationen ska vara rotationsinvariant, vilket inte är läget just nu (i vissa vinklar förvrids istället formen). Min gissning är att min egenvektorsberäkning har ett teckenfel eller liknande någonstans som bara uppstår ibland, men förhoppningsvis kan jag fixa det.

Nästa vecka är det inte oväntat en slutspurt som gäller, i form av att försöka få PCA att fungera korrekt, extrahera klassificeringsfeatures och med passande (simpel) metod försöka klassificera några bilder. I rapporten ska jag beskriva min implementation av snakes och PCA, samt strukturera om lite saker (som vanligt).

2008-10-17

Vecka 42

Under veckan har jag beskrivit morfologi i lite större detalj än tidigare i rapporten, mer specifikt färgmorfologi utifrån "pseudo-färg" och delvis vektorsortering. Jag har också tittat lite på features som area, konturlängd och cirkularitet som när de beräknas givet en segmenterad hand förhoppningsvis förmedlar en del information om vad som pågår. En del tid gick också åt för att undersöka PCA (principalkomponentanalys). Jag har beräkningen av egenvärden och -vektorer färdig nu, vilken var oväntat krånglig för de matriser som dyker upp för mig, men jag har inga resultat eller illustrativa bilder hittils.

Nästa vecka
är det fortsatt rapportskrivande som gäller, samt att på implementationssidan transformering till att representera händer egenvektorerna som nya axlar och skala om området till standardstorlek. Jag ska också se om jag hinner spela in statisk träningsdata i form av ett antal bokstäver i teckenspråksalfabetet och faktiskt försöka klassificera tecken (!). Denna oväntade utveckling (som var oväntad eftersom jag lagt fokus för examensarbetet på segmenteringen av hud i realistiska ljusmiljöer, vilket visade sig vara svårt) är menad att demonstrera att segmenteringen faktiskt fungerar under vissa förhållanden (som jag kan beskriva och kvantifiera ganska bra) och när den gör det bör det gå att också utvinna information ur bilden.

2008-10-10

Vecka 41

Jag testade att använda mina funktioner för göra att med en tränad färgmodell göra en tröskling vid Mahalanobisavstånd 10 och plocka ut ut färgvärden från den största kopplade komponenten, vilket var (delar av) min hand. Genom en massiv dilation och invertering av masken betecknade jag allt annat i bilden som bakgrund (det fanns inga andra hudområden på bilden). Resultatet av att plotta färgvärdena i RGB-rymden syns nedan, med hudvärden i grönt och bakgrund som röda punkter.
Som det kanske syns är alla färgvärden (både bakgrund och hud) i bilden koncentrerade i en ganska liten del av den totala färgrymden. Nästa bild visar området inom Mahalanobisavstånd 10, alltså de pixlar som skulle klassificeras som hud. Pixlarnas färg är de faktiska RGB-värden som ingår i regionen.
Resultatet ser ganska lovande ut för de gröna färgvärdena (vid avstånd 10 får man ungefär 95%/6% andel sanna positiva och falska positiva klassificeringar), men på grund av metoden jag använde för att plocka fram hudvärdena i första hand är det självklart de med lågt Mahalanobisavstånd inom handen som användes. Även fast alla färgvärden som identifierades som hud faktiskt var det (sanna positiva) så fanns det många fler hudpixlar som inte inkluderades (falska negativa). Nästa steg var att testa vilka slags färgvärden en hand faktiskt innehåller under typiska ljudförhållanden. För att göra detta tog jag en bild med enkel bakgrund, vilket gjorde det relativt enkelt att automatiskt segmentera handen, vilket syns nedan.
I figuren nedan är alla värden markerade i färgrymden.
Det här ger en helt annan bild av vilka färgvärden en hand kan förväntas anta. Det sista uppenbara steget var att ta en bild av bakgrunden utan några hudområden och se hur de förhåller sig till hudvärdena.
Figuren nedan visar färgvärdena från bakgrunden ovan.
Det är intressant dels hur litet område som färgvärdena hamnar inom, men även hur mycket färgerna skiljer sig från vad man intuitivt skulle förväntat sig utifrån den faktiska bilden. Även om det finns blå, röda och vita föremål i bilden fångar denna kameran under dessa förhållanden
färger som alla är beiga med lite variationer i hur ljusa/mörka de är. Den enda uppenbara skillnaden mellan bakgrunden jämfört med hudvärdena är att den inte innehåller lika ljusa punkter, vilket beror på att handen är närmare kamerna och lampan som belyser scenen är just ovanför.

Denna undersökning har visat (ännu en gång) att det inte är tvärenkelt att segmentera utifrån enbart färg, i alla fall med denna kameran och möjligheten att kontrollera belysningen. Det är intressant att min metod med Mahalanobisavstånd och största kopplade komponenten ofta producerar så pass acceptabla resultat trots allt. Ironiskt nog är orsaken till den (begränsade) framgången till stor del att metoderna för att samla in huddata inte får med alla delar av handen.
Om hela handens färgvärden används för att beräkna Mahalanobisavståndets kovariansmatris och medelvektor placeras fördelningen nästan exakt i mitten av färgrymden och ett gigantiskt högt tröskelvärde behövs för att få med mer än en bråkdel av hudpixlarna. Detta gör självklart också att stora delar av bakgrunden felaktigt klassificeras som hud.

Nästa vecka är det som vanligt rapportskrivande som gäller till en början, jag behöver fortfarande dokumentera snakes mer ingående från ett teoretiskt perspektiv och även beskriva min implementation (även om det i dagsläget verkar tvivelaktigt att den kommer bidra något i slutändan) av dom. Delavsnittet om färgmorfologi gapar också tomt. På implementationssidan så är nuvarande planen att testa diverse features (principalkomponentanalys (PCA) står högt på listan) under antagandet att handsegmenteringen är tillräckligt fungerande för att producera något slags användbar data till klassificeringsalgoritmer. Om det faktiskt är fallet eller bara är omotiverad optimism är en öppen fråga hittils, men även om resultatet blir entydigt negativt bör jag ha en ganska bra bild av anledningen till misslyckandet, och isåfall gäller det att knyta ihop det jag har arbetat med hittils och avsluta allt jag påbörjat i rapporten.

2008-10-03

Vecka 40

Jag har under veckan skrivit början till en systembeskrivning i rapporten och fyllt ut beskrivningarna av binär och gråskale-morfologi, kopplade komponenter och snakes.

En ganska pinsam bugg med all min spatiella filtrering visade sig först när jag arbetade med väldigt små bilder (8x8 pixlar) till rapporten, men när jag upptäckte den fick jag orsak att skriva en bättre metod för att pad:a bilder innan filtrering som verkar funka bra. Det fick mig i sin tur att gå tillbaks och undersöka färgmodeller och binär morfologi. Till skillnad från på kontoret (där väggarna var för nära hudfärg) har det visat sig att under antagandet att handen är det största hudfärgade objektet går det ofta bra att segmentera enbart med hjälp av färg här hemma. Detta förutsätter en hyfsat välkalibrerad hudmodell (vilket kan utföras en gång och sparas till fil så länge ljusförhållandena inte ändras) och att belysningen på handen är ungefär densamma i det område man rör sig i. Bilden nedan är endast nerskalad.
Nästa bild visar Mahalanobiskartan (där låg intensitet är nära hudfärg).
Genom att tröskla bilden så att värden under 30 blir vita och övriga svarta och sedan göra en ordentlig dilation fick jag resultatet nedan. Några delar av bilden som inte hör till handen var tillräckligt nära i färg för att komma med.
Nu kommer (äntligen) min kopplade komponent-funktion till nytta. Efter en liten modifikation ger den nu också information om de funna komponenterna, vilken man kan använda för att endast behålla den komponenten som har störst area.
Resultatet blir dugligt i många fall, även om delar av formen går förlorad.

Nästa vecka kommer jag undersöka hur hud- och ickehud-pixlar är fördelade i färgrymden för att undersöka hur pass separerbara mängderna är (jag har mina gissningar: nästan inte alls), skriva om snakes och se vilka features man kan använda efter sin hudklassificering för att avgöra vad handen håller på med.