JANI URAMA LIIKKEENESTIMOINTI VIDEONPAKKAUKSESSA Kandidaatintyö Tarkastaja: yliopistonlehtori Heikki Huttunen Jätetty tarkastettavaksi 14. joulukuuta 2012
ii TIIVISTELMÄ TAMPEREEN TEKNILLINEN YLIOPISTO Signaalinkäsittelyn ja tietoliikenteen koulutusohjelma URAMA, JANI: Liikkeenestimointi videonpakkauksessa Kandidaatintyö, 24 sivua Joulukuu 2012 Pääaine: Signaalinkäsittely ja multimedia Tarkastaja: yliopistonlehtori Heikki Huttunen Avainsanat: video, videonpakkaus, koodekki, tiedon pakkaus, kompressio, liikkeenestimointi, liikkeenkompensointi Liikkeenestimointi on yksi videonpakkauksen vaativimmista osa-alueista niin algoritmien kuin laskentatehovaatimusten osalta. Oikean algoritmin valinta sovellukseen on tasapainoilua nopeuden ja tehokkuuden välillä. Tässä työssä tutkitaan ja vertaillaan liikkeenestimoinnin algoritmeja pääasiassa niiden pakkaustehokkuuden ja -nopeuden kannalta. Algoritmien vertailua varten toteutettiin yksinkertainen videokoodekki käyttäen Matlab-ohjelmistoa. Työn tavoitteina on selvittää, kuinka liikkeenestimointi vaikuttaa videoiden pakkaukseen ja kuinka käytännöllisiä vaihtoehtoja nopeat liikkeenestimointialgoritmit ovat.
iii ALKUSANAT Tämä kandidaatintyö on kirjoitettu vaihto-opiskeluvuoteni aikana Japanin Sendaissa, Tohokun yliopistossa. Opiskelin vajaan vuoden ajan Kawamatan signaalinkäsittelyn laboratoriossa huhtikuusta 2012 maaliskuuhun 2013. Viikoittaiset tapaamiset ja säännölliset seminaariesitykset koskien työstämääni videokoodekkia, asiantunteva ympäristö sekä kattava kokoelma alan kirjallisuutta loivat ihanteelliset puitteet kandidaatintyön kirjoittamiselle. Kiitokset Tohokun yliopiston apulaisprofessori Abe Masahidelle arvokkaista neuvoista sekä Matlab-ohjelmistoa koskevasta tietämyksestä. Lisäksi haluan kiittää työn ohjaajana ja tarkastajana Suomesta käsin toiminutta yliopistonlehtori Heikki Huttusta rakentavista kommenteista työn eri vaiheissa. Sendaissa, 14. joulukuuta 2012 Jani Urama jani.urama@tut.fi
iv SISÄLLYS 1 Johdanto...1 2 Videonpakkauksen perusteet...2 2.1 Miksi videonpakkausta tarvitaan?...2 2.2 Videokoodekin rakenne ja toimintaperiaate...2 3 Liikkeenestimointi...7 3.1 Yleistä liikkeenestimoinnista...7 3.2 Toteutetut liikkeenestimointialgoritmit...10 3.2.1 Full Search...10 3.2.2 Decimated Full Search...11 3.2.3 Two-Dimensional Logarithmic Search...12 3.2.4 Three Step Search...13 3.2.5 Diamond Search...14 4 Koodekin toteutus ja algoritmien vertailu...15 4.1 Toteutettu koodekki...15 4.2 Vertailukriteerit...17 4.3 Testimateriaali...18 5 Tulokset...19 6 Yhteenveto...24
v LYHENTEET, TERMIT JA NIIDEN MÄÄRITELMÄT 2DLS BD DCT DVD dekooderi desimointi DS DFS enkooderi entropia FS inter-kehys intra-kehys koodekki MAE MSE pikseli PSNR RGB RLE Logaritminen haku. Yksinkertainen ja nopea liikkeenestimointialgoritmi (two-dimensional logarithmic search) Blu-ray Disc Diskreetti kosinimuunnos. Muunnos, jonka tulos kuvaa syötteen eri taajuisten kosiniaaltojen summana. (discrete cosine transform) digital versatile disc Koodekin purkava osa (decoder) Desimointi. Jätetään osa pikseleistä kokonaan huomiotta etsittäessä parasta liikevektoria. (decimation) Timanttihakumenetelmä. Liikkeenestimointialgoritmi, joka etsii parasta liikevektoria timantin muotoisen hakualueen avulla. (diamond search) Desimoitu täydellinen haku. Liikkeenestimointialgoritmi, joka käy järjestelmällisesti koko hakualueen läpi, mutta jättää osan vaihtoehdoista huomiotta. (decimated full search) Koodekin pakkaava osa (encoder) Informaatioteorian kontekstissa suure, joka mittaa informaatiosisällön määrää. Ilmoitetaan yleensä bitteinä. (entropy) Täydellinen haku. Liikkeenestimointialgoritmi, joka käy kaikki mahdolliset vaihtoehdot läpi. (full search) Videokehys, joka on kuvattu kokonaan tai osittain muiden kehysten avulla käyttäen liikkeenestimointia. (inter frame) Videokehys, joka ei viittaa mihinkään muuhun kehykseen, eli on pakattu ilman liikkeenestimointia käyttäen ainoastaan kuvankäsittelyn menetelmiä. (intra frame) Kuva- tai äänisignaalia pakkaavasta ja purkavasta osasta koostuva ohjelmisto. (codec) Absoluuttinen keskivirhe (mean absolute error) Keskineliövirhe (mean square error) Kuvapiste. Bittikarttakuvan pienin jakamaton yksikkö (pixel) Signaali-kohinasuhde. Signaalin maksimiarvon ja häiriön välinen suhde. Ilmoitetaan desibeleinä. (peak signal-tonoise ratio) Punaisesta, vihreästä ja sinisestä komponentista koostuva väriavaruus. Jakson pituuden koodaus. Entropiakoodausmenetelmä (runlength encoding)
vi resoluutio Kuvapisteiden lukumäärä vaaka- ja pystysuunnassa (pixel resolution) teräväpiirto 1280x720 tai 1920x1080 pikselin resoluutio (high-definition) TSS Kolmen askeleen haku. Yksinkertainen ja nopea liikkeenestimointialgoritmi (three step search) YC b C r Kirkkausarvosta (luminance), sinisestä erotuskomponentista (blue chrominance) ja punaisesta erotuskomponentista (red chrominance) koostuva väriavaruus.
1 1 JOHDANTO Analoginen tekniikka videoihin ja liikkuvaan kuvaan liittyen on väistynyt uuden digitaalisen tekniikan tieltä. Muun muassa videonauhurit ovat korvautuneet kotitalouksissa DVD-soittimilla ja tallentavilla digitaalisovittimilla, digitaaliset elokuvaprojektorit yleistyvät elokuvateattereissa ja Suomessa on siirrytty analogisista televisiolähetyksistä digitaalisiin. Kehitys digitaalisen tekniikan alueella jatkuu edelleen, esimerkkeinä sukupolvenvaihdos DVD-levyistä (engl. digital versatile disc) BD-levyihin (engl. Blu-ray Disc) ja teräväpiirtotelevisioiden yleistyminen. Kehitys mahdollistaa yhä parempilaatuisten videoiden luomiseen yhä suurempien tallennuskapasiteettivaatimusten kustannuksella. Näitä vaatimuksia voidaan madaltaa kehittämällä tehokkaampia videonpakkausmenetelmiä tai vaihtoehtoisesti saadaan parannettua laatua nykyisten kapasiteettien puitteissa. Fyysinen media ei ole ainoa motivaation lähde videonpakkausmenetelmien kehittämiselle, sillä suurin osa Internet-liikenteestä on videoliikennettä ja ennusteiden mukaan sen osuus kasvaa edelleen [1]. Internetin siirtokapasiteetti on rajallinen aikayksikköä kohden, joten tehokkaammille pakkausmenetelmille on selkeä tarve Internetin ruuhkautuessa. Yksi keskeisimpiä videonpakkauksen osa-alueita nykyisissä standardeissa on liikkeenestimointi. Sen avulla voidaan mallintaa tulevia kehyksiä edellisten pohjalta, ja näin välttää jokaisen kehyksen tallentaminen erillisenä kuvana. Liikkeenestimointi on laskentatehollisesti erittäin vaativaa, joten on kehitetty useita eri algoritmeja nopeuttamaan prosessia. Haittapuolena nopeilla algoritmeilla on se, etteivät ne välttämättä tuota parasta mahdollista tulosta. Työssä tarkastellaan liikkeenestimoinnin menetelmiä ja sen rakenne on seuraava. Aluksi luodaan katsaus videonpakkauksen perusteisiin, mutta tämän kandidaatintyön pääpaino on liikkeenestimoinnissa ja sen algoritmeissa. Algoritmien vertailua varten toteutettiin yksinkertainen videokoodekki Matlab-ohjelmistolla. Työn loppupuolella vertaillaan toteutetun koodekin avulla liikkeenestimoinnin algoritmeja pääasiassa niiden pakkaustehokkuuden ja -nopeuden kannalta.
2 2 VIDEONPAKKAUKSEN PERUSTEET 2.1 Miksi videonpakkausta tarvitaan? Ilman tehokkaita videonpakkausmenetelmiä olisi digitaalisten videoiden käyttö epäkäytännöllistä nykyisillä tallennusmedioilla ja siirtokapasiteeteilla. Taulukossa 2.1 on esitetty kahden tunnin kestoisen teräväpiirtoelokuvan videodatan vaatima tallennuskapasiteetti pakkaamattomana. Taulukko 2.1. Pakkaamattoman teräväpiirtoelokuvan videodatan vaatima tallennuskapasiteetti. Videon ominaisuudet Resoluutio Väriavaruus Kehysnopeus Kesto Yhteensä Arvo 1920*1080 pikseliä/kehys 3 väriä/pikseli ja 8 bittiä/väri 24 kehystä/sekunti 7200 sekuntia 8,6 10 12 bittiä Yksikerroksiselle BD-levylle voidaan tallettaa 25 gigatavua eli 2,0 10 11 bittiä dataa, toisin sanoen levylle mahtuu vajaat kolme minuuttia pakkaamatonta videota, eikä esimerkissä ole otettu huomioon äänidataa ollenkaan. Videonpakkausmenetelmillä kyseinen elokuva saadaan kuitenkin tallennettua yhdelle BD-levylle. 2.2 Videokoodekin rakenne ja toimintaperiaate Videokoodekki koostuu kahdesta erillisestä osasta pakkaavasta ja purkavasta. Videokoodekin purkavaa osaa ei tässä työssä käsitellä tarkemmin. On tyypillistä, että videokoodekin pakkaava osa, eli enkooderi, pakkaa videon häviöllisesti, eli sitä ei voida palauttaa täysin entiselleen pakkauksen purkamisen jälkeen. Pakkauksen aikana jätetään vähemmälle tarkkuudelle tai kokonaan pois epäolennaista dataa, jota ihminen ei havaitse niin herkästi. Tiedetään esimerkiksi, että ihmissilmä on herkempi kirkkauden kuin värien muutoksille [2; 3, s. 259], joten voidaan käyttää RGB-väriavaruuden sijaan YC b C r -väriavaruutta. Tällöin väri-informaation koodaamiseen tarvittavien bittien määrää voidaan oleellisesti vähentää alinäytteistämällä [4, s. 87].
3 Seuraavat kappaleet selostavat yleisellä tasolla lohkopohjaiseen liikkeenestimointiin perustuvan enkooderin toimintaperiaatteen käyttäen esimerkkinä kuvassa 2.1 esitetyn enkooderin lohkokaaviota. Syötteenä ovat videokehykset ja ulostulona pakattu videodata bittivirtana. Kehykset kiertävät yksitellen enkooderin lohkojen läpi, joista muunnos-, kvantisointi- ja entropiakoodauslohkot ovat oleellisimmat pakkauksen kannalta. Ne toimivat lähes identtisesti kuvanpakkauksessa käytettyjen vastaavien menetelmien kanssa. Liikkeenestimointi- ja liikkeenkompensointilohkojen tarkoituksena on tehostaa pakkausta pakkausnopeuden ja kuvanlaadun heikkenemisen kustannuksella. Käänteisen muunnoksen ja kvantisoinnin lohko sekä puskuri ovat välttämättömiä liikkeenestimoinnin toiminnalle, jotta voidaan käyttää samaa kehystä, kuin mikä dekooderilla on käytössään. erotuskuva (K n K n 1 ) kehykset K Muunnos (DCT) ja kvantisointi Entropiakoodaus bittivirta Liikkeenkompensointi liikekompensoitu kehys K n 1 Käänteinen muunnos ja kvantisointi dekoodattu erotuskuva tai intra kehys liikevektorit Liikkeenestimointi K n K n 1 Puskuri liikevektorit Kuva 2.1. Tässä työssä toteutetun lohkopohjaiseen liikkeenestimointiin perustuvan videokoodekin pakkaavan osan lohkokaavio. Tämän kandidaatintyön pääaihealue on korostettu punaisella laatikolla. Ensimmäisenä enkooderille syötteenä tuleva kehys on aina intra-kehys (engl. intra frame), joka pakataan bittivirtaan kuvankäsittelyn menetelmin ilman liikkeenestimointia tai erotuskuvan laskemista. Ensimmäinen toimenpide on spatiaalista redundanssia hyödyntävä muunnos. Spatiaalinen redundanssi tarkoittaa vierekkäisten pikselien samankaltaisuutta. Esimerkiksi sinisen taivaan muodostavat pikselit ovat kaikki väriarvoiltaan hyvin lähellä toisiaan, joten käyttämällä sopivaa muunnosta näihin arvoihin saadaan sama informaatio keskitettyä muutamaan kertoimeen, jolloin loput kertoimet voidaan jättää pienemmälle tarkkuudelle tai kokonaan huomiotta. Tätä varten kehys jaetaan loh-
4 koihin, jotka ovat kooltaan tyypillisesti 4x4 tai 8x8 pikseliä. Jokaiselle lohkolle suoritetaan erikseen muunnos ja sen tulos kvantisoidaan, eli arvot jaetaan ennalta määritetyillä kokonaisluvuilla ja pyöristetään, mikä tekee videonpakkauksesta häviöllisen. Kuva 2.2. havainnollistaa asiaa käyttäen diskreettiä kosinimuunnosta [5]. Kuva 2.2. Ylhäällä vasemmalla on esitetty alkuperäinen lohko, ylhäällä oikealla sama lohko kosinimuunnoksen jälkeen, alhaalla vasemmalla sama lohko kvantisoituna ja alhaalla oikealla sama lohko vastaavien käänteisten operaatioiden jälkeen. Lopuksi lohkot entropiakoodataan eli niiden arvoille annetaan vaihtelevan pituiset koodit. Entropiakoodauksessa useimmiten toistuville arvoille asetetaan lyhyempi koodi kuin harvemmin toistuville. Näin saadaan yhteensä lyhyempi bittijono verrattuna tilanteeseen, jossa kaikilla arvoilla olisi vakiomittainen koodi. Morsekoodi on esimerkki eräänlaisesta entropiakoodauksesta, jossa symbolien pituudet on alun perin määrätty kirjainten esiintymistiheyden perusteella englannin kielessä [6, s. 84]. Videonpakkauksessa eräs tyypillisesti käytettävä menetelmä on Huffman-koodaus [7], jota tässäkin työssä on käytetty. Entropiakoodatut lohkot syötetään bittivirtaan, joka puolestaan voidaan käyttötarkoituksesta riippuen esimerkiksi tallentaa tiedostoon tai lähettää samassa laitteessa sijaitsevalle dekooderille. Lisäksi enkooderi simuloi dekooderia ja suorittaa lohkoille käänteiset muunnokset, jolloin saadaan liikkeenestimoinnin käyttöön koottua täsmälleen sama kehys, kuin mikä dekooderilla on käytössään. Tällöin kvantisoinnista johtuvat virheet saadaan otettua huomioon liikkeenestimointivaiheessa. Dekoodattu kehys tallennetaan puskuriin odottamaan seuraavaa kehystä ja liikkeenestimointia. Intra-kehystä seuraavat kehykset ovat inter-kehyksiä (engl. inter frame), joiden pakkaamisessa käytetään hyödyksi jo pakattuja kehyksiä ja ajallista redundanssia. Ajallinen redundanssi tarkoittaa peräkkäisten kuvien samankaltaisuutta. Kehysnopeuden ollessa kymmeniä kehyksiä sekunnissa ei tilanne peräkkäisten kehysten välillä ehdi juuri muuttua, jolloin seuraava kehys K n voidaan esittää edellisen kehyksen K n 1 ja näiden kahden kehyksen välisen erotuskuvan (K n K n 1 ) summana. Kaavana tämä esitetään seuraavasti: K n = K n 1 + (K n K n 1 ) (1)
5 Tällöin riittää tallentaa pelkkä erotuskuva (K n K n 1 ), joka pakkautuu paremmin pienemmän entropiansa ansiosta (luku 4.1. Toteutettu koodekki). Entropia on muuttujassa, tässä tapauksessa pikselien väriarvoissa, esiintyvän satunnaisuuden mitta. Kuvassa 2.3 on esitetty esimerkkinä kehys K n ja erotuskuva (K n K n 1 ) sekä niiden entropiat. Kehys K n Erotuskuva (K n K n 1 ) Entropia 7,33 bittiä Entropia 5,70 bittiä Kuva 2.3. Kehys K n ja erotuskuva (K n K n 1 ) sekä niiden entropiat. Kehyksestä K n on esitetty vain kirkkausarvokomponentti. Erotuskuvassa neutraali harmaa tarkoittaa nollaa, tummat sävyt negatiivisia arvoja ja vaaleat sävyt positiivisia arvoja. Liikkeenestimointi kehittää tätä ideaa pidemmälle ja yrittää minimoida vastaavan erotuksen (K n K n 1 ) kokoamalla jo pakattujen kehysten osista uuden kehyksen K n 1, joka on mahdollisimman samankaltainen kehyksen K n kanssa. Kuvassa 2.4 on esitetty liikekompensoitu kehys K n 1 sekä selkeästi tasaisempi erotuskuva (K n K n 1 ) ja sen entropia. Liikekompensoitu kehys K n 1 Erotuskuva (K n K n 1 ) (Vastaa kehystä K n ) Entropia 4,62 bittiä Kuva 2.4. Liikekompensoitu kehys K n 1 sekä erotuskuva (K n K n 1 ) ja sen entropia. Kuvien oikeassa reunassa on havaittavissa epämuodostumia, sillä reunasta esiin tullut alue ei ole ollut nähtävissä edellisessä kehyksessä, joten sitä ei ole voitu kompensoida.
Liikkeenestimointilohko saa syötteenä nykyisen kehyksen K n sekä viitekehykset, joiden pohjalta liikkeenestimointi suoritetaan. Viitekehyksinä voidaan käyttää useampaa kehystä ja jopa tulevia kehyksiä sijoittamalla kehykset bittivirtaan sopivassa järjestyksessä, mutta tässä työssä käytetään viitekehyksenä ainoastaan edeltävää kehystä K n 1. Tämä tosin aiheuttaa sen, että mikäli kehykseen ilmestyy jotain uutta, ei sitä voida kompensoida kunnolla pelkän edellisen kehyksen avulla, kuten kuvan 2.4 oikeasta alareunasta voidaan havaita. Liikkeenestimointilohkon ulostulona ovat liikevektorit, jotka lähetetään sekä entropiakoodattavaksi bittivirtaan että liikkeenkompensointilohkolle. Liikkeenkompensointi kokoaa uuden kehyksen K n 1 käyttäen lohkoja, jotka on haettu viitekehyksistä liikevektoreiden avulla. Tuloksena saadaan liikekompensoitu kehys K n 1, joka muistuttaa nykyistä kehystä K n enemmän kuin yksikään viitekehyksistä yksinään. Lopuksi näiden kahden kehyksen väliselle erotuskuvalle (K n K n 1 ) suoritettavat toimenpiteet ovat lähes identtiset intra-kehysten kanssa: suoritetaan muunnos sekä entropiakoodaus ja tulos syötetään bittivirtaan. Lisäksi toteutetaan käänteiset muunnokset ja summataan dekoodattu erotuskuva (K n K n 1 ) liikekompensoidun kehyksen K n 1 kanssa, jolloin saadaan kvantisoinnista johtuvat virheet huomioonottava kehys K n jälleen käyttöön seuraavaksi vuorossa olevan kehyksen liikkeenestimointia varten. Ongelma on, että tästä kehysten kierrätyksestä johtuen virheet kasautuvat kehyksestä toiseen ja kuvanlaatu heikkenee. Ratkaisuna on käyttää tietyin väliajoin intra-kehystä, jolloin virheiden kasautuminen katkeaa ja pakkausprosessi voi alkaa uudelleen niin sanotusti puhtaalta pöydältä. Edellä kuvattua intra- ja inter-kehysten pakkaamista jatketaan kunnes syötteenä olleet kehykset loppuvat. 6
7 3 LIIKKEENESTIMOINTI 3.1 Yleistä liikkeenestimoinnista Liikkeenestimoinnin perusideana on mallintaa videossa esiintyvien kohteiden liikettä, jotta uudet kehykset voidaan esittää jo tunnettujen kehysten avulla muokkaamalla niitä liikkeen mukaisesti. Ideaalitapauksessa voitaisiin kaikki videossa esiintyvä liike mallintaa tarkasti ja tehokkaasti, mutta se ei ole käytännössä nykyteknologialla mahdollista. Kompromissina useimmat nykyiset liikkeenestimointialgoritmit perustuvat lohkopohjaiseen liikkeenestimointiin (engl. block based motion estimation) [8, s. 478], jonka toimintaperiaate on esitetty kuvassa 3.1. Nykyinen kehys K n jaetaan lohkoihin ja yksi kerrallaan jokaiselle lohkolle etsitään viitekehyksestä (tai viitekehyksistä) parhaiten täsmäävä lohko. Yhdessä kehyksessä on liian monta kandidaattia parhaaksi lohkoksi, jotta niitä kaikkia olisi järkevää käydä läpi yksitellen, joten etsintä keskitetään lohkon sijainnin ympärille tietyn kokoiselle hakualueelle. Tuloksena saadaan liikevektori, joka vastaa kysymykseen Mistä tämä lohko tuli? liikevektori hakualue Viitekehys K n 1 (edellinen kehys) Kehys K n (nykyinen kehys) Kuva 3.1. Lohkopohjaisen liikkeenestimoinnin toimintaperiaate. Tällä hetkellä käsiteltävän lohkon sijainti on merkitty punaisella, parhaiten täsmäävä lohko on merkitty vihreällä ja tuloksena saatu liikevektori on merkitty sinisellä. Viitekehys on reunustettu mustalla, sillä hakualue ylittää kehyksen rajat lohkon ollessa kehyksen reunalla. Lohkopohjaisessa liikkeenestimoinnissa on kuitenkin tiettyjä rajoituksia ja oletuksia. Ensinnäkin koska kehys jaetaan lohkoihin ja lohkon kaikkien pikselien liike ilmoitetaan yhden liikevektorin avulla siirtymänä kaksiulotteisessa tasossa, muun muassa loitonnusta, lähennystä ja pyörimistä ei voida mallintaa. Toisekseen kohteiden muoto ei välttämättä täsmää lohkojen rajojen kanssa ja yhdessä lohkossa saattaa olla useampia kohteita, jotka liikkuvat eri suuntiin, mikä aiheuttaa epätarkkuutta. Lisäksi liike ei ole sidottu kokonaisiin pikseleihin, vaan liike on diskreetin sijaan jatkuvaa. Viimeksi mai-
8 nittua voidaan mallintaa paremmin puolikkaan ja neljäsosapikselin estimaatiolla (engl. half and quarter pixel estimation) [9], mutta sitä ei käsitellä tässä työssä sen tarkemmin. Käytännön esimerkkinä kuvassa 3.2 on esitetty toteutetun koodekin Full Search - algoritmilla lasketut liikevektorit testivideon tennis yhdelle kehykselle. Liikevektori kertoo mihin edellisessä kehyksessä pitää siirtyä, jotta löytää parhaiten täsmäävän lohkon. Liikevektorin suunta on siis päinvastainen havaitun liikkeen kanssa. Kuva 3.2. Testivideon tennis erään kehyksen lohkojen liikevektorit. Tässä tapauksessa liikevektorit ovat onnistuneet mallintamaan liikettä melko hyvin. Pingispallon liikesuunta on alaspäin ja käsivarsi on myös liikkumassa alaspäin, mutta ei yhtä nopeasti. Tausta pysyy paikoillaan, joten liikevektori kertoo parhaan lohkon löytyvän samasta kohtaa kuin nykyinenkin lohko toisin sanoen liikevektori on siinä tapauksessa nollavektori. Kaikki liikevektorit eivät kuitenkaan ole yhdenmukaisia muiden kanssa, vaan näyttävät osoittavan ihan eri suuntaan. Tämä johtuu estimoinnin suorittamisesta numeerisesti ja parempi lohko saattaakin löytyä hieman eri paikasta tai nopea liikkeenestimointialgoritmi ei ole löytänyt parasta mahdollista vaihtoehtoa. Liikkeenestimointialgoritmin tehtävänä on löytää käsiteltävälle lohkolle sitä parhaiten vastaava lohko hakualueelta käyttäen kriteerinä tiettyä kustannusfunktiota. Tässä työssä on käytetty kustannusfunktiona keskineliövirhettä MSE (engl. mean square error) [3, s. 653], joka määritellään M x N -pikselin kokoisille lohkoille A ja B seuraavasti:
9 missä m ja n ovat pikselien indeksit. Eräs toinen nopea ja yleisesti käytetty kustannusfunktio on absoluuttinen keskivirhe MAE (engl. mean absolute error) [3, s. 653]. Liikkeenestimointialgoritmit käyvät läpi hakualueella etsintäpisteitä, jonka käsitettä on havainnollistettu tarkemmin kuvassa 3.3. Koska lohkon pikselien määrä on epäolennainen liikkeenestimointialgoritmeja kuvailtaessa, merkitään koko lohkoa vain yhtenä pisteenä, jonka sijainnin määrää lohkon vasemman yläkulman pikseli. Kuva 3.3. Esimerkki hakualueesta ja sen sisältämistä etsintäpisteistä, jotka on merkitty vaaleanharmaalla. Vasemmalla on esitetty yksityiskohtainen kuvaus hakualueesta, oikealla yksinkertaistettu kuvaus. Lohkon koko on 4x4-pikseliä. Vasemmanpuoleiseen kuvaan on rajattu punaisella hakualue, jonka säde on neljä pikseliä ja jonka sisältämät pikselit ovat kaikki mahdollisia etsintäpisteitä. Lohkon sijainnin määräävä vasemman yläkulman pikseli on merkitty sinisellä pallolla. Muut lohkoon kuuluvat pikselit on merkitty turkooseilla palloilla, ja tummanharmaalla pallolla merkittyjä pikseleitä tarvitaan kustannusfunktion laskemiseen etsintäpisteen osuessa hakualueen reunalle. Oikeanpuoleinen kuva esittää yksinkertaistetun kuvauksen hakualueesta. Pienenkin hakualueen kaikkien etsintäpisteiden läpikäyminen on laskentatehollisesti erittäin vaativaa, joten on kehitetty useita algoritmeja nopeuttamaan prosessia. Nopeat algoritmit eivät kuitenkaan välttämättä löydä parasta mahdollista lohkoa ja täten algoritmin valinta on tasapainoilua tehokkuuden ja nopeuden välillä. Seuraavissa kappaleissa on esitelty tarkemmin tässä työssä toteutetut liikkeenestimointialgoritmit. Algoritmeille ei ole olemassa vakiintuneita suomennoksia, joten työssä on käytetty englanninkielisiä termejä ja niiden lyhenteitä.
10 3.2 Toteutetut liikkeenestimointialgoritmit 3.2.1 Full Search FS-algoritmi (engl. full search) käy läpi kaikki mahdolliset vaihtoehdot hakualueen sisällä ja täten löytää varmasti parhaan mahdollisen liikevektorin kyseiseltä alueelta. Kuva 3.2 esittää esimerkkitapauksen 17x17 pikselin hakualueelle. Kuva 3.2. Esimerkki Full Search -algoritmin toiminnasta. Hakualueen origo on merkitty mustalla pallolla ja origon lisäksi kokeiltavat pisteet on merkitty sinisellä pallolla. Kokeiltavia pisteitä on kaikkiaan 289. Käytännön sovelluksissa FS-algoritmia ei käytetä, koska algoritmi on erittäin hidas hakualueen ollessa suuri, sillä kokeiltavien pisteiden määrä kasvaa eksponentiaalisesti lausekkeen (2n+1) 2 mukaan, missä n on hakualueen säde pikseleinä. Vertailukohteena algoritmi on kuitenkin käyttökelpoinen.
11 3.2.2 Decimated Full Search DFS-algoritmi (engl. decimated full search) toimii muuten samalla periaatteella kuin FS-algoritmi, mutta kokeiltavien pisteiden määrä on desimoitu kertoimella n, eli kokeillaan vain joka n:s mahdollisuus. Kuva 3.3 esittää esimerkkitapauksen 17x17 pikselin hakualueelle, jossa kokeiltavien pisteiden lukumäärä on desimoitu kertoimella 4. Kuva 3.3. Esimerkki Decimated Full Search -algoritmin toiminnasta. Hakualueen origo on merkitty mustalla pallolla ja origon lisäksi kokeiltavat pisteet on merkitty sinisellä pallolla. Kokeiltavia pisteitä on kaikkiaan 81, joka on hieman yli neljäsosan kaikista mahdollisuuksista johtuen tavasta, jolla joka neljäs pikseli on valittu. DFS-algoritmi esittää yksinkertaisimman tavan nopeuttaa liikkeenestimointia jättämällä pois kokeiltavia pisteitä. Suurilla hakualueilla saavutettu hyöty ei ole merkittävä muihin nopeisiin algoritmeihin verrattuna, sillä kokeiltavien vektorien määrä kasvaa edelleen eksponentiaalisesti hakualueen säteeseen verrattuna.
12 3.2.3 Two-Dimensional Logarithmic Search 2DLS-algoritmi (engl. two-dimensional logarithmic search) esiteltiin alun perin jo vuonna 1979 [10]. Algoritmista on sittemmin kehitetty useita variaatioita pienillä muutoksilla, mutta työssä on toteutettu algoritmin alkuperäinen versio. Kuva 3.4 esittää esimerkkitapauksen 17x17 pisteen hakualueelle. 1. askel 2. askeleen uudet pisteet 3. askeleen uudet pisteet 4. askeleen uudet pisteet 5. askeleen uudet pisteet 6. askeleen uudet pisteet Kuva 3.4. Esimerkki Two-Dimensional Logarithmic Search -algoritmin toiminnasta. Ensimmäisen askeleen origo on merkitty mustalla pallolla. 2DLS-algoritmi on tässä tapauksessa kokeillut 25 pistettä. Vähimmäismäärä pisteitä tälle hakualueen koolle on 17, joka toteutuu vektorin löytyessä origosta tai välittömästi sen ympäriltä. Aluksi määritetään askelkoko s seuraavasti: missä n on hakualueen säde. Esimerkkitapauksessa säde n on 8, joten askelkooksi s saadaan 4. Ensimmäisessä vaiheessa kokeillaan origo sekä neljä x- ja y-akseleilla s:n etäisyydellä olevaa pistettä. Mikäli kustannusfunktion pienimmän arvon toteuttava piste ei ollut origo, siirretään origo kyseiseen pisteeseen ja toistetaan ensimmäinen vaihe. Muussa tapauksessa askelkoko puolitetaan ennen ensimmäisen vaiheen toistamista eikä origoa siirretä. Toisto jatkuu kunnes askelkoko on puolittamisen jälkeen yksi, jolloin sen hetkistä origoa ja sitä ympäröiviä kahdeksaa pistettä verrataan ja paras valitaan liikevektoriksi. Huomionarvoista on, että jo kokeiltuja pisteitä ei tarvitse kokeilla enää uudestaan ja mahdollisesti hakualueen ulkopuolelle osuvia pisteitä ei oteta huomioon.
13 3.2.4 Three Step Search TSS-algoritmi (engl. three step search) [11] muistuttaa hyvin pitkälle 2DLS-algoritmia. Suurimmat eroavaisuudet ovat askelkoon puolittaminen jokaisen askeleen jälkeen sekä yhdeksän pisteen vertaaminen joka askeleella viiden sijaan. Algoritmi on saanut nimensä siitä, että askelkoon ollessa aluksi kolme tai neljä, löytää algoritmi liikevektorin kolmen askeleen jälkeen. Tällöin etsittävien pisteiden lukumäärä on yhteensä aina 25, ja algoritmi ei löydä liikevektoreita kuin korkeintaan ±7 pikselin etäisyydeltä suuntaansa. Kuva 3.5. esittää esimerkkitapauksen 17x17 pisteen hakualueelle askelkoon ollessa aluksi neljä. Kuva 3.5. Esimerkki Three Step Search -algoritmin toiminnasta. Ensimmäinen vaihe on merkitty sinisellä, toinen vaihe vihreällä ja kolmas vaihe punaisella pallolla. Kokeiltuja pisteitä on 25, joka on vakio tälle hakualueen koolle. Algoritmista on kehitetty edistyneempiä versioita kuten NTSS-algoritmi (engl. new three step search) [12] sekä 4SS-algoritmi (engl. four step search) [13]. Tässä työssä käytetään kuitenkin TSS-algoritmista versiota, jossa askelkoko määrätään aluksi kaavan (3) mukaisesti, jolloin päästään eroon ±7 pikselin etäisyyden rajoituksesta suuremmilla hakualueilla.
14 3.2.5 Diamond Search DS-algoritmi (engl. diamond search) perustuu oletuksiin, joiden mukaan huomattavan suuri osa liikevektoreista sijaitsee kahden pikselin säteellä hakualueen origosta lohkon pysyessä paikallaan tai vaihtoehtoisesti pääasiassa joko pysty- tai vaakasuoraan johtuen kameran kääntymisestä [14]. Algoritmin ensimmäisessä vaiheessa kuvassa 3.6. esitetty suuri timanttikuvio asetetaan hakualueen origoon ja sen sisältämät pisteet kokeillaan. Mikäli kustannusfunktion pienimmän arvon toteuttava piste ei ollut origo, siirretään suuri timanttikuvio kyseiseen pisteeseen ja toistetaan ensimmäinen vaihe. Muussa tapauksessa siirrytään toiseen vaiheeseen, asetetaan kuvassa 3.6. esitetty pieni timanttikuvio origoon ja kokeillaan kuvion sisältämät pisteet, joista paras valitaan liikevektoriksi. Kuva 3.6. esittää esimerkkitapauksen 17x17 pikselin hakualueelle. Kuva 3.6. Vasemmalla esimerkki Diamond Search -algoritmin toiminnasta, oikealla ylhäällä suuri timanttikuvio ja oikealla alhaalla pieni timanttikuvio. DS-algoritmi on tässä tapauksessa kokeillut 27 pistettä. Vähimmäismäärä pisteitä on 13, joka toteutuu vektorin löytyessä origosta tai sen vierestä pienen timanttikuvion alueelta. Esimerkkitapauksessa algoritmi etenee ensin kolmesti oikealle alaviistoon ja kerran oikealle, jonka jälkeen pienin kustannusfunktion arvo löytyy sen hetkisestä origosta ja siirrytään toiseen vaiheeseen, eli käytännössä kokeillaan origon ylä- ja alapuolella sekä oikealla ja vasemmalla puolella välittömästi sijaitsevat pisteet. Huomionarvoista on, että jo kokeiltuja pisteitä ei tarvitse kokeilla enää uudestaan ja mahdollisesti hakualueen ulkopuolelle osuvia pisteitä ei oteta huomioon. Tällöin ensimmäisellä askeleella kokeillaan vain yhdeksän pistettä ja sitä seuraavilla tyypillisesti kolmesta viiteen pistettä.
15 4 KOODEKIN TOTEUTUS JA ALGORITMIEN VERTAILU 4.1 Toteutettu koodekki Koodekki on kuva- tai äänisignaalia pakkaavasta ja purkavasta osasta koostuva ohjelmisto. Tässä tapauksessa kyseessä on videoiden kuvasignaalia käsittelevä koodekki. Koodekin luomiseen käytettiin Matlab-ohjelmistoa ja kaikki lohkot toteutettiin itse. Tavoitteena oli rakentaa yksinkertainen koodekki erityisesti liikkeenestimointialgoritmien vertailua varten. Koodekin toteuttaminen itse mahdollisti algoritmien sekä parametrien hallinnan tarpeiden mukaan. Liikkeenestimointialgoritmeja toteutettiin viisi kappaletta: FS-, DFS-, 2DLS-, TSS- ja DS-algoritmi. Muunnokseksi valittiin diskreetti kosinimuunnos [5] ja entropiakoodaukseen käytettiin jakson pituuden koodausta RLE (engl. run-length encoding) [3, s. 20] sekä Huffman-koodausta [7] yksinkertaisuuden vuoksi. Seuraavissa kappaleissa on selostettu valitut metodit hieman tarkemmin ja selvitetty niiden taustaa lyhyesti. Diskreetti kosinimuunnos muuntaa lohkon sisältämän informaation eri taajuisten komponenttien summaksi. Kyseiset taajuuskomponentit 8x8 pikselin kokoiselle lohkolle on esitetty graafisesti kuvassa 4.1. Kuva 4.1. Diskreetin kosinimuunnoksen 64 taajuuskomponenttia 8x8 pikselin lohkolle. Kertoimet taajuuskomponenteille saadaan muunnoksen kaavasta, joka määritellään kahdessa ulottuvuudessa M x N -pikselin kokoiselle lohkolle L seuraavasti [3, s. 293]:
16 missä m ja n ovat lohkon pikselien indeksit, G ij on indekseillä i ja j indeksoitu kerroinmatriisi ja C i C j määritellään kaavan (5) mukaan: Numeerinen esimerkki diskreetistä kosinimuunnoksesta on esitetty kuvassa 2.2. Näin saadaan lohkon sisältämä oleellinen informaatio pakattua muutamaan matalataajuisen komponentin kertoimeen, jolloin korkeataajuisten, kuvan yksityiskohtia kuvaavien komponenttien kertoimet voidaan jättää vähemmälle huomiolle subjektiivisen kuvanlaadun juuri kärsimättä. Entropiakoodaus perustuu Shannonin esittämään teoreemaan [15], jonka mukaan n symbolin pituinen viesti voidaan tietyin oletuksin pakata häviöttömästi korkeintaan nh bitin pituiseksi, mutta ei lyhyemmäksi. Viestin entropia H voidaan laskea kaavalla: missä p i on viestin symbolien pistetodennäköisyydet, kun eri symboleita on q kappaletta. Mitä todennäköisempi symboli on, sitä pienempi on sen odotettu informaatiosisältö ja entropia, jolloin sen koodaamiseen kannattaa käyttää vähemmän bittejä. Intuitiivisesti voidaan ajatella, että firman oveen kiinnitetty lappu Pomo saapui tänään töihin normaalisti. ei ole kovin informatiivinen verrattuna ilmoitukseen Pomo on liikematkalla, eikä ole tavattavissa. Tällöin ei kannata tuhlata paperia edellä mainitun ilmoittamiseen. Tässä työssä on käytetty kahta entropiakoodausmenetelmää. Ensimmäinen käytetyistä menetelmistä on jakson pituuden koodaus eli RLE. Ideana on korvata monta kertaa peräkkäin toistuva merkki arvoparilla, joka kertoo montako kertaa merkki toistuu, ja mikä kyseinen merkki on. Esimerkiksi 12 numerosta koostuva lukujono 222221113333 koodattaisiin kuudella numerolla muodossa (5,2) (3,1) (4,3). Koska kuvan- ja videonpakkauksessa syntyvässä bittivirrassa on huomattavan suuri osa nollia, käytetään tästä variaatiota, joka kertoo montako nollaa edeltää seuraavaa nollasta poikkeavaa lukua ja mikä kyseinen nollasta poikkeava luku on. Esimerkiksi 12 numerosta koostuva lukujono 000001002304 koodattaisiin kahdeksalla numerolla muodossa (5,1) (2,2) (0,3) (1,4). Toinen käytetyistä menetelmistä on Huffman-koodaus, jota hyödynnetään yhdessä jakson pituuden koodauksen kanssa. Huffman-koodaus asettaa useimmiten toistuville arvoille lyhyemmän koodin kuin harvemmin toistuville ja se toimii seuraavalla periaatteella. Aluksi järjestetään symbolit (tässä työssä RLE:n arvoparit) niiden pistetodennäköisyyksien mukaan laskevaan järjestykseen, jonka jälkeen kaksi harvinaisinta symbolia yhdistetään uudeksi symboliksi, jolla on näiden kahden symbolin yhteenlaskettu todennäköisyys. Tähän kohtaan muodostuville niin sanotuille puun haaroille annetaan tunnisteeksi toiselle nolla ja toiselle ykkönen. Symbolien yhdistämistä jatketaan kunnes kaikki
17 symbolit on yhdistetty ja tuloksena saatu niin sanottu Huffman-puu, josta on kuvassa 4.2 esitetty esimerkki. p 1 =0,56 a 1 0 Symboli a i p i Koodi a 1234 p 2 =0,19 a a 1 0,56 0 2 p 1234 =1,00 0 1 a 2 0,19 10 a 234 a 3 0,14 110 p 3 =0,14 a 3 p 234 =0,44 1 a 4 0,11 111 0 a 4 1 p 4 =0,11 a 34 p 34 =0,25 Kuva 4.2. Esimerkki Huffman-puusta neljälle symbolille. Symbolin a 3 koodin muodostava reitti on korostettu punaisella. Symboleille asetetut koodit saadaan kulkemalla puun läpi ja keräämällä haarojen tunnisteista symbolille lopullinen koodi. Esimerkin symboleiden entropia on kaavalla (6) laskettuna 1,67 bittiä/symboli, kun taas tuloksena saadun Huffman-koodin keskimääräinen koodinpituus on 1,69 bittiä/symboli. Huffman-koodaus on siis tässä esimerkkitapauksessa melko optimaalinen menetelmä, koska se toimii parhaiten symbolien todennäköisyyksien mukaillessa negatiivisia kahden potensseja [3, s. 67]. 4.2 Vertailukriteerit Vertailukriteereinä algoritmien välillä käytettiin pääasiassa ulostulona saadun pakatun videon tiedostokokoa suhteessa liikkeenestimoinnissa kokeiltujen pisteiden lukumäärään. Liikkeenestimointiin käytetty suoritusaika suoritinaikana oli saatavilla Matlabohjelmiston kautta, mutta koska algoritmien toteutus ei ole välttämättä optimaalisin mahdollinen, valittiin kriteeriksi kokeiltujen pisteiden lukumäärä. Toinen vertailukriteereistä oli algoritmin löytämien optimaalisten liikevektoreiden lukumäärä prosentteina verrattuna FS-algoritmiin. Lisäksi algoritmeja vertailtiin niiden kuvanlaadun perusteella, jonka tulosmetriikaksi valittiin signaalikohinasuhde PSNR (engl. peak signal-to-noise ratio), joka määritellään keskineliövirheen MSE avulla seuraavasti [3, s. 272]: PSNR ja MSE ovat objektiivisia kuvanlaadun mittoja, mutta ne eivät välttämättä kerro subjektiivisesta kuvanlaadusta mitään riippuen kuvassa esiintyvien virheiden ja kohinan tyypistä. Wang et al. [16] esittävät esimerkin, jossa kaikilla testikuvilla on sama MSE, mutta subjektiivinen kuvanlaatu on täysin eri. Siitä huolimatta tässä työssä on käytetty
18 kuvanlaadun tulosmetriikkana signaalikohinasuhdetta PSNR, sillä se on yleisesti käytetty ja tässä tapauksessa tiedetään tarkkaan videoihin syntyvien virheiden syy ja laatu, jolloin algoritmeja voidaan objektiivisesti verrata keskenään. Lehtorannan mukaan hyvälaatuisen videon PSNR on yli 33 db ja yli 0,5 db muutos on merkittävä [17, s. 18, 21]. 4.3 Testimateriaali Testimateriaalina algoritmien vertailuun käytettiin Xiph.Org-säätiön kokoamia pakkaamattomia testivideoita [18]. Videoista valittiin testimateriaaliksi resoluutioltaan ja pakkautuvuudeltaan vaihtelevia videoita yhteensä viisi kappaletta, ja niiden tarkemmat tekniset ominaisuudet on koottu taulukkoon 4.1. Taulukko 4.1. Testeissä käytettyjen videoiden tekniset ominaisuudet. Pakkautuvuuden arvio perustuu tässä työssä saatuihin tuloksiin. Yleisesti ottaen pakkautuvuuteen vaikuttavat eniten yksityiskohtien sekä liikkeen määrä ja tyyppi. Videon nimi Resoluutio Kehyksiä Pakkautuvuus flower_garden 720x480 1) 360 kohtalainen foreman 352x288 300 hyvä mobile_calendar 352x288 360 vähäinen stockholm 1280x720 300 2) hyvä tennis 352x240 150 kohtalainen Videon flower_garden alkuperäinen resoluutio oli 720x486, mutta siitä rajattiin alimmat kuusi pikseliriviä pois, jotta pystyresoluutioksi saatiin lohkokoolla tasajaollinen luku (huomautus 1). Videon stockholm 604 kehyksestä käytettiin vain 300 ensimmäistä kehystä, sillä muuten FS-algoritmilla olisi kestänyt pakkauksessa liian kauan aikarajoitteisiin nähden (huomautus 2).
19 5 TULOKSET Kaikissa testeissä intra-kehysten väli, kvantisointikerroin sekä liikkeenestimointiin käytettyjen lohkojen koko pidettiin vakioina. Myös hakualueen koko oli vakio kaikissa muissa testeissä lukuun ottamatta yhtä testiä, johon ei otettu mukaan FS- ja DFSalgoritmeja niiden hitauden vuoksi. Ainoat varsinaiset muuttujat olivat siis itse video ja liikkeenestimointialgoritmi. Vertailun vuoksi mukana oli myös tapaus, jossa liikkeenestimointia ei käytetä, vaan otetaan pelkkä erotuskuva. Taulukossa 5.1 on esitetty tiivistettynä kaikki oleellisimmat parametrit. Taulukko 5.1. Yhteenveto testeissä käytetyistä parametreista Parametri Arvo Video yksi taulukossa 4.1 esitetyistä testivideoista Liikkeenestimointialgoritmi FS, DFS, 2DLS, TSS, DS tai pelkkä erotuskuvan otto Intra-kehysten väli 10 kehystä Kvantisointikerroin 16 Liikkeenestimoinnin lohkokoko 16x16 pikseliä Hakualueen koko 17x17 pikseliä, ellei toisin mainita Pääasiallisena vertailukriteerinä eri algoritmien välillä käytettiin ulostulona saadun pakatun videon tiedostokokoa suhteessa liikkeenestimointivaiheessa kokeiltujen pisteiden keskimääräiseen lukumäärään per lohko tosin sanoen pakkaussuhde verrattuna pakkausnopeuteen. Taulukossa 5.2 on esitetty testitulokset kaikkien algoritmien osalta kolmelle matalaresoluutioisimmalle videolle. Taulukko 5.2. Pakkaustehokkuuden ja -nopeuden vertailun testitulokset. KP tarkoittaa keskimääräistä etsintäpisteiden määrää per lohko ja PS tarkoittaa pakkaussuhdetta. Suurempi pakkaussuhde on parempi. foreman tennis mobile_calendar Algoritmi KP PS KP PS KP PS FS 289 28,18 289 20,28 289 8,50 DFS 81 23,48 81 18,02 81 6,75 TSS 25 26,16 25 18,31 25 8,40 2DLS 18,86 26,64 18,74 18,21 17,39 8,42 DS 19,23 27,09 16,64 19,79 14,20 8,48 Erotuskuva - 18,73-15,11-6,63
20 Parhaimpaan pakkaustehokkuuteen yltää odotetusti FS-algoritmi, mutta sen vaatima laskenta-aika pelkän liikkeenestimoinnin osalta verrattuna nopeisiin algoritmeihin on jopa 10 20-kertainen, mikä täsmää etsintäpisteiden lukumäärän suhteen kanssa. Pakkauksen vaatimassa kokonaisajassa ero nopeimpaan DS-algoritmiin verrattuna on kuitenkin vain noin viisinkertainen. Tulee kuitenkin muistaa, että toteutettu koodekki ei ole täysin optimoitu, joten kokonaissuoritusaika on vain suuntaa antava. Erot FS-algoritmin ja nopeiden algoritmien pakkaussuhteissa ovat noin 5 10 % luokkaa. Käytettäessä liikkeenestimointia pakkaussuhde kasvaa huomattavasti verrattuna tilanteeseen, jossa liikkeenestimointia ei käytetä tehokkuus kasvaa videosta riippuen noin 30 50 %. Taulukossa 5.3 on esitetty taulukkoa 5.2 vastaavat tulokset kahdelle korkeamman resoluution videolle sekä keskiarvot kaikille viidelle videolle. Taulukko 5.3. Pakkaustehokkuuden ja -nopeuden vertailun tulokset korkeamman resoluution videoille sekä keskiarvot. KP tarkoittaa keskimääräistä etsintäpisteiden määrää per lohko ja PS tarkoittaa pakkaussuhdetta. Suurempi pakkaussuhde on parempi. flower_garden stockholm keskiarvo KP PS KP PS KP PS FS 289 19,35 289 35,47 289 22,35 DFS 81 17,18 81 28,40 81 18,77 TSS 25 18,42 25 33,67 25 20,99 2DLS 20,20 18,47 21,10 33,57 19,25 21,06 DS 20,32 19,09 18,70 35,48 17,82 21,99 Erotuskuva - 10,35-17,03-13,57 Tulokset ovat pakkausnopeuden osalta muuten samaa luokkaa matalaresoluutiosten videoiden kanssa, mutta 2DLS- ja DS-algoritmi vaativat hieman enemmän etsintäpisteitä löytääkseen liikevektorin. Ero ei kuitenkaan ole merkittävän suuri. Muut algoritmit vaikuttavat saavuttavan FS-algoritmia pakkaustehossa resoluution kasvaessa DSalgoritmi jopa ylittää FS-algoritmin pakkaustehokkuuden pakattaessa videota stockholm, mikä viittaisi siihen, että kun käytetään keskineliövirhettä MSE liikkeenestimoinnin kustannusfunktiona, ei sen mukaan löydetty optimaalisin lohko olekaan aina pakkaustehokkuuden kannalta paras lohko. Lisäksi havaitaan, että käytettäessä liikkeenestimointia pakkaussuhde on tällä kertaa noin kaksinkertaistunut, eli tiedostokoko on puolittunut verrattuna pelkän erotuskuvan ottoon. Keskimääräisesti parhaiten nopeista algoritmeista suoriutuu DS-algoritmi niin nopeuden kuin tehokkuuden osalta. DFSalgoritmin suorituskyky on kautta linjan kehno. Algoritmeja vertailtiin myös kuvanlaadun perusteella, jonka tulosmetriikkana toimi yleisesti käytetty signaalikohinasuhde PSNR. Taulukossa 5.4 on esitetty testivideoiden signaalikohinasuhteiden keskiarvot jokaiselle algoritmille sekä erotuskuvan otolle. Taulukko 5.4. Keskiarvoiset signaalikohinasuhteet algoritmeille. FS DFS TSS 2DLS DS Erotuskuva PSNR (db) 33,58 33,53 33,57 33,48 33,55 33,99
21 Yllättävää oli pelkän erotuskuvan oton muita selkeästi parempi tulos, mikä johtunee erotuskuvaan tarvittujen ja käytettyjen bittien suuremmasta lukumäärästä. Muiden algoritmien tulokset olivat hyvin lähellä toisiaan, eikä niissä havaittu silminnähtävää eroa kuvanlaadullisesti. Suurin yksittäinen ero signaalikohinasuhteissa oli 0,94 db videossa flower_garden erotuskuvan oton ja 2DLS-algoritmin välillä, mutta johtuen videon suuresta yksityiskohtien määrästä, joka peittää epäkohtia, ei voida sanoa eron olleen silminnähden merkittävä. Ero oli kuitenkin juuri ja juuri havaittavissa. Huomattavin silminnähtävä epäkohta oli ajoittainen lohkojen rajojen näkyminen (engl. blocking artifacts), mikä johtui algoritmeista riippumattomasta syystä, eli siitä, ettei koodekkiin toteutettu suodatusta. Lisäksi tutkittiin kuinka monta prosenttia optimaalisista liikevektoreista kukin algoritmi löysi verrattuna FS-algoritmiin. Optimaalisuudella tarkoitetaan tässä sitä kuinka hyvin algoritmi löytää käytetyn kustannusfunktion minimin, eli toisin sanoen saman liikevektorin kuin FS-algoritmi. Tulokset on esitetty kuvassa 5.1 graafisesti. Löytyneitä optimaalisia liikevektoreita 100 % 90 % 80 % 70 % 60 % 50 % 40 % 30 % 20 % 10 % 0 % stockholm foreman flower_g tennis mobile_c Erotuskuva DFS TSS DS 2DLS Kuva 5.1. Löytyneiden optimaalisten liikevektorien määrä prosentteina verrattuna FSalgoritmiin. Kustannusfunktiona on käytetty keskineliövirhettä MSE. Optimaalisuus vaikuttaa korreloivan tietyllä tasolla pakkaustehokkuuden kanssa nopeiden algoritmien osalta, mutta erotuskuvan ja DFS-algoritmin prosenttiluvut vaihtelevat huomattavasti riippuen videosta. Erotuskuvan prosenttiluku kertoo käytännössä kuinka suuri osa optimaalisista liikevektoreista oli nollavektoreita ja DFS-algoritmi kokeili tässä tapauksessa noin 28 % kaikista vaihtoehdoista, mikä on yli nelinkertainen määrä DS-algoritmiin verrattuna. Tulokset näyttäisivät luultavasti erilaisilta, mikäli kustannusfunktioksi olisi valittu jokin muu kuin MSE. Hakualueen suurentamisen vaikutusta pakkaussuhteeseen tutkittiin TSS-, DS- ja 2DLS-algoritmien osalta. Muut algoritmit jätettiin pois epäolennaisina tai liian hitaina. Taulukossa 5.5 on esitetty testin tulokset sekä käytetyt videot ja hakualueiden koot.
22 Taulukko 5.5. Hakualueen koon vaikutus pakkaussuhteeseen. Video mobile_calendar flower_garden Hakualue 17x17 33x33 65x65 17x17 33x33 65x65 TSS 8,40 8,37 8,34 18,42 17,16 15,36 DS 8,48 8,48 8,48 19,09 19,18 19,18 2DLS 8,42 8,39 8,37 18,47 17,52 16,11 Molemmissa videoissa suurempi hakualue vain haittaa TSS- ja 2DLS-algoritmien toimintaa, sillä silloin ne aloittavat etsinnän kauempaa ja harvemmalta alueelta, jolloin ne eivät löydä lähellä origoa sijaitsevia liikevektoreita, vaan eksyvät helpommin kustannusfunktion lokaaleihin minimeihin. Lisäksi hakualueen laajentaminen 65x65-pikseliin hidasti näiden kahden algoritmin toimintaa noin 50 %. Videossa mobile_calendar DSalgoritmin toimintaan suurempi hakualue ei vaikuta merkittävästi suuntaan eikä toiseen, sillä suurin osa liikevektoreista sijaitsee origon läheisyydessä ja se löytää ne edelleen yhtä nopeasti. Videossa flower_garden hakualueen suurentaminen parantaa hieman DS-algoritmin suorituskykyä ja se kykenee löytämään parempia liikevektoreita kauempaa. Enempi hakualueen suurentaminen ei kuitenkaan auta, mikäli videossa ei ole niin nopeaa liikettä että laajennetulta hakualueelta löytyisi optimaalisia liikevektoreita. Laajempi 33x33-pikselin hakualue hidasti DS-algoritmin toimintaa vajaat 10 % pakkaussuhteen parantuessa noin 0,5 %, eli tässä tapauksessa hakualueen laajentaminen ei ole kannattavaa. Lopuksi kuvassa 5.2 on esitetty graafisesti tulokset kolmelle testivideoista pakkaustehokkuuden ja -nopeuden osalta. Kaaviossa on eroteltu eri videot eri väreillä sekä eri algoritmit eri symboleilla. 40 35 Pakkaussuhde 30 25 20 15 10 5 0 0 50 100 150 200 250 300 Etsintäpisteitä keskimäärin per lohko Erotuskuva TSS DFS FS DS 2DLS Kuva 5.2. Videoiden mobile_calendar (violetti), flower_garden (sininen) sekä stockholm (punainen) pakkaussuhteen suhde pakkausnopeuteen esitettynä graafisesti. Suurempi pakkaussuhde ja vähäisempi etsintäpisteiden määrä on parempi tulos.
Suurempi pakkaussuhde ja vähäisempi kokeiltujen pisteiden määrä on parempi, eli mitä ylempänä vasemmalla symboli on, sitä parempi tulos on. Kuvan 5.2 ja edellisten tulosten perusteella DS-algoritmi on kokonaisuudessaan hieman 2DLS- ja TSS-algoritmia parempi. 23
24 6 YHTEENVETO Tässä kandinaatintyössä esiteltiin muutama yleisin ja tunnetuin videonpakkauksessa käytetty liikkeenestimointialgoritmi ja vertailtiin niitä Matlab-ohjelmistolla toteutetun videokoodekin avulla. Tärkeimpinä kriteereinä pidettiin videoiden pakkaustehokkuutta ja -nopeutta. Toissijaisena kriteerinä arvioitiin kuvanlaatua, ja lisäksi tutkittiin optimaalisten liikevektoreiden löytymistä hakualueelta sekä hakualueen koon vaikutusta. Paras pakkaussuhde saavutettiin Full Search -algoritmilla, mutta se ei ole käytännöllinen vaihtoehto sovelluksiin sen kohtuuttoman hitauden vuoksi. Toisiksi paras pakkaussuhde oli Diamond Search -algoritmilla, joka oli myös nopein algoritmi. Two Dimensional Logarithmic Search ja Three Step Search -algoritmit olivat lähes yhtä nopeita, mutta niiden tuottama pakkaussuhde oli kuitenkin heikompi. Decmated Full Search - algoritmi suoriutuu poikkeuksellisen heikosti verrattuna muihin algoritmeihin, sillä se ei ota huomioon välittömästi hakualueen origon ympärillä olevia pisteitä ja siksi sillä jää moni optimaalinen liikevektori löytämättä. Liikkeenestimoinnin käytöllä on kuvanlaatua laskeva vaikutus signaalikohinasuhteen mukaan, mutta ero on niin pieni, että se on mitätön saavutettuun pakkaussuhteeseen verrattuna, sillä kuvanlaatua voidaan tarvittaessa säädellä muilla keinoilla. Kaikkien algoritmien tuottamien videoiden signaalikohinasuhteet olivat hyvin lähellä toisiaan, eikä niissä havaittu silminnähtävää eroa kuvanlaadullisesti. Hakualueen laajentamista kokeiltiin vain kahdella videolla ja kolmella eri algoritmilla, joten yleispäteviä johtopäätöksiä ei voida tehdä. Havaittiin kuitenkin, että vaikutukset pakkaustehokkuuteen eivät aina ole positiivisia, vaan ne riippuvat huomattavasti sekä videosta että käytetystä liikkeenestimointialgoritmista. Pääteltiin, että hakualueen laajentamisella voidaan saavuttaa suurempi pakkaussuhde pakkausnopeuden kustannuksella, mikäli videossa esiintyy tarpeeksi nopeaa liikettä ja käytetty algoritmi kykenee löytämään liikevektoreita kauempaa. Muiden parametrien vaikutusta liikkeenestimointiin tai videonpakkaukseen ei tässä työssä testattu. Testivideoita, koodekin ominaisuuksia ja eri algoritmeja listaa voisi jatkaa loputtomiin olisi voinut olla kattavamminkin, mutta tehtyjen testien valossa yleispätevimmäksi liikkeenestimointialgoritmiksi toteutettujen algoritmien joukosta todettiin Diamond Search -algoritmi.
25 LÄHTEET [1] Cisco Visual Networking Index: Forecast and Methodology, 2011-2016. USA 2012, Cisco Systems Inc., Cisco Visual Networking Index 3. 16 p. [2] Mullen, T.. The contrast sensitivity of human colour vision to red-green and blueyellow chromatic gratings. The Journal of Physiology, 359(1985), pp. 381-400. [3] Solomon, D. Data Compression: The Complete Reference. 3rd Edition. New York 2004, Springer. 900 p. [4] Poynton, C. Digital Video and HDTV: Algorithms and Interfaces. San Francisco 2003, Morgan Kaufmann Publishers. 763 p. [5] Ahmed, N., Natarajan T., Rao R.K. Discrete Cosine Transform. IEEE Transactions on Computers C-23(1974)1, pp. 90-93. [6] Burns, R.W. Communications: An International History of the Formative Years, London 2004, The Institution of Electrical Engineering and Technology. 651 p. [7] Huffman, D.A. A Method for the Construction of Minimum Redundancy Codes. Proceedings of the IRE 40(1952) 9, pp. 1098-1101. [8] Hanzo, L., Cherriman, P.J., Streit, J. Wireless Video Communications: Second to Third Generation Systems and Beyond. New York 2001, IEEE Press. 1093 p. [9] Suh, J.W., Jeong, J. Fast Sub-pixel Motion Estimation Techniques Having Lower Computational Complexity. IEEE Transactions on Consumer Electronics 50(2004)3, pp. 968-973. [10] Jain, J.R., Jain, A.K. Displacement Measurement and Its Application in Interframe Image Coding. IEEE Transactions on Communications 29(1981)12, pp. 1799-1808. [11] Koga, T., Iinuma, K., Hirano, A., Iijima, Y., Ishiguro, T. Motion Compensated Interframe Coding for Video Conferencing. Innovative Telecommunications - Key to the Future. Proceedings of the National Telecommunications Conference, New Orleans, Louisiana, USA, December 1981. New York, IEEE. pp. G5.3.1- G5.3.5.
26 [12] Li, R., Zeng, B., Liou, M.L. A New Three-step Search Algorithm for Block Motion Estimation. IEEE Transactions on Circuits and Systems for Video Technology 4(1994)4, pp. 438-442. [13] Po, L.M., Ma, W.C. A Novel Four-Step Search Algorithm for Fast Block Motion Estimation. IEEE Transactions on Circuits and Systems for Video Technology 6(1996)3, pp. 313-317. [14] Zhu, S., Ma, K.K. A New Diamond Search Algorithm for Fast Block Matching Motion Estimation. IEEE Transactions on Image Processing 9(2000)2, pp. 287-290. [15] Shannon, C.E. A Mathematical Theory of Communication. Bell System Technical Journal 27(1948)3-4, pp. 379 423, 623 656. [16] Wang, Z., Bovik, A.C. A universal image quality index. IEEE Signal Processing Letters 9(2002)3, pp. 81-84. [17] Lehtoranta, O. Parallel Encoder Implementations for High Quality Video. Dissertation. Tampere 2007. Tampereen teknillinen yliopisto. Julkaisu - Tampere University of Technology. Publication 648. 165 p. [18] Xiph.Org Foundation. 2012. Xiph.org Test Media. [WWW]. [Viitattu 22.8.2012]. Saatavissa: http://media.xiph.org/