SMErec-hankkeessa kehitettiin virtuaalihologrammien tallennus- ja visualisointiratkaisuja

Anssi Gröhn

XR-teknologia on yhteinen nimitys kaikille kolmelle virtuaaliteknologian muodolle, eli virtuaali-, sekä lisätylle ja sekoitetulle todellisuudelle. SMErec-hankkeessa hyödynnettiin XR-teknologian mahdollisuuksia osaamisen esille tuomisessa rekrytointimahdollisuuksien parantamiseksi. Tavoitteena oli mahdollistaa hologrammitallenteiden tekeminen ja tarkastelu, joissa erityisesti etäopiskelijat pystyvät esittämään osaamistaan. Kyse on oman persoonallisen esitystavan digitalisoinnista uudella teknologialla, katsoja voi tarkastella ihmistä ja kehonkieltä pelkän videon sijaan.

Menetelmänä hologrammitallenne sijoittuu haastattelun ja työhakemuksen väliin, joissa työnantaja voi “tavata“  hakijan virtuaaliympäristössä ja saada hakijalta esittelyn työtehtävässä tarvittavaan osaamisen tallenteen avulla. Tällä tavoin poistetaan kynnyksiä introverttien ja etäopiskelijoiden tapauksissa uuden teknologian avulla, ja tuodaan näkyvyyttä hiljaisille osaajille, joita työnantajat myös arvostavat. Tässä artikkelissa käsittelen virtuaalihologrammien teknistä toteutusta ja avaan hieman teknistä taustaa, millainen kamerateknologia osaltaan mahdollistaa virtuaalihologrammit.

Hologrammit SMErec-hankkeessa

Virtuaalihologrammeilla tarkoitetaan kolmiulotteista, animoitua esitystä kohteesta, jota voi tarkastella monesta eri suunnasta XR-teknologian välineillä. Virtuaalihologrammit tallennetaan ohjelmallisesti useammalla syvyyskameralla esityksestä, josta saatu kuva- ja syvyystieto puolestaan toistetaan erityisen sovelluksen avulla. Visualisointisovellus mahdollistaa kohteen tarkastelun halutussa koossa.  Sinällään holotallenteen tekeminen ei eroa normaalin videon tekemisestä. Kamerat kytketään päälle, ja esiintyjä pääsee vauhtiin. Ero onkin lähinnä tekninen – kohteesta tallentuu samalla useampi kuvakulma syvyystietoineen.

Eräs vaikuttavimpia hologrammeja on Microsoft Researchin vuodesta 2012 alkaen kehittämä Holoportaatio, jossa usean kuva- ja syvyystietoa tuottavan Kinect-laitteen sekä keskitetyn laskentalaitteiston avulla muodostetaan yksinkertaistettu 3D-malli näkymässä olevista kohteista.

Siinä missä Microsoftin tutkima ja kehittämä holoportaatioratkaisu käyttää Kinect-sensoreita, SMErec-hankkeessa kamerateknologiaksi valittiin Intelin Realsense saatavuuden ja kustannustehokkuuden vuoksi. Ominaisuuksiltaan ratkaisut ovat kuitenkin samankaltaisia; molemmissa on videokamera, infrapunasensorit, sekä stereokuvien laserkeilaukseen perustuva syvyyssensori. Niiden avulla voidaan muodostaa kolmiulotteinen pistepilvi, joka kuvaa rakeisena 3D-mallina kameran havaitseman ympäristön. Tämä on eräs fotogrammetrian menetelmistä, jossa pyritään selvittämään eri kohteista niiden muodot ja ominaisuudet. Fotogrammetriaa voidaan hyödyntää niin suuriin kuin pieniinkin kohteisiin. Fotogrammetria toimii joko yksittäisillä kuvilla, jotka kuvataan kohteen ympäriltä ja joista ohjelmallisesti rakennetaan 3D-malli, tai keilaukseen pohjautuvilla menetelmillä, joissa syvyystieto mitataan erillisen sensorin avulla.

Realsense-kameroita varten on tarjolla Intel RealSense -ohjelmistokirjasto kuva- ja syvyystiedon käsittelyyn, joka on saatavilla Github-versionhallintapalvelusta niin Windows, Linux ja Mac OS-käyttöjärjestelmille.

