Syvien hermoverkkojen suorituskyky otti suuren askeleen eteenpäin kahden viime vuosikymmenen aikana. Joka vuosi kehitetään uusia arkkitehtuureja, jotka ylittävät huippuluokan tulokset. Pelkästään arkkitehtuurien parantaminen ei kuitenkaan toimi ilman laadukasta tietojoukkoa. Tietojoukolla on suuri vaikutus lopulliseen suorituskykyyn. Erilaisten, tarkkojen tietojoukkojen kerääminen ja merkitseminen voi olla työlästä ja kallista, eivätkä olemassa olevat tietojoukot yleensä kata kaikkea todellista tiedonjakelua, joten käytetään tiedon lisäystekniikoita.
Tässä artikkelissa näytän, kuinka ihmiskasvojen tietojoukkoasi voidaan rikastaa 3D-geometrian muunnolla mallin suorituskyvyn parantamiseksi. Avoimen lähdekoodin toteutus esitetään alla[1].
Datan lisäys on tekniikka, joka lisää datan määrää soveltamalla näytteisiin erilaisia muutoksia. Yleinen kuvan lisäys voidaan jakaa kahteen luokkaan: geometrisiin muunnoksiin ja värimuunnoksiin. Geometriset muunnokset koostuvat skaalauksesta, rajaamisesta, kääntämisestä, kiertämisestä, käännöksestä jne. Kun taas värimuunnokset koostuvat värin värinästä, kohinan lisäämisestä, harmaasävytyksestä, kirkkauden/kontrastin säädöstä jne.
Ajatellaanpa, kuinka voimme parantaa kuvaa, jos tiedämme, että siellä on ihmisen kasvot. Miten erottamme yhden ihmisen toisesta? On olemassa kasvonpiirteitä, jotka muodostavat identiteetin, kuten ihonväri, kasvojen muoto, hiustenleikkaus, rypyt, silmien väri jne. Yksi erottuvista on kasvojen muoto.
Joten jos muutamme syötetyn kasvokuvan muotoa, se on hieman erilainen henkilö koulutettavalle mallille. Joten, käytetään tätä ominaisuutta tietojoukkomme täydentämiseen.
Muutamme kasvojen geometriaa käyttämällä 3D Morphable -mallia (3DMM), erityisesti FLAME[2]-mallia. 3DMM on kolmiulotteinen verkko, jolla on parametreja sen muodon, asennon ja ilmeen muokkaamiseen. 3DMM on rakennettu kolmiulotteisista verkoista, jotka todelliset ihmiset ovat rekisteröineet.
Siten se voi edustaa todellisten kasvojen muotojen jakautumista. Hupun alla se koostuu keskimuodosta ja joukosta pääkomponentteja, jotka määrittelevät muodon ja ilmeen muutossuunnat. Alfa ja beta ovat mallin parametreja.
Ennen kuin muutamme kasvojen muotoa, meidän on löydettävä 3DMM-parametrit, jotka vastaavat syötettyä valokuvaamme. Tätä varten on useita menetelmiä, kuten optimointi maamerkkeihin, fotometrinen optimointi tai regressiomallit parametrien ennustamiseksi yhdessä vaiheessa. Käytin 2D-maamerkkioptimointia, koska se on yksinkertainen toteutus ja antaa tarkat tulokset kohtuullisessa ajassa.
Syötekuvasta havaittiin kasvojen maamerkit Dlib-kasvojentunnistusmallilla. Adam-optimointialgoritmia käytettiin maamerkkien MSE-häviön kanssa 3DMM:n sovittamiseksi kasvokuvaan. Yhdentyminen kesti noin 150 iteraatiota.
Nyt olemme valmiita muokkaamaan kasvojen geometriaa. Ensinnäkin meillä on jo kolmiulotteinen verkko, joka on kohdistettu kasvokuvaamme. 3DMM:n muotoparametrien muuttaminen johtaa verkkopisteiden siirtymiseen kuva-avaruudessa. Tietäen, että siirtyy, voimme käyttää sitä liikuttamaan kuvan pikseleitä.
Tiheän siirtymäkartan saamiseksi käytin OpenGL-kirjastoa, jossa renderöin 3DMM-verkon siirtymällä x- ja y-suunnassa vertex-värin sijaan. Yksi asia on vielä harkittava, kuinka käsitellä pikseleitä, jotka olivat poissa kasvojen verkkoalueelta.
Tätä tarkoitusta varten käytin ekstrapolaatiota, joka yhdistää muuttuneet kasvot sujuvasti staattiseen taustaan. Niin kauan kuin meillä on tiheät siirtokartat x- ja y-suuille, voimme käyttää niitä minkä tahansa tyyppisiin tarroihin, kuten kasvojen maamerkkeihin, segmentointimaskeihin tai parillisiin kuviin. Alla olevassa kuvassa on esimerkkejä kasvojen suurentamisesta geometrisella muutoksella. Jos haluat tietää lisätietoja, kutsun sinut lähdekoodiin[1].
Nyt voit kokeilla sitä tietojoukoissasi. Tämä lisäystekniikka auttaa sinua parantamaan mallia tehden siitä vakaan muunnelmien syöttämiselle. Tässä artikkelissa opimme 3D-geometrisesta muunnoksesta, mutta sen lisäksi on olemassa pintakuviomuutoksia, jotka ovat lisäparannuksia kasvotietosarjoihin, jotka seuraavassa artikkelissa.
Viitteet
[1] GitHub-koodi.
[2] FLAME-malli.