donderdag 18 december 2008

Wallpaper group classificatie (2)

De voorbije twee weken heb ik voornamelijk besteed aan het finetunen van het classificatiealgoritme beschreven in mijn vorige blogpost, en niet, zoals vermeld in die post, met het implementeren van een alternatief algoritme. Dat algoritme bleek te complex om op korte tijd (2 weken tot de thesispresentatie) te implementeren. En omdat het eerste algoritme nog geen acceptabele resultaten gaven, besloot ik dat algoritme verder te tunen.

Enkele van de aanpassingen zijn de volgende:
- detectie van glide reflection
- fixen van een bug in de code om een textuur te spiegelen over een bepaalde as
- beter selecteren van naburige roosterpunten in de correlatiefunctie en de mediaantegel registreren op deze roosterpunten
- fixen van enkele bugs in het classificatiegedeelte van de code

Al deze aanpassingen zorgden voor een verbetering van de resultaten. Om de tabel uit vorige post als vergelijking te gebruiken: de eerste 3 regels zijn mijn oude resultaten, de laatste 3 de resultaten van het algoritme in huidige vorm.

Tabel 1: trimmed normalized residual error van verschillende symmetrieën voor verschillende texturen en de uitkomst van het classificatiealgoritme

Nog een laatste opmerking is dat near-regular textures nu ook een stuk beter worden ondersteund, maar nog steeds geen bevredigende resultaten geven. Er is dus nog heel wat werk aan de winkel.

woensdag 3 december 2008

Wallpaper group classificatie

Het is weeral een tijdje geleden sinds mijn laatste blogpost. Door de Athensweek en een stagepresentatie heb ik niet zo bijster veel tijd gehad.

De laatste week heb ik mij vooral bezig gehouden met de wallpaper group classificatie. Nu ik de translatievectoren kan bepalen, ben ik in staat een median tile te berekenen, een soort representatieve tegel. Dit gebeurt door verschillende tegels uit te knippen uit de textuur, deze te matchen op elkaar, dus ervoor te zorgen dat ze op elkaar passen (dit gebeurt momenteel nog op een discrete schaal, dus op pixelniveau, maar in de toekomst zou ik via bilineaire interpolatie een continue schaal gebruiken), en vervolgens per pixel de mediaanintensiteit te nemen.

Eenmaal deze median tile berekend, pas ik elk van de 8 mogelijke symmetrieën (180°, 120°, 90° en 60° rotatiesymmetrie en reflectie over de translatie- en de diagonaalassen waarbij er eventueel glide reflection is) toe op de textuur. Vervolgens correleer ik de median tile met de getransformeerde textuur en zoek het maximum daarvan. Daarna registreer ik de median tile met de textuur, vertrekkende vanaf dit maximum, via de SSD (sum of squared differences). Op deze positie wordt dan de trimmed normalized residual error berekend. Ook op naburige roosterpunten wordt deze error berekend. Nu is het zo dat sommige stukken in de correlatiefunctie niet zo interessant zijn, voornamelijk de randen. Die naburige roosterpunten mogen dus enkel in het centrum van de correlatiefunctie genomen worden. De implementatie hiervan leek initieel vrij eenvoudig, maar het heeft me toch even gekost om dit te implementeren. Uiteindelijk worden van al deze errors de mediaan genomen zodat men er zeker van is dat in de getransformeerde textuur het rooster opnieuw aanwezig is. Via een threshold die berekend is via een Chi²-distributie wordt dan bepaald of deze error klein genoeg is om met 99% zekerheid te zeggen dat de symmetrie voor deze textuur van toepassing is. Als laatste wordt voor de reflecties bekeken of het al dan niet glide reflections zijn. Dit laatste stuk heb ik evenwel nog niet kunnen implementeren.

De resultaten die ik haal met deze implementatie stemmen niet helemaal overeen met diegene uit de paper. Deze zijn gemiddeld heel wat minder goed. Enkele vergelijkingen:

Textuur 1: cmm

Textuur 2: pgg

Textuur 3: p6

In tabel 1 worden de resultaten vergeleken. De threshold ligt op 1, dus indien de error minder is dan 1, is de symmetrie van toepassing. De eerste 3 tabelregels zijn resultaten uit de paper, de volgende 3 zijn mijn resultaten. Voor (1) en vooral voor (2) zijn de resultaten relatief hetzelfde, buiten het feit dat mijn algoritme nog geen glide reflection kan detecteren. Voor (3) is er al meer verschil en is de uitkomst zelfs dubbelzinnig.

