tiistai 22. marraskuuta 2016

Prototyypin kehittäminen ja tulokset

Prototyyppi perustuu Omar Oreifej’n vuonna 2011 kuvaamaan menetelmään [1]. Olemme kehittäneet myös algoritmin kehittyneempää versiota [2], mutta sen rakentaminen on osoittautunut oletettua vaikeammaksi. Tässä kirjoituksessa kuvaamme ensimmäisen menetelmän toiminnan ja esittelemme sen avulla tehtyjä havaintoja. Prototyypin koodi löytyy Githubista.

Oreifej’n menetelmä on iteratiivinen ja kaksivaiheinen. Kuva 1 esittää algoritmin toimintaperiaatteen. Ensimmäisessä vaiheessa lasketaan videokuvien aikakeskiarvo ja siirretään jokaista videokuvaa kohti tätä aikakeskiarvoa. Tämä tapahtuu estimoimalla keskiarvon ja yksittäisen kuvan välinen optinen vuo, joka kuvaa pikselien liikettä kuvien välillä. Tämän jälkeen kuvien vääristymät (keskiarvon näkökulmasta) voidaan poistaa. Tämä vaihe toistetaan suodatetuille kuville uudestaan, kunnes kuvien aikakeskiarvo stabiloituu.

Alkuperäisessä tutkimuksessa vääristymien poistoon käytettiin kuvien elastista rekisteröintiä aikakeskiarvoa vastaan. Rekisteröinnissä ratkaistaan yhteinen koordinaatisto, jossa kumpikin kuva voidaan esittää siten että kuvat asettuvat päällekkäin. Kuva 2 havainnollistaa rekisteröinnin ideaa. Kehitysvaiheessa totesimme kuitenkin, että elastinen rekisteröinti on laskennallisesti liian raskas.

Algoritmin toisessa vaiheessa koko videosta muodostetaan matriisi, jossa pystyvektorit ovat yksittäisiä kuvia. Minimoimalla tämän matriisin astetta saadaan mahdollisimman moni kuva esittämään täysin sama informaatio. Minimointitehtävässä poistetaan siis satunnaisia virheitä, jotka esiintyvät vain harvoissa kuvissa. Tämä käsittely poistaa tehokkaasti esimerkiksi ensimmäisestä vaiheesta jääneitä haamukuvia, sekä satunnaisia heijastuksia.

Vaikka algoritmin lopputuloksena on periaatteessa sama määrä videokuvia kuin mitä sisään syötetään, eivät lopputuotteena saadut videokuvat enää välttämättä muodosta sulavaa videota. Käytännössä lopputuloksena käytetäänkin näiden kuvien aikakeskiarvoa.

oreifej.png
Kuva 1: Oreifej’n menetelmä.


Kuva 2. Esimerkki kahden kuvan rekisteröinnistä [3].

Oreifej’n tutkimuksessa [1] esitellään algoritmin tuloksia mustavalkoisilla kuvilla ja simuloidulla aaltoliikkeellä. Nämä tulokset eivät kerro meille juuri mitään, sillä todellisen maailman videokuvissa aaltoliike on monimutkaisempaa ja kuvissa esiintyy myös satunnaisia häiriöitä, kuten heijastuksia.

Prototyypin tavoitteena oli selvittää tekniikan rajoitteet. Koska tekniikka on niin uutta, oli selvitettävä, voiko menetelmää soveltaa todellisen maailman tilanteisiin. Kiinnostavia rajoitteita oli siis useita:

  • Aaltoliikkeen luonne, aallonpituus ja amplitudi
  • Materiaalin määrä (videon pituus) ja laatu
  • Veden sameuden ja heijastusten vaikutus
  • Videossa esiintyvien objektien liikkeen vaikutus
  • Kameran kuvakulma ja liike
  • Algoritmin ajoaika

Testeissä kävi nopeasti selväksi, ettei menetelmä sovellu sameaan veteen, vaan pohjan on erotuttava videolla selkeästi. Myös voimakkaat heijastukset estävät menetelmän käytön. Heijastuksia on kuitenkin mahdollista vähentää käyttämällä polarisoivaa linssiä.

Kuvissa 4 ja 5 on esitetty esimerkki prototyypin suorituskyvystä. Vasemmalla on pysäytyskuva videosta, jossa esiintyy huomattavaa veden aaltoilua, mikä estää yksityiskohtien havaitsemisen. Oikealla puolestaan on esitetty lopputulos. Nähdään selvästi, että algoritmi kykenee suodattamaan häiriöt pois ja yksittäiset kivet erottuvat selkeästi. Toisaalta vasemman kuvan yläosassa nähdään voimakasta “puuroutumista”. Tämä johtuu siitä, että videota on pakattu aggressiivisesti eikä pakkausalgoritmi kykene esittämään aaltoilua tarkasti. Oikean kuvan yläosassa nähdään, että puuroutuminen aiheuttaa informaation häviämisen, eikä vedenpohjaa pystytä palauttamaan. Vähemmällä pakkaamisella informaatio saataisiin säilytettyä, mutta tämä merkitsee videon bittinopeuden ja siten tiedostokoon kasvua.