Teknisestä näkökulmasta virtuaalihologrammien tekeminen vaatii 3D-mallin muodostamista syvyyskameroiden tuottamasta datasta. Intel Realsense D435-syvyyskamerat tuottavat normaalia RGB-videokuvaa, sekä jokaista ruudun pikseliä vastaavan syvyystiedon 16-bittisenä arvona. Tämän tiedon perusteella on mahdollista luoda ohjelmallisesti 3D-pistepilvi, joka esittää kuvattavaa tilaa tai hahmoa.

Intel Realsense-kirjaston tallennuksessa oletuksena käyttämä ROS bag-muoto ei ole riittävän tehokas usean syvyyskameran videon tallennuksessa. Sen vuoksi tarvitaan vaihtoehtoinen ratkaisun pistepilvitiedon tallentamiseen, joka toimii pienessä tilassa tapahtuvan esityksen tallentamisessa.

Rajoitteet ovat myönteinen voima suunnittelulle – tallennusratkaisu

Kunkin kameran tuottama syvyys- ja videokuva ovat resoluutioltaan 848×480 pikseliä. Molemmat tarvitaan yhden kameran pistepilven tuottamiseksi. Kuvassa 1 on esitetty, miten Full HD-tasoiseen kuvaan voidaan sovittaa kahden kameran kuvat. Vastaavasti kuvassa 2 havainnollistetaan, miten 4K-videokuvaan saataisiin neljän kameran kuvatieto vastaavalla tavalla.

Kuva 1. RGB- ja syvyystiedon sijoittelu FullHD-tasoisen videokuvaan.

Kuva 2. RGB- ja syvyystiedon sijoittelu 4K-videokuvaan.

Valitettavasti YUV-koodattuun videoon ei pystytä pakkaamaan 16-bittistä arvoa suoraan RGB-tiedon lisäksi, koska väriarvot esitetään yleensä kolmella 8-bittsellä RGB-kolmikolla. Lisäksi ratkaisussa käytetty H264-koodekki hyödyntää ihmissilmän ominaisuuksia pakatessaan kuvatietoa, ja muuttaa väriarvoja sen mukaisesti saavuttaakseen suuremman pakkaustehokkuuden. 16-bittistä syvyystietoa ei voi esimerkiksi suoraan koodata väriarvoina kahteen värikanavaan. [1]

Tallennusratkaisussa on huomioitava, että mitä kauempana kamerasta kohde sijaitsee, sitä enemmän tarkkuus kärsii ja syvyystietoon tulee mukaan häiriötä. Kun D435-kameran syvyystiedon tarkkuus asetetaan suurimmaksi 100 mikrometriin, saadaan 16-bittisellä etumerkittömällä kokonaisluvulla esitettynä maksimietäisyydeksi 6.5 metriä, joka riittää varsin hyvin yhden ihmisen holotallenteen tekemiseen. [2] Koska holotallennetta tarkastellaan aina hieman kauempaa, syvyystieto on koodattavissa karkeammalla yhden senttimetrin tarkkuudella kokonaiskuvan kärsimättä liikaa.

Tämän vuoksi kuvausalue on rajattu 2,55 metrin alueelle syvyyssuunnassa. Etäisyys kamerasta kuvattavaan kohteeseen on aina vähintään 0,74 metriä. Lisäksi rajataan maksimietäisyydeksi kamerasta 3,29 metriä. Asettelu on näkyvissä kuvassa 3. Tällöin kameran syvyystiedon tuottamat arvot ovat välillä 7400 – 32900. Syvyysarvot alkavat vähintään 7400 etäisyydeltä joka tapauksessa, joten voimme vähentää etäisyyden kamerasta tallennusta varten. Siispä kaavaksi saadaan:

Pikselin syvyysarvo = (raaka syvyysarvo – 7400) / 100.

Tuloksen arvoväli onkin sopivasti 0-255, sillä maksimiarvolla laskettuna tulos on

Pikselin syvyys = (32900-7400) / 100  = 255.

Kuva 3. Kahden syvyyskameran tallennusalueen rajaaminen soveltuvilla etäisyyksillä.

Kaikki syvyysarvot voidaan siis esittää 8-bittisellä luvulla. Vastaavasti harmaasävyt koodataan H264-koodekkia varten siten, että jokainen RGB-kanava sisältää saman arvon. Toki H264-koodekki voi tehdä vielä muutoksia tähänkin arvoon, mutta harmaasävykuva vakauttaa arvojen vaihtelua.

