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.