Kuva 4. Esimerkkikuva purosta.

Kuva 5. Algoritmin lopputulos.

Kuvissa 5 ja 6 on esitetty toinen esimerkki, jossa on mukana myös liikkuvia objekteja. Vene ja uimarit ovat kuvissa selvästi eri paikoissa, koska ne liikkuvat videolla. Lopputuloksesta nähdään, että algoritmi saa asetettua veneen ja uimarin paikoilleen ilman merkittäviä haamukuvia. Myös köysi, jolla uimari vetää venettä, erottuu lopputuloksesta selkeästi. Toisaalta oikealla yläkulmassa oleva uimari näyttää häviävän lopputuloksessa.

Kuvassa 6 nähdään myös, että algoritmi onnistuu selkeyttämään kuvaa merenpohjasta huomattavasti. Yksittäiset kivet erottuvat selvästi, ja isompia objekteja voisi tunnistaa pohjasta helposti.

Kuva 5. Esimerkki merestä.

Kuva 6. Algoritmin lopputulos.


Algoritmi toimii erinomaisesti myös rantavedessä, kuten kuvista 7 ja 8 näkee. Vedenpohja saadaan palautettua hyvin tarkasti ja eri muodot erottuvat selkeästi. Objektien tunnistaminen pohjasta on mahdollista, ja suurempi resoluutio mahdollistaisi entistä pienempien esineiden tunnistamisen. Aaltojen vaahtopäät aiheuttavat kuitenkin pieniä ongelmia. Kuvissa 9 ja 10 on toinen esimerkki, josta voi tehdä samankaltaisia havaintoja.

mexico5_sample.png
Kuva 7. Esimerkki merenrannasta.

mexico53.jpg
Kuva 8. Merenrannan käsittelyn lopputulos.

mexico_sample.png
Kuva 9. Toinen esimerkki rantavedestä.

mexico2.jpg
Kuva 10. Toisen esimerkin lopputulos.

Algoritmin ajoaika on muutamia minuutteja 5-10 sekunnin videolla, jonka resoluutio on 720p. Toisaalta ajoaikaan vaikuttaa huomattavasti se, kuinka nopeasti keskiarvokuva stabiloituu. Lähelle reaaliaikaisuutta ei kuitenkaan päästä, mikä karsii pois monia mahdollisia sovelluskohteita.

Testeissä kävi myös ilmi, että algoritmi kuluttaa muistia erittäin paljon, sillä jokainen videokuva esitetään matriisimuodossa. Algoritmin ensimmäisen vaiheen osalta muistinkäyttöä on mahdollista pienentää merkittävästi, mutta toinen vaihe edellyttää, että koko video on ladattuna muistiin. Käytännössä toinen vaihe vaatii muistia niin paljon, ettei sen suorittaminen korkearesoluutioisella videolla ole mahdollista. Testeissä toisen vaiheen suorittaminen vaati myös noin tunnin ajoajan. Koska vaikutus kuvanlaatuun on melko vähäinen, ei toisen vaiheen suorittaminen ole järkevää.

Vaikka algoritmi pystyy jossain määrin käsittelemään myös liikkuvia objekteja, kamera ei saa liikkua. Jos kamera liikkuu, videon aikakeskiarvo muuttuu niin sotkuiseksi, ettei siitä ole enää mahdollista palauttaa suodatettua kuvaa. Tämä on erittäin merkittävä rajoite, mutta jos kuvausolosuhteita voidaan hallita, ei ongelmaa ole. Testiaineiston etsintä internetistä osoittautui kuitenkin tämän takia hankalaksi.

Prototyypin avulla olemme saaneet osoitettua, että menetelmää on mahdollista soveltaa tosimaailmaan. Vaikka tekniikka asettaa tiukkoja rajoitteita, voidaan vedenpohjasta hankkia tarkkoja kuvia esimerkiksi dronen avulla. Tilanteita, joissa tarvitaan staattista kuvaa vedenpohjasta ilman tarvetta reaaliaikaisuudelle ovat esimerkiksi erilaiset etsintä- ja kartoitustehtävät.


Lähteet

[1] Oreifej, O. et al. 2011. A Two-Stage Reconstruction Approach for Seeing Through Water. http://www.cs.ucf.edu/~oreifej/papers/WATER_CVPR2011.pdf Haettu 21.11.2016.

[2] Halder, K. et al. 2014. High accuracy image restoration method for seeing through

[3] Zöllei L., Fisher III J.W., Wells III W.M. An Introduction to Statistical Methods of Medical Image Registration. Mathematical Models in Computer Vision: The Handbook, Springer 2005.


Ei kommentteja:

Lähetä kommentti