# Bakalárska práca - Analýza stárnutí obličeje


autor: Alžbeta Hrabošová

login: xhrabo14

---

Tento projekt implementuje analýzu vývoja tváre na datasete snímok tvárí. Na základe vykonanej analýzy predikuje vývoj tvárových rysov zo vstupnej snímky.


## Prerekvizity pre inštaláciu

Python 3.10

## Inštalácia

Z koreňového adresára príkazom `poetry install`
následne stiahneme predtrénovaný model `cd data && wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2`.


## Uživateľská príručka

Štruktúra algoritmu je rozdelená do Jupyter notebookov nasledovne:

- `landmarks_detection.ipynb` - Detekcia bodov z datasetu snímok. Na začiatku skriptu je potrebné definovať cestu k datasetu, ktorý musí mať nasledovnú štruktúru: v hlavnom adresári sa nachádzajú podadresáre so snímkami jednej osoby v rôznych vekoch. Názov snímky musí mať tvar `{id}_{age}.png`. Jednotlivé bloky notebooku musia byť spustené sekvenčne. Detekované body sa uložia vo forme csv súborov do vopred definovaného adresáru.
- `data_preprocessing.ipynb` - Tento skript načíta detekované body z predošlého skriptu a počíta vzdialenosti medzi definovanými bodmi. Tieto vzdialenosti následne normalizuje a normalizované hodnoty opäť uloží do csv súboru. V ďaľších krokoch sa doplnia chýbajúce hodnoty lineárnou interpoláciou a odstránia sa vekové skupiny, ktoré obsahujú menej ako 80% dát.
- `males_females.ipynb` -  V tomto skripte je analyzovaný vývoj tvárových rysov u žien a mužov. Jednotlivé bloky kódu zobrazujú grafy, ktoré vykreslujú vývoj tváre v závislosti od veku. Grafy zobrazujú priemerné hodnoty rysov počas vývoja, k nim rozptyl, detailnejšie grafy pre jednotlivé rysy a percentuálne zmeny medzi vekovými skupinami.
- `distance_matrices.ipynb` - Tento skript implemetnuje vzdialenostné matice a ich zobrazenia pomocou heat mapy. Na začiatku je vytvorená vzdialenostná matica cez všetky rysy a vek, ktorá reprezentuje vzdialenosti medzi jednotlivými id. Druhá matica je vypočítana pre vekové kategórie v priemere cez všetky id. Nakoniec sú vykreslené vzdialenostné matice pre jednotlivé rysy.
-`fit_curve.ipynb` -  V tomto skripte je implementovaná fukcia, ktorú použijeme v rámci normalizovania rysov. Jedná sa o funkciu, ktorá modeluje priebeh vývoja vzdialenosti vnútorných kútikov očí (en-en). Jej priebeh je vykreslený na grafe.
-`umap_visualization.ipynb` - Tento skrip zobrazuje vývoj 10 rysov na tvári jednotlivcov pomocou UMAP. Redukciou 10 komponent na 2 ich následné zobrazí vo 2D. Grafy reprezentujú celkový vývoj vzhľadom na jednotlivcov, ďaľej v tom to grafe vyznačí jednicov s najpodobnejším a najodlišnejším vývojom. Na ďaľšom grafe zobrazuje podobnosti medzi jednotlivými fotografiami farebne odlíšené podľa veku.
- `nearest_neighbors.ipynb` - Tento skript implementuje hľadanie najpodobnejších snímok ku každej inej fotografii. Tento postup je iplementovaný pomocou Nearest Neighbors a Weighted Nearest Neighbors a nájdeme tak 10 najpodobnejších snímok ku každe snímke. Výstup hľadania overíme vo vzdialenostnej matici, kde hľadáme najpodobnejších na základe najmenších vzdialenosti.
- `visualize _growth.ipynb` - Tento skript predikuje a vyklesluje predikciu vývoja tváre na základe vstupnej snímky. Na začiatku skriptu je potrebné definovať cestu k vstupnej snímke, rovnako aj vek a pohlavie osoby na vstupnej snímke. Vykreslený je predikovaný vývoj na základe strednej hodnoty z našich dát, na základe minimálnej hodnoty a maximálnej.
- `growth_similarities.ipynb` - Tento skript vykresluje odlišnosti medzi vývojom jednotlivcov z datasetu. Pomocou vzdialenostnej matice sme vybrali tie id, ktoré majú k sebe najmenšiu a naväčšiu vzdialenosť. Vývoj týchto jedincov s najpodobnejším a najodlišnejším vývojom sú následne graficky zobrazené.
- `experiments.ipynb` - Tento skript obsahuje pomocné experimenty vykonané v priebehu implementácie, napr. postup pri výbere správnej mierky pre škálovanie, zobrazenie detekovaných bodov, čiastkové výpočty apod.
- `face_preprocessing.py` - Knižnica, ktorá obsahuje pomocné funkcie pre spracovanie a analýzu datasetu.


Skripty `landmarks_detection.ipynb` a `data_preprocessing.ipynb` je potrebné spustiť ako prvé a v poradí v akom su napísane, pretože výstup prvého skriptu je vstupom nasledujúceho skriptu. Zvyšné skripty majú závislosť na prvých dvoch, inak ich je možné spúšťať nezávisle od seba.