Tabel 1: trimmed normalized residual error van verschillende symmetrieën voor verschillende texturen en de uitkomst van het classificatiealgoritme

Conclusie is dat het algoritme redelijke resultaten aflevert die meestal kloppen, maar toch nog te dikwijls fout zijn. Een belangrijke reden hiervoor is dat de beschrijving van het algoritme relatief vaag is. Heel wat elementen en parameters moeten zelf bedacht worden.

Het algoritme geeft ook enkel goede resultaten bij reguliere texturen. Bij near-regular textures zijn de resultaten veel minder goed. Om dit probleem te counteren, staat er in de paper nog een tweede algoritme beschreven dat ik de komende weken zal proberen implementeren.

maandag 3 november 2008

Translatievectoren gevonden

Er is intussen een week gepasseerd en de voorbije week ben ik wat meer in gang geschoten. Nu ik de autocorrelatie van een textuur kon berekenen, was het tijd om lokale maxima hiervan te zoeken. Dit kon gebeuren via non-maximum suppression. Ik dacht eerst dat dit best in C geschreven werd, maar als M-file draaide het in feite ook zeer vlot. Blijkbaar gaat Matlab Just in Time (JIT) naar C compileren als de code te traag is. Hierdoor ben ik wat tijd verloren, maar nu weet ik weer terug hoe ik een MEX-file voor Matlab kan schrijven.

Nadat de lokale maxima zijn gevonden, moet de kortste afstand tot een groter maximum berekend worden. Hiervan neemt men dan de punten met de 32 grootste afstanden (nadien heb ik deze parameter dynamisch berekend, maar hier ga ik niet verder op in) en deze geeft men mee aan de general Hough transform.

Initiële figuur

Autocorrelatie met lokale maxima aangeduid

Die zoekt namelijk de 2 kleinste translatievectoren die dit rooster genereert. De implementatie van deze transformatie is te vinden in de paper Extracting periodicity of a regular texture based on autocorrelation functions. Dit algoritme is zeer robuust en gaf zeer goede resultaten, zelfs bij texturen waarbij de patronen helemaal niet regelmatig zijn. Bij enkele texturen faalt het algoritme, maar dit zijn zorgen voor later.

Initiële figuur met rooster

Nog enkele voorbeelden zijn te zien in onderstaande figuren.

Muurschildering uit een Egyptische tombe in Thebe

Badkamer linoleum vloer

Stalen hek

Houten hek

maandag 27 oktober 2008

Eerste resultaten

Na het indienen van mij stageverslag kon ik eindelijk deftig beginnen. Na een nieuwe meeting met Ares kon ik reeds beginnen implementeren in Matlab. De eerste stap is het berekenen van de autocorrelatie van een figuur zodat het translatierooster zichtbaar wordt (zie figuren). Hierna is het de bedoeling dat de lokale maxima van deze correlatiematrix worden gezocht. Hiervoor is een zeer rekenintensief algoritme nodig, genaamd non-maximum suppression (http://www.vision.ee.ethz.ch/~aneubeck/). Om dit algoritme te versnellen, heb ik beslist dit in C te schrijven. Matlab ondersteunt MEX-plugins (MATLAB Executable), functies die dus in C-code geschreven zijn. Helaas heb ik deze functie nog niet helemaal afgewerkt voor de meeting van vandaag met Ares, maar dit zal alleszins niet lang meer duren.

Thesisstart

Dit is mijn eerste blogpost, en dat pas eind oktober. De eerste weken van het semester waren dan ook zeer druk, o.a. een stageverslag dat moest ingediend worden. Om alles recht te zetten zal ik een bondig overzicht geven van wat ik tot nu toe gedaan heb.

Het begon allemaal met een eerste thesismeeting met Ares op 07/07 waarin de thesis kort besproken werd en met een eerste ruwe planning. De grote vakantie zou grotendeels dienen om literatuurstudie te doen en eventueel een eerste implementatie te maken. Ik kon beginnen met het lezen van drie papers:
  • A Computational Model for Periodic Pattern Perception Based on Frieze and Wallpaper Groups: dit is de interessantste paper en is de basis voor de start van mijn thesis
  • Near-Regular Texture Analysis and Manipulation
  • Discovering Structural Regularity in 3D Geometry
Er werd beslist dat ik voor de implementatie best kon beginnen in Matlab en nadien eventueel kon overschakelen op C/C++ indien snelheid een grote bottleneck zou worden.

Tijdens de vakantie heb ik uiteindelijk enkel de drie papers kunnen uitlezen. Doordat ik een stage had, had ik een groot gebrek aan tijd.