Mala matematička / linearna algebra iza Instagrama Face 3D filtera

Moje je čvrsto uvjerenje da smo svi ikada koristili Snapchat / Instagram filtere ili barem vidjeli kako se naši prijatelji koriste i dijele ih na svojim pričama na društvenim mrežama ili u postu.

Pojam "filtriramo" započinjemo uljepšavanjem ili dodavanjem ukrasa pozadini, kasnije postaje sve popularniji kako se pojavljuje na svakom licu na kameri kao što su ugradnja sunčanih naočala, zečja glava, preobrazba dobi itd. S nestrpljenjem gledamo naše vlastito lice

Konkretno u ovom postu razgovarat ćemo o tome što bi naš telefon / Instagram 'radio' kad radimo filtere za lice tako da naočale stavimo na pravo mjesto i budu u mogućnosti da prate našu glavu.

Ukratko, glavni proces 3D filtra lica je podijeljen u 3 faze uzastopno:

  1. Otkrivanje lica
  2. Otkrivanje orijentira lica
  3. Projekcija predmeta

Detekcija lica i otkrivanje orijentira dio su strojnog učenja / dubokog učenja koji otkriva objekte iz cijele slike i vrši regresiju. Za svako otkriveno lice, poslati bi se algoritmu druge faze da procijeni gdje su nos, oči, usta itd. Do sada, puno algoritama i skupova podataka pokriva 68 orijentira lica. Ovdje izvrstan izvor za daljnje čitanje.

Orijentir lica od strane pyimagesearch.com

Međutim, usredotočit ćemo se na treću fazu (projekcija predmeta) jer na tome govorimo o matematici / linearnoj transformaciji algebre / matrice. Naravno da se u prve dvije faze mora prevladati puno matematike, ali svaka od njih ima veliku ploču o kojoj će se moći raspravljati.

Projekcija predmeta

Rezultat otkrivanja orijentira je skup koordinata x i y po orijentiru, što je u međuvremenu samo 2D informacija što trebamo znati z-koordinate je li lijevo oko udaljenije od desnog oka od kamere, pa možemo reći da je lice gledajući s lijeve strane jer bi naočale slijedile koji put gledamo.

Problem / metoda kojom se koristimo za izradu takve projekcije naziva se "Perspektivna-n-točka (PnP)" ili "Model klipa klipa". Metoda je bila prije desetljeća, ali se još uvijek često koristi u mnogim slučajevima računalnog vida, uključujući robotiku, proširenu stvarnost i našu raspravu. Da bi ova metoda funkcionirala, potrebna su joj 3 elementa:

1. 3D točke svjetskog koordinatnog prostora kao referentne točke

Izraz je super cool "svjetski koordinatni prostor", to su neke popravne točke koje možemo reći kao referentne točke ili u normalnom stanju jer svijet zna da je to istina !!!. U ovom slučaju koristimo ovih 14 točaka.

Ovi položaji nalikuju ljudskim koordinatama orijentacije lica s nosom u prednjem i središnjem dijelu lica, bradom na dnu i tako dalje.

2. 2D Točke projekcijskih točaka, korespondencija jedan na jedan sa svjetskim koordinatnim prostorom

Projekcijske točke dolaze iz modela dubokog učenja u drugoj fazi, koji je model orijentacije na licu i koristimo samo 14 bodova od 68 bodova dobivenih iz modela.

3. Matrica kamere

Matrica sadrži podatke o žarišnoj duljini kamere i glavnoj točki koja je praktično zamijenjena koordinatom središta slike. Iako je žarišna duljina obično ista s ukupnim pikselima širine slike.

Perspektivna točka n (točka) (PnP) / Pinhole model kamere

Korištenjem 3 gore navedene informacije, iz ove formule želimo dobiti matricu rotacije (R) i prijevodni vektor (t).

Izvor: OpenCV Documentation

To je podudaranje sa 14 točaka svjetskog koordinatnog prostora na 14 točaka stvarnog otkrivenog lica kako bi se dobilo koliko se lica rotira i prevodi na svaku dimenziju.

Projekcija nove točke

Izvor: OpenCV Documentation

Znajući rotacijsku matricu i prijevodni vektor, željeli bismo projicirati nove točke (mogu biti različite od 14 ulaznih točaka). Ulaz je 3d koordinata (X, Y, Z) nalikuje svjetskom svemirskom koordinatnom točku na 2D koordinatu (u, v) koja na kraju prikazujemo samo sliku u 2D.

Izvor: naočale i naočale

Na primjer, ako želite projicirati novu točku leće u 2D, odaberite ulazni 3D oko svjetske koordinate oka plus malo količine koordinate Z, jer je leća bliža očima u odnosu na kameru. Isto tako, jastučić za nos, odaberite mjesto oko svjetske koordinate nosa.

Da biste primijenili filtar, morate definirati neke 3D točke vašeg predmeta, npr. Naočale, šešir ili brkove u odnosu na 14 točaka svjetskog koordinatnog prostora, a zatim projekcija transformira one 3D točke u 2D točke koje smatraju pozu glave lica.

Ukratko, postupak prikazivanja filtara je: Otkrivanje lica -> Procjena orijentacije 2D lica -> Dobivanje matrice rotacije i vektora prevođenja -> Projekt 3D stavka ukazuje na 2D -> Vizualizirati. To se događa na svakom kadru koji je zabilježila kamera.

Kodovi u python / C ++ da bi se to dogodilo

Ako želite primijeniti ovaj koncept, molimo pogledajte OpenCV Dokumentaciju o ovoj raspravi.

Funkcija za dobivanje rotacijske matrice i prijevodnog vektora: C ++: projectPoints Python: cv2.projectPoints

Funkcija projiciranja 3D stavki ukazuje na 2D: C ++: projectPoints Python: cv2.projectPoints

Oboje su unutar OpenCV paketa !!

odricanje

Nisam inženjer Snapchat / Instagrama, ne kažem da oni koriste ovaj koncept za koji ne znam što rade iznutra, mislim da djeluju sofisticiranije od onoga što ste pročitali u ovom članku. Glavna poruka koju bih vam želio dostaviti je da vi možete koristiti koncept za to!

Hvala na čitanju!!! Živjeli