Pages

Tuesday, January 15, 2013

Rezanje kapa

Kakvo li sad rezanje kapa? Pa eto, što sam radio preko vikenda i potrošio cca 42 sata. E pa na rezanje kapa. Da malo približim o čemu se radi. Projekt na jednom kolegiju je bio "Detekcija i klasifikacija različitih pokrivala za glavu". Ideja je dakle da se na slici pronađe čovjek, odnosno njegovo lice i da se s njegove glave izreže kapa. Izrezati u smislu kako bi to npr. napravili u Photoshop-u. Naravno to treba biti automatizirano. U ovom trenutku se naslućuje kompleksnost problema, ali to nije zabavni dio priče.

Zabavni dio priče je taj da smo to radili u timu. Tim od osam ljudi. Projekt je bio davno zadan, tamo negdje u 10. mjesecu prošle godine. Naravno kako to kod nas ide projekt se počeo ozbiljno raditi tri dana prije predaje. Netko bi se mogao pitati: "Za tri dana stignete pronaći kapu na čovjeku i još k tome reći koja je vrsta kape?". E nismo ni mi (tim) znali da je moguće ali očito je :).

Moj zadatak bio je da odredim gdje se nalazi kapa i da ju probam čim bolje odrezati. Otud i naziv za ovaj post. Da se ne hvalim moram napomenuti da sam na tom zadatku radio zajedno s kolegicom.

Ideja je sljedeća:
  1. Pronađi lice na slici (postoji puno gotovih algoritama za to i to nije problem)
  2. Procijeni gdje se nalazi kapa (očito iznad lica i veličine je lica + 30% prema dole)
  3. Iz te slike obriše se lice (zna se koja je boja lica i ti pixeli se izbrišu iz te manje slike gdje se pretpostavlja da je kapa)
  4. Iz slike gdje je izbačeno lice probaju se naći krivulje i po tim krivuljama odrezati kapu (e tu je onaj zanimljivi dio)
    1. Prvo se slika pretvori u nijanse sive (boja->crno-bijela)
    2. Na toj slici se traže rubovi i nastaje čisto crno bijela slika (bez nijansi sive), gdje je 1 predstavlja pixel koji je na rubu a 0 su svi ostali pixeli. (Na rubu znači da je između te točke na slici i susjedne nagla promjena u boji, i to se definira kao rub)
    3. Iz tako novo dobivene  konstruiraju se krivulje, tako da ako se dvije točke koje predstavljaju rub susjedne, točke na istoj krivulji (znači može biti više odvojenih krivulja na slici)
    4. Ali to nije sve: Sad je tu trik. Kako te točke koje su rubovi i na kad gledamo našim okom očito su te točke na istoj krivulji, Canny često tu napravi grešku. Ideja je da se svaka točka podeblja. Sad umjesto da je veličine jednog pixela, duplo je veća npr. 2x2 kvadrat pixela.
    5. Sad se još jednom probaju naći krivulje. Iz takvih krivulja uzme se ona krivulja koja zatvara najveću površinu, i kaže se to je kapa.
  5. Iz informacije o obliku kape slika se odreže (pomoću maske)

Ima sad tu još puno drugih stvari vezanih uz projekt ali ovo je bitno za rezanje kape.
Moram napomenuti da je ovaj algoritam produkt naših ideja i istraživanja (tj. isprobavanja, budimo iskreni, ali kao što se vidi nije to nešto previše komplicirano).

Rezultati:




 Greške zbog kojih dolazi unutar kape su posljedica micanja lica, gdje se onda i neke boje s kapa maknu. Ali to pomaže u preciznjem rezanju donjeg oblika kapa i zapravo ta greška ne utječe jako na krajnji rezultat (tj. prepoznavanje kape).

I sad neočekivani zaključak: Rad u timu od 8 ljudi je prava umjetnost. Nikad nisam volio raditi u timu, ali to nekako progutam ako imam sa sobom razumne ljude, u ovom slučaju su to bili i iznimno pametni ljudi.

 Sad par savjeta što ne raditi:
  1. Pokušajte izbjegavati velike timove (u praksi nemoguće)
  2. Ako voditelj tima nije izabran, izaberite nekoga tko zna voditi tim (nije nužno da bude i najveći stručnjak)
  3. Nemojte svi u timu biti "pametni" - svi rade sve a nitko ništa ne radi
  4. Što prije precizno definirajte zadatke: tko, što, gdje, kako
  5. Nemojte to raditi 3 dana prije roka






No comments:

Post a Comment