FFmpeg-kirjaston käyttö

Koska RGB- ja syvyyskuva syntyvät kuva kerrallaan reaaliajassa, ja videoon halutaan yhdistää myös ääni, on syytä käyttää kirjastoa, joka mahdollistaa useamman median pakkaamisen. FFmpeg on avoimen lähdekoodin kirjasto, joka tukee varsin laajalla kirjolla erilaisia koodekkeja, ja mahdollistaa videon purkamisen ja pakkaamisen reaaliajassa. FFmpeg on C-kielellä toteutettu, joten sitä voidaan käyttää helposti yhdessä Intelin Realsense SDK:n kanssa, hyödyntäen samalla säikeistystä ja Nvidian näytönohjaimen h264-rautakiihdytystä. [3]

Koska kahden kameran striimissä voi olla ajallisesti jonkin millisekunnin keskinäinen ero, yhdistämisvaiheessa on säädettävä ajoituksia. Tämäkin on tehtävä toistaiseksi käsin, mutta työ on tehtävä yleensä vain kerran per video.[4]

Tallennus tapahtuu kahdessa vaiheessa. Ensimmäisessä vaiheessa ohjelmisto tallentaa kameroiden tuottaman tiedon, sekä mikrofonin kaappaaman äänen kiintolevylle. Toisessa vaiheessa yhdistetään ääni-, kuva- ja syvyystieto yhdeksi virtuaalihologrammivideoksi. Sen jälkeen video onkin mahdollista toistaa 3D-mallina sitä tukevan erityisen visualisointiohjelmiston avulla.

3D-pistepilven rakentaminen dynaamisesti videokuvasta

Virtuaalihologrammien tarkastelua varten käytetään kehitystyötä varten hankittuja Meta 2 –AR–laseja, joille paras kehitysväline on tällä hetkellä Unity-pelimoottori. Tämän vuoksi myös hologrammivideosta 3D-pistepilven rakentava visualisointiohjelmisto on toteutettu kokonaisuudessaan Unity-pelimoottorilla.

Pistepilven tehokas renderöinti vaatii GPU-kiihdytetyn version Intel Realsense2-kirjaston visualisointilogiikasta. Realsense2-kirjasto on julkaistu avoimena lähdekoodina Apache License 2.0:n alla, joten siinä käytetyt ratkaisut ovat kehittäjien hyödynnettävissä.

Pistepilvien osien kalibrointi ja visualisointiparametrien asettaminen tehdään Unityssä. Unity-projektissa rakennetaan ensiksi dynaamisesti neliöistä koostuva suorakulmio. Suorakulmiossa on 848×480 neliötä, joka vastaa yhden kameran tuottaman kuvan pikseleitä. Kunkin neliöön kytketään haluttu kuvapiste RGB-videokuvasta, sekä syvyystieto, jolloin niitä voidaan siirtää ohjelmallisesti

Kuva 4. Yksinkertaistettu esitys pistepilven muodostumisesta syvyystiedon perusteella.

Kukin kuvapiste siirretään halutulle etäisyydelle SDK-kirjastossa kuvatun kaavan perustella, jolloin saadaan rakennettua näytönohjaimen avulla pistepilvi visualisointia varten. Kuvapisteen siirtämisen periaate on havainnollistettu kuvassa 4, ja ruutukaappaus lopputuloksesta on näkyvissä kuvassa 5.

Koska syvyyskuvassa on tiettyjä häiriöitä tallennusetäisyydestä johtuen, varjostinohjelmaan on totetuttu ns. mediaanispatiaalisuodatin, joka häivyttää lyhyen aikavälin sisällä esiintyvät pienet erot arvoista. Suodatin toimii käytännössä siten, että valitaan sopiva määrä peräkkäisiä syvyyskuvia tarkasteltavaksi, joiden syvyystietojen mediaani valitaan aina esitettäväksi syvyystiedoksi. Uuden kuvan saapuessa vanhin poistetaan ja uusi lisätään tarkastelujoukkoon. Suodattimen ansiosta pistepilvi on yhtenäisempi, joskin nopeat liikkeet eivät rekisteröidy visualisointiin välittömästi.

Kuva 5. Tuotettu pistepilvi Meta 2 AR-lasein läpi nähtynä.

