Blog

Augmentacija slika koristeći TensorFlow

Antonio Parunov

Augmentacija slika je procedura pri kojoj se skup podataka umjetno proširi primjenjivanjem različitih transformacija na slike. Svrha toga je dvojaka, s jedne strane ćemo poboljšati preciznost i točnost modela, a s druge ćemo unaprijediti generalizabilnost modela. Naime, primjenom različitih transformacija, moguće je konstruirati slike koje se značajno razlikuju od onih u skupu podataka, ali bismo očekivali od modela da ih ipak zna ispravno klasificirati.

Navedimo neke od mogućih augmentacija slika:

  • rotacija,
  • translacija,
  • smicanje,
  • refleksija,
  • promjena kontrasta,
  • promjena svjetline,
  • promjena saturacije,
  • promjena nijansi (engl. hue),
  • promjena oštrine,
  • izrezivanje nasumičnih djelova slike.

Augmentacije slika možemo podijeliti u kategorije, tako bi prve četiri spadale u afine augmentacije, a slijedećih pet spada u augmentacije na razini piksela. Slika 1 prikazuje primjer afine augmentacije, rotaciju, a slika 2 primjere nekih augmentacija na razini piksela.

augmentacija slike, afine augmentacije
Slika 1. Rotacija. Izvor originalne fotografije: Photo by Kabo on Unsplash

augmentacija slike, augmentacije na razini piksela
Slika 2. Augmentacija na razini piksela. Gore lijevo se nalazi svjetlina, desno je kontrast.
Dolje lijevo je saturacija, a desno promjena nijansi.

Determinizam

Naravno, želimo da augmentacija bude nasumična, zbog čega nećemo primijeniti svaku moguću augmentaciju na svakoj slici te želimo da magnituda augmentacije također nasumično varira. Time izbjegavamo da model koristi svoje kapacitete za „pamćenje”, već da pomno traži parametre koji će rezultirati što boljim predviđanjima. Ipak, želimo da različitim pokretanjima programa dobivamo iste (reproducibilne) rezultate.

Tajna je u tome što nasumični brojevi koje nam generiraju programski jezici nisu nasumični u pravom smislu. Oni se generiraju djelovanjem komplicirane funkcije na neko sjeme (engl. seed). Za isto sjeme očekujemo isti generirani broj. Također, mala promjena sjemena bi trebala drastično promijeniti generirani broj. Time smo osigurali da naš generator ima visoku entropiju, što daje privid nasumičnosti. Tako generirane brojeve nazivamo pseudoslučajnim.

Slike kao tenzori

Slika naizgled ima dvije dimenzije, širinu i duljinu. No mi ne možemo jednim brojem parametrizirati boju. Stoga je uz te dvije dimenzije potrebna i dimenzija boje.  Nadalje, u dubokom učenju se skup podataka podijeli na hrpe (engl. batch), koje se potom šalju modelu na učenje. Tako dolazimo do objekta čiji oblik možemo zapisati kao uređenu četvorku (N, W, H, C). Ovdje N označava broj slika u hrpi, W je broj piksela u jednom redu slike, H broj piksela u stupcu, a C označava kanal boje (crvena, zelena ili plava). Ovakav objekt poznat je kao tenzor ranga 4, te je poznavanje njihove algebre esencijalno za bavljenje računalnim vidom. Jako zgodan alat koji imamo na raspolaganju je funkcija tf.einsum(). Ona je bazirana na Einsteinovoj sumacijskoj konvenciji. Promotrimo običan umnožak matrica:

U Einsteinovoj sumacijskoj konvenciji izostavljamo simbol sume te se on implicitno podrazumijeva za sve duple indekse. Stoga gornji izraz možemo zapisati kao:

Koristeći tf.einsum() to bi bilo:

U donjem će odjeljku biti pokazano kako se ova funkcija koristi u praksi. Nadalje, nešto više će biti rečeno o samom TensorFlowu.

Primjer augmentacija slika

U ovome ćemo primjeru koristiti TensorFlow programski paket u programskom jeziku Python. TensorFlow je moćna biblioteka koja omogućuje rad s grafičkim modelima, gdje su vrhovi grafova operacije, a bridovi su tenzori. Stoga imamo svojevrstan tok tenzora i stoga je naziv TensorFlow prikladan.

Definirajmo funkciju koja nam mijenja kontrast svake slike u hrpi zasebno. Takva funkcija bi primala 2 argumenta, hrpu slika (images) te faktore promjene kontrasta (factors).  Neka je x faktor promjene, m srednja vrijednost intenziteta slike rednog broja n te kanala boje c. Tada piksel indeksa i,j prima sljedeću vrijednost:

Kao što vidimo iz formule, kada je f = 1, vrijednosti intenziteta pojedinog piksela ostaje nepromijenjena. Za f = 0  svi pikseli, pak, poprimaju vrijednost jednaku prosjeku.

Također nam treba funkcija koja nam generira vjerojatnosti te magnitude pojedinih augmentacija. Ona zatim poziva zasebne funkcije za augmentaciju te vraća augmentiranu hrpu slika. Njeni su argumenti hrpa slika (images), labele (labels) te sjeme (seed). Pri tome koristimo funkciju tf.random.stateless_uniform(), koja generira nasumične brojeve u zadanom formatu (shape). Ova funkcija ima prednost nad običnim tf.random_uniform() u tome što njene vrijednosti ne ovise o globalnom sjemenu. Iz tog je razloga možemo iskoristiti kako bismo postigli reproducibilnost.

Na posljetku nam preostaje konstruirati funkciju koja učitava podatke, svrstava ih u hrpe te augmentira koristeći gornje funkcije. Također, ova bi funkcija trebala generirati niz sjemena koji ćemo koristiti za generator slučajnih brojeva. Pretpostavljeno je da raspolažemo skupom podataka u formatu tf.data.Dataset. Takav skup podataka zajedno sa željenom veličinom hrpe dajemo funkciji generate_batches(data,  batch_size, train). Argument train stavimo na ‘False’ za validaciju te True za trening. Funkcija f(batch_seed, D) je svojevrsni posrednik između tf.data.Dataset modula te naših funkcija za augmentaciju.

Zaključak

U ovom blogu smo se upoznali s osnovnim konceptima augmentacije slika. Osim toga smo se pozabavili i problemom determinizma i reproducibilnosti te pokazali jedan od načina kojim se takvi problemi mogu riješiti u TensorFlowu. Na kraju smo konstruirali funkciju koja augmentacije primjenjuje na svaku sliku zasebno, umjesto na sve slike jednako unutar hrpe, kao što je to slučaj sa gotovim augmentacijama u TensorFlowu. Augmentacija slika se pokazala korisnom, jer omogućuje da poboljšamo preciznost i generalizabilnost modela, pokazujući modelu primjere slika kakvi se ne pojavljuju u skupu podataka, a za koje bismo očekivali da ih model može pravilno klasificirati.

Reference:
  1. https://jackd.github.io/posts/deterministic-tf-part-2/
  2. https://www.tensorflow.org/api_docs/python/tf