% Tento soubor nahraďte vlastním souborem s obsahem práce.
%=========================================================================
% Autoři: Alžbeta Hrabošová
\chapter{Úvod}

% Starnutie tváre je rozsiahla téma, ktorá nachádza uplatnenie v rôznych oblastiach a jednou z nich je aj počítačové videnie a spracovanie obrazu. Veľa aplikácii využíva starnutie tváre, jedná sa hlavne o aplikácie na rozpoznávanie tvárí v rôznych vekových kategóriách (bezpečnosť), automatický odhad veku (rodičovská kontrola, interakcia medzi človekom a počítačom na základe veku) alebo predpovedanie vzhľadu človeka v rôznych vekových kategóriách (vyhľadávanie nezvestných osôb). Spracovanie tváre je zložitý proces, ktorý zahŕňa mnoho faktorov, ktoré tento proces ovplyvňujú ako etnický pôvod, výraz tváre, kvalita fotografie a v neposlednom rade vek. 
Vývoj tváre v~čase je nepretržitý a dynamický proces, ktorý neprebieha rovnomerne. Trajektórie starnutia nie sú konštantné počas celého ľudského života, u~každého jednotlivca prebieha starnutie individuálne a rozdiely sú zjavné medzi rôznymi vekovými štádiami a pohlaviami. Starnutie tváre teda často predstavuje pre počítačové modely výzvy pre presnú predikciu vývoja jednotlivých tvárových štrurktúr do budúcnosti.

Podrobné pochopenie vývoja tváre je dôležité v~rôznych vedeckých disciplínach, ktoré sa zaoberajú rekonštrukciou tváre, predpovedaním starnutia, v~medicíne alebo forenzných vedách. Z~medicínskeho hľadiska je pre bežnú klinickú prax dôležité poznať nielen vývojové zmeny tváre ako celku, ale aj špecifické zmeny presne definovaných rozmerov tváre \cite{introduction}. Úspešná identifikácia a rozpoznávanie podľa znakov tváre sú nevyhnutné v~mnohých forenzných aplikáciách, napr. pri forenznej identifikácii tváre, predpovedaní starnutia alebo rozpoznávaní tváre. Poznanie zmien tváre súvisiacich so starnutím s~ohľadom na pohlavný dimorfizmus je obzvlášť dôležité najmä pri identifikácii dlhodobo nezvestných osôb a rekonštrukcii tváre.

Táto práca je zameraná na problematiku starnutia tváre s~ohľadom na pohlavie, predovšetkým na zmeny ľudskej tváre, ktoré súvisia s~vekom a na vývoj algoritmu, ktorý dokáže tieto zmeny analyzovať a predikovať do budúcnosti. S~vekom sa mení fyzická morfológia tváre, ktorej sa budeme venovať v~kapitole \ref{antropometria}. Táto kapitola popisuje atropometrické vlastnosti tváre, ako a podľa čoho ich vieme určiť a prečo sú pre analýzu tváre kľúčové. Predstavený bude aj všeobecný model rastu tváre, ktorým sa riadi vývoj tváre v~čase. Kapitola \ref{ml} sa venuje základom strojového učenia a jeho využitiu v~oblasti spracovania obrazu. Uvádza stručný prehľad algoritmov, ktoré sa využívajú na detekciu tváre a významných bodov na tvári a rovnako aj využitiu starnutia tváre v~aplikáciach, ktoré sa dnes používajú. Návrh algoritmu, ktorý analyzuje a predikuje vývoj tváre v~čase, zvolené nástroje a rovnako aj implementácia tohto návrhu sú uvedené v~kapitole \ref{navrh}. Kapitola \ref{experimenty} sa venuje testovaniu vytvoreného algoritmu a experimentom na poskytnutom datasete od Prírodovedeckej fakulty Masarykovej univerzity. Experimenty dopĺňajú grafy, vykreslujúce vývoj tváre počas starnutia, farebné mapy, znázorňujúce rozdiely u~jednotlivých osôb v~závislosti od veku, ako aj rozdiely vo vývoji medzi pohlaviami. Vyhodnotenie výsledkov, zhrnutie práce a možnosti ďalšieho rozšírenia aplikácie su uvedené v~kapitole \ref{zaver}.


\chapter{Atropometrické vlastnosti tváre} 
\label{antropometria}



\section{Antropometria ľudskej tváre}

Popisom a hodnotením znakov ľudského tela sa zaoberá antropológia \cite{roman2008biometrie}. Antropologické metódy, ktorými sa hodnotí stav ľudského tela je možné rozdeliť na antropometrické (somatometrické) a somatoskopické. Antropometria (somatometria) kvantitatívne vyjadruje morfológiu ľudského tela, hodnotí znaky objektívnymi pomôckami a vyjadruje ich dĺžkovými mierami ako obvody, oblúky, uhly apod. Somatoskopia je kvalitatívne vyjadrenie ľudského tela a študuje na základe pozorovania vývoj, veľkosť alebo absenciu určitého znaku. 


Antropometria tváre má teda potenciál zohrávať kľúčovú úlohu pri vývoji modelov starnutia tváre. Takéto štúdie poskytujú kvantitatívny opis kraniofaciálneho komplexu v~rôznom veku, a teda poskytujú množstvo možností prístupov na charakterizovanie starnutia tváre. Antropometrické štúdie tváre poskytujú husté merania medzi kľúčovými orientačnými bodmi na ľudských tvárach v~rôznych vekových kategóriách a zohrávajú rozhodujúcu úlohu pri chirurgických zákrokoch na tvárach rastúcich detí.

\section{Geometria tváre}

Ľudská tvár má dobre definované roviny, plochy a body. Existujú štyri hlavné roviny \cite{george2007facial}:

    \begin{enumerate}
        \item mediálna rovina - stredná línia tváre, rozdeľuje tvár na ľavú a pravú časť,
        \item stredová rovina tváre - rozdeľuje tvár na dolnú a hornú polovicu,
        \item transverzálna nosová rovina - horizontálna rovina, paralelná k~stredovej rovine, prechádzajúca cez bod subnasale,
        \item transglabelárna rovina - horizontálna rovina, paralelná k~stredovej a transverzálnej rovine, prechádzajúca cez glabelu.
    \end{enumerate}

\noindent Tieto roviny sú zobrazené na obrázku \ref{face_planes}.

\begin{figure}[h]
    \centering
    \scalebox{0.5}{\includegraphics{obrazky-figures/face_planes.png}}
    \caption{Roviny tváre \cite{face_template}.}
    \label{face_planes}
\end{figure}

\newpage

\section{Antropometrické body}

Antropometrické body predstavujú množinu bodov, ktoré sú presne definované a nachádzajú sa na miestach, ktoré majú anatomický význam. Pomocou týchto bodov sme schopní charakterizovať tvar spôsobom, ktorý vytvára korešpondenciu medzi konkrétnymi prípadmi tvaru. Výber najpouživanejších antropometrických bodov je zobrazený na obrázku \ref{landmarks}.

Okrem antropológie a lekárskych štúdii majú antropomentrické body využitie taktiež v~iných odvetviach ako počítačové videnie alebo spracovanie obrazu, napr. rozpoznávanie a detekcia tváre alebo výrazov, v~počítačovej grafike pri animácii mimiky, či pri simulácii starnutia. Pre veľké množstvo aplikácii ako sú animácie tváre, sledovanie tváre alebo rozpoznávanie tváre je potrebná väčšia množina bodov, ktoré je možné detekovať \cite{ferkova}. Tieto body sú označované ako matematické orientačné body a nie sú definované na základe anatomických údajov. Namiesto toho sú definované pomocou minima alebo maxima a funkcie popisujúcej tvar, zakrivenie alebo gradienty.
Pretože sa táto práca týka biologickej antropológie, zameriavame sa na detekciu biologických orientačných bodov. Definície najčastejšie používaných antropomentrických bodov sú uvedené v~tabuľke \ref{landmarks_table} a ich vykreslenie na obrázku \ref{landmarks}.\\



\begin{table}[h]
    \begin{center}
    \begin{tabular}{|c|c|>{\centering\arraybackslash}p{9cm}|}
     \hline
     Názov bodu     & Označenie  & Definícia \\
     \hline
     Trichion       & tr         & Bod ležiaci v~mediálnej rovine na vlasovej hranici.\\
     Nasion         & n          & Najhlbší bod na stredovej línii, na koreni nosa. \\
     Subnasale      & sn         & Stred uhla na základni nosovej prepážky.\\
     Gnathion       & gna        & Najnižší bod stredovej línie dolnej čeľuste.\\
     Exocanthion    & ex         & Bod na vonkajšom kútiku oka.\\
     Entokanthion   & en         & Bod na vnútornom kútiku oka.\\
     Zygion         & zy         & Bod ležiaci najviac laterálne, na priamke medzi zrenicami.\\
     Gonion         & go         & Bod ležiaci najviac laterálne, na dolnej čelusti, na priamke, ktorá je kolmá na strednú líniu a pretína stomion.\\
     Alare          & al         & Bod ležiaci najviac laterálne na prednom okraji nosovej dierky.\\
     Cheilion       & ch         & Bod ležiaci v~kútiku úst.\\
     Stomion        & sto        & Stredný bod ústnej štrbiny.\\
     \hline
    \end{tabular}
    \end{center}
\caption{Definície najčastejšie používaných antropometrických bodov podľa Fetter \cite{fetter}:} 
\end{table}
\label{landmarks_table}

\begin{figure}[H]
    \centering
    \scalebox{0.4}{\includegraphics{obrazky-figures/landmarks.png}}
    \caption{Definované antropometrické body \cite{face_template}.}
    \label{landmarks}
\end{figure}



\newpage

\section{Rast a vývoj tváre v~čase}

Vývoj ľudskej tváre podlieha vplyvom mnohých faktorov ako strava, klíma, zdravotný stav, diéta, ochorenia, gravidita a životný štýl. Tieto faktory spôsobujú rôzne zmeny v~tvare aj štruktúre tváre počas jej vývoja. S~vekom súvisiace zmeny sa delia na priame a nepriame.

Priame zmeny vznikajú ako následok vývoja človeka. Napríklad v~období formovania je tvár vystavená prevažne zmenám tvaru v~dôsledku rastu kostí, zatiaľ čo v~dospelosti sa zmeny tváre pripisujú najmä zmenám štruktúry (vznik vrások). Podľa Fairhurst \cite{fairhurst} je lebka najmä od detstva do puberty natiahnutá smerom nadol a von. Oči, ústa a nos sa zväčšujú, aby vyplnili zväčšujúcu sa plochu lebky a čelo sa zmenšuje. Tieto zmeny môžu pokračovať do dospelosti, ale už menej dramaticky. Priame účinky starnutia možno primerane simulovať \cite{fairhurst}, pretože pôsobia rovnomerne vzhľadom na celú ľudskú populáciu.

Nepriame zmeny sú spôsobené foktormi, ktoré sú mimo fyzického starnutia. Do tejto kategória patria ochorenia spájené prevažne so staršou populáciou, ktoré spôsobujú zmeny vo vzhľade tváre (tumory, strata váhy). Tieto zmeny je takmer nemožné presne určiť vzhľadom na ich nepredvídateľný charakter.\\

Rast a vývoj neplnoletých sa riadi všeobecným modelom, avšak určenie konkrétnych individuálnych rastových modelov je komplikované, pretože tvár dieťaťa rastie rôznou rýchlosťou a môže sa vyvinúť s~oneskorením alebo naopak príliš rýchlo v~porovnaní s~inými deťmi v~rovnakom veku \cite{suri2013longitudinal}. Hlavný rastový vzor predstavuje dieťa s~veľmi veľkým objemom lebky v~porovnaní so zmenšeným tvárovým komplexom \cite{albert2019craniofacial}. Tvárový komplex počas prvých rokov života rýchlo rastie a predlžuje sa v~dolnej a strednej časti tváre. Rýchlosť sa potom znižuje a celková tvár postupne zväčšuje svoj objem, dĺžku a šírku, až kým nedosiahne rozmery dospelého človeka.\\

U~zmien ľudskej tváre súvisiacich s~vekom a rastom je zmena tvaru spolu s~veľkosťou v~rôznych vekových štádiách veľmi podstatná, pretože tieto zmeny nie sú proporcionálne. Zmeny tvaru ovplyvňujú predovšetkým výšku a hĺbku tváre \cite{jandova}.\\

\subsection*{Očnica (orbita)}

Očnicu tvorí sedem kostí a väčšina rastu očnice, ku ktorému dochádza, sa deje kvôli rôznym švom medzi viacerými kosťami \cite{costello2012growth}. Očnice sú na začiatku rastu a vývoja pomerne veľké v~porovnaní so zvyškom tváre v~dôsledku rýchleho rastu očí v~prvom roku života. Veľké zaokrúhlené oči sa začínajú predlžovať približne vo veku 3 - 4 rokov.

\subsection*{Interkantálna šírka}
Interkantálna šírka je vzdialenosť medzi bodom endocanthion ľavého oka po endocanthion pravého oka (en-en). Interkantálna šírka dosahuje v~priemere 93~\% hodnoty dospelého človeka u~oboch pohlaví vo veku okolo 5 rokov.      

\subsection*{Orbitálna šírka}
Orbitálna šírka sa meria od bodu endocanthion po exocanthion (en-ex). Orbitálna šírka sa uvádza na úrovni 70~\% jej veľkosti v~dospelosti vo veku okolo 1 roka, okolo 8 roka dosahuje 90~\% veľkosti dospelého človeka \cite{humphrey1998growth}.


\subsection*{Nos}
Nosové kosti sú dve malé párové kosti, ktoré sa nachádzajú medzi očnicami, hornou čeľusťou a čelnou kosťou.

