genetic-images/report/report.org

158 lines
7.9 KiB
Org Mode
Raw Normal View History

#+TITLE: Création dimages par algorithme génétique avec référence
#+SUBTITLE: Rapport de projet
#+AUTHOR: Lucien Cartier-Tilet
#+EMAIL: phundrak@phundrak.fr
#+CREATOR: Lucien Cartier-Tilet
#+LANGUAGE: fr
#+LATEX_CLASS: article
#+LaTeX_CLASS_OPTIONS: [a4paper,twoside]
#+LATEX_HEADER: \usepackage{xltxtra,fontspec,xunicode}\usepackage[total={6.5in,9.5in}]{geometry}\setromanfont[Numbers=Lowercase]{Charis SIL}
#+LATEX_HEADER: \usepackage{xcolor} \usepackage{hyperref}
#+LATEX_HEADER: \hypersetup{colorlinks=true,linkbordercolor=red,linkcolor=blue,pdfborderstyle={/S/U/W 1}}
#+STARTUP: latexpreview
2019-03-25 11:58:56 +00:00
#+OPTIONS: toc:nil
* Sujet
Le sujet de ce projet est la création dun logiciel pouvant recréer une image
fournie grâce à des générations aléatoires et successives de formes aux,
positions, couleurs et taille aléatoires. Lalgorithme commence par créer une
image vide aux dimensions identiques à limage de référence, puis applique une
de ces formes aléatoires. Si la ressemblance de limage ainsi générée augmente
par rapport à sa version précédente par rapport à limage de référence, alors
cette modification est conservée, sinon elle est annulée. Répéter jusquà
satisfaction.
* Les méthodes utilisées
Plusieurs approches au problème sont possibles, allant de la simple
implémentation naïve du problème à des moyen pouvant au moins décupler la
vitesse de génération de limage. Sauf indication contraire, jai utilisé dans
limplémentation de chaque méthode des carrés comme forme déléments appliqués
aléatoirement à limage.
Pour évaluer la ressemblance entre deux image, jévalue une distance euclidienne
entre le vecteur de leurs pixels qui peut se résumer à ceci :
#+begin_export latex
$$\sqrt{\sum_{i=0}^{n} V_{i}^{2}+W_{i}^{2}}$$
#+end_export
~V~ étant le vecteur de pixels de limage de référence, ~W~ étant le vecteur de
pixels de limage générée, et ~n~ la taille de ces deux vecteurs.
Les tests de temps sont réalisés sur un Thinkpad x220, disposant dun processeur
Intel® Core™ i5-2540M à 2.6GHz, composé de deux cœurs supportant chacun deux
threads, et de 4Go de RAM. Le programme est compilé avec les options
doptimisation ~-O3~ et ~-flto~.
Voici également ci-dessous la liste des options et arguments possibles
concernant lexécution du logiciel.
#+begin_src text
$ ./bin/genetic-image -h
Allowed options:
-h [ --help ] Display this help message
-i [ --input ] arg Input image
-o [ --output ] arg Image output path (default: input path + "_output")
-m [ --method ] arg Method number to be used (default: 1)
-n [ --iterations ] arg Number of iterations (default: 5000)
-v [ --verbose ] Enables verbosity
#+end_src
Voici la ligne de commande utilisée depuis le répertoire ~build~ afin de pouvoir
obtenir un temps dexécution :
#+begin_src shell
perf stat -r {nombreExécutions} -B ./bin/genetic-image \
-i ../img/mahakala-monochrome.jpg -o output.png \
-n {nombreIterations} -m 1
#+end_src
Les deux éléments entre accolades sont à remplacer par leur valeur, par exemple
afin dexécuter dix fois le programme avec vingt améliorations, il faudrait
exécuter ceci :
#+begin_src shell
perf stat -r 1 -B ./bin/genetic-image \
-i ../img/mahakala-monochrome.jpg -o output.png -n 20 -m 1
#+end_src
** Méthode naïve
Jai tout dabord implémenté la méthode naïve afin davoir une référence en
matière de temps. Cette dernière est implémentée dans ~src/methods.cc~ avec la
fonction ~method1()~. Comme ce à quoi je mattendais, cette méthode de
génération dimages est très lente, principalement dû au fait que lalgorithme
en létat essaiera dappliquer des couleurs nexistant pas dans limage de
référence, voire complètement à lopposées de la palette de couleurs de limage
de référence.
Voici les moyennes de temps dexécution selon le nombre ditérations réussies
sur le nombre dexécutions indiqué.
2019-03-25 11:58:56 +00:00
| / | < | < | < |
| Nb daméliorations | Temps dexécution (s) | Variation (s) | Nb dexécutions |
|--------------------+-----------------------+---------------+-----------------|
| 10 | 0.060847 | 0.000498 | 200 |
| 50 | 0.29823 | 0.00453 | 100 |
| 100 | 0.7093 | 0.0135 | 50 |
| 200 | 1.9584 | 0.0559 | 20 |
| 500 | 8.739 | 0.291 | 10 |
| 1000 | 27.930 | 0.582 | 5 |
Naturellement, la variation en temps dexécution croît en même temps que le
nombre daméliorations nécessaires à apporter à limage à améliorer, dû à la
nature aléatoire de lalgorithme. Cependant, on constate également une
croissance importante du temps dexécution suivant également ce nombre
ditérations réussies.
2019-03-25 11:24:40 +00:00
Vous trouverez en Annexe 1.1 un exemple dimage générée à partir de
~img/mahakala-monochrome.png~ avec 2000 améliorations via cette méthode.
** Réduction du panel des couleurs
Constatant que la majorité des échecs dajout de formes de couleur par la
première méthode échouent dû à une couleur incorrecte, voire nappartenant pas à
limage de référence, jai décidé de restreindre les possibilités de couleurs
parmis lesquelles le hasard peut choisir à la liste des couleurs présentes dans
limage de référence uniquement. Ce choix se fait donc via limplémentation dun
set de valeurs uniques représentant les couleurs trouvées dans limage de
référence, leur détection étant réalisée avec des threads parallèles pour plus
de rapidité à lexécution. Cette méthode est celle implémentée dans la fonction
~method2()~ dans ~src/methods.cc~.
Voici les moyennes de temps dexécution selon le nombre ditérations réussies
sur le nombre dexécutions indiqué.
2019-03-25 11:58:56 +00:00
| / | < | < | < |
| Nb daméliorations | Temps dexécution (s) | Variation (s) | Nb dexécutions |
|--------------------+-----------------------+---------------+-----------------|
| 10 | 0.074951 | 0.000533 | 200 |
| 50 | 0.26385 | 0.00401 | 100 |
| 100 | 0.6385 | 0.0148 | 50 |
| 200 | 1.6145 | 0.0348 | 20 |
| 500 | 6.747 | 0.235 | 10 |
| 1000 | 19.608 | 0.327 | 5 |
On peut remarquer une très nette amélioration de la rapidité dexécution du
logiciel. Étant donné que cette modification ne sera à priori pas en conflit
avec dautres méthodes, cette amélioration sera conservée pour toutes les autres
avancées suivantes.
** Une taille des formes aléatoire mais contrôlée
2019-03-25 11:24:40 +00:00
Une autre méthode peut être de contrôler la taille des éléments en spécifiant
une taille minimale et maximale selon le nombre déléments posés et le nombre
total déléments à poser. Ainsi, on pourrait privilégier tout dabord de grandes
formes en début de génération pour encourager petit à petit les formes à réduire
en taille. Cela permettrait dobtenir rapidement une représentation grossière de
limage pour ensuite pouvoir progressivement afiner les détails.
** Concurrence entre threads
Une utilisation na
2019-03-25 11:24:40 +00:00
* Annexes
** Images
#+CAPTION: Image générée à partir de ~img/mahakala-monochrome.png~ avec 2000 améliorations avec la première méthode
[[./output1.png]]
#+CAPTION: Image générée à partir de ~img/mahakala-monochrome.png~ avec 2000 améliorations avec la seconde méthode
[[./output2.png]]