Visualisointitoteutusta tehdessä on kuitenkin huomioitava, että jokaisen kameran tuottama syvyystieto on riippuvainen laitteen tallennuskomponenttien ominaisuuksista. Tämä tarkoittaa käytännössä sitä, että kukin hologrammitallenne vaatii myös tietyt ulkoiset kamerakohtaiset parametrit 3D-pistepilven tuottamiseen. Tallenteen tekemisen yhteydessä on siis ladattavia metatietoa laitteesta, jotta hologrammit piirtyvät oikein, ja nämä arvot on ladattava visualisointiohjelmistoon.

Myös kameroiden sijoittelu ja orientaatio vaikuttaa hologrammien piirtämiseen. Tämän vuoksi visualisointiohjelmiston kamerat on aseteltava kameroiden fyysistä sijoittelua vastaaviksi, että kaikki hologrammin osat toistuvat oikein suhteessa toisiinsa ja saadaan aikaan uskottava lopputulos. Tällä hetkellä ohjelmisto ei tue automaattista kalibrointia, vaan mallien sijainnit Unity-projektissa on säädetty käsin. Tämä tarkoittaa myös, että tallennettaessa hologrammeja toisessa paikassa, visualisointiohjelmisto on kalibroitava niitä varten erikseen. Kalibrointitieto on kuitenkin mahdollista tallentaa erilliseen tiedostoon, ja ladata aina mallin näyttämisen yhteydessä, jolloin visualisointi toimii koskematta itse ohjelmakoodiin.

Syvyystiedon mukana on myös hieman häiriöitä mallin reunojen yhteydessä, jolloin syvyysarvo vaihtuu rajusti. Tätä tilannetta varten varjostinohjelmaan on lisätty yhtenäisyyssuodatin, joka tutkii vierekkäisten neliöiden etäisyyttä nykyiseen nähden, ja mikäli ennalta määritetty etäisyys ylittyy, neliö tulkitaan “häiriöksi” ja jätetään piirtämättä. Vastaavasti neliöt, joiden etäisyys on suurempi kuin maksimietäisyys, jätetään piirtämättä.

Kehitystyö jatkuu

Hankkeessa on toteutettu ratkaisu virtuaalihologrammien tallennukseen ja visualisointiin, jolla voidaan esitellä sekä testata tulevaisuuden vuorovaikutusmenetelmiä. Yleistymistä varten kehitystyötä on kuitenkin jatkettava.

Kameroiden kalibrointi on toistaiseksi vielä tehtävä käsin, ja se on varsin aikaa vievää. Kun jatkossa käytetään useampaa kameraa, kalibrointi on rakennettava siten, että se on mahdollista tehdä vastaavilla menetelmillä, kuin mitä useamman kameran liikkeenkaappauslaitteistojen yhteydessäkin.

Tuotettu virtuaalihologrammi ei ole täydellinen 3D-malli kohteesta, sillä yksinkertaistetun 3D-mallin muodostaminen pistepilvestä vaatisi enemmän kuva- ja syvyystiedon ohjelmallista käsittelyä. Toisaalta ratkaisu on varsin suorituskykyinen ja toteuttavissa pienemmilläkin laitteistopanostuksilla. Lopputuloksena on onnistuttu välittämään esiintyjän kehonkieli katsojalle.

Anssi Gröhn, lehtori
Karelia-ammattikorkeakoulu

 

[1] Nvidian näytönohjaimen ajurit tosin rajaavat oletuksena tuettujen yhtäaikaisten striimien määrän pakattaessa kahteen, mutta meidän tapauksessame tllanne ei ole ongelma – kaksi stiimiä riittää.

[2] Useamman D435-kameran tuottamat kuvat olisi toki mahdollista synkronoida erillisen kaapelin avulla, mutta siinäkin tapauksessa äänilähteen synkronointi olisi tehtävä yhä käsin, joten synkronointikaapelia ei toteutettu.

[3] Tutkimalla koodekin toimintaa tarkemmin tämän voisi ehkä kiertää, mutta helpompi ja tarkoitukseen riittävä ratkaisu oli löytyi tallennustilannetta tutkimalla, ja vähentämällä syvyystiedon tarkkuutta.

[4] 6.5 metrin maksimi saadaan 16-bittisen etumerkittömän kokonaisluvun maksimiarvosta 65535, jolloin arvon muuttuminen yhdellä vastaa 0.1 mm muutosta syvyydessä, toisin sanoen maksimi 65535*0.1mm on 6.5 metriä.