Pokiaľ ide o~morfológiu nosa, ukázalo sa, že šírka nosa sa vyvíja v~ranom veku \cite{jandova}. Do~tretieho až štvrtého roku života dosahuje 71~\% (ženy) a 74~\% (muži) rozmerov dospelého človeka (18 - 30 rokov). V~tom istom veku dosahuje výška nosa 62~\% (muži) a 67~\% (ženy) hodnôt dospelého človeka, zatiaľ čo dĺžka nosovej priehradky je len  54~\% u~mužov a 58~\% u~žien. Okolo veku 5 - 8 sa koreň nosa posúva vyššie už a je vidno špičku nosa.
Avšak u~oboch, mužov aj žien sa rozmery nosu menia aj po osemnástom roku života.

\subsection*{Mandibula (spodná čelusť)}
S~pribúdajúcim objemom sa ramus mandibuly rozširuje a predlžuje, zatiaľ čo predná časť mandibuly vystupuje dopredu a mení sa z~okrúhleho, hladkého obrysu na špicatý tvar dospelého človeka. V~priemere dosahuje dolná čeľusť vo veku 1 roka 60 - 70~\% svojej veľkosti v~dospelosti a vo veku 5 rokov 74 - 85~\% svojej veľkosti v~dospelosti \cite{humphrey1998growth}. Dolná čeľusť dosahuje svoju maximálnu rýchlosť rastu tesne okolo puberty, ktorá sa pohybuje medzi 13,6. a 14,5. rokom u~mužov a medzi 10. a 12. rokom u~žien \cite{suri2013longitudinal}. Dolná čeľusť dosahuje zrelosť vo veku 16 rokov u~mužov a 14 rokov u~žien \cite{humphrey1998growth}. 

\subsection*{Mandibulárna šírka}
Šírka čeľuste je vzdialenosť medzi párom bodov gonion (go-go). Pri narodení dosahuje šírka čeľuste už približne 60~\% svojej hodnoty v~dospelosti. Vo veku 5 rokov dosiahne niečo vyše 92~\% svojho priemerného rastu v~dospelosti, pričom od 1 do 5 rokov narastie o~11 mm \cite{humphrey1998growth}.

\subsection*{Mandibulárna dĺžka}
Mandibulárna dĺžka je vzdialenosť bodov gonion a gnathion (go-gna). Podobne ako v~prípade iných častí čeľuste, aj dĺžka mandibule má v~ranom veku výrazne rýchly rast, pričom priemerné percento sa pohybuje okolo 77~\% veľkosti dospelého človeka vo veku 5 rokov \cite{liu2010mandibular}.

\subsection*{Mandibulárna výška}
Mandibulárna výška je vzdialenosť stomion, gnathion (sto-gna). Táto hodnota dosahuje 67~\% hodnoty dospelých vo veku 1 roka, 87,8~\% vo veku 5 rokov a u~mužov dosahuje zrelý stav vo veku 15 rokov a u~žien vo veku 12 rokov \cite{farkas1992growth}.


\subsection*{Výška a šírka tváre}
Norquay et al. \cite{norquay} vyhodnocoval trojrozmerné profily tváre a analyzoval rozdiely vo veľkosti a tvare počas rastu a vývoja. Priemerné trajektórie rastu tváre ukázali hlavne vertikálný rast s~rozdielmi medzi mužmi a ženami.
Vo veku piatich rokov je šírka tváre viac vyvinutá, ako jej výška. Napríklad v~tomto veku dosahuje šírka dolnej čeľusti u~chlapcov 89.8~\% hodnôt dospelého človeka a 94.1~\% hodnôt dospelého človeka u~dievčat. Pre porovnanie, výška tváre vo veku piatich rokov dosahuje u~chlapcov len 79.7~\% hodnôt dospelého človeka a u~dievčat 86.3~\%. Hĺbka hornej a dolnej čeľusti dosahuje vo veku piatich rokov 85~\% rozmerov dospelého človeka, pričom chlapci vykazujú o~niečo nižšie hodnoty.

Okolo siedmeho roku sa postupne vytráca detská zaokrúhlenosť tváre z~dôvodu stenčovania vrstvy podkožného tuku. Vo všeobecnosti, široká a krátka tvár novorodencov začína vertikálne rásť v~dôsledku zväčšujúcich sa dýchacích ciest, chrupu a rastu čeľusti.

\subsection*{Výška čela}
Výška čela je vzdialenosť medzi bodom trichion a nasion (tr-n). Zistilo sa, že výška čela u~mužov vo veku 4 až 5 rokov dosiahla 71~\% svojej veľkosti v~dospelosti a okolo 16. a 17. roku života bola stále len na úrovni 89~\% . Na druhej strane, u~žien vo veku 4 až 5 rokov dosiahlo čelo 80~\% svojej dospelej veľkosti a vo veku 14 až 16 rokov bolo kompletné na 97~\% \cite{sforza2014three}.

\subsection*{Pery}
Proporcie pier u~dievčat dosahujú  95~\% ich hodnôt v~dospelosti vo veku 13 - 14 rokov a u~chlapcov vo veku 15 - 18 rokov. Okrem toho sa ukázalo, že horná pera dosahuje proporcie dospelého človeka skôr ako ako dolná pera. U~mužov aj u~žien sa hrúbka hornej pery zmenšuje po dosiahnutí veku 18 rokov. 

\section{Zhrnutie}

Antropometria ľudskej tváre zohráva významnú úlohu v~mnohých odvietviach ako lekárstvo, plastická chirurgia ale aj v~počítačových vedách pri spracovaní obrazu, prístupových zariadeniach, ktoré využívajú detekciu a rozpoznávanie tváre alebo počítačovej grafike. Antropometrické body slúžia na presnú identifikáciu kľúčových častí na tvári ako sú nos, oči, obočie alebo pery. Podľa antropometrických bodov a vzdialenosťami medzi nimi vieme určiť významé miery, ktoré sa s~pribúdajúcim vekom a zmenami tvaru lebky menia. Tieto zmeny sa riadia všeobecným modelom vývoja tváre, ale počas vývoja ľudskej tváre sú ovplyvnené mnohými faktormi, ktoré môžu spôsobiť neproporcionálne zmeny tvaru a štruktúry tváre. 

\chapter{Spracovanie obrazu a strojové učenie}
\label{ml}

V~tejto kapitole sa budeme venovať strojovému učeniu, konkrétne algoritmom strojového učenia, ktoré využívajú spracovanie obrazu a počítačové videnie k~detekcii tváre. Detekcia tváre je zvyčajne prvým krokom v~aplikáciách, ktoré používajú sledovanie, analýzu a rozpoznávanie tváre a výrazne ovplyvňuje fungovanie ďalších krokov v~aplikácii. Rozpoznávanie tváre je rovnako dôležité aj pri analýze tváre tým, že nám pomáha zistiť, na ktoré časti obrázku sa treba zamerať, aby sme boli schopní určiť pohlavie, vek alebo pocity.  

Počítačové videnie a spracovanie obrazu sú dve oblasti, ktoré spolu veĺmi úzko súvisia a využívajú umelú inteligneciu k~získavaniu informácií z~obrázkov, videí a iných vizuálnych vstupov. Spracovanie obrazu aj počítačové videnie využívajú ako vstupné údaje obraz. Spracovanie obrazu sa zameriava najmä na spracovanie vstupných obrazov s~cieľom ich zlepšiť alebo pripraviť na iné úlohy (zvýšenie jasu, kontrastu, doostrenie obrazu, konverzia farebného obrazu do odtieňov sivej, orezanie obrazu). Počítačové videnie využíva strojové učenie na rozpoznávanie vzorov a extrakciu informácií zo vstupných obrázkov, s~cieľom správne im porozumieť a predvídať vizuálne vstupy podobne ako ľudský mozog. Počítačové videnie má využitie v~rôznych odvetviach, napríklad 
 v~doprave, kde vozidlá používajú počítačové videnie na sledovanie objektov a okolia, na asistenčný systém vodiča a autonómnu navigáciu. Bezpečnostné systémy a prístupové zariadenia využívajú rozpoznávanie tváre a detekciu objektov. Zdravotnícke zariadenia používajú klasifikáciu obrazu na identifikáciu a diagnostiku ochorení. 
 
\section{Strojové učenie}

Strojové učenie \cite{geron2017hands} je podmnožinou umelej inteligencie a je to veda o~schopnosti počítačov učiť sa, bez toho aby boli explicitne naprogramované. Algoritmy strojového učenia sú navrhnuté tak, aby boli schopné simulovať ľudskú inteligenciu učením sa z~okolitého prostredia. Strojové učenie sa skladá z~rôznych typov modelov strojového učenia a rôznych algoritmov. V~závislosti na povahe dát a požadovaného výsledku môžeme strojové učenie rozdeliť do~4~skupín: učenie s~učiteľom, učenie bez učiteľa, kombinácia učenia s~učiteľom a bez učiteľa a spätnoväzbové učenie. 

\subsection*{Učenie s~učiteľom}

Učenie s~učiteľom (\textit{supervised machine learning}) je prístup strojového učenia, kde sa na trénovanie algoritmu požíva dataset so správne označými dvojicami vstup - výstup. Na základe týchto dát sa potom algoritmus natrénuje tak, aby vedel pre daný vstup vyprodukovať korektný výstup. Do tejto skupiny patria algoritmy ako: 
\begin{itemize}
    \item Rozhodovacie stromy (\textit{Decision trees}),
    \item Náhodný les (\textit{Random Forest}),
    \item Algoritmus k-najbližších susedov (\textit{K-Nearest-Neighbors}),
    \item Neurónové siete.
\end{itemize}

\subsection*{Učenie bez učiteľa}

Učenie bez učiteľa (\textit{unsupervised machine learning}) sa používa pri dátach, ktoré neboli vopred klasifikované. Algoritmus teda nepríde na správny výstup, ale postupne skúma dáta a opisuje určité štruktúry v~týchto neoznačených dátach. Najčastejšími problémami, ktoré rieši učenie bez učiteľa, sú zhlukovanie a asociácia. Úlohou zhlukovania je spájať dáta do skupín, ktoré „majú niečo spoločné“. Cieľom asociácie je nájsť tzv. asociačné pravidlá, ktoré popisujú skupiny dát a vzťahy medzi nimi. Príkladom takéhoto algoritmu je napríklad zhlukovanie metódou najbližších stredov (\textit{K-Means Clustering}).

\subsection*{Kombinácia učenia s~učiteľom a bez učiteľa}

Tento model pozostáva z~kombinácie učenia s~učiteľom a učenia bez učiteľa (\textit{semi-supervised learning}). Na trénovanie algoritmu využívajú zvyčajne dáta s~veľkým množstvom neoznačených údajov a malým množstvom označených údajov. Menšia časť dát sa použije na trénovanie modelu, ktorý sa potom použije na označenie zvyšku neoznačených údajov.

\subsection*{Spätnoväzbové učenie}

Spätnoväzbové učenie (\textit{reinforcement learning}) je úplne odlišné. Učenie tu prebieha tak, že vytvoríme systém – agenta, ktorého nasadíme do prostredia a necháme ho nech sa učí prostredníctvom interakcie s~prostredím. Pri tomto druhu učenia sa využíva metóda odmeňovania želaného správania a trestania negatívneho správania. Táto metóda priraďuje želaným činnostiam kladné hodnoty, aby agenta povzbudila a neželaným činnostiam záporné hodnoty.



\section{Detekcia tváre}

Algoritmov, ktoré sa dnes používajú na detekciu tváre a fungujú veľmi dobre je široké spektrum. Vo všeobecnosti ich môžeme rozdeliť do dvoch skupín:

\begin{itemize}
    \item klasické algoritmy strojového učenia, ako napríklad Viola-Jones alebo HOG (\textit{Histogram of Oriented Gradients}),
    \item algoritmy hlbokých neurónových sietí, ktoré využívajú konvolúčne neurónové siete ako Fast R-CNN, RetinaFace alebo Yolo.
\end{itemize}

\noindent Časovú os, ktorá zobrazuje vývoj algoritmov na detekciu tváre, vidíme na obrázku \ref{timeline}.


\begin{figure}[h]
    \centering
    \scalebox{0.25}{\includegraphics{obrazky-figures/timeline-of-face-detection-methods.png}}
    \caption{Vývoj algoritmov na detekciu tváre za posledných 20 rokov \cite{face-detection-alg}.}
    \label{timeline}
\end{figure}



\section{Klasické algoritmy strojového učenia}

Tradičné metódy využívajú manuálne vytvorené prvky, ako sú hrany a deskriptory, v~kombinácii s~technikami strojového učenia, ako je analýza hlavných komponentov, lineárna diskriminačná analýza alebo Support Vector Machine (SVM). Tradičné techniky strojového učenia môžu byť užitočnejšie pri použití na menšie súbory vstupných údajov a poskytujú vysoký výkon pri nižšej spotrebe zdrojov. 

\subsection*{Viola-Jones algoritmus}
Viola-Jones \cite{viola2001rapid} je algoritmus strojového učenia, ktorý už je už pomerne starý ale dokáže detekovať tvár v~reálnom čase. Pri danom obraze v~odtieňoch sivej algoritmus analyzuje mnoho okien rôznych veľkostí a snaží sa detekovať cieľový objekt hľadaním špecifických príznakov v~každom okne. Algoritmus pozostáva zo 4 hlavných krokov,  ako výber Haarových príznakov, vytvorenie integrálneho obrazu, AdaBoost tréningu a vytvorenia kaskádových klasifikátorov.


\subsubsection*{Haarove filtre}

