probably the last commit, university project is done
This commit is contained in:
parent
bb3c9fb0d9
commit
ea4072482e
@ -39,16 +39,6 @@ target_compile_features(${TGT} PRIVATE cxx_std_17)
|
|||||||
target_include_directories(${TGT} PRIVATE include/genimg)
|
target_include_directories(${TGT} PRIVATE include/genimg)
|
||||||
target_link_libraries(${TGT} ${CONAN_LIBS} stdc++fs)
|
target_link_libraries(${TGT} ${CONAN_LIBS} stdc++fs)
|
||||||
|
|
||||||
# Tests
|
|
||||||
if(TESTS)
|
|
||||||
set(TESTTGT genetic-image-tests)
|
|
||||||
file(GLOB TEST_FILES "tests/tests.cc")
|
|
||||||
add_executable(${TESTTGT} ${TEST_FILES})
|
|
||||||
target_compile_features(${TESTTGT} PRIVATE cxx_std_17)
|
|
||||||
target_include_directories(${TESTTGT} PRIVATE include/genimg)
|
|
||||||
target_link_libraries(${TESTTGT} ${CONAN_LIBS} stdc++fs)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# OS specific instructions.
|
# OS specific instructions.
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
elseif(WIN32)
|
elseif(WIN32)
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
#!/usr/bin/env fish
|
|
||||||
# This script was written to work with the fish shell. If you do not have the
|
|
||||||
# fish shell installed on your system, please install it before executing this
|
|
||||||
# script.
|
|
||||||
# The results will be stored in the output file `results.txt`
|
|
||||||
set nb_amelioration 10 50 100 200 500 1000
|
|
||||||
set nb_execution 200 100 50 20 10 5
|
|
||||||
set available_methods 1 2 3 4
|
|
||||||
set output results.txt
|
|
||||||
rm -f $output
|
|
||||||
for method in $available_methods
|
|
||||||
set nb_options (count $nb_execution)
|
|
||||||
echo "Method $method:" >> $output
|
|
||||||
echo "| / | < | < |" >> $output
|
|
||||||
echo "| Nb d’améliorations | Nb d’exécutions | Temps d’exécution (s) |" >> $output
|
|
||||||
echo "|--------------------+-----------------+-----------------------|" >> $output
|
|
||||||
for i in (seq $nb_options)
|
|
||||||
set total_exec_time 0
|
|
||||||
set startexec (date +%s.%N)
|
|
||||||
for j in $nb_execution[$i]
|
|
||||||
./build/bin/genetic-image -i ./img/mahakala-monochrome.jpg \
|
|
||||||
-n $nb_amelioration[$i] -m $method
|
|
||||||
end
|
|
||||||
set endexec (date +%s.%N)
|
|
||||||
set total_exec_time (math "$total_exec_time+($endexec-$startexec)/$i")
|
|
||||||
echo "|$nb_amelioration[$i]|$nb_execution[$i]|$total_exec_time|" >> $output
|
|
||||||
end
|
|
||||||
echo "" >> $output
|
|
||||||
end
|
|
Binary file not shown.
Before Width: | Height: | Size: 42 KiB |
Binary file not shown.
Before Width: | Height: | Size: 26 KiB |
Binary file not shown.
Before Width: | Height: | Size: 21 KiB |
@ -6,30 +6,88 @@
|
|||||||
#+LANGUAGE: fr
|
#+LANGUAGE: fr
|
||||||
#+LATEX_CLASS: article
|
#+LATEX_CLASS: article
|
||||||
#+LaTeX_CLASS_OPTIONS: [a4paper,twoside]
|
#+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{xltxtra,fontspec,xunicode}
|
||||||
|
#+LATEX_HEADER: \usepackage[total={6.5in,9.5in}]{geometry}
|
||||||
|
#+LATEX_HEADER: \setromanfont[Numbers=Lowercase]{Charis SIL}
|
||||||
#+LATEX_HEADER: \usepackage{xcolor} \usepackage{hyperref}
|
#+LATEX_HEADER: \usepackage{xcolor} \usepackage{hyperref}
|
||||||
#+LATEX_HEADER: \hypersetup{colorlinks=true,linkbordercolor=red,linkcolor=blue,pdfborderstyle={/S/U/W 1}}
|
#+LATEX_HEADER: \hypersetup{colorlinks=true,linkbordercolor=red,linkcolor=blue,pdfborderstyle={/S/U/W 1}}
|
||||||
#+STARTUP: latexpreview
|
#+STARTUP: latexpreview
|
||||||
#+OPTIONS: toc:nil
|
#+OPTIONS: H:3 toc:nil
|
||||||
|
#+OPTIONS: auto-id:t
|
||||||
|
#+MACRO: newline @@latex:\hspace{0pt}\\@@ @@html:<br>@@
|
||||||
|
#+MACRO: newpage @@latex:\newpage@@
|
||||||
|
{{{newpage}}}
|
||||||
|
#+TOC: headlines
|
||||||
|
{{{newpage}}}
|
||||||
|
|
||||||
|
* Avant-propos
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-e3612e77-a5ab-4dd1-bb43-ed6f10fa845d
|
||||||
|
:UNNUMBERED: t
|
||||||
|
:END:
|
||||||
|
|
||||||
|
Ce document est un rapport de projet dont le sujet est décrit ci-dessous. Si
|
||||||
|
vous souhaitez obtenir le code source sans avoir à recopier celui contenu dans
|
||||||
|
ce fichier PDF, vous pouvez vous rendre sur son dépôt Git situé à l’adresse
|
||||||
|
suivante : [[https://labs.phundrak.fr/phundrak/genetic-images]]
|
||||||
|
|
||||||
|
* Notes sur le code
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-e784b2a1-801d-4f70-9889-534100c06ca8
|
||||||
|
:UNNUMBERED: t
|
||||||
|
:END:
|
||||||
|
Le code source de ce projet repose sur trois dépendances :
|
||||||
|
- ~boost_options~
|
||||||
|
- ~spdlog~
|
||||||
|
- ~opencv~
|
||||||
|
|
||||||
|
Cependant, seul ~opencv~ est une dépendance que l’on peut appeler « cœure » au
|
||||||
|
projet ; en effet, c’est grâce à cette bibliothèque que sont exécutées toutes
|
||||||
|
les opérations de manipulation d’images, allant de la simple ouverture de
|
||||||
|
fichier image à la génération des images telle que décrite ci-dessous.
|
||||||
|
~boost_options~ est utilisé afin de parser les options du programme passées dans
|
||||||
|
le terminal, et ~spdlog~ permet de générer une sortie utile pour la version
|
||||||
|
~debug~ du programme, affichant des données utiles pour un développeur
|
||||||
|
travaillant sur le code source (en l’occurrence moi-même). Ces deux dernières
|
||||||
|
dépendances n’ont pas d’impact sur la rapidité du programme.
|
||||||
|
{{{newpage}}}
|
||||||
|
|
||||||
* Sujet
|
* Sujet
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-d5b7a742-a9eb-4860-8872-c5342d46cec9
|
||||||
|
:END:
|
||||||
|
|
||||||
Le sujet de ce projet est la création d’un logiciel pouvant recréer une image
|
Le sujet de ce projet est la création d’un logiciel pouvant recréer une image
|
||||||
fournie grâce à des générations aléatoires et successives de formes aux,
|
fournie grâce à des générations aléatoires et successives de formes aux
|
||||||
positions, couleurs et taille aléatoires. L’algorithme commence par créer une
|
positions, couleurs et taille aléatoires. À chaque étape, une évaluation de la
|
||||||
image vide aux dimensions identiques à l’image de référence, puis applique une
|
ressemblance entre l’image générée et l’image de référence est effectuée. Si
|
||||||
de ces formes aléatoires. Si la ressemblance de l’image ainsi générée augmente
|
l’algorithme constate que l’application d’une de ces formes aléatoire à l’image
|
||||||
par rapport à sa version précédente par rapport à l’image de référence, alors
|
générée améliore cette ressemblance entre cette dernière et l’image de
|
||||||
cette modification est conservée, sinon elle est annulée. Répéter jusqu’à
|
ressemblance, la modification est conservée. Sinon elle est ignorée, et une
|
||||||
satisfaction.
|
nouvelle image candidate au remplacement de l’image générée est créée. En
|
||||||
|
d’autres mots, il s’agit d’un équivalent de sélection naturelle au sein des
|
||||||
|
images générées aléatoirement ; seules les meilleures sont retenues et seront la
|
||||||
|
base des images générées aléatoirement ultérieures. Ce processus se répètera
|
||||||
|
autant de fois que l’utilisateur le souhaite.
|
||||||
|
|
||||||
|
{{{newpage}}}
|
||||||
* Les méthodes utilisées
|
* Les méthodes utilisées
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-703b5f08-24ce-480d-bfbb-e3b51844138f
|
||||||
|
:END:
|
||||||
|
|
||||||
Plusieurs approches au problème sont possibles, allant de la simple
|
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
|
implémentation naïve du problème à des moyen pouvant fortement accélérer la
|
||||||
vitesse de génération de l’image. Sauf indication contraire, j’ai utilisé dans
|
vitesse de génération de l’image ainsi que sa qualité. Deux types de formes
|
||||||
l’implémentation de chaque méthode des carrés comme forme d’éléments appliqués
|
aléatoires ont été implémentés : des triangles et des carrés. Les triangles sont
|
||||||
aléatoirement à l’image.
|
pour l’instant restreint dans leur dimensions –en effet, ils tiennent tous dans
|
||||||
|
un carré, leur hauteur et largeur sur les axes ~x~ et ~y~ étant égales. Il
|
||||||
|
serait toutefois possible d’implémenter une version de ce programme générant une
|
||||||
|
hauteur et une largeur toutes deux indépendantes l’une de l’autre pour une
|
||||||
|
version future du programme. Le choix de la forme se fait via l’utilisation
|
||||||
|
d’une option du programme, ~-f [--form]~ prenant pour valeur soit ~1~, le choix
|
||||||
|
par défaut, activant alors d’utilisation des carrés, ou bien la valeur ~2~
|
||||||
|
activant l’utilisation des triangles.
|
||||||
|
|
||||||
Pour évaluer la ressemblance entre deux image, j’évalue une distance euclidienne
|
Pour évaluer la ressemblance entre deux image, j’évalue une distance euclidienne
|
||||||
entre le vecteur de leurs pixels qui peut se résumer à ceci :
|
entre le vecteur de leurs pixels qui peut se résumer à ceci :
|
||||||
@ -41,8 +99,9 @@ pixels de l’image générée, et ~n~ la taille de ces deux vecteurs.
|
|||||||
|
|
||||||
Les tests de temps sont réalisés sur un Lenovo Ideapad Y700, disposant d’un
|
Les tests de temps sont réalisés sur un Lenovo Ideapad Y700, disposant d’un
|
||||||
processeur Intel® Core™ i7-6700HQ à 2.6GHz et un turbo à 3.5GHz, composé de
|
processeur Intel® Core™ i7-6700HQ à 2.6GHz et un turbo à 3.5GHz, composé de
|
||||||
quatre cœurs supportant chacun deux threads, et de 16Go de RAM. Le programme est
|
quatre cœurs supportant chacun deux threads, et l’ordinateur dispose d’un total
|
||||||
compilé avec les options d’optimisation ~-O3~ et ~-flto~.
|
de de 16Go de RAM. Le programme est compilé avec clang 8.0 et avec les options
|
||||||
|
~-Wall -Wextra -Wshadow -Wpedantic -pedantic -O3 -flto~.
|
||||||
|
|
||||||
Voici également ci-dessous la liste des options et arguments possibles
|
Voici également ci-dessous la liste des options et arguments possibles
|
||||||
concernant l’exécution du logiciel.
|
concernant l’exécution du logiciel.
|
||||||
@ -51,20 +110,26 @@ concernant l’exécution du logiciel.
|
|||||||
Allowed options:
|
Allowed options:
|
||||||
-h [ --help ] Display this help message
|
-h [ --help ] Display this help message
|
||||||
-i [ --input ] arg Input image
|
-i [ --input ] arg Input image
|
||||||
-o [ --output ] arg Image output path (default: input path + "_output")
|
-o [ --output ] arg Image output path (default: "output_" + input path)
|
||||||
|
-n [ --iterations ] arg Number of iterations (default: 2000)
|
||||||
-m [ --method ] arg Method number to be used (default: 1)
|
-m [ --method ] arg Method number to be used (default: 1)
|
||||||
-n [ --iterations ] arg Number of iterations (default: 5000)
|
-f [ --form ] arg Select shape (1:square, 2:triangle)
|
||||||
|
-c [ --cols ] arg For method 5 only, number of columns the reference
|
||||||
|
image should be divided into. If the value is equal
|
||||||
|
to 0, then it will be assumed there will be as many
|
||||||
|
rows as there are collumns. (default: 0)
|
||||||
|
-r [ --rows ] arg For method 5 only, number of rows the reference image
|
||||||
|
should be divided into. (default: 1)
|
||||||
|
-S [ --submethod ] arg Sub-method that will be used to generate the
|
||||||
|
individual tiles from method 5. (default: 1)
|
||||||
|
-s [ --size ] Enables controlled size of the random shapes
|
||||||
-v [ --verbose ] Enables verbosity
|
-v [ --verbose ] Enables verbosity
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Voici le script grâce auquel les valeurs de temps d’exécution ont été obtenues :
|
** Méthode naïve (méthode 1)
|
||||||
|
:PROPERTIES:
|
||||||
#+INCLUDE: ../benchmarks.fish src shell -n
|
:CUSTOM_ID: h-34ace9fe-4c22-434a-8dc5-b913cdf631c6
|
||||||
|
:END:
|
||||||
Quelques-unes de ces lignes commençasont là uniquement pour de la mise en forme des
|
|
||||||
données afin que je puisse
|
|
||||||
|
|
||||||
** Méthode naïve
|
|
||||||
|
|
||||||
J’ai tout d’abord implémenté la méthode naïve afin d’avoir une référence en
|
J’ai tout d’abord implémenté la méthode naïve afin d’avoir une référence en
|
||||||
matière de temps. Cette dernière est implémentée dans ~src/methods.cc~ avec la
|
matière de temps. Cette dernière est implémentée dans ~src/methods.cc~ avec la
|
||||||
@ -74,29 +139,32 @@ en l’état essaiera d’appliquer des couleurs n’existant pas dans l’image
|
|||||||
référence, voire complètement à l’opposées de la palette de couleurs de l’image
|
référence, voire complètement à l’opposées de la palette de couleurs de l’image
|
||||||
de référence.
|
de référence.
|
||||||
|
|
||||||
Voici les moyennes de temps d’exécution selon le nombre d’itérations réussies
|
Voici les options de la commande utilisée ici :
|
||||||
sur le nombre d’exécutions indiqué.
|
#+begin_src shell
|
||||||
|
-i img/mahakala-monochrome.jpg -n2000 -m1 -f1 # carrés
|
||||||
|
-i img/mahakala-monochrome.jpg -n2000 -m1 -f2 # triangles
|
||||||
|
#+end_src
|
||||||
|
|
||||||
| / | < | < |
|
Voici les moyennes de temps d’exécution de cette méthode pour 2.000
|
||||||
| Nb d’améliorations | Nb d’exécutions | Temps d’exécution (s) |
|
améliorations :
|
||||||
|--------------------+-----------------+-----------------------|
|
|
||||||
| 10 | 200 | 0.065881 |
|
|
||||||
| 50 | 100 | 0.130041 |
|
|
||||||
| 100 | 50 | 0.186012 |
|
|
||||||
| 200 | 20 | 0.385982 |
|
|
||||||
| 500 | 10 | 1.437486 |
|
|
||||||
| 1000 | 5 | 3.608983 |
|
|
||||||
|
|
||||||
Naturellement, la variation en temps d’exécution croît en même temps que le
|
| carrés | triangles |
|
||||||
nombre d’améliorations nécessaires à apporter à l’image à améliorer, dû à la
|
|---------------+--------------|
|
||||||
nature aléatoire de l’algorithme. Cependant, on constate également une
|
| 10m 40s 615ms | 4m 57s 987ms |
|
||||||
croissance importante du temps d’exécution suivant également ce nombre
|
|
||||||
d’itérations réussies.
|
|
||||||
|
|
||||||
Vous trouverez en Annexes (§[[*M%C3%A9thode 1]]) un exemple d’image générée à partir de
|
On constate une plus grande rapidité d’exécution lors de l’utilisation de
|
||||||
|
carrés. Je suppose que cela est dû à une facilité avec les triangles à créer des
|
||||||
|
traits et bordures inclinées pour lesquelles plusieurs carrés seraient
|
||||||
|
nécessaires, ainsi qu’une meilleure flexibilité quant aux formes pouvant être
|
||||||
|
créées.
|
||||||
|
|
||||||
|
Vous trouverez en Annexes un exemple d’image générée à partir de
|
||||||
~img/mahakala-monochrome.png~ avec 2000 améliorations via cette méthode.
|
~img/mahakala-monochrome.png~ avec 2000 améliorations via cette méthode.
|
||||||
|
|
||||||
** Réduction du panel des couleurs
|
** Réduction du panel des couleurs (méthode 2)
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-dd67b1e5-04ed-4cdf-a9e3-7b3fbf1b2353
|
||||||
|
:END:
|
||||||
|
|
||||||
Constatant que la majorité des échecs d’ajout de formes de couleur par la
|
Constatant que la majorité des échecs d’ajout de formes de couleur par la
|
||||||
première méthode échouent dû à une couleur incorrecte, voire n’appartenant pas à
|
première méthode échouent dû à une couleur incorrecte, voire n’appartenant pas à
|
||||||
@ -108,18 +176,17 @@ référence, leur détection étant réalisée avec des threads parallèles pour
|
|||||||
de rapidité à l’exécution. Cette méthode est celle implémentée dans la fonction
|
de rapidité à l’exécution. Cette méthode est celle implémentée dans la fonction
|
||||||
~method2()~ dans ~src/methods.cc~.
|
~method2()~ dans ~src/methods.cc~.
|
||||||
|
|
||||||
Voici les moyennes de temps d’exécution selon le nombre d’itérations réussies
|
Voici les options de la commande utilisée ici :
|
||||||
sur le nombre d’exécutions indiqué.
|
#+begin_src shell
|
||||||
|
-i img/mahakala-monochrome.jpg -n2000 -m2 -f1 # carrés
|
||||||
|
-i img/mahakala-monochrome.jpg -n2000 -m2 -f2 # triangles
|
||||||
|
#+end_src
|
||||||
|
|
||||||
| / | < | < |
|
Voici le temps moyen d’exécution pour cette méthode avec 2.000 améliorations :
|
||||||
| Nb d’améliorations | Nb d’exécutions | Temps d’exécution (s) |
|
|
||||||
|--------------------+-----------------+-----------------------|
|
| carrés | triangles |
|
||||||
| 10 | 200 | 0.072979 |
|
|--------------+--------------|
|
||||||
| 50 | 100 | 0.114426 |
|
| 7m 23s 774ms | 2m 57s 152ms |
|
||||||
| 100 | 50 | 0.157965 |
|
|
||||||
| 200 | 20 | 0.290475 |
|
|
||||||
| 500 | 10 | 0.785426 |
|
|
||||||
| 1000 | 5 | 2.664046 |
|
|
||||||
|
|
||||||
On peut remarquer une amélioration quant à la rapidité d’exécution du logiciel.
|
On peut remarquer une amélioration quant à la rapidité d’exécution du logiciel.
|
||||||
Cependant, le résultat n’est pas aussi important qu’escompté. Je suppose que
|
Cependant, le résultat n’est pas aussi important qu’escompté. Je suppose que
|
||||||
@ -127,15 +194,20 @@ cela est dû au fait que l’algorithme précédent peut considérer un rapproch
|
|||||||
d’une zone déjà colorée vers la couleur d’origine comme une amélioration, avec
|
d’une zone déjà colorée vers la couleur d’origine comme une amélioration, avec
|
||||||
une possibilité plus large sur ce plan-là que pour le second algorithme qui se
|
une possibilité plus large sur ce plan-là que pour le second algorithme qui se
|
||||||
doit d’être plus précis concernant les couleurs. Une nette amélioration du
|
doit d’être plus précis concernant les couleurs. Une nette amélioration du
|
||||||
résultat est toutefois visibles, voir Annexes (§[[*M%C3%A9thode 2]]) pour une image
|
résultat est toutefois visibles (voir Annexes pour une image générée à partir de
|
||||||
générée à partir de ~img/mahakala-monochrome.png~ via la méthode 2 et avec 2000
|
~img/mahakala-monochrome.png~ via la méthode 2 et avec 2000 améliorations).
|
||||||
améliorations.
|
|
||||||
|
À nouveau, on constate également un meilleur temps avec les triangles qu’avec
|
||||||
|
les carrés.
|
||||||
|
|
||||||
Étant donné que cette modification ne sera à priori pas en conflit avec d’autres
|
Étant donné que cette modification ne sera à priori pas en conflit avec d’autres
|
||||||
méthodes, cette amélioration sera conservée pour toutes les autres avancées
|
méthodes, cette amélioration sera conservée pour toutes les autres avancées
|
||||||
suivantes.
|
suivantes.
|
||||||
|
|
||||||
** Une taille des formes aléatoire mais contrôlée
|
** Une taille des formes aléatoire mais contrôlée (méthode 3)
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-058e4525-07bb-4a62-8be5-56ad93c5b2e7
|
||||||
|
:END:
|
||||||
|
|
||||||
Une autre méthode peut être de contrôler la taille des éléments en spécifiant
|
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
|
une taille minimale et maximale selon le nombre d’éléments posés et le nombre
|
||||||
@ -147,37 +219,25 @@ forme à appliquer est définie comme suit :
|
|||||||
|
|
||||||
#+begin_export latex
|
#+begin_export latex
|
||||||
$$coef=\frac{nbIterRestantes}{totalIter}$$
|
$$coef=\frac{nbIterRestantes}{totalIter}$$
|
||||||
$$tailleMinimale=coef \frac{min(Width,Height)}{2}$$
|
$$tailleMinimale=coef\cdot\frac{min(Width,Height)}{2}$$
|
||||||
$$tailleMaximale=tailleMinimale*2+1$$
|
$$tailleMaximale=tailleMinimale\cdot2+1$$
|
||||||
$$taille=Rand([\![tailleMinimale;tailleMaximale[\![)$$
|
$$taille=Rand([\![tailleMinimale;tailleMaximale[\![)$$
|
||||||
#+end_export
|
#+end_export
|
||||||
|
|
||||||
Voici les moyennes de temps d’exécution selon le nombre d’itérations réussies
|
|
||||||
sur le nombre d’exécutions indiqué.
|
|
||||||
|
|
||||||
| / | < | < |
|
|
||||||
| Nb d’améliorations | Nb d’exécutions | Temps d’exécution (s) |
|
|
||||||
|--------------------+-----------------+-----------------------|
|
|
||||||
| 10 | 200 | 0.082068 |
|
|
||||||
| 50 | 100 | 0.244236 |
|
|
||||||
| 100 | 50 | 0.418075 |
|
|
||||||
| 200 | 20 | 1.453703 |
|
|
||||||
| 500 | 10 | 4.777205 |
|
|
||||||
| 1000 | 5 | 20.33209 |
|
|
||||||
|
|
||||||
Cette version du logiciel est nettement plus lente que ses versions précédentes
|
Cette version du logiciel est nettement plus lente que ses versions précédentes
|
||||||
du fait de la contrainte de taille pour les formes pouvant potentiellement
|
du fait de la contrainte de taille pour les formes pouvant potentiellement
|
||||||
améliorer l’image, cependant la qualité des images générées est plus haute que
|
améliorer l’image, et cela à un tel point que pour 2.000 améliorations, le
|
||||||
celle des version précédentes, voir en Annexes (§[[*M%C3%A9thode 3]]).
|
programme tourne durant plus d’une heure. De plus, la qualité de l’image ainsi
|
||||||
|
générée n’est pas nécessairement meilleure, ainsi cette méthode n’est pas
|
||||||
|
nécessairement bonne. Toujours est-il que j’ai laissé pour les méthodes
|
||||||
|
suivantes une option pour l’utilisateur lui permettant d’activer le contrôle de
|
||||||
|
la taille des éléments s’il le souhaite via l’option ~-s [--size]~. Toutefois,
|
||||||
|
les temps d’exécution des méthodes suivantes n’en tiendront pas compte.
|
||||||
|
|
||||||
Cette méthode ne me semble que moyennement concluante, certes la vitesse
|
** Concurrence entre threads (méthode 4)
|
||||||
d’exécution du logiciel est beaucoup plus faible, mais il est également vrai que
|
:PROPERTIES:
|
||||||
la qualité des images générées est supérieure aux deux autres méthodes. Ainsi,
|
:CUSTOM_ID: h-ea0ba369-6334-4013-ae8c-bcba78a77a37
|
||||||
il sera possible d’utiliser les modifications apportées par cette méthode en
|
:END:
|
||||||
utilisant une option ~-s [ --size ]~ avec les méthodes suivantes pour activer
|
|
||||||
cette modification de l’algorithme.
|
|
||||||
|
|
||||||
** Concurrence entre threads
|
|
||||||
|
|
||||||
Une utilisation de calculs parallèles pourrait être intéressante afin
|
Une utilisation de calculs parallèles pourrait être intéressante afin
|
||||||
d’accélerer la génération des images : l’utilisation de threads mis en
|
d’accélerer la génération des images : l’utilisation de threads mis en
|
||||||
@ -187,40 +247,31 @@ résultats sont récupérés et évalués, et parmi les résultats améliorant l
|
|||||||
générée, celle avec le meilleur score est conservée. Cela permet ainsi de
|
générée, celle avec le meilleur score est conservée. Cela permet ainsi de
|
||||||
multiplier les chances d’avoir une amélioration de l’image par tentative.
|
multiplier les chances d’avoir une amélioration de l’image par tentative.
|
||||||
|
|
||||||
Voici les benchmarks d’exécution de cette méthode sans contrôle de la taille des
|
Voici les options de la commande utilisée ici :
|
||||||
formes aléatoires :
|
#+begin_src shell
|
||||||
| / | < | < |
|
-i img/mahakala-monochrome.jpg -n2000 -m4 -f1 # carrés
|
||||||
| Nb d’améliorations | Nb d’exécutions | Temps d’exécution (s) |
|
-i img/mahakala-monochrome.jpg -n2000 -m4 -f2 # triangles
|
||||||
|--------------------+-----------------+-----------------------|
|
#+end_src
|
||||||
| 10 | 200 | 0.080525 |
|
|
||||||
| 50 | 100 | 0.139892 |
|
|
||||||
| 100 | 50 | 0.169113 |
|
|
||||||
| 200 | 20 | 0.273342 |
|
|
||||||
| 500 | 10 | 0.610812 |
|
|
||||||
| 1000 | 5 | 1.403816 |
|
|
||||||
|
|
||||||
Et voici les benchmarks d’exécution de cette même méthode avec contrôle de la
|
Voici les moyennes de temps d’exécution de cette méthode pour 2.000
|
||||||
taille des formes aléatoires :
|
améliorations sans contrôle de la taille des éléments générés :
|
||||||
| / | < | < |
|
|
||||||
| Nb d’améliorations | Nb d’exécutions | Temps d’exécution (s) |
|
|
||||||
|--------------------+-----------------+-----------------------|
|
|
||||||
| 10 | 200 | 0.085981 |
|
|
||||||
| 50 | 100 | 0.156099 |
|
|
||||||
| 100 | 50 | 0.29183 |
|
|
||||||
| 200 | 20 | 0.59844 |
|
|
||||||
| 500 | 10 | 2.513782 |
|
|
||||||
| 1000 | 5 | 6.457168 |
|
|
||||||
|
|
||||||
Pour résumer, ces deux tableaux montrent la parallélisation de la seconde
|
| carrés | triangles |
|
||||||
méthode et de la troisième méthode respectivement via des threads
|
|--------------+-----------|
|
||||||
concurrentiels. On peut remarquer que le temps d’exécution s’est nettement
|
| 2m 30s 636ms | 58s 885ms |
|
||||||
amélioré, avec un temps d’exécution à peu près deux fois plus rapide pour
|
|
||||||
l’exécution sans contrôle de taille des formes que la seconde méthode, et
|
|
||||||
pouvant être jusqu’à trois fois plus rapide que la troisième méthode avec le
|
|
||||||
contrôle de la taille des formes activée. On a donc une véritable amélioration
|
|
||||||
significative avec cette nouvelle version parallèle.
|
|
||||||
|
|
||||||
** Collaboration entre threads
|
Nous avons cette fois-ci une très nette amélioration de la vitesse d’exécution
|
||||||
|
de l’algorithme, ce dernier étant jusqu’à environ trois fois plus rapide que la
|
||||||
|
seconde méthode. Il s’agit d’une claire amélioration de la seconde méthode, qui
|
||||||
|
elle-même présentait une amélioration de rapidité et de qualité d’image par
|
||||||
|
rapport à la première méthode. En revanche, il n’y a pas de différence de
|
||||||
|
qualité d’image visible au bout de ces 2.000 améliorations de visible à l’œil nu
|
||||||
|
entre les deuxième et quatrième méthodes.
|
||||||
|
|
||||||
|
** Collaboration entre threads (méthode 5)
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-38045bea-a1cb-49e8-ab0e-b8f9861ceb9b
|
||||||
|
:END:
|
||||||
|
|
||||||
Une différente approche au parallélisme peut être réalisée : plutôt que
|
Une différente approche au parallélisme peut être réalisée : plutôt que
|
||||||
d’essayer de mettre en concurrence plusieurs threads, il serait possible
|
d’essayer de mettre en concurrence plusieurs threads, il serait possible
|
||||||
@ -233,27 +284,180 @@ alors à nous une fois les différents threads lancés concernant leur méthode
|
|||||||
génération d’image, il est possible d’utiliser chacune des méthodes précédentes.
|
génération d’image, il est possible d’utiliser chacune des méthodes précédentes.
|
||||||
Ce choix se fera via une option supplémentaire ~--sub-method~ ou ~-S~.
|
Ce choix se fera via une option supplémentaire ~--sub-method~ ou ~-S~.
|
||||||
|
|
||||||
|
J’ai choisi d’utiliser les deux méthodes les plus efficaces comme sous-méthodes,
|
||||||
|
la deuxième et la quatrième. J’ai choisi la deuxième car il s’agit actuellement
|
||||||
|
de la méthode la plus efficace qui ne soit pas parallélisée, et je pense que
|
||||||
|
cela pourrait peut-être présenter un avantage par rapport à la quatrième méthode
|
||||||
|
qui risque de se retrouvée ralentie par un trop grand nombre de threads lancés
|
||||||
|
en même temps ; une image découpée en deux lignes et cinq colonnes, comme cela
|
||||||
|
va être le cas ci-dessous, lancera sur le processeur de tests au maximum 2×4×8
|
||||||
|
threads en même temps, soit 16 threads simultanés potentiels, deux fois plus
|
||||||
|
donc qu’avec la méthode 2 en sous-méthode, qui ne tournera que sur huit threads.
|
||||||
|
|
||||||
|
Voici les options de la commande utilisée ici :
|
||||||
|
#+begin_src shell
|
||||||
|
-i img/mahakala-monochrome.jpg -n2000 -m5 -c2 -r4 -S4 -f1 # carrés
|
||||||
|
-i img/mahakala-monochrome.jpg -n2000 -m5 -c2 -r4 -S4 -f2 # triangles
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Voici les temps moyens d’exécution pour la cinquième méthode, utilisant en
|
||||||
|
sous-méthode la seconde présentée :
|
||||||
|
|
||||||
|
| carrés | triangles |
|
||||||
|
|--------------+-------------|
|
||||||
|
| 6m 26s 520ms | 2m 6s 865ms |
|
||||||
|
|
||||||
|
Et voici les temps moyens d’exécution pour la même méthode utilisant la
|
||||||
|
quatrième méthode comme sous-méthode :
|
||||||
|
|
||||||
|
| carrés | triangles |
|
||||||
|
|-------------+-------------|
|
||||||
|
| 4m 26s 78ms | 1m 6s 984ms |
|
||||||
|
|
||||||
|
Bien que les deux méthodes n’aient pas nécessairement bénéficiées d’amélioration
|
||||||
|
quant à leur temps d’exécution, les images générées via cette cinquième méthode
|
||||||
|
sont d’une qualité nettement supérieure aux images générées jusqu’à présent,
|
||||||
|
avec un niveau de détail largement meilleur. La quatrième méthode utilisée en
|
||||||
|
sous-méthode présente un avantage sur la seconde en considérant le temps
|
||||||
|
d’exécution, et il semblerait que l’on puisse remarquer une légère amélioration
|
||||||
|
de l’image également. Cependant, et bien que cela soit plus lent, la génération
|
||||||
|
à base de carrés présente cette fois-ci un avantage par rapport à la génération
|
||||||
|
à base de triangles : ces derniers cachent beaucoup plus aisément la séparation
|
||||||
|
entre les différentes zones de génération de l’image que les triangles, sans
|
||||||
|
doutes dû à la difficulté d’obtenir des zones de remplissages dont un des côtés
|
||||||
|
soit parfaitement vertical ou horizontal avec ces derniers.
|
||||||
|
|
||||||
|
J’ai également remarqué que si l’on utilise un grand nombre de colonnes et de
|
||||||
|
lignes, le programme peut mettre énormément de temps pour effectuer sa tâche.
|
||||||
|
Avec l’image de test, j’ai exécuté le logiciel en divisant l’image de test en
|
||||||
|
cinq colonnes et lignes, donnant un total de vingt-cinq threads exécutant chacun
|
||||||
|
une méthode sur une zone de l’image ; j’ai dû manuellement arrêter le programme
|
||||||
|
au bout de plus d’une heure de travail afin de ne pas perdre de temps. Je pense
|
||||||
|
que cela est dû à certaines zones étant très homogènes, rendant le travail
|
||||||
|
d’amélioration de cette zone très difficile quand la majorité de la zone est à
|
||||||
|
peu près identique à sa version originale, chaque amélioration ne pouvant
|
||||||
|
s’effectuer que sur quelques pixels tout au plus.
|
||||||
|
|
||||||
|
{{{newpage}}}
|
||||||
|
* Conclusion
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-ba75708b-da5b-445b-b4d1-624e20a37ad9
|
||||||
|
:END:
|
||||||
|
|
||||||
|
Plusieurs approches ont été abordées lors de ce projet quand à la meilleure
|
||||||
|
méthode de génération d’images basée sur des formes aléatoires, aux couleurs
|
||||||
|
aléatoires. Quelques unes d’entre elles portent sur un certain contrôle du
|
||||||
|
facteur aléatoire, tandis que d’autres tentent de tirer profit du matériel
|
||||||
|
utilisé afin de disposer d’une plus grande puissance de calcul. Alors que l’on a
|
||||||
|
constaté qu’une limitation de l’arbitraire quant au panel de couleurs possibles
|
||||||
|
est intéressante, celle de leur taille l’est moins, tout du moins avec la
|
||||||
|
formule utilisée. Il serait néamoins intéressant de réitérer cette tentative
|
||||||
|
avec une autre approche, comme par exemple réduire la taille maximale des
|
||||||
|
éléments suite à un certain nombre d’échecs de génération de successeurs
|
||||||
|
successifs.
|
||||||
|
|
||||||
|
En revanche, les méthodes consistant à répartir la charge de travail sur
|
||||||
|
plusieurs threads ont été chacune couronnées de succès, et ultimement la
|
||||||
|
combination d’une méthode se basant sur la concurrence entre threads elle-même
|
||||||
|
lancée en collaboration avec d’autres de cette même méthode s’est prouvée être
|
||||||
|
l’une des méthodes les plus efficaces afin de re-créer avec fidélité une image
|
||||||
|
de référence.
|
||||||
|
|
||||||
|
Note intéressante : la génération d’image avec des triangles est plus rapide
|
||||||
|
qu’une génération d’image basée sur des carrés, mais ces derniers seront la
|
||||||
|
forme la plus efficace visuellement lors de cette cinquième et meilleure méthode
|
||||||
|
présentée dans ce rapport.
|
||||||
|
|
||||||
|
{{{newpage}}}
|
||||||
* Annexes
|
* Annexes
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-077e6074-6117-4baf-93ce-723faea5cde2
|
||||||
|
:END:
|
||||||
|
** Code
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-561530b8-dd10-4bd7-9918-0afa79bd6f2e
|
||||||
|
:END:
|
||||||
|
*** ~src/main.cc~
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-023c2313-f912-4f8b-ad40-0c5dace0b7aa
|
||||||
|
:END:
|
||||||
|
#+INCLUDE: ../src/main.cc src c++ -n
|
||||||
|
|
||||||
|
*** ~include/genimg/shapes.hh~
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-2ac81b89-94d9-48de-a020-d838a8655dce
|
||||||
|
:END:
|
||||||
|
#+INCLUDE: ../include/genimg/shapes.hh src c++ -n
|
||||||
|
|
||||||
|
*** ~src/shapes.cc~
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-d039100c-a975-4200-964e-b5f2091cce5f
|
||||||
|
:END:
|
||||||
|
#+INCLUDE: ../src/shapes.cc src c++ -n
|
||||||
|
|
||||||
|
*** ~include/genimg/methods.hh~
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-6a670e34-4292-4e13-8a7c-df091375d980
|
||||||
|
:END:
|
||||||
|
#+INCLUDE: ../include/genimg/methods.hh src c++ -n
|
||||||
|
|
||||||
|
*** ~src/methods.cc~
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-3321dadc-c768-44b6-863a-51b5c45115c8
|
||||||
|
:END:
|
||||||
|
#+INCLUDE: ../src/methods.cc src c++ -n
|
||||||
|
|
||||||
|
*** ~include/genimg/parseargs.hh~
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-497e47cb-1bde-4bdc-9cd0-c5547a93f20f
|
||||||
|
:END:
|
||||||
|
#+INCLUDE: ../include/genimg/parseargs.hh src c++ -n
|
||||||
|
|
||||||
|
*** ~src/parseargs.cc~
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-c43eaaf6-c963-4a45-8ae1-b939b9750d88
|
||||||
|
:END:
|
||||||
|
#+INCLUDE: ../src/parseargs.cc src c++ -n
|
||||||
|
|
||||||
** Images
|
** Images
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-9eb043df-229e-461e-9d2c-1b7cbeda88af
|
||||||
|
:END:
|
||||||
*** Image de référence
|
*** Image de référence
|
||||||
#+CAPTION: Image de référence utilisée pour les tests du logiciel
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: h-ba67dd5b-2918-4128-8521-c88329392744
|
||||||
|
:END:
|
||||||
|
|
||||||
|
#+CAPTION: Image de référence
|
||||||
[[../img/mahakala-monochrome.jpg]]
|
[[../img/mahakala-monochrome.jpg]]
|
||||||
*** Méthode 1
|
|
||||||
#+CAPTION: Image générée à partir de ~img/mahakala-monochrome.png~ avec 2000 améliorations avec la première méthode
|
|
||||||
[[./output1.png]]
|
|
||||||
|
|
||||||
*** Méthode 2
|
|
||||||
#+CAPTION: Image générée à partir de ~img/mahakala-monochrome.png~ avec 2000 améliorations avec la seconde méthode
|
|
||||||
[[./output2.png]]
|
|
||||||
|
|
||||||
*** Méthode 3
|
#+CAPTION: Méthode 1, carrés
|
||||||
#+CAPTION: Image générée à partir de ~img/mahakala-monochrome.png~ avec 2000 améliorations avec la troisième méthode
|
[[./output1-1.png]]
|
||||||
[[./output3.png]]
|
|
||||||
|
|
||||||
*** Méthode 4
|
#+CAPTION: Méthode 1, triangles
|
||||||
**** Taille des formes non contrôlée
|
[[./output1-2.png]]
|
||||||
#+CAPTION: Image générée à partir de ~img/mahakala-monochrome.png~ avec 2000 améliorations avec la quatrième méthode sans l’option ~-s~
|
|
||||||
|
#+CAPTION: Méthode 2, carrés
|
||||||
|
[[./output2-1.png]]
|
||||||
|
|
||||||
|
#+CAPTION: Méthode 2, triangles
|
||||||
|
[[./output2-2.png]]
|
||||||
|
|
||||||
|
#+CAPTION: Méthode 4, carrés
|
||||||
[[./output4-1.png]]
|
[[./output4-1.png]]
|
||||||
**** Taille des formes contrôlée
|
|
||||||
#+CAPTION: Image générée à partir de ~img/mahakala-monochrome.png~ avec 2000 améliorations avec la quatrième méthode avec l’option ~-s~
|
#+CAPTION: Méthode 4, triangles
|
||||||
[[./output4-2.png]]
|
[[./output4-2.png]]
|
||||||
|
|
||||||
|
#+CAPTION: Méthode 5, sous-méthode 2, carrés
|
||||||
|
[[./output5-2-1.png]]
|
||||||
|
|
||||||
|
#+CAPTION: Méthode 5, sous-méthode 2, triangles
|
||||||
|
[[./output5-2-2.png]]
|
||||||
|
|
||||||
|
#+CAPTION: Méthode 5, sous-méthode 4, carrés
|
||||||
|
[[./output5-4-1.png]]
|
||||||
|
|
||||||
|
#+CAPTION: Méthode 5, sous-méthode 4, triangles
|
||||||
|
[[./output5-4-2.png]]
|
||||||
|
Binary file not shown.
@ -81,7 +81,6 @@ void processFilenames(po::variables_map const &t_vm, path const &t_input,
|
|||||||
ret.output_path = output_path;
|
ret.output_path = output_path;
|
||||||
ret.iterations = vm.count("iterations") ? vm["iterations"].as<int>()
|
ret.iterations = vm.count("iterations") ? vm["iterations"].as<int>()
|
||||||
: DEFAULT_ITERATIONS;
|
: DEFAULT_ITERATIONS;
|
||||||
spdlog::debug("arg: {}", vm.count("form") ? vm["form"].as<int>() : 1);
|
|
||||||
ret.method = vm.count("method") ? vm["method"].as<int>() : 1;
|
ret.method = vm.count("method") ? vm["method"].as<int>() : 1;
|
||||||
switch (vm.count("form") ? vm["form"].as<int>() : 1) {
|
switch (vm.count("form") ? vm["form"].as<int>() : 1) {
|
||||||
case 2: ret.shape = Shape::ShapeType::Triangle; break;
|
case 2: ret.shape = Shape::ShapeType::Triangle; break;
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
#include <gtest/gtest.h>
|
|
||||||
|
|
||||||
TEST(SquareRootTest, PositiveNos)
|
|
||||||
{
|
|
||||||
ASSERT_EQ(6, 2 * 3);
|
|
||||||
ASSERT_EQ(6, -2 * -3);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(SquareRootTest, NegativeNos)
|
|
||||||
{
|
|
||||||
ASSERT_EQ(-6, -2 * 3);
|
|
||||||
ASSERT_EQ(-6, 2 * -3);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
{
|
|
||||||
testing::InitGoogleTest(&argc, argv);
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user