Uh, gotova pauza :). Prošlo je dosta vremena od zadnji put. Razlog su opet obaveze. Zadnjih četiri-pet mjeseci bavio sam se kompresijom slika bez gubitaka pa mi je želja ukratko ispričati o čemu se radi.
Cilj kompresije podataka je smanjiti njihovu originalnu veličinu. Razlozi mogu biti različiti, od želje za uštedom memorijskog prostora do bržeg prijenosa preko mreže i sl. Glavna podjela
kompresija je na one s gubitkom i one bez. Kompresija s gubitkom je
kompresija pri kojoj se određena količina podataka izgubi i ne može se
više vratiti. Poznati formati kao što su JPEG ili MP3 su upravo
kompresije s gubitkom. Kako su to kompresije za sliku odnosno zvuk,
temelje se na tome da iz podataka maknu informacije koje čovjek
ionako ne može uočiti u obliku slike ili zvuka. Kompresija bez
gubitaka komprimira podatke ali tako da se poslije mogu vratiti u
identičan originalni
oblik. Da bi podatke bilo moguće komprimirati potrebna je određena
redundancija u njima. Jednostavan primjer je kompresija teksta. Obično
se tekst u binarnom formatu zapisuje tako da se za svaki znak (slovo)
koristi 8 bitova. Kako se neka slova češće pojavljuju od drugih, ideja
je korištenja manjeg broja bitova za takve znakove i većeg broja bitova
za znakove koji se rjeđe ponavljaju.
Iako neki znakovi sada budu kodirani možda s 15 bitova oni se rijetko
pojavljuju, a oni češći će biti kodirani npr. s 2 bita. Rezultat toga je
smanjenje prosječne duljine binarnog koda znakova. Ovo je ukratko bio
uvod :).
Cilj projekta na kojem sam radio bio je implementacija kompresije bez gubitaka na grafičkim karticama pomoću okruženja CUDA. Kompresija slike bez gubitaka veoma je važna u medicini, gdje je potrebno očuvati originalnu
informaciju. Algoritam koji se implementirao bazirao se na predviđanju
piksela. Ako su poznati susjedi nekog piksela, tada je velika
vjerojatnost da je taj piksel sličan svojim
susjedima, ako se radi o prirodnim slikama (npr. slika s puno šuma nema smisla u ovom kontekstu). Problem je što na slikama
postoji više različitih područja. Zato samo jedna predikcijska funkcija
daje loše rezultate na cijeloj slici. Kompresija se temelji na grešci
predviđanja. Za svaki piksel se izračuna razlika između njegove
vrijednosti i vrijednosti koje mu je dala predikcijska funkcija. Dobra
predikcijska funkcija malo griješi i očekivana greška je 0. To znači da
je vjerojatnost pojavljivanja greške 0 velika, pa se sad taj problem
može pretvoriti u klasičan problem kao kod kompresije teksta. Direktna kompresija slike kao teksta nije dobra jer je distribucija vrijednosti piksela ujednačena, tj. ne postoji "boja" koja se češće pojavljuje.
Kao
što sam naveo, jedna predikcijska funkcija na cijeloj slici nije sasvim
dovoljna. Zato se koriste adaptivne metode, koje prepoznaju dijelove
slika i prema tome odrede koja će se predikcijska funkcija koristiti.
Jedna od takvih metoda
implementirana je u ovom projektu. I sad tu još postoji puno detalja
ali ako netko ovo i pročita i zanima ga više slobodno me kontaktira :).
Rezultati
su bili dobri. Zbog korištenja grafičke kartice umjesto procesora
dobilo se ubrzanje algoritma. Osim toga algoritam na grafičkoj kartici
troši manje električne energije nego dok se izvodi na procesoru. Moram se zahvaliti zahvaliti i kolegi s kojim sam to radio :).
Eto toliko za sada. Uskoro bi morao doći i post o kriptografiji, preciznije o jednoj relativno novoj hash funkciji (neću reći kojoj :)).
No comments:
Post a Comment