Haarové filtre nám umožňujú z~obrazu detekovať hrany, priame čiary a diagonálne čiary, ktoré môžeme použiť na identifikáciu objektu (ľudskej tváre). 
Haarové filtre pozostávajú zo škálovateľných obdĺžnikových rámcov zobrazených na obrázku \ref{haar_features}, ktoré sa používajú na porovnanie pixelov, konkrétne toho, ako tmavý je jeden voči druhému.
Súčet pixelov, ktoré ležia v~bielych obdĺžnikoch sa odpočíta od súčtu pixelov v~čiernom obdĺžniku.

\begin{figure}[h]
    \centering
    \scalebox{0.2}{\includegraphics{obrazky-figures/haar_features.png}}
    \caption{4 základné typy Haarových filtrov \cite{haar_features}.}
    \label{haar_features}
\end{figure}


\subsubsection*{Integrálny obraz}

Vzájomné sčítavanie a odpočítavanie pixelu po pixeli by bolo veľmi neefektívne a pomalé, preto sa na vypočítanie obdĺžnikových príznakov používa metóda integrálneho obrazu.
Integrálny obraz v~bode x, y je súčtom intenzity pixelov nad a naľavo od tohto bodu, vrátane intenzity daného bodu.

\[ 
ii(x, y)= \sum_{z' \leq z,y' \leq y} {i(x'y')}
\]

, kde $ii(x, y) $ je integrálny obraz v~bode $x,y$ a $i(x, y)$ je originálny obraz. Jeho výpočet je zobrazený na obrázku \ref{integral_image}.

\begin{figure}[h]
    \centering
    \scalebox{0.4}{\includegraphics{obrazky-figures/integral_image.png}}
    \caption{Hodnota integrálneho obrazu v~bode 1 sa vypočíta ako súčet pixelov v~obdĺžniku A, hodnota v~bode 2 ako A~+ B , v~bode ako 3 A~+ C a v~bode 4 ako A~+ B + C + D. Súčet pixelov v~obdĺžniku D bude teda 4 + 1 - (2 + 3) \cite{viola2001rapid}.}
    \label{integral_image}
\end{figure}


\subsubsection*{AdaBoost algoritmus}

AdaBoost algoritmus je algoritmus strojového učenia pre výber najlepšej podmnožiny príznakov z~pomedzi všetkých, ktoré detekujú tvár. Podľa \cite{viola2001rapid} by bolo nutné pre okno $24\times24$ pixelov vypočítať viac ako 160 000 príznakov, čo je veľmi neefektívne nakoľko len malá množina príznakov je užitočná pre identifikáciu tváre. Takéto relevantné príznaky sa nazývajú aj slabé klasifikátory. Každému z~nich je priradená váha a lineárnou kombináciou týchto slabých príznakov vzniká silný klasifikátor, ktorý má tvar:

\[ 
    {h(x)}
    =
    \left\{ 
    \begin{array}{cl}
       1 & \sum\limits _{t=1}^T {\alpha{_t}h{_t}(x) \geq \frac{1}{2}\sum\limits _{t=1}^T a{_t}}\\
       0 & \text{inak}
    \end{array}  
    \right.
\]
, kde $\alpha$ je váha slabého klasifikátoru $h{_t}(x)$, T je počet iterácií.


\subsubsection*{Kaskádové klasifikátory}

Kaskádový klasifikátor (\textit{Cascade classifier}) je mechanizmus, ktorý využíva rozhodovací strom, kde každý uzol pozostáva zo silného klasifikátora vytvoreného algoritmom AdaBoost. Vstup sa vyhodnocuje postupne po etapách a na každé čiastkové okno sa aplikuje séria klasifikátorov.


Ak klasifikátor pre určitú etapu vyprodukuje negatívny výsledok, vstup sa okamžite vyradí, čím sa eliminujú okná, ktoré tvár neobsahujú. Preto prvý uzol pozostáva z~jednoduchého klasifikátora s~vysokou mierou detekcie, ktorý vyradí veľký počet čiastkových okien hneď na začiatku. Pokiaľ klasifikátor vyprodukuje pozitívný výsledok, aplikuje sa naň ďalší klasifikátor atď. Tento postup je zobrazený na obrázku \ref{cascade_cls}.

\begin{figure}[H]
    \centering
    \scalebox{0.4}{\includegraphics{obrazky-figures/cascade_classifier.jpg}}
    \caption{Schéma kaskádového klasifikátoru.}
    \label{cascade_cls}
\end{figure}

Viola-Jones algoritmus má podľa \cite{hog} niekoľko nedostatkov. Je síce pomerne rýchly ale nakoľko je už cca. 15 rokov starý, pri spracovávaní veľkého množstva dát na detekciu tvárí može nastať falošná detekcia tvárí, alebo úplné vynechanie tvárí, jednoducho kvôli zlému výberu parametrov pre jednotlivé obrázky.

\subsection*{HOG - Histogram oriantovaných gradientov}

Na detekciu objektov sa HOG \cite{dalal2005histograms} väčšinou používa v~spojení s~SVM (\textit{Support Vector Machines}).

Základom algoritmu deskriptora HOG je, že vzhľad objektu možno modelovať pomocou rozloženia gradientov intenzity v~obdĺžnikových oblastiach obrazu. Implementácia tohto deskriptora si vyžaduje rozdelenie obrazu na menšie časti nazývané bunky a potom sa pre každú bunku výpočíta histogram orientovaných gradientov pre pixely vrámci tejto bunky. 

\subsubsection*{Normalizácia obrazu}

Tento krok normalizácie môže zlepšiť výkonnosť deskriptora HOG a Existujú tri hlavné metódy normalizácie:


\begin{itemize}
    \item gama/power normalizácia: vypočíta sa ako $\log{p}$ každého pixelu p,
    \item normalizácia odmocninou: vypočíta sa ako $\sqrt{p}$ každého pixelu p,
    \item normalizácia rozptylom: vypočíta sa ako $ p' = \frac{(p - \mu)}{ \sigma}$, kde $\mu$ je priemer a $\sigma$ štandardná odchýlka vstupného obrazu.
\end{itemize}

\subsubsection*{Výpočet gradientu}

Na získanie gradientov použijeme konvolúciu:

\[
    G_{x} = I~\star D_{x} \quad a \quad G_{y} = I~\star D_{y}
\]
, kde I~je vstupný obraz, $D_{x}$ je filter v~smere x a $D_{y}$ je filter v~smere y.\\

\noindent Konečnú reprezentáciu veľkosti gradientu obrazu vypočítame ako:

\[
|G| = \sqrt{G_{x}^{2} + G_{y}^{2}}
\]

\noindent Orientáciu gradientu pre každý pixel vstupného obrazu možno potom vypočítať pomocou:
\[
\theta = \arctan2(G_{y}, G_{x})
\]

\noindent Pri daných parametroch |G| a $\theta$ môžeme teraz vypočítať histogram orientovaných gradientov.

\subsubsection*{Vážené hlasy v~každej bunke}

Keď máme veľkost magnitúdy a orientácie gradientu, ďalším krokom je rozdeliť obrázok na bunky a bloky.

Bunka je obdĺžniková oblasť definovaná počtom pixelov, ktoré patria do každej bunky. Napríklad, ak by sme mali obrázok s~rozmermi 128 x 128 a definovali by sme pixely na bunku ako $4\times4$, mali by sme $32\times32 = 1024$ buniek.
Nakoniec každý pixel prispeje do histogramu váženým hlasom - váha hlasu je veľkosť gradientu $|G|$ v~danom pixeli.

\subsubsection*{Normalizácia kontrastu v~blokoch}

Ak chceme zohľadniť zmeny osvetlenia a kontrastu, môžeme hodnoty gradientu lokálne normalizovať. Opäť potrebujeme zoskupiť bunky do väčších blokov. Je bežné, že tieto bloky sa prekrývajú, čo znamená, že každá bunka prispieva k~výslednému vektoru príznakov viac ako raz. Používa sa $2\times2$ alebo $3\times3$ buniek na blok a vo väčšine prípadov sa dosiahne primeraná presnosť.
Pre každú z~buniek v~aktuálnom bloku spojíme ich zodpovedajúce histogramy gradientu, po ktorých nasleduje normalizácia $L1$ alebo $L2$ celého spojeného vektora príznakov.

Nakoniec po normalizácii všetkých blokov vezmeme výsledné histogramy, spojíme ich a považujeme ich za náš konečný vektor príznakov.

\subsubsection*{Detekcia tváre s~využitím HOG}

Metóda používaní na trénovanie je nasledovná: trénovacia množina obsahuje P pozitívnych vzoriek (vzorky, ktoré obsahujú tvár) a N negatívnych vzoriek (vzorky, ktoré neobsahujú tvár), kde N > P. Z~oboch množín extrahujeme HOG deskriptor, získame tak deskriptor pre negatívne a pre pozitívne vzorky. Na pozitívnych a negatívnych vzorkách sa natrénuje algorimus, ktorý využíva Support Vector Machine (SVM).
Ďalším krokom je použitie metódy \textit{hard-negative mining}. Pre každý obrázok v~negatívnej trénovacej množine sa použije technika posuvného okna. V~každom okne sa vypočítajú deskriptory HOG a aplikuje sa na ne náš klasifikátor. Ak klasifikátor (nesprávne) klasifikuje dané okno ako tvár, vzniknú tak falošne pozitívne výsledky a tie sa uložia ako vektor príznakov spojený s~falošne pozitívnym políčkom spolu s~pravdepodobnosťou klasifikácie. 
Ako posledný krok sa vezmú falošne pozitívne vzorky nájdené počas fázy \textit{hard-negative mining}, zoradia sa podľa ich pravdepodobnosti a znovu sa natrénuje klasifikátor pomocou týchto negatívnych vzoriek.
 

\section{Algoritmy hlbokých neurónových sietí}

V~prístupe hlbokých neurónových sietí sa na detekciu tváre používajú konvolučné neurónové siete (CNN). Jedná sa o~špeciálny typ neurónovej siete, ktorá sa od klasických neurónových sietí odlišuje konvolúčnou a pooling vrstvou. Výhodou CNN je, že konvolúčna vrstva znižuje vysokú dimenzionalitu obrázkov bez straty ich informácií, preto sa veľmi často používajú v~aplikáciách na rozpoznávanie tváre alebo obrazu.
CNN pozostáva z~niekoľkých vrstiev obsahujúcich rôzne filtre, ktoré majú na starosti detekciu jednotlivých častí obrazu. Prvá vrstva sa snaží zamerať na široké vlastnosti, zatiaľ čo posledné vrstvy sa snažia detegovať veľmi špecifické vlastnosti. Algoritmy hlbokých neurónových sietí poskytujú vysokú presnosť a oproti tradičným algorimom strojového učenia sú neporovnateľne rýchlejšie a používajú sa aj v~mikroprocesoroch s~nízkym výpočtovým výkonom. Hlavnou výhodou metód hlbokých neurónových sietí je ich generalizácia, teda schopnosť modelu predikovať správne výsledky aj na dátach, na ktorých nebol natrénovaný.

\subsection*{Architektúra konvolúčnej neurónovej siete CNN}

Konvolučná neurónová sieť, označovaná ako CNN alebo ConvNet, je trieda neurónových sietí, ktorá sa využíva hlavne na spracovanie údajov s~topológiou podobnou mriežke, ako je napríklad obrázok.
CNN sú podtriedou hlbokých neurónových sietí, ktoré dokážu rozpoznávať a klasifikovať konkrétne prvky z~obrázkov a sú vďaka ich vysokej presnosi široko používané na rozpoznávanie obrazu a videí, klasifikácie obrazu, analýzu obrazu v~medicíne, počítačovom videní a taktiež pri spracovaní prirodzeného jazyka \cite{cnn_architecture}.\\

Architektúra CNN má dve hlavné časti:

\begin{itemize}
    \item konvolučnú časť, ktorá oddeľuje a identifikuje rôzne prvky obrazu v~procese nazývanom extrakcia príznakov (\textit{Feature Extraction}. Sieť extrakcie príznakov pozostáva z~mnohých párov konvolučných alebo pooling vrstiev,
    \item plne prepojená vrstva, ktorá využíva výstup z~procesu konvolúcie a predpovedá triedu obrazu na základe vlastností extrahovaných v~predchádzajúcich fázach.
\end{itemize}

Cieľom tohto CNN modelu extrakcie príznakov je znížiť počet príznakov prítomných vo vstupných dátach. Vytvárané sú nové príznaky, ktoré sumarizujú existujúce príznaky obsiahnuté v~pôvodných dátach. CNN pozostáva z~viacerých vrstiev, ako je znázornené na schéme \ref{cnn_architecture}.

\begin{figure}[H]
    \begin{center}
        \scalebox{0.7}{\includegraphics{obrazky-figures/cnn_architecture.png}}
    \end{center}
    \caption{Architektúra konvolúčnej neurónovej siete CNN. \cite{cnn_architecture_img}}
    \label{cnn_architecture}
\end{figure}


\subsubsection*{Konvolučná vrstva}

Táto vrstva je prvou vrstvou CNN, ktorá sa používa na extrakciu rôznych príznakov zo vstupných obrázkov. V~tejto vrstve sa vykonáva matematická operácia konvolúcie medzi vstupným obrazom a filtrom určitej veľkosti $M \times M$. Posúvaním filtra po vstupnom obraze sa vykoná bodový súčin medzi filtrom a časťami vstupného obrazu vzhľadom na veľkosť filtra ($M \times M$). 
Výstup sa označuje ako mapa prvkov (\textit{Feature Map}), ktorá nám poskytuje informácie o~obraze, ako sú napríklad rohy a hrany a táto mapa príznakov sa privádza do ďalších vrstiev, aby sa naučili niekoľko ďalších príznakov vstupného obrazu.  Konvolučné vrstvy zároveň zabezpečujú, aby priestorový vzťah medzi pixelmi zostal neporušený.

\subsubsection*{Pooling vrstva}

Po konvolučnej vrstve nasleduje pooling vrstva. Hlavným cieľom tejto vrstvy je zmenšiť veľkosť mapy prvkov, čím sa znižuje potrebné množstvo výpočtov. Realizuje sa to zmenšením spojení medzi vrstvami a nezávisle sa vykonáva na každej mape samostatne. Pooling v~podstate sumarizuje funkcie vytvorené konvolučnou vrstvou. Existuje niekoľko funkcií združovania, napríklad priemer obdĺžnikového okolia, norma $L2$ obdĺžnikového okolia a vážený priemer založený na vzdialenosti od centrálneho pixelu, najčastejšie sa využíva Max pooling, kde sa z~mapy príznakov vyberie najväčší prvok.

\subsubsection*{Plne prepojená vrstva (Fully Connected Layer FC) }

Neuróny v~tejto vrstve majú plnú konektivitu so všetkými neurónmi v~predchádzajúcej a nasledujúcej vrstve. V~tejto vrstve sa vstupný obraz z~predchádzajúcich vrstiev sploští a privedie do vrstvy FC. Sploštený vektor potom prechádza niekoľkými ďalšími vrstvami FC, v~ktorých prebiehajú operácie matematických funkcií a začína sa proces klasifikácie. Vrstva FC pomáha mapovať reprezentáciu medzi vstupom a výstupom.

\subsubsection*{Vrstva Dropout}

Pokiaľ sú všetky funkcie pripojené k~vrstve FC, može to spôsobiť nadmerné prispôsobenie v~súbore trénovacích údajov. Nadmerné prispôsobenie znamená, že model funguje veľmi dobre na trénovacích dátach ale zlyháva pri použití na nových neznámych údajoch. Tento problém sa rieši vrstvou Dropout, kde sa z~neurónovej siete počas procesu trénovania vynechá niekoľko neurónov, napríklad pri hodnote 0.3 sa z~neurónovej siete náhodne vyradí 30\% uzlov. Vynechanie uzlov tak vedie k~zlepšeniu výkonnosti modelu strojového učenia, pretože zabraňuje nadmernému prispôsobeniu tým, že zjednodušuje sieť.

\section*{Viacfázové a jednofázové detektory tváre}

Pri detektcii objektov sa používajú detektory s~dvoma základnými typmi architektúr. Rozdelujeme ich na jednofázové (\textit{single-stage}), ako napríklad R-CNN, Fast~R-CNN, Faster R-CNN a dvojfázové (\textit{two-stage})  detektory ako SSD, RetinaFace a YOLO. Dvojfázové detektory rozdeľujú proces detekcie na dve fázy, fázu návrhu kandidátskych oblastí RoI (Regions of Interest) a na fázu, kde sa kandidátske oblasti klasifikujú a upresňujú. Na druhej strane jendofázové detektory používaju jednu konvolúčnú neurónovú sieť, ktorá priamo vytvára kandidátske okná a klasifikuje ich v~jednej fáze, teda jedných prechodom obrazu touto sieťou. Na obrázku \ref{multi_single_stage} je zobrazená schéma dvojfázovej architektúry siete \textit{Faster R-CNN} a jednofázovej siete \textit{RetinaNet}.

\begin{figure}[H]
    \centering
    \scalebox{0.3}{\includegraphics{obrazky-figures/single_multi_stage.png}}
    \caption{Schéma dvojfázovej architektúry siete \textit{Fater R-CNN} a jednofázovej siete~\textit{RetinaNet} \cite{single_multi_stage}.}
    \label{multi_single_stage}
\end{figure}

\subsection*{Faster R-CNN}

Faster R-CNN \cite{ren2015faster} je dvojfázová konvolúčna neurónová sieť, ktorá je rozšírením R-CNN a Fast R-CNN. Pri R-CNN a Fast R-CNN sa na generovanie kandidátskych okien používa algoritmus \textit{selective search}, ktorý nahradila konvolúčna sieť RPN (\textit{Region Proposal Network}). V~prvej fáze RPN používa konvolučný prístup s~posuvným oknom na generovanie návrhov kandidátskych okien. Vygenerované návrhy sa orežú pomocou vrstvy RoI (Region of Interest) a v~druhej fáze sa pre každý návrh vykoná záverečná klasifikácia. Detailnejšia schéma architektúry Faster R-CNN je zobrazená na obrázku \ref{two_stage}.

\begin{figure}[H]
    \centering
    \scalebox{0.3}{\includegraphics{obrazky-figures/Fastes_RCNN.jpg}}
    \caption{Schéma dvojfázovej architektúry siete \textit{Fater R-CNN} \cite{ren2015faster}.}
    \label{two_stage}
\end{figure}

% \subsection*{MTCNN - Viacúrovňová kaskádovitá konvolúčna neurónová sieť}

% Tento model zahŕňa 3 úrovne konvolúčnych neurónových sietí P-Net, R-Net a O-Net. Vstupný obraz sa najskôr naškáluje na rôzne mierky a vytvorí sa tak pyramída obrazov rôznych veĺkostí, ktorá je vstupom do prvej úrovne P-net.

% \subsubsection*{P-net (Proposal Network)}

% Jedná sa o FCN (fully convolutional network), ktorá sa používa na získanie kandidátskych okien a ich príslušných regresných vektorov. Tieto vektory sa potom použijú na upresnenie kandidátov. Nakoniec sa použije NMS (Non-Maximum Suppression), aby sa zlúčili kandidáti, ktorí sa silno prekrývajú.

% \subsubsection*{R-net (Refine Network)}

% Po prvej fáze sa každý z kandidátov zaradí do siete R-Net. Ide o zložitejšiu sieť CNN, než aká bola použitá v prvej etape a slúži na filtrovanie a výber vysoko presných kandidátskych okien. Táto sieť tiež využíva regresné vektory ohraničenia na vykonanie kalibráci a NMS na zlučovanie kandidátov.

% \subsubsection*{O-net (Output Network)}

% Táto fáza je podobná sieti R-Net, ale táto sieť sa zameriava na podrobnejší opis tváre a zobrazí pozície piatich tvárových orientačných bodov pre oči, nos a ústa.

% \begin{figure}[H]
%     \centering
%     \scalebox{0.35}{\includegraphics{obrazky-figures/MTCNN.png}}
%     \caption{Architektúra MTCNN. \cite{zhang2016joint}}
%     \label{timeline}
% \end{figure}

\subsection*{RetinaFace}

RetinaFace \cite{deng2020retinaface} je jednofázový detektor tváre, ktorý umožnuje lokalizovať tvár v~rôznych mierkach na úrovni pixelov. RetinaFace pozostáva z~kaskádovej regresie, trénovanej pomocou viaczložkovej chybovej funkcie (\textit{multi-task loss function}) skladajúcej sa z:

\begin{itemize}
    \item binárnej chyby detekcie tváre (\textit{binary softmax loss}), 
    \item regresnej chyby ohraničenia tváre (\textit{face box regression loss}),
    \item regresnej chyby piatich významných orientačných bodov na tvári (\textit{facial landmark regression loss}),
    \item regresnej chyby popisujúcej kvalitu detekovaného ohraničenia a bodov na tvári (\textit{dense regression loss}).
\end{itemize}

\begin{figure}[h]
    \centering
    \scalebox{0.25}{\includegraphics{obrazky-figures/retinaFace.png}}
    \caption{Princíp detekcie tváre RetinaFace. \cite{deng2020retinaface}}
    \label{timeline}
\end{figure}

\subsection*{Yolo}
Hlavným prínosom Yolo siete \cite{yolo}  je detekcia objektov v~reálnom čase. Celý model pozostáva iba z~jednej konvolúčnej neurónovej siete a obrázok ňou prechádza iba raz.
Myšlienka siete Yolo spočíva v~rozdelení vstupného obrazu na mriežku o~veľkosti $S \times S$. Ak stred objektu spadá do bunky mriežky, táto bunka mriežky je zodpovedná za detekciu tohto objektu. Každá bunka mriežky predikuje B ohraničujúcich polí a skóre dôveryhodnosti pre tieto polia. Hodnoty dôveryhodnosti vyjadrujú, nakoľko je model presvedčený, že pole obsahuje objekt, a nakoľko presný je podľa neho predpovedaný box.

Yolo predpovedá viac ohraničujúcich boxov na jednu bunku mriežky. V~čase trénovania, Yolo vyberie jedno predikované políčko, ktoré bude zodpovedné  za predpovedanie objektu, podľa najvyššej hodnoty IOU (prienik nad zjednotením) medzi predikovaným políčkom a skutočným. Každé predikované políčko sa zlepšuje v~predpovedaní určitých veľkostí, pomerov strán alebo tried objektov.

Pri detekcii objektov sa často pre objekt vytvorí viacero ohraničujúcich boxov. Tieto ohraničujúce boxy sa môžu prekrývať alebo sa môžu nachádzať na rôznych miestach, ale všetky predstavujú ten istý objekt. NMS (Non maximum supression) sa používa na identifikáciu a odstránenie nadbytočných ohraničujúcich boxov, aby bol na výstupe len jedenohraničujúci box pre každý objekt na obrázku. Tento postup je zobrazený na obrázku \ref{yolo_diagram}. Yolo siete dosahujú oproti RetinaNet vyššiu rýchlosť ale nie sú také presné.

\begin{figure}[h]
    \centering
    \scalebox{0.32}{\includegraphics{obrazky-figures/yolo.png}}
    \caption{Yolo diagram \cite{deng2020retinaface}.(1) Rozdelenie vstupného obrazu do mriežky, (2) predikcia ohraničujúcich boxov pre každú bunku, (3) odstránenie nadbytočných ohraňučujúcich boxov.}
    \label{yolo_diagram}
\end{figure}

% \subsection*{YuNet}

% Jedná sa o veľmi jednoduchý a rýchly model na detekciu tváre, ktorý bol v októbri 2021 pridaný do knižnice OpenCV. Pri algoritmoch ako HOG, Haarove príznaky, CNN, ktoré OpenCV ponúka vzniká problém, že síce fungujú dobre pri frontálne natočených tvárach ale pri otočených alebo mierne zamaskovaných tvárach už príliš efektívne nie sú. Práve tento problém vyriešil YuNet detektor tváre, založený na CNN konvolučných neurónových sieťach, ktorý vyvinuli Chengrui Wang a Yuantao Feng \cite{facedetect-yu}. Hlavnou výhodou oproti RetinaFace je vyššia rýchlosť detekcie.

\section{Detekcia významných bodov tváre}

Detekcia orientačných bodov tváre je nevyhnutnou súčasťou analýzy vývoja tváre v~čase, nakoľko vieme podľa nich určiť presnú polohu oblastí na tvári ako sú oči, nos, pery a pod. Rovnako vieme určiť vzdialenosti týchto bodov, ktoré sa vekom prirodzene menia a analyzovať tieto zmeny. Dnes existuje veľa rôznych nástrojov, ktoré nám poskytujú veľmi detekciu týchto bodov, ako napríklad knižnica Dlib alebo Mediapipe.

\subsection*{Dlib}

Dlib je \textit{C++ knižnica}, ktorá obsahuje nástroje a algoritmy strojového učenia. Jedným z~týchto nástrojov je aj predtrénovaný detektor tvárových bodov, ktorý je implementovaný pomocou regresných stromov \cite{kazemi2014on}. Táto metóda pozostáva z~tréningovej sady obrázkov, kde už sú ručne označené body, ktoré špecifikujú $(x, y)$ súradnice oblastí každej tvárovej štruktúry a pravdepodobnosti vzdialenosti medzi pármi vstupných pixelov.

Vzhľadom na tieto tréningové údaje je súbor regresných stromov trénovaný na odhadnutie pozícií orientačných bodov tváre priamo zo samotných intenzít pixelov. Konečným výsledkom je detektor orientačných bodov tváre, ktorý možno použiť na detekciu orientačných bodov tváre v~reálnom čase. Tento predtrénovaný detektor bodov tváre dokáže detekovať polohu 68 súradníc bodov, ktoré sa mapujú na štruktúry tváre.

\subsection*{Mediapipe}

Mediapipe je open source knižnica od spoločnossti Google, ktorá ponúka rôzne nástroje na báze strojového učenia pre rôzne problémy počítačového videnia. Face Mesh \cite{mediapipe} je detektor významných bodov na tvári, ktorý pozostáva z~dvoch hlbokých neurónových sietí. Prvá neurónová sieť pracuje s~celým vstupným obrazom a určuje jednodlivé oblasti na tvári a druhá neurónová sieť pracuje už s~jednotlivými časťami tváre, vrámci ktorých predikuje 3D povrch pomocou regresie. Na rozdiel od knižnice Dlib tento model určuje 468 súradnic v~3D priestore.

\section{Aplikácie, ktoré využívajú starnutie tváre}

Starnutie tváre využíva dnes veľké množstvo aplikácií v~rôznych oblastiach ako forenzné vedy, pri identifikácii dlhodobo nezvestných osôb alebo rekonštrukcie tvárí. Synteticky zostarnutie tvárí hercov sa vo veľkom používa aj vo filmovej produkcii.

\subsection*{Predikcia veku v~prípade nezvestných osôb}
Vedci z~Washingtonskej univerzity vyvinuli softvér \cite{kemelmacher2014illumination}, ktorý dokáže z~obrázku tváre malého dieťaťa automaticky predikovať, ako bude vyzerať v~neskoršom období jeho života až do 80. roku života. Tento softvér funguje aj na fotkách s~premenlivým osvetlením a výrazmi. Podobé techniky vekovej progresie zaznamenali významný úspech pri riešení prípadov nezvestných detí, keď boli osoby rozpoznané po mnohých rokoch na základe snímok s~vekovou progresiou.

Algoritmus pracuje na nasledovnom princípe: určí priemerné usporiadanie pixelov z~tisícov náhodných internetových fotografií tvárí rôznych vekových kategórií a pohlaví. Algoritmus potom nájde zhodu medzi priemermi z~každej skupiny a vypočíta priemernú zmenu tvaru a vzhľadu tváre medzi vekovými kategóriami. Tieto zmeny sa potom aplikujú na novú fotografiu dieťaťa s~cieľom predpovedať, ako bude vyzerať v~každom ďalšom veku až do 80 rokov.

\begin{figure}[h]
    \centering
    \scalebox{0.4}{\includegraphics{obrazky-figures/face_progression.jpg}}
    \caption{Fotografia dieťaťa (úplne vľavo) je rozdelená podľa veku do dvojíc, kde jedna fotografia (vľavo v~každej dvojici) je vygenerovaná algoritmom a porovnaná so skutočnými fotografiami tej istej osoby v~príslušnom veku (vpravo v~každej dvojici) \cite{kemelmacher2014illumination}.}
\end{figure}

\subsection*{Využitie starnutia vo filmovej produkcii}

Spoločnosť Disney Research Studios vytvorila neurónovú sieť k~zostarnutiu tváre FRAN (\textit{Face Re-Aging Network}) \cite{zoss2022production}, svoj najnovší pokrok v~oblasti vizuálnych efektov, ktorý využíva neurónové siete na vytvorenie prvej praktickej, plne automatickej a produkčne pripravenej metódy na zostarnutia tvárí vo videozáznamoch. Takéto digitálne stvárnenie tvárí vo videu je v~oblasti filmov a reklamy čoraz bežnejšie. Prevládajúci pracovný postup 2D maľovania si však často vyžaduje manuálnu prácu po jednotlivých snímkach, ktorá môže trvať niekoľko dní. Riešenie tohto problému pomocou viacúrovňovej neurónovej siete FRAN uľahčuje prácu, znižuje náklady a zároveň zlepšuje realistickosť efektu.

Na vytvorenie siete FRAN výskumníci spoločnosti \textit{Disney} náhodne vygenerovali tisíce príkladov synteticky zostarnutých tvárí vo veku od 18 do 85 rokov pomocou siete StyleGAN2. S~týmito tréningovými údajmi sa nerónová sieť FRAN naučila všeobecné princípy o~tom, ako sa mení vzhľad človeka s~vekom. FRAN  potom dokáže aplikovať tieto naučené princípy starnutia na skutočných hercov pohybe, na snímku po snímke.

\begin{figure}[H]
    \centering
    \scalebox{0.4}{\includegraphics{obrazky-figures/FRAN.png}}
    \caption{Pri aplikácii na snímky videa sa dokáže FRAN vyrovnať s~rôznou hĺbkou a polohou hlavy v~zábere, ako aj s~rôznymi pózami hlavy a zmenami svetelných podmienok \cite{kemelmacher2014illumination}.}
\end{figure}

\section{Zhrnutie}

Detekcia tváre z~obrazu a následná extrakcia významných orientačných bodov sú neodmysliteľnou súčasťou analýzy starnutia ľudskej tváre, ktoré využívaju nástroje strojového učenia a spracovania obrazu. Dnes máme k~dispozície veľmi veľa algoritmov na detekciu tváre, ktoré využívajú rôzne prístupy a možeme ich rozdeliť na klasické algoritmy strojového učenie a algoritmy, ktoré na detekciu tváre využívajú konvolúčne neurónové siete. Obidva prístupy sa využívajú a každý algoritmus pracuje za určitých podmienoch lepšie alebo naopak menej presnejšie. Podľa vlastností vstupného obrazu ako osvetlenie, kvalita obrazu alebo čiastočné zamaskovanie tváre vieme vybrať algoritmus, ktorý za daných podmienok pracuje najlepšie. Z~detekovanej tváre následne môžeme pomocou nástrojov na extrakciu významných orientačných bodov detekovať významné časti na tvári.

Starnutie ľudskej tváre sa taktiež využíva v~rôznych oblastiach ako polícia a kriminalistika na pomoc pri vyhľadávaní nezvestných osôb, kde sme schopní predikovať výzor človeka v~neskoršom veku. Ďaľšie využitie majú aplikácie na starnutie vo filmovej podukcii, ktoré umožňujú umelé zostarnutie herca alebo naopak, vytvorenie jeho mladšej verzie.

\chapter{Návrh algoritmu a implementácia}
\label{navrh}

V~tejto kapitole bude opísaný návrh a implementácia algoritmu, ktorý analyzuje vývoj tváre v~čase. V~návrhu implementácie bude potrebné naskôr definovať body a rysy na tvári, ktoré budeme analzyovať a zároveň všetky kroky potrebné pre spracovanie vstupného datasetu. Vrámci implementácie opíšeme detailnejšie postup týchto krokov, zvolené nástroje a knižnice.

\section{Návrh implementácie}

Cieľom aplikácie je schopnosť implementovaného algoritmu predikovať ďalší vývoj tváre človeka na základe snímky jeho tváre, identifikovaného vekom. Schéma na obrázku \ref{pipeline} zobrazuje všetky kroky potrebné pre detekciu významných bodov na tvári a ich následne spracovanie pre ich ďaľšiu analýzu.\\

\begin{figure}[H]
    \centering
    \scalebox{0.3}{\includegraphics{obrazky-figures/pipeline.png}}
    \caption{Schéma zobrazujúca hlavné kroky spracovania vstupného datasetu \cite{fgnet, dlib_landmarks}.}
    \label{pipeline}
\end{figure}



\subsection*{Analyzované rysy tváre}

Pre našu analýzu bude potrebné vybrať rysy, ktoré sú reprezentované ako vzdialenosti medzi definovanými antropomentrickými bodmi. Na obrázku \ref{measurements} je vyznačených 10 vzdialeností, ktoré budeme analyzovať a v~tabuľke \ref{table_measurements} ich stručný popis. Vzdialenosti bodov sme vybrali na základe \cite{ramanathan2006modeling, machado2017new}, kedže sa jedná o~najvýznamnejšie rozmery pre antropometrické štúdie.




\begin{figure}[H]
    \centering
    \scalebox{0.39}{\includegraphics{obrazky-figures/measurements.png}}
    \caption{Vyznačenie analyzovaných rysov na tvári. \cite{face_template}}
    \label{measurements}
\end{figure}

\begin{table}[H]
        \begin{center}
        \begin{tabular}{ | c|c |}
         \hline
         Vzdialenosť     & Definícia  \\
         \hline
         en-en      & Vzdialenosť vnútorných kútikov očí. \\
         ex-ex      & Vzdialenosť vonkajších kútikov očí.\\
         zy-zy      & Šírka tváre meraná medzi najkrajnejšími bodmi lícnej kosti.\\
         go-go      & Vzdialenosť medzi najkrajnejšími bodmi dolnej čeluste. \\
         al-al      & Šírka nosa meraná medzi najkrajnejšími bodmi nosovej dierky. \\
         ch-ch      & Šírka úst meraná medzi kútikmi úst.         \\
         n-sn       & Výška nosu meraná medzi koreňom nosa a základnou nosovej prepážky.  \\
         sn-gna     & Výška dolnej časti tváre meraná medzi bodom nasion a gnathion.      \\
         sto-gna    & Výška dolnej čelusti meraná medzi bodmi stomion a gnathion.         \\
         n-gna      & Morfologická výška tváre meraná medzi bodmi nasion a gnathion.      \\   
         \hline
        \end{tabular} 
        \end{center}        
        \caption{Názov a definície jednotlivých rysov na tvári.} 
        \label{table_measurements}
\end{table}
        
\subsection*{Predspracovanie datasetu pre analýzu}

Aby sme mohli analyzovať jednotlivé rysy na tvári a ich zmeny v~priebehu starnutia bude potrebné vstupné dáta v~niekoľkých krokoch vhodne upraviť. Tieto úpravy budú zahŕňať kroky ako detekcia tváre zo snímok, následné orezanie a naškálovanie snímok, aby boli vrámci celého datasetu jednotné. Z~takto upravených snímok tvárí bude ďaľej potrebné detekovať body na tvári, ktoré sme si vopred určili a vypočítať vzdialenosti medzi nimi. Nakoniec budeme tieto vzdialenosti vrámci jednej osoby normalizovať.

\subsection*{Dataset snímok pre analýzu}

Analýza starnutia tváre bude prevedená na datasete poskytnutom Prírodovedeckou fakultou Masarykovej univerzity v~Brne. Dataset obsahuje snímky tvári 287 osôb vo vekovom rozmedzí od 0.25 až 25 rokov, z~ktorého boli odstránené 2 osoby z~dôvodu nedostatku snímok počas ich celého vývoja. Z~výsledného počtu osôb tvoria 142 ženy a 143 muži.
Následne budú z~datasetu výbrané len tie snímky, ktoré obsahujú aspoň 80\% dát v~rámci každej vekovej kategórie, nakoľko by nedostatočný počet dát v~nejakej z~nich výrazne skresloval výsledky. Podľa histogramu na obrázku \ref{missing_data}, ktorý vykresluje početnosť chýbajúcich dát v~rámci jednotlivých vekových kategórií, budeme brať do úvahy dáta vo veku od 0.75 do 17.5 vrátane. Všetky fotografie boli vytvorené v~laboratorných podmienkach, nasnímané z~frontálneho natočenia tváre oproti kamere, preto už ďaľšia frontalizácia tvárí nebude potrebná.

\begin{figure}[H]
    \begin{center}
        \scalebox{0.45}{\includegraphics{obrazky-figures/missing_data_hist.png}}
        \caption{Histogram zobrazujúci chýbajúce dáta vrámci jednotlivých vekových skupín.}
        \label{missing_data}
    \end{center}
\end{figure}

\subsection*{Spracovanie a naškálovanie snímok}

Nakoľko dataset obsahuje snímky, ktoré majú často nízku kvalitu, sú orotované alebo rozmazané bude potrebné ich naškálovať tak, aby boli v~rámci datasetu konzistentné a následne z~nich mohli detekovať body identifikujúce štruktúru tváre. Postup pozostává z~nasledovných krokov:

\begin{itemize}
    \item identifikácia štruktúry tváre v~jednotlivých snímkach,
    \item zarovnanie tváre na základe translácie a rotácie.
\end{itemize}

\subsubsection*{Detekcia tváre zo snímok}

Na detekciu alebo identifikáciu štruktúry tváre v~datasete snímok jednotlivcov použijeme detektor tváre RetinaFace \cite{deng2020retinaface} z~viacerých dôvodov. Náš dataset obsahuje snímky obsahujúce veľké množstvo šumu a RetinaFace dosahuje veľmi dobré výsledky a to aj v~zlých svetelných podmienkach, rôznych pózach, veľkostiach a natočeniach tváre, pri detekcii zakrytých tvárí a tvárí s~rôznymi výrazmi.

\subsubsection*{Zarovnanie tváre}

Cieľom zarovnania tváre bude transformovať snímku do výstupného súradnicového priestoru tak, aby všetky tváre v~celom datasete:

\begin{itemize}
    \item boli umiestnené v~strede výsledného obrazu,
    \item boli orotované tak, aby oči ležali na horizontálnej priamke (na rovnakých súradniciach \textit{y}),
    \item boli naškálované (zmenšené/zväčšené) tak, aby veľkosť tvárí v~rámci datasetu bola približne rovnaká.
\end{itemize}

\noindent Príklad vstupnej snímky a tej istej snímky po orotovaní a zarovnaní je zobrazený na obrázku \ref{scaled}.

\begin{figure}[H]
    \centering
    \scalebox{0.4}{\includegraphics{obrazky-figures/scaled.jpg}}
    \caption{Originálna snímka tváre (vľavo) a výsledný obraz po zarovnaní (vpravo). \cite{fgnet}}
    \label{scaled}
    \end{figure}

\subsection*{Detekcia bodov na tvári}

Po zarovnaní sú všetky snímky z~datasetu  pripravené tak, aby sme z~každého obrazu tváre mohli detekovať jej významné body. Na detekciu bodov na tvári sme zvolili predtrénovaný detektor bodov z~knižnice Dlib, ktorý určuje polohu 68 súradníc bodov charakterizujúcich tvárové štruktúry ako nos, oči, obočie, ústa a čelusť. Z~nich vyberieme 16 bodov, ktoré budeme potrebovať pre analýzu a sú zobrazené na obrázku \ref{16points}.

    \begin{figure}[H]
        \centering
        \scalebox{0.5}{\includegraphics{obrazky-figures/defined_lnd.jpg}}
        \caption{16 presne definovaných bodov, ktoré budeme analyzovať. \cite{fgnet}}
        \label{16points}
    \end{figure}



\subsection*{Výpočet a normalizácia najvýznamnejších rysov na tvári}
\label{normalization_section}


Každú vzdialenosť dvoch bodov zobrazených na obrázku \ref{measurements} bola vypočítame ako euklidovskú vzdialenosť dvoch bodov podľa nasledovného vzorca:

\[
    d_{(x, y)} = \sqrt{(x_2 - y_2) + (x_1 - y_2)},
\]

Takto získané vzdialenosti budeme následne normalizovať vzdialenosťou bodov \textit{en-en} (vnútoré kútiky očí), aby sme dosiahli konzistenciu medzi snímkami v~rámci veku.
Podľa \cite{farazdaghi2017backward, ramanathan2006modeling} sa vzdialenosť vnútorných kútikov očí zmení od narodenia do 11. roku života o~20\% a od 11. roku ostáva stabilná. Vychádzajúc z~týchto štúdií vieme určiť hodnoty tejto vzdialenosti v~danom veku, ktoré sú ale diskrétne a my by sme ich potrebovali mať spojité, preto skúsime nájsť funkciu, ktorá dobre aproximuje vývoj \textit{en-en} vo veku od 0 do 11 rokov. Na základe naších pokusov sme zvolili funkciu v~tvare:

\[
    y = \frac{a}{1 + e^{-x \cdot c + d}} + b,
\]

, kde parametre a, b, c, d nájdeme pomocou metódy najmenších štvorcov na základe hodnôt zo šúdií \cite{farazdaghi2017backward, ramanathan2006modeling}. Výsledné hodnoty sú $a = 0.21, b = 0.78, c = 0.54, d = 2.57$ a priebeh tejto funkcie v~závislosti od veku je zobrazený na obrázku \ref{normalization}.

Po normalizovaní všetkých hodnôt prípadné chýbajucé hodnoty doplneníme metódou lineárnej interpolácie a veľké výkyvy v~hodnotách vyhladíme použitím metódy kĺzavého priemeru. Po normalizácii vzdialeností  dvoch bodov (podelení vzdialenosti hodnotou en-en) ďalej už nehovoríme o~samotnej vzdialenosti dvoch bodov ale o~pomere tejto vzdialensti ku v~vzdialenosti \textit{en-en}. Pre jednoduchosť budeme v~ďaľšej práci a označení kriviek v~grafoch používať označenie vzdialenosti dvoch bodov resp. rysy.

\begin{figure}[H]
    \centering
    \scalebox{0.5}{\includegraphics{obrazky-figures/normalization.png}}
    \caption{Vývoj vzdialenosti medzi bodmi \textit{en-en} (vnútorné kútiky očí) v~zásvislosti od veku.}
    \label{normalization}
\end{figure}

\section{Implementácia}

V~rámci implementácie sme použili ako programovací jazyk \textit{Python} a jednotlivé časti sú rozdelené do viacerých skriptov vo forme \textit{Jupyter notebookov}. Ako nástroj na manipuláciu s~dátami a ich ukladanie do tabuliek sme použili knižnicu \textit{Pandas} a pre vykreslovanie grafov knižnicu \textit{Matplotlib}.

\subsection*{Skrity pre spracovanie snímok}
{\spaceskip  1.5em  \relax
Spracovanie vstupného datasetu snímok je implementovanné v~skripte }\\\textit{landmarks\_detection.ipynb}, ktorý zahŕňa detekciu tváre zo snímok, zarovnanie a následnú detekciu významných bodov na tvári. Všetky snímky sú spracovávané sekvenčne, pričom sa najskôr spracuje ich názov v~tvare \textit{\{id\}\_\{age\}.tif}, ktorý pozostáva z~indentifikátoru osoby na snímke a jeho veku. Ďalej sme snímky načítali pomocou knižnice \textit{OpenCV} a naškálovalovanie implementovali v~nasledovných krokov:

\begin{itemize}
    \item vstupný obraz sa prevedie do šedotónového, aby sa znížil počet dimenzií obrazu a z~neho sa detekuje tvár pomocou \textit{RetinaFace} detektoru, ktorý nám vráci súradnice ohraničujúceho boxu tváre,
    \item pre orotovanie, orezanie a vycentrovanie tváre v~rámci obrazu použili knižnicu \textit{imutils} \cite{imutils}, ktorá orotuje tvár podľa stredov očí tak, aby ležali na horizontálnej priamke. Tvár odiali/priblíži podľa vzdialenosti ľavého oka od ľavého okraju, ktorú sme nastavili na 35 \% šírky výsledného obrazu.
\end{itemize}

Z~naškálovaných snímok extrahujeme body použitím predtrénovaného detektoru bodov z~knižnice Dlib. Ten nám vráti pole 68 súradníc na tvári, ktoré si uložíme spolu s~\textit{id} a vekom, ktoré ich identifikujú.\\


Skript \textit{data\_preprocessing.ipynb} implementuje výpočet vzdialeností definovaných bodov, normalizáciu týchto vzdialenosti a následné vytriedenie dát. Vzdialenosti definovaných bodov, zobrazených na orázku \ref{10_measurements}, ktoré sme detekovali pomocou predošlého skriptu vypočítame, ako eklidovskú vzdialenosť dvoch bodov. Takto získané vzdialenosti normalizujeme vdialenosťou \textit{en-en} (vnútorné kútiky očí), ktorej hodnoty sme dostali vytvorením funkcie opísanej v~sekcii \ref{normalization_section}, ktorá nám modeluje jej priebeh.\\
Po normalizovaní hodnôt sme doplnili chýbajúce hodnoty metódou lineárnej interpolácie a veľké výkyvy v~hodnotách sme vyhladili metódy kĺzavého priemeru, kde sme nové hodnoty vypočítali podľa priemeru hodnôt v~okne o~veľkosti 3. Ďalej sme z~dát odstránili tie vekové kategórie, ktoré obsahujú menej ako 20 \% dát (viď obrázok \ref{missing_data}).


\subsection*{Skripty pre analýzu vývoja tváre}

V~skripte \textit{males\_females.ipynb} sme ako prvé priradili ku každému \textit{id} pohlavie a následne vypočítali počet mužov a žien. Vypočítali sme strednú hodnotu pre každý rys a pre každú vekovú kategóriu s~rozdielom medzi pohlaviami. Jej priebeh je vykleslený ako krivky na obrázku \ref{mean}. Na vykreslenie rozptylu dát sme potrebovali vypočítať najmenšiu a najväčšiu pravdepodobnú hodnotu, ktorú sme dostali ako:

\begin{align*}
    b_{lower} = Q_1 - 1,5 \cdot IQR,\\
    b_{upper} = Q_3 + 1,5 \cdot IQR
\end{align*}

, kde $Q_1$ je prvý kvartil, $Q_3$ tretí kvartil a $IQR$ kvartilové rozpätie (viď boxplot). Následne sme vypočítali percentuálny podiel maximálnej dosiahnutej hodnoty. V~našom datasete sa jedná o~hodnotu v~17,5 roku života pre každého človeka. Hodnoty sme vypočítali ako:

\begin{equation*}
    percentage_{age} = \frac{x_{age}}{x_{17,5}} \cdot 100
\end{equation*}

, kde $x_{age}$ je hodnota rysu v~danom veku a $percentage_{age}$ je jeho percentuálna hodnota. Vypočítali sme rozdiely medzi vekovými kategóriami a tým dostali percentuálne zmeny medzi nimi, ktoré sú vykreslené na obrázku \ref{npercentage}.


Vizualizácia pomocou UMAP je iplementovaná vrámci skriptu \textit{umap\_visualization.ipynb}, kde sú jednotlivé komponenty najskôr štandardne škálované na strednú hodnotu 0 a smerodajnú odchýlku 1. Týmto transformujeme komponenty do podobnej mierky. Následne použijeme UMAP, ktorý zdredukuje naše dáta z~10 na 2 komponenty, aby sme ich mohli graficky zobraziť (viď \ref{umap_all}, \ref{umap_48_id}, \ref{umap_age}).

{\spaceskip  1em  \relax
Implementácia výpočtu vzdialenostných matíc je obsiahnutá v~skripte}\\
\emph{distance\_matrices.ipynb}, ktoré boli výstupom skriptu \textit{data\_preprocessing.ipynb}. Najskôr sme vytvorili maticu vzdialeností pre \textit{id} osôb, čomu predchádzalo transformovanie dát do správneho tvaru. Vypočítali sme euklidovské vdialenosti cez všetky rysy a vek medzi dvojicami id. Dostali sme tak štvorcovú maticu o~rozmeroch $285 \times 285$, ktoré odpovedajú počtu osôb v~datasete. Takto vytvorenú maticu sme vizualizovali pomocou heat mapy.\\
Podobný postup sme zvolili aj pri vytvorení vzdialenostných matíc pre jednotlivé vekové kategórie, kde sme transformovali tabuľku podľa veku v~priemere pre všetky \textit{id}. Obidve matice sú zobrazené na obrázku \ref{id_age_dst}.
Ako posledné sme vytvorili matice podobností pre jednotlivé analyzované rysy. Pre ich výpočet sme použili hodnoty pre konkrétnu komponentu, ktorá reprezentuje jeden rys. Ich vizualizácia pomocou heat máp je znázornená na obrázku \ref{all_heatmaps}.

Skript \textit{nearest\_neighbors.ipynb} implementuje hľadanie podobností medzi snímkami v~datasete a podobností vrámci celkového vývoja osôb. Pomocou \textit{Nearest Neighbors}  sme našli ku každej snímke 30 iných snímok s~najpodobnejšími rysmi. Dostali sme tak 30 snímok zoradených podľa vzdialenosti (podobnosti), kde každá prináleží určitej triede (\textit{id}). Ďalej sme podľa hodnôt vzdialeností a ich príslušností do rovnakej triedy (\textit{id}), našli 10 \textit{id} najbližších ako: 

\begin{equation*}
    \sum_{i = 0}^{k_{id}} \frac{1}{{x_i}^2 + 1} 
\end{equation*}

, kde $k_{id}$ je množina všetkých výsledkov jednej triedy.
Grafické zobrazenie najbližších susedov vidíme na obrázku \ref{nearest_nbrs}. Následne sme zo vzdialenostnej matice vývoja vrámci id implementovanej v~skripte \textit{distance\_matrices.ipynb} vybrali ku každému \textit{id} 10 s~najmenšou vzdialenosťou. Výsledky získane pomocou najbližších susedov sme porovnali s~výsledkami z~matice podobností a vypočítali zhodu.

\subsection*{Skripty pre vizualizáciu vývoja tváre}

Výstupom našej analýzy je grafické zobrazenie zmien a vývoja jednotlivých rysov zo vstupnej snímky, ktoré je implementované v~skripte  \textit{visualize\_growth.ipynb}. Zo vstupnej snímky detekujeme tvár, extrahujeme príslušné body, vypočítame ich vzdialenosti a dostaneme tak 10 rysov, ktorých ďaľší vývoj chceme predikovať. Zároveň musíme definovať vek a pohlavie človeka na vstupnej snímke. Z~priemernej, minimálnej a maximálnej hodnoty rysov vyjadrených v~percentách si podľa pohlavia zadaného na vstupe načítame potrebné dáta. Tieto hodnoty reprezentujúce percentuálne zmeny rysov v~rámci veku aplikujeme na vstupné hodnoty rysov zo vstupnej snímky, čím vypočítame nové hodnoty rysov v~ďaľších vekových štádiách.\\
Vizuálne zobraziť posuvy jednotlivých bodov je trochu zložitejšie nakoľko berieme do úvahy, že tvár rastie horizontálne aj vertikálne a jednotlivé body sa rovnaho posúvajú vo viacerých smeroch. Máme súradnice detekovaných bodov zo vstupnej snímky a ako referenčné body sme si zvolili \textit{nasion} (koreň nosu) a \textit{en-en} (vnútorné kútiky očí), voči ktorým sme počítali jednotlivé posuvy. Pri zmenách v~horizontálnom smere je to pomerne jednoduché, nakoľko vypočítame len rozdiel rysu v~určitom veku oproti hodnote rysu zo vstupu a o~túto hodnotu posunieme bod vpravo a vľavo (prepočítame x-ové súradnice bodov). Pri zmenách rozmerov tváre vo vertikálnom smere musíme vziať do úvahy všetky body, ktoré sú týmito zmenami postihnuté a tak vypočítať zmeny v~posuve x-ovej aj y-ovej súradnice. Napríklad pri posuve bodu na špičke nosu v~smere y, musíme rovnako posunúť aj body na okrajoch nosu v~rovnakom smere. Na obrázku \ref{growth} sú vyznačené smery v~ktorých sme jednotlivé body posúvali.

V~skripte \textit{growth\_similarities.ipynb} sme hľadali osoby s~najpodobnejším a najodlišnejším vývojom. Našli sme ich zo vzdialenostnej matice, ktorá reprezentuje vzdialenosti osôb na základe ich vývoja. Najpodobnejší vývoj sme našli tak, že sme vybrali najmenšiu hodnotu v~tejto matici, rozdielnu od 0 (tá reprezentuje vzdialenosť osoby samej k~sebe) a k~nej príslušnú dvojicu \textit{id} a tým dostali osoby, ktoré majú najpodobnejší vývoj. Analogicky sme hľadali \textit{id} osôb s~najodlišnejším vývojom s~rozdielom, že sme vyberali najväčšiu hodnotu v~matici. Pre tieto osoby sme rovnako ako v~predošlom skripte graficky vykreslili ich vývoj.


\section{Zhrnutie}

V~tejto kapitole boli opísané všetky kroky potrebné pre správne spracovanie datasetu, ktorý budeme analyzovať. V~rámci návrhu bolo ako prvé potrebné definovať, ktoré antropometrické body sú pre nás podstatné a ktoré rysy budeme v~rámci starnutia tváre skúmať. Ďaľšie kroky zahŕňali detekciu tváre zo vstupnej snímky, následné naškálovanie, ktoré je podstatné z~hľadiska konzistencie snímok v~datasete a nakoniec detekciu jednotlivých bodov na tvári. Zo súradníc týchto bodov sme vypočítali ich vzdialenosti a tie následne normalizovali vzdialenosťou vnútorných kútikov očí, nakoľko je počas vývoja tváre najstabilnejší a vieme namodelovať jeho priebeh od narodenia až do dospelosti. Týmto spôsobom tak dostaneme z~každej snímky 10 rysov, ktoré následne budeme v~závislosti od veku analyzovať. Tieto kroky sme implementovali v~programovaciom jazyku Python a uviedli sme aj ďaľšie použité nástroje a knižnice. Podrobnejšie sme opísali aj postupy pri implementácii jednotlivých krokov návrhu, ako aj analýzu a výsledne vykreslenie predikcie vývoja.


\chapter{Výsledky a experimenty} 
\label{experimenty}

V~tejto kapitole sa budeme venovať analýze a experimentom prevedených na predspracovaných dátach (kapitola \ref{navrh}), kde sme hovorili predovšetkým o~spracovaní vstupných dát ako naškálovanie, normalizovanie a vyhladenie prípadných výchylok vo vstupnom datasete, ktoré by mohli skreslovať výsledky. Analyzovať budeme vývoj a zmeny desiatich tvárových rysov v~jednotlivých vekových štádiach s~rozdielmi medzi mužmi a ženami.

\section{Analýza vývoja tváre v~závislosti od veku}

Po vypočítaní strednej hodnoty pre každý rys v~závislosti od veku sme dospeli k~nasledovným výsledkom: v~skorom vekovom štádiu rastie tvár prevažne do šírky nakoľko vo~veku 6 rokov u~žien dosahuje rys \textit{zy-zy} (šírka tváre) už 94 \% hodnoty tohto rozmeru v~dospelosti, u~mužov je to 96 \%. Vzdialenosť \textit{go-go} (šírka dolnej čeluste) dosahuje u~žien aj mužov vo~veku 6 rokov 91 \% hodnoty tohto rozmeru v~dospelosti. Naopak v~neskoršom vekovom štádiu, keď už sa šírka tváre takmer ustálila, tak rast do dĺžky sa ešte výrazne mení. Od~9. až 13. roku sa vzdialenosť \textit{n-gna} (morfologická výška tváre) zväčší o~takmer 8 \% u~žien a u~mužov približne o~7 \%. Tieto percentuálne zmeny su zobrazené na obrázku \ref{npercentage}, kde môžeme rovnako vidieť, že najväščie zmeny v~raste nastali okolo veku 4 rokov a potom neskôr medzi 10. a 14. rokom. Postupne ako sa vek blíži k~dospelosti všetky hodnoty začínajú konvergovať k~nule, čo znamená, že zmeny v~tomto veku sú už minimálne.



\begin{figure}[H]
    \begin{center}
        \scalebox{0.3}{\includegraphics{obrazky-figures/percentage_growth.png}}
    \end{center}
    \caption{Percentuálne zmeny vo vývoji rysov u~mužov (vľavo) a žien (vpravo) v~závislosti od veku.}
    \label{npercentage}
\end{figure}



\section{Analýza desiatich rysov na tvári}
\label{10_measurements}

Krivky vývoja jednotlivých tvárových rysov v~závislosti od veku a pohlavia sú zobrazené na~obrázku \ref{mean}. Každá krivka, ktorá reprezentuje strednú hodnotu je ohraničená maximálnou a minimálnou hodnotou rozptylu pre daný rys.

\begin{figure}[H]
    \centering
    \scalebox{0.33}{\includegraphics{obrazky-figures/avg_males_females}}
    \caption{Krivky vývoja jednotlivých rysov zobrazujúce strednú hodnotu a k~nim farebnou plochou vykreslený rozptyl u~mužov (vľavo) a žien (vpravo) v~závislosti od veku.}
    \label{mean}
\end{figure}

Detailnejší vývoj tvárových rysov u~mužov a žien je vykreslený na~obrázku \ref{10_ratios}, kde je na~každom grafe zobrazený vývoj konkrétnej vzdialenosti v~závislosti od veku. Rovnako sme vykreslili krivku, ktorá zobrazuje strednú hodnotu a k~nej rozptyl vykreslený ako farbená plocha medzi jeho maximálnou a minimálnou hodnotou. 


\begin{figure}
    \centering
    \scalebox{0.58}{\includegraphics{obrazky-figures/10_ratios_growth_filled.png}}
    \caption{Krivky vývoja desiatich rysov zobrazujúcich strednú hodnotu pre mužov a ženy a k~nim farebnou plochou vykreslený rozptyl v~závislosti od veku.}
    \label{10_ratios}
\end{figure}

\subsubsection{Šírka nosu (al-al)}

Najväčšia zmena vzdialenosti bodov \textit{al-al} nastane vo veku od troch do šiestich rokov, kedy sa šírka nosu zväčší až o~13~\% u~žien a o~12~\% u~mužov, pričom vo veku 6 rokoch je táto hodnota u~žien na úrovni 94~\% hodnoty v~osemnástom roku a u~mužov na úrovni 93~\%. Od tohto veku ostáva táto vzdialenosť takmer stála, významnejšia zmena nastane až okolo dvanásteho až trinásteho roku, kedy nastane nárast o~približne 2~\% rovnako u~mužov a žien.

\subsubsection{Šírka úst (ch-ch)}

Vzdialenosť bodov \textit{ch-ch} sa úplne vyvinula už počas prvých šiestich rokov života rovnako u~mužov aj žien a od šiestich rokov ostáva stabilná. Tieto zmeny pomeru avšak môžu obsahovať mierny šum vzhľadom na fakt, že sa jedná o~vzdialenosť medzi vonkajšími kútikmi úst a výraz tváre osoby na snímke (osoba sa usmieva, mračí a pod.) výrazne ovplyvňuje výsledky.

\subsubsection{Vzdialenosť vnútorných kútikov očí (en-en)}

Podľa vzdialenosti vnútorných kútikov očí boli normalizované všetky vzdialenosti nakoľko je táto vzdialenosť najstabilnejšia počas celého vývoja človeka. Vzdialenosť bodov \textit{en-en} a~jeho vývoj v~závislosti od veku je detailnejšie opísaný v~odseku o~normalizácii \ref{normalization_section}.

\subsubsection{Vzdialenosť vonkajších kútikov očí (ex-ex)}

Vzdialenosť \textit{ex-ex} dosiahne najväčšiu zmenu medzi tretím a piatym rokom a to o~6~\% u~žien aj mužov, pričom u~mužov vo veku piatich rokov dosahuje táto vzdialenosť 93 \% hodnoty dospelého človeka. U~žien je to približne 90~\%. Zároveň sa u~mužov tento rys od ôsmeho roku už výrazne nemení ale u~žien dochádza k~miernemu rastu a vo výsledku vo veku osemnásť rokov je tento rys u~žien o~2.5~\% väčší ako u~mužov.

\subsubsection{Šírka dolnej čelusti (go-go)}

U~žien sa vzdialenosť bodov \textit{go-go} vyvíja približne do veku štrnástich rokov, kedy dosahuje 98~\% svojej hodnoty v~osemnástom roku života s~najväčším nárastom vo veku 3,5 až 6,5 roku. U~mužov je vývoj tohto pomeru veľmi podobný, pričom vo veku 6 rokov dosahuje až 91~\% hodnoty dospelého človeka a vo veku 14 rokov 98~\%.

\subsubsection{Šírka tváre (zy-zy)}

Vzdialenosť \textit{zy-zy} sa najvýraznejšie vyvýja do veku siedmych rokov, kedy dosahuje u~žien 95~\% hodnoty v~osemnástom roku života, u~mužov je to až 97~\% . Od siedmeho roku až do~osemnásteho sa šírka tváre zväčsuje už minimálne. 

\subsubsection{Morfologická výška tváre (n-gna)}

Najväčší nárast u~vzdialenosti \textit{n-gna} bol zaznamenaný už v~skorom vekovom štádiu od~prvého až piateho roku a to o~12~\% u~žien a 13~\% u~mužov. V~tomto veku dosahuje rys \textit{n-gna} u~žien 85~\% hodnoty dospelého človeka, u~mužov 84~\% a ďaľší výraznejší nárast nastal vo~veku dvanásť až štrnásť rokov.


\subsubsection{Výška nosu (n-sn)}

Najväčší nárast rysu \textit{n-sn} nastal od prvého do šiesteho roku, kedy jeho hodnota vzrástla o~takmer 19~\% u~žien aj mužov. U~mužov sa hodnota tohto rysu dostane na 96 \% vo veku deviatich rokov, u~žien dovŕši 96~\% trochu neskôr a to vo veku jedenásť rokov.

\subsubsection{Výška dolnej časti tváre (sn-gna)}

Vzdialenosť \textit{sn-gna} sa spolu so \textit{sto-gna} vyvýja v~najneskoršom vekovom štádiu nakoľko dosahuje 90~\% hodnoty dospelého človeka až vo veku desiatich rokov. Výraznejší nárast bol zaznamenaný u~žien od desiateho do trinásteho roku, kedy už hodnota dosahovala hodnotu dospelého človeka, u~mužov bol podobný nárast zaznamenaný od desiateho do štrnásteho roku života.

\subsubsection{Výška dolnej čelusti (sto-gna)}

Pre vzdialenosť \textit{sto-gna} bol zaznamenaný najväšší celkový nárast za celé analyzované obdobie od prvého do osemnásteho roku života. Výraznejšia zmena nastala u~mužov a to o~34~\%, u~žien o~31~\%.


\section{Analýza podobnosti vývoja tváre osôb}

Nakoľko dáta, ktoré analyzujeme sú viacdimenzionálne, vzniká tak problém ich zobraziť v~2D. Konkrétne obsahujú 10 komponent reprezentujúcich 10 rysov na~tvári. Pre vizualizáciu dát v~2D nájdeme nizkodimenzionálnu reprezentáciu naších dát pomocou UMAP (Uniform Manifold Approximation and Projection), čo nám umožnuje zredukovať 10 komponent na 2 a tie už sme schopní aj vizuálne zobraziť.


\subsection*{Podobnosť vo vývoji vrámci osôb}

Na najvyššej úrovni sme analyzovali vzťahy medzi celkovým vývojom tváre jednotlivcov a vieme určiť, ktoré osoby majú najpodobnejší, resp. najmenej podobný vývoj tváre medzi sebou (viď obrázok \ref{min_max_dst}). Obrázok \ref{umap_all} zobrazuje rozloženie 285 osôb na základe ich vývoja desiatich tvárových rysov. Jeden bod na mape teda reprezentuje jednu osobu a jej vývoj počas celého analyzovaného vekového obdobia. Na základe tohto zobrazenia sme zistili, že vývoj tváre je u~každej osoby individuálny, nie sú tam žiadne výrazné zoskupenia, ale body sú skôr rovnomerne rozložené v~priestore.

\begin{figure}[H]
    \begin{center}
        \scalebox{0.59}{\includegraphics{obrazky-figures/umap_embd_all.png}}
    \end{center}
    \caption{UMAP reprezentácia vývoja 285 osôb, kde jeden bod zobrazuje vývoj tváre jedného človeka počas celého analyzovaného vekového obdobia.}
    \label{umap_all}
\end{figure}

\subsection*{Podobnosti vrámci veku osôb}

Omnoho zaujímavejšie sú pre nás podobnosti a závislosti na veku osôb. Na obrázku \ref{umap_48_id} je zobrazených 48 rôznych osôb vo veku od jedného do osemnásteho roku. Všetky dáta sú farebne odlíšené podľa \textit{id} osoby, jeden bod teda zodpovedá tvárovým rysom jednej osoby v~určitom veku (jednej konkrétnej snímke). Pre lepšiu prehľadnosť sme na každom podgrafe zobrazili len 12 rôznych osôb. Nakoľko sme farebne odlíšili množinu snímok vo všetkých vekových kategóriách náležiacich určitému \textit{id}, vidíme určitú vekovú podobnosť. Množina bodov jednej farby vytvára vždy približne rovnaký útvar, čím sme zistili viditeľnú vekovú závislosť v~našich dátach.

\begin{figure}[H]
    \begin{center}
        \scalebox{0.38}{\includegraphics{obrazky-figures/umap_48_id.png}}
    \end{center}
    \caption{UMAP reprezentácia tvárových rysov pre konkrétny vek a ID osôb, farebne odlíšených podľa ID. Každý podgraf zobrazuje 12 osôb.}
    \label{umap_48_id}
\end{figure}

Pokiaľ dáta farebne odlíšime podľa veku (obrázok \ref{umap_age}) môžeme veľmi dobre vidieť podobnosti v~rámci veku. Body na mape, zobrazené rovnakou alebo podobnou farbou, sú zoskupené pri sebe, čo znamená výraznú podobnosť osôb v~rámci rovnakého veku. Na tejto mape rovnako vidíme aj výraznu zmenu tvaru zoskupenia bodov a to približne vo veku 11 rokov. Je to spôsobené skutočnosťou, že sme dáta normalizovali podľa vytvorenej funkcie \ref{normalization_section} vo veku od 0 až 11 rokov a v~našich dátach je výrazne viditeľná. 

\begin{figure}[H]
    \begin{center}
        \scalebox{0.5}{\includegraphics{obrazky-figures/umap_age.png}}
    \end{center}
    \caption{UMAP reprezentácia tvárových rysov pre konkrétny vek a ID osôb, farebne odlíšených podľa veku.}
    \label{umap_age}
\end{figure}

\subsection*{Vzdialenostné matice}
\label{distance_matrices}

Nad rovnakými dátami sme vytvorili maticu vzdialeností (\textit{distance matrix}), ktorá vyjadruje vzdialenosti medzi dvojicami objektov. Pre výpočet vzdialeností existuje mnoho spôsobov, v~našom prípade sme použili euklidovskú vzdialenosť. Ako prvú sme vytvorili distance matrix, ktorá vyjadruje celkové vzdialenosti medzi vývojom jednotlivých osôb, to znamená, že boli vypočítané vdialenosti cez všetky rysy a vek medzi dvojicami id. Druhá maticu vzdialeností nám vyjadruje vzdialenosti vývoja všetkých 10 rysov vrámci veku v~priemere pre všetky osoby.\\
K~vizualizácií týchto matíc podobnosti sme použili heat mapu, na ktorej môžeme oveľa lepšie vizuálne vidieť jednotlivé vzdialenosti. Na obrázku \ref{id_age_dst} vľavo je vykreslená heat mapa zobrazujúca prvú vzdialenostnú maticu, reprezentujúcu vzdialenosti vrámci id osôb. Farebná škála vyjadruje veľkosť vzdialenosti medzi vývojom tvárových rysov osôb, teda čierna farba odpovedá najmenšej vzdialenosti (najvyššia podobnosť) a biela najväčšej vzdialenosti. Heat mapa vpravo zobrazuje podobosti medzi jednotlivými vekovými kategóriami v~priemere pre všetky osoby, na ktorej veľmi pekne vidíme vysokú podobnosť vývoja tváre osôb v~rovnakých alebo podobných vekových kategóriách, čo nám zobrazuje čierna farba pozdĺž diagonály.

\begin{figure}[H]
    \begin{center}
        \scalebox{0.4}{\includegraphics{obrazky-figures/id_age_dst_matrices.png}}
    \end{center}
    \caption{Heat mapa (vľavo) zobrazujúca podobnosť vývoja vrámci osôb a heat mapa (vpravo) zobrazujúca podobnosť vrámci vekových kategórií.}
    \label{id_age_dst}
\end{figure}

Detailnejšie sa možeme pozrieť na vývoj jednotlivých pomerov \ref{all_heatmaps}, kde je pomocou heat mapy zobrazený každý pomer zvlášť. Na týchto mapách taktiež veľmi pekne vidíme, že rysy, ktoré súvisia so zmenou šírky (en-en, ex-ex, al-al, ch-ch, go-go, zy-zy) tváre sú výraznejšie v~skoršom vývoji, približne do siedmeho roku života. To vysvetľuje tmavá štvorcová plocha, ktorá nám reprezentuje pomerne veľkú podobnosť medzi vekovými kategóriami spadajúcich do tejto plochy. Najvýraznejšiu čiernu plochu môžeme vidieť pri vzdialenosti \textit{en-en}, pretože ten je od 11. roku stály. Pre porovnanie, vývoj pomerov súvisiacich so zmenou výšky tváre (n-gna, n-sn, sn-gna, sto-gna) výrazne pokračuje aj v~neskoršom vekovom štádiu medzi siedmym a štrnástym rokom.

\begin{figure}[H]
    \begin{center}
        \scalebox{0.37}{\includegraphics{obrazky-figures/heatmaps_measurements.png}}
    \end{center}
    \caption{Heat mapy všetkých desať tvárových pomerov zobrazujúcich podobnosť vývoja vrámci konkrétneho pomeru.}
    \label{all_heatmaps}
\end{figure}

\section{Predikcia ďaľšieho vývoja tváre}

Aby sme vedeli zo vstupnej fotografie a veku osoby predikovať jej ďaľší vývoj potrebujeme z~násho datasetu násť osobu s~najpodobnejšou krivkou starnutia, resp. najpodobnejším vývojom tváre. Táto úloha nie je jednoduchá, pretože predikovať vývoj do dospelosti iba na základe jednej fotografie je veľmi obtiažne. Cieľom je teda z~našej vstupnej fotografie nájsť spomedzi všetkých dostupných fotografií tie k~nej najpodobnejšie a id osôb, ktoré sme získali z~najpodobnejších fotografií overiť v~distance matrix, kde máme uložené podobnosti celkového vývoja osôb medzi sebou.

\subsection*{Hľadanie najpodobneších fotografií}

Najpododobnejšiu fotografiu, resp. osobu s~najpodobnejšími tvárovými pomermi sme hľadali pomocou najbližších susedov (\textit{Nearest Neighbors}) a to nasledovným spôsobom:

\begin{itemize}
    \item spomedzi všetkých fotografií z~datasetu sme ku každej našli 30 najbližších susedov zoradených podľa vzdialeností (30 najpodobnejších fotografií),
    \item následne sme pomocou vážených najbližších susedov (\textit{Weighted Nearest Neighbors}) \cite{weighted_voting} z~dostupných 30 vybrali 10, podľa hodnôt vzdialeností a ich príslušností do rovnakej triedy (\textit{id}).
\end{itemize}

Týmto spôsobom sme schopní vybrať na základe jednej fotografie 10 \textit{id} osôb s~najpodobnejšou krivkou starnutia.

\begin{figure}[H]
    \begin{center}
         \begin{subfigure}{0.43\textwidth}
             \centering
             \includegraphics[width=\textwidth]{obrazky-figures/30_nearest_nbrs.png}
             % \caption{30 najbližších susedov}
             % \label{30_nearest}
         \end{subfigure}
         \begin{subfigure}{0.43\textwidth}
             \centering
             \includegraphics[width=\textwidth]{obrazky-figures/10_nearest_nbrs.png}
             % \caption{10 najbližších susedov}
             % \label{10_nearest}
         \end{subfigure}
        \caption{Výber 10 najbližších vážených susedov (vpravo) spomedzi 30 najbližších susedov (vľavo).}
        \label{nearest_nbrs}
    \end{center}
\end{figure}


\subsection*{Presnosť algoritmu}

Náš algoritmus je schopný na základe jednej fotografie nájsť 10 id osôb s~najpodobnejším vývojom, avšak či je tento spôsob dostatočne presný si musíme nejako overiť. Najjednoduchší spôsob je overiť si zhodu v~našej už spomínanej matici vzdialeností \ref{distance_matrices}, ktorá reprezentuje podobnosti celkového vývoja osôb mezi sebou. Výsledky nášho algoritmu, kde sme zo~všetkých dostupných fotografií našli pomocou najbližších susedov 10 najpodobnejších, a~k~nim príslušné id, sme porovnali s~výsledkami zo~vzdialenostnej matice, kde sme rovnako pre každé id vybrali 10 najpodobnejších (tých, ktorí majú k~nemu najmenšiu vzdialenosť). 
Na~základe tohto porovnania sme zistili, že výsledky sa zhodujú len na 12.89\%. Tieto výsledky nie sú príliš prekvapivé nakoľko problém predikcie vývoja tváre osoby na základe jednej snímky je veľmi zložitý a vyžadoval by si aj rozsiahlejšiu analýzu.

\section{Grafická vizualizácia vývoja tváre}

Výstupom našej analýzy je grafické zobrazenie zmien a vývoja jednotlivých rysov zo vstupnej snímky. Pokiaľ dostaneme snímku tváre, vek a pohlavie osoby na tejto snímke, sme schopní na základe výsledkov našej analýzy zobraziť pravdepodobný ďaľší vývoj skúmaných rysov. Posuvy jednotlivých bodov sú vyznačené na obrázku \ref{growth}. \\

\begin{figure}[H]
    \begin{center}
        \scalebox{0.4}{\includegraphics{obrazky-figures/plot_growth.png}}
    \end{center}
    \caption{Smery posuvu jednotlivých bodov v~horizontálnom a vertikálnom smere.}
    \label{growth}
\end{figure}

Vývoj jednotlivých rysov osoby je zobrazený na príklade na obrázku \ref{growth_all}, kde je zo~snímky tváre osoby vo veku 3 rokov predikovaný ďaľší možný vývoj na základe strednej, minimálnej a maximálnej hodnoty rysov u~mužov až do veku 17 rokov. Z~týchto zobrazení veľmi pekne vidíme, že pokiaľ sme predikovali vývoj podľa minimálnej hodnoty, posuvy medzi jednotlivými bodmi boli veľmi malé. Naopak pri vykreslení vývoja podľa maximálnej hodnoty nastali pomerne veľké zmeny v~náraste jednotlivých rysov.

\begin{figure}[H]
    \begin{center}
        \scalebox{0.27}{\includegraphics{obrazky-figures/plot_growth_all.png}}
    \end{center}
    \caption{Vývoj rastu tváre podľa strednej hodnoty (vľavo), minimálnej hodnoty (v~strede), maximálnej hodnoty (vpravo) zobrazený v~5 vekových štádiach, kde vstupný vek sú 3 roky a cieľový 17 rokov.}
    \label{growth_all}
\end{figure}

Z~pohľadu extrémnych rozdielov vo vývoji sa opäť vrátime do našej UMAP, ktorá nám zobrazovala podobnosti vo vývoji všetkých osôb v~datasete. Na obrázku \ref{min_max_dst} sú označené dvojice s~najpodobnejším vývojom a s~najodlišnejším vývojom. Teraz je toto zobrazenie pomocou UMAP pre nás omnoho pochopiľnejšie, nakoľko osoby s~najpodobnejším vývojom majú od seba najmenšiu vzdialenosť oproti osobám s~najodlišnejším vývojom, ktoré sú od seba pomerne ďaľeko. Obrázok \ref{min_max_dst} (dole) vykresluje priebeh vývoja u~dvojice s~najpodobnejším vývojom, kde vidíme určitú analógiu medzi ich vývojom. Veľmi výrazná je zmena medzi 3. a 5. rokom, ktorá je takmer rovnaká u~oboch osôb a tým sme dospeli k~tomu, že počas tohto vekového obdobia došlo k~najväčšiemu progresu. Naopak u~dvojice s~najodlišnejším priebehom vývoja vidíme pomerne odlišné zmeny v~jednotlivých vekových štádiách.

\begin{figure}[H]
    \begin{center}
        \scalebox{0.55}{\includegraphics{obrazky-figures/umap_min_max_dst.png}}
    \end{center}
    \caption{Zobrazenie dvojice s~najpodobnejším vývojom (vyznačené červenou farbou) a najodlišnejším  (vyznačené žltou farbou).}
    \label{min_max_dst}
\end{figure}


\begin{figure}[H]
    \begin{center}
        \scalebox{0.4}{\includegraphics{obrazky-figures/plot_max_dst.png}}
        \scalebox{0.4}{\includegraphics{obrazky-figures/plot_min_dst.png}}
    \end{center}
    \caption{Najpodobnejší vývoj dvojice osôb (hore) a najodlišnejší vývoj dvojice osôb (dole).}
    \label{min_max_dst}
\end{figure}

\section{Zhrnutie}

V~tejto kapitole sme analyzovali vývoj 10 rysov, sledovali ich percentuálne zmeny od narodenia až do 18. roku a hľadali podobnosti medzi krivkami starnutia jednotlivých osôb. Dospeli sme k~záveru, že najväčšie zmeny v~horizontálnom raste tváre prebiehajú približne do 6. roku a ďalej sú už tieto zmeny minimálne v~porovnaní s~rastom vo vertikálnom smere, kedy sa tvár a po 6. roku stále výrázne predlžuje až do veku 13 rokov. Taktiež sme dospeli k~záveru, že vek má v~našich dátach pomerne veľký vplyv. Na základe podobnosti medzi snímkami sme hľadali krivky s~najpodobnejším vývojom a výsledky si overili v~matici vzdialeností, ktorá reprezentuje podobnosti kriviek celkového vývoja tváre. Rast tváre sme graficky vykreslili podľa priemerného vývoja u~mužov a žien ale aj podľa maximálnej a minimálnej hodnoty. Nakoniec sme porovnali dvojice osôb s najpodobnejším a najodlišnejším vývojom tváre.

\chapter{Záver}
\label{zaver}

Táto bakalárska práca uvádza problematiku starnutia tváre, predovšetkým v~oblasti spracovania obrazu a počítačového videnia a analyzuje starnutie tváre z~pohľadu antropometrických vlastností. Problémom všetkých aplikácii a softvérov, ktoré slúžia na predikciu starnutia ľudskej tváre je, že používajú na transformáciu tváre predtrénované neurónové siete a nie trasformáciu bodov na tvári, ktoré identifikujú tvárové štruktúry. Preto bol v~tejto práci navrhnutý a implementovaný algoritmus, ktorý analyzuje zmeny antropometrických rysov počas vývoja tváre.\\
Navrhnutý algoritmus detekuje tvár z~každej snímky, ktorú následne oreže, orotuje a naškáluje tak, aby boli všetky snímky vrámci datasetu jednotné. Následne detekuje z~tváre body, ktoré identifikujú tvárové štruktúry a podľa nich vypočíta vzdialenosti bodov pre vytvorenie 10 tvárových rysov. Tieto rysy potom normalizuje podľa vzdialenosti vnútorných kútikov očí, aby voli vrámci veku konzistentné.\\
Pomocou implementovaného algoritmu bola prevedená analýza na datasete poskytnutom Prírodovedeckou fakultou Masarykovej univerzity, ktorej výstupom sú krivky starnutia jednotlivcov v~datasete. Tieto krivky modelujú rôzne alternatívy vývoja tváre počas určitého vekového obdobia. Algoritmus na základe vstupnej snímky tváre človeka hľadá spomedzi všetkých kriviek starnutia tú najpodobnejšiu, ktorá by modelovala ďaľší priebeh vývoja tváre. Nakoľko je ale pomerne obtiažne predikovať z~jednej snímky človeka jej ďaľší vývoj, modelujeme ho pomocou priemerného vývoja tváre u~žien a mužov zo všetkých analyzovaných dát.\\
Vytvorený algoritmus je síce schopný predikovať vývoj tváre na základe priemerných hodnôt, stále je priestor na možné vylepšenia. Na to, aby algoritmus mohol spomedzi všetkých kriviek starnutia spoľahlivo určiť, podľa ktorej sa bude tvár ďalej vyvíjať existuje viacero možností. Jednou z~nich je vykonať rozsiahlejšiu analýzu, použiť zložitejšie algoritmy a~metódy na vyhľadávanie podobností medzi dátami alebo zväčšiť množinu výberu najpodobnejších kriviek.





%===============================================================================
