On estime que les gens sont exposés à plus de cinq mille messages publicitaires par jour. Les entreprises, les produits, les organisations tentent tous de se représenter d'une manière visuellement attrayante et distinctive. Les grands acteurs dépensent parfois des sommes considérables pour développer leur marque, mais le reste d'entre nous doit souvent démarrer et se tourner vers des créateurs de logos en ligne tels que Looka ou Tailor Brands comme point de départ. Ces services vous permettent de créer un logo en quelques clics en sélectionnant du texte, des éléments visuels et des caractéristiques de style. La création d'un logo est généralement gratuite, mais si vous souhaitez télécharger une version vectorisée de haute qualité, vous devez payer une petite somme.
Les générateurs de logos répondent aux besoins d'un marché spécifique et les logos qui en résultent sont élégants. Cependant, le processus de génération est en grande partie basé sur des modèles, dans lesquels un nombre fixe d'éléments visuels tels que des icônes, des polices et des couleurs sont combinés de manière prédéterminée.
D'une certaine manière, les générateurs de logos basés sur des modèles sont comparables à des livres de cuisine intelligents et interactifs. Mais que se passerait-il si un véritable chef venait chez vous pour vous concocter un repas unique ? Les modèles d'IA générative tels que DALL-E 1 et 2 d'OpenAI et Imagen et Parti de Google ont montré qu'ils étaient capables de combiner et d'intégrer des concepts complexes et de les traduire en représentations visuelles de haute qualité, qui ne se distinguent pas de la créativité humaine, mais qui s'en rapprochent. Et si nous pouvions créer un modèle d'IA génératif spécialisé pour générer des logos réellement créatifs et significatifs, qui ne soient pas des combinaisons astucieuses d'éléments préfabriqués, mais qui soient aussi bons que les vrais logos ? En outre, les logos cachent une compréhension symbolique commune de la signification et du sens qu'ils tentent de transmettre (sémiotique). Pourrions-nous faire en sorte qu'un modèle d'IA comprenne cette signification et ne crée pas simplement des logos "attrayants", mais des logos qui correspondent à nos attentes et à nos conventions humaines ? Ce billet de blog documente le développement d'un démonstrateur de preuve de concept d'un modèle de type DALL-E pour la génération de logos. Nous abordons la collecte de données, le prétraitement, la génération de légendes, l'entraînement du modèle et les résultats. Si vous souhaitez passer directement à la démonstration interactive, vous pouvez vous rendre sur Replicate.
Avant de nous plonger dans le processus de préparation des données, qui occupera la majeure partie de ce billet, il est utile de faire un bref retour en arrière sur le modèle que nous avons choisi d'utiliser, car il a déterminé un grand nombre de nos décisions ultérieures.
Lorsque nous avons commencé ce projet, DALL-E 1 était à la pointe de la technologie en matière de génération d'images à partir de texte, c'était donc un choix logique. Plus précisément, nous avons choisi de commencer par minDALL-E, une implémentation PyTorch open source d'une variante plus petite de DALL-E combinant le VQGAN original pré-entraîné avec un transformateur de type GPT à 1.3b paramètres entraîné sur 14 millions de paires image-texte.
Sans entrer dans les détails, minDALL-E est composé de deux parties :
Au moment de l'apprentissage, vous devez d'abord apprendre au tokenizer d'image (VQGAN) à reconstruire les images de l'ensemble de données sur la base des tokens d'image. Une fois cette étape franchie, vous pouvez entraîner le prédicteur de jetons d'image (GPT) à prédire séquentiellement les jetons d'image qui devraient se trouver dans le texte fourni (prédire l'image en fonction de la légende).
Au moment de l'inférence, lorsqu'un logo doit être généré, l'invite d'entrée est convertie en jetons de texte qui sont utilisés par le transformateur (GPT) pour prédire les jetons d'image qui sont ensuite traduits en une nouvelle image, jamais vue auparavant, par le décodeur du tokenizer d'image.
Le point de départ de notre collecte de données est le Wikipedia-based Image Text Dataset(WIT) qui comprend plus de 11 millions d'images avec des descriptions textuelles riches et des métadonnées qui nous permettent de filtrer relativement facilement sur les logos. Parmi les autres ensembles de données ouvertes utiles que nous avons trouvés figurent le Large Logo Dataset(LLD, 120 000 logos) et le WebLogo-2M Dataset (2 millions de logos avec des étiquettes faibles). Ils sont complétés par des logos que nous avons collectés automatiquement en ligne sur des sites web publics à l'aide de Selenium. Récemment, le Laion-5b (5b paires image-texte) est devenu disponible. Nous ne l'utilisons pas encore pour cette exploration, mais il pourrait s'avérer utile à l'avenir.
La première étape consiste à convertir toutes les images au format jpeg et à ajuster leur taille. Le problème que nous rencontrons ici est que certains types de fichiers permettent des arrière-plans transparents, alors que notre modèle nécessite des fichiers jpeg (sans transparence). Pour résoudre ce problème, nous devons deviner astucieusement la couleur d'arrière-plan correcte en nous basant sur les bords du logo et la remplir avant de convertir l'image. Cette opération est souvent loin d'être facile et un nettoyage manuel supplémentaire s'est avéré nécessaire.
Deuxièmement, notre modèle nécessite des images jpg de 256x256px, ce qui n'est pas très grand pour un logo, surtout lorsqu'il contient beaucoup de texte. De plus, de nombreux fichiers que nous avons collectés contiennent une quantité importante d'espaces blancs autour des logos, ce qui est bien sûr une perte d'information et doit être réduit. Pour ce faire, nous utilisons la bibliothèque d'imagerie Python pour calculer la différence entre l'image du logo et une image ne comportant que la couleur de fond, puis nous rognons sur cette zone. Les images trop petites sont supprimées et les autres sont converties à la bonne forme et à la bonne taille.
Une chose que nous remarquons rapidement est que les données que nous avons collectées ne peuvent pas être utilisées telles quelles, mais qu'un filtrage et un nettoyage sérieux sont nécessaires. Tout d'abord, pour la génération d'images basées sur le texte, il faut des paires d'images et de textes. Certaines informations peuvent être tirées des images elles-mêmes, mais si vous voulez relier le logo à une entreprise ou à un produit, à un secteur d'activité ou à d'autres informations sur la marque, vous avez besoin de métadonnées et, de préférence, d'informations contextuelles. Cela exclut d'emblée certains jeux de données ouverts.
Deuxièmement, les images de logos sont souvent des images réelles d'objets portant des logos, comme des voitures ou des bâtiments. En outre, certaines images de logos ne sont même pas des logos tels qu'on les conçoit, par exemple des emblèmes historiques et des timbres en papier. Comme nous voulons générer des logos propres, plus ou moins prêts à être utilisés sur un site web par exemple, nous voulons filtrer ces images.
Une heuristique très utile pour détecter les images qui ne sont pas des logos consiste à examiner la taille du fichier. Les logos sont des images numériques composées d'un nombre limité de couleurs, qui apparaissent dans des blocs de plusieurs pixels. Ils sont donc très faciles à compresser. Les images compressées dont la taille de fichier est très faible sont plus susceptibles d'être "vides" ou de contenir de grandes bandes blanches, tandis que celles dont la taille de fichier est élevée contiennent probablement des informations à haute fréquence, ce qui est typique des images du monde réel. Nous choisissons donc un seuil inférieur et un seuil supérieur et ne conservons que les images situées entre les deux.
Enfin, de nombreux éléments sont des doublons ou des quasi-doublons (variantes occasionnelles, par exemple), dont on ne souhaite pas qu'ils soient trop nombreux dans l'ensemble de données afin d'éviter les biais. Pour la détection des doublons, nous utilisons un CNN pré-entraîné sur ImageNet, qui contient des représentations générales dans ses couches finales. Nous codons toutes les images de notre ensemble de données (déjà filtrées) avec le modèle et stockons leurs encastrements. Nous calculons ensuite les distances entre ces encastrements pour déterminer la similarité sémantique entre chaque paire d'images. Si les intégrations de deux images sont proches, leur contenu est très similaire.
Par essais et erreurs, nous apprenons qu'il faut combiner plusieurs techniques de filtrage et de nettoyage, de manière itérative, et qu'il faut souvent y revenir après un prétraitement plus poussé pour effectuer un nettoyage supplémentaire. Le traitement des données dans le monde réel peut être une entreprise peu glorieuse. Nous appliquons diverses techniques pour réduire les données de mauvaise qualité en plusieurs étapes. Nous obtenons ainsi un ensemble de données d'un peu plus de 140 000 images de logos distinctes avec des informations contextuelles.
Un bon logo représente principalement une interaction intelligente entre le texte, la police, les couleurs et les éléments visuels. Pour ce faire, nous devons ajouter les informations pertinentes aux légendes des logos afin que le modèle soit en mesure d'apprendre les associations correctes. La première étape consiste donc à extraire le texte précis du logo. Nous testons plusieurs options et choisissons le service OCR Google Cloud Vision API qui, lorsqu'il utilise le mode de détection de texte, est capable d'extraire du texte à partir d'une large gamme d'images, y compris les panneaux de signalisation et les logos.
Nous voulons également permettre à l'utilisateur de choisir les couleurs les plus importantes du logo, mais cette information n'est que rarement disponible dans les métadonnées ou le texte environnant. Nous avons donc décidé d'extraire les couleurs d'arrière-plan et les couleurs de premier plan les plus importantes des images elles-mêmes en utilisant Colorgram, Color Thief et la bibliothèque d'images Python. Nous définissons une liste de noms de couleurs souhaités et faisons correspondre les couleurs extraites avec ces noms...
En outre, une distinction est souvent faite entre différents types de logos, dont certains que nous voulions être en mesure de générer de manière ciblée. Pour ce faire, nous avons entraîné un classificateur à prédire 6 types de logos différents : lettrine, mot-symbole, symbole, mascotte abstraite et emblème (comme nous l'avons vu ici). Nous avons ensuite étiqueté manuellement 600 logos à l'aide de Labelbox et affiné un classificateur prêt à l'emploi MobileNetV2.
Nous extrayons des mots-clés d'une description de l'entreprise ou de l'organisation qui se cache derrière le logo par le biais d'un transformateur de phrases pré-entraîné qui sous-tend une architecture KeyBERT. Le raisonnement est le suivant : ces mots-clés identifient ce que l'organisation représente et comment elle veut être perçue. Ces deux aspects sont très susceptibles de se refléter dans la conception du logo (par exemple, une entreprise technologique qui souhaite être perçue comme moderne et innovante optera probablement pour un logo minimaliste, tandis qu'une banque qui souhaite être perçue comme stable et digne de confiance optera pour un emblème d'apparence traditionnelle).
Voici quelques exemples d'organisations avec les principaux mots-clés que nous avons extraits pour elles
L'idéal serait de disposer d'une ou plusieurs descriptions générées par l'homme pour chaque logo, mais l'étiquetage de 140 000 images serait d'un coût prohibitif. Comme nous sommes en phase d'amorçage, nous allons essayer le sous-titrage automatique à l'aide de ClipCap, un système combinant astucieusement CLIP et GPT2 pour produire des descriptions d'images inédites dans la nature.
ClipCap est affiné sur le plus petit ensemble de données Conceptual Cap tions qui contient un peu plus de 3 millions de paires image-texte, dont la plupart sont des images de scènes, d'objets ou de paysages, et non des logos. Malgré cela, ClipCap fournit des résultats acceptables lorsqu'il est appliqué à des logos. Dans certains cas, il se contente d'observer qu'il s'agit d'un "logo", alors que dans d'autres cas, ClipCap reconnaît des caractéristiques de style, des éléments visuels ou fournit même une sorte d'interprétation.
La manière dont une légende est réalisée est en produisant séquentiellement le texte token par token en utilisant le réseau de décodeurs GPT2 de ClipCap. À chaque étape, ce modèle produit une distribution de probabilité des mots qui sont appropriés pour la légende. Puisque nous obtenons cette distribution, nous avons plusieurs options pour construire notre légende. La méthode la plus simple (et la plus ennuyeuse) consiste à toujours prendre le mot ayant la probabilité la plus élevée (et la plus petite quantité d'entropie). Cette méthode est bien sûr un peu courte, car le meilleur mot à un moment donné n'est pas nécessairement le meilleur mot dans l'ensemble.
Une alternative à cette méthode est d'échantillonner à partir de la distribution de probabilité de sortie. Cela permet d'obtenir des légendes plus variables, car le mot ayant la probabilité la plus élevée n'est pas toujours très informatif et, en incluant des mots moins évidents, on peut obtenir des phrases plus intéressantes. En outre, l'ajout d'un paramètre de température permet de manipuler le degré d'"aventurisme" du mécanisme d'échantillonnage. Une température plus basse rend le modèle plus confiant, de sorte qu'il choisira plus souvent l'option la plus sûre et la plus probable ; une température plus élevée égalise davantage la distribution, ce qui conduira à des sélections plus variables (voir la figure ci-dessous).
Une autre extension de cette technique d'échantillonnage, appelée recherche par faisceau, consiste à construire plusieurs séquences (ou faisceaux) au lieu d'une seule, et à rechercher à la fin la séquence qui a le meilleur score global. En modifiant la taille du faisceau, nous faisons un compromis entre le calcul nécessaire et la qualité de la légende.
En fin de compte, pour la partie sous-titrage du pipeline, les images plus grandes donnent généralement de meilleurs résultats, tout comme l'utilisation de la recherche par faisceau avec une taille de 5 et l'ajustement de la température à 0,3. On obtient ainsi une belle combinaison de descriptions véridiques mais créatives et sémantiquement riches.
Un dernier défi consiste à combiner toutes les informations que nous avons recueillies dans des ensembles de légendes cohérentes, mais en même temps suffisamment variables, de près de 64 jetons de texte pour entraîner notre modèle. Après avoir relu l'article de DALL-E et vérifié à nouveau le billet de blog, nous décidons qu'il est préférable de remplir au maximum les 64 jetons de texte disponibles afin de donner au modèle autant d'informations que possible à utiliser pour prédire les jetons d'image.
Pour chaque logo, nous disposons des informations suivantes :
Ensuite, nous créons un script pour générer des permutations de phrases en remaniant autant que possible les éléments d'information disponibles afin d'éviter les biais liés à la position et à l'ordre tout en conservant un semblant de langage naturel. Nous distinguons également plusieurs phases afin de limiter les biais, car certains termes sont plus fréquents que d'autres, comme les couleurs par exemple. Chaque phase contient dix légendes générées parmi lesquelles le modèle en sélectionne une au moment de l'apprentissage.
Comme point de départ, nous utilisons les poids pré-entraînés standards de minDALLE. La première étape consiste à affiner le VQGAN. Ce modèle VQGAN a déjà été entraîné sur une grande variété de données, ce qui inclut mais n'est pas limité à des images graphiques telles que des logos. Bien que ce réseau d'encodage et de décodage puisse déjà reconstruire des images de manière satisfaisante, il peut encore faire beaucoup mieux sur les images de logos en particulier. Les données du monde réel contiennent généralement des informations à haute fréquence, car les images naturelles présentent une grande variété de couleurs et de textures irrégulières. Les logos, quant à eux, sont généralement constitués de plans de la même couleur et de formes relativement simples.
Nous voulons que le VQGAN nous donne des bords nets et des plans de couleur homogène pour reconstruire nos logos, ce qui nécessite un réglage fin du modèle. Pendant le processus de réglage fin, nous pouvons clairement voir les améliorations sur ces aspects et nous voyons la perte diminuer à chaque époque. Nous entraînons le modèle pendant quarante époques jusqu'à ce que nous soyons satisfaits de la qualité des résultats. À ce stade, le modèle n'est pas encore surajusté, de sorte qu'il est possible d'obtenir des gains de qualité supplémentaires en poursuivant l'entraînement.
Le processus général d'apprentissage du modèle DALL-E consiste à encoder un lot de légendes d'images provenant de l'ensemble d'apprentissage et à apprendre à prédire les mots-clés d'images discrètes de VQGAN (voir également la section sur le modèle ci-dessus). Chacun de ces jetons représente une classe distincte et cette étape est typiquement entraînée avec la perte d'entropie croisée.
En plus de cette prédiction autorégressive des jetons d'image, pour aider à apprendre des enchâssements de texte significatifs qui capturent les relations entre les mots, il y a une perte de modélisation du langage, similaire à celle utilisée pour former les modèles GPT autorégressifs du décodeur seul. Cette perte est ajoutée à la perte totale avec un certain poids, afin d'équilibrer l'effet des pertes liées au langage et à la prédiction de jetons d'image.
Lors de l'entraînement de ce modèle pour la génération d'images conditionnées par du texte, nous nous rendons rapidement compte que notre ensemble de données n'est pas très grand et que notre modèle est suffisamment grand pour en mémoriser une grande partie. Cela conduit rapidement à un surajustement où, plutôt que de dériver des principes généralisables, le modèle apprend les données par cœur. Cela lui permet d'atteindre une excellente performance sur les données vues mais une performance lamentable sur les données non vues, ce qui n'est bien sûr pas ce que nous voulons !
Il y a trois façons principales de s'attaquer au surajustement : augmenter la taille de l'ensemble de données d'apprentissage, réduire la taille du modèle ou appliquer une régularisation. Comme les deux premières solutions ne sont pas envisageables, nous appliquons plusieurs techniques de régularisation pour limiter la capacité du modèle à apprendre des choses par cœur et le forcer à apprendre des représentations plus utiles qui se généralisent à l'ensemble de test. Les techniques utilisées comprennent la perte focale, l'écrêtage du gradient, la décroissance du poids et la variation des légendes, qui sont toutes discutées plus en détail ci-dessous. Avec cette configuration adaptée, nous affinons le modèle pendant 15 époques jusqu'à ce qu'il commence à se suradapter.
Tout d'abord, nous remplaçons la perte d'entropie croisée par une perte mieux adaptée aux ensembles de données déséquilibrés en termes de classes. Mais en quoi notre ensemble de données est-il déséquilibré, me direz-vous ? Étant donné que nous ne prédisons pas directement l'image entière, mais plutôt des segments (sous la forme de jetons d'image), certains jetons apparaissent beaucoup plus souvent que d'autres dans les logos, comme le jeton qui représente un fond noir ou blanc. Ceux-ci sont beaucoup plus fréquents qu'un patch d'image exotique contenant du texte et plusieurs couleurs (alors que ce dernier est en fait plus important). Ainsi, pour réduire les effets de ces jetons dominants (les paris les plus sûrs), nous mettons en œuvre la perte focale. Il s'agit d'une perte d'entropie croisée adaptée qui donne plus de poids (en termes de perte) aux mots-clés qui ne sont pas bien prédits (et qui ont donc une probabilité plus faible) et réduit le poids des classes qui sont déjà prédites avec une probabilité décente. L'objectif du modèle n'est plus d'essayer d'optimiser encore plus les parties les plus faciles, mais de s'attaquer aux défis les plus ardus.
Une deuxième technique de régularisation est l'écrêtage de gradient, qui limite la taille des gradients pendant l'apprentissage et réduit les chances que le modèle s'emballe. Si un échantillon spécifique (ou un lot) donne un gradient bizarre et/ou absurdement élevé qui pousse les poids du modèle dans une direction non souhaitée, son impact est limité. Bien que les gradients soient généralement orientés dans une direction favorable, nous ne voulons pas apporter de changements trop importants à chaque mise à jour.
Une autre technique appliquée aux gradients est la décroissance des poids. Il s'agit d'une technique bien connue qui consiste à inclure la taille des poids du modèle dans la fonction de perte. L'idée sous-jacente est que, si nous permettons aux poids du modèle de prendre n'importe quelle valeur, il est très facile d'apprendre toutes les données d'apprentissage. En limitant la taille de ces poids, en ajoutant les amplitudes des poids à la perte avec la perte L2, les poids du modèle restent dans des limites raisonnables et ont une meilleure chance d'apprendre des caractéristiques qui sont largement utilisables et contiennent des informations utiles qui peuvent être utilisées pendant l'inférence.
Une dernière technique importante que nous utilisons consiste à augmenter la variété des légendes associées à chaque image. Comme nous l'avons vu dans la section consacrée à la génération de légendes, nous sommes en mesure de générer une liste de légendes pour chaque image et d'en attribuer une au hasard à chaque période d'apprentissage. De cette manière, le modèle n'a pas la possibilité d'apprendre uniquement la correspondance directe entre le texte et l'image, mais doit plutôt apprendre les informations sémantiques contenues dans les légendes.
Cependant, tout ce que nous essayons ne fonctionne pas comme prévu. Nous définissons des intégrations de caractères distinctes pour pouvoir diriger la génération de texte à l'intérieur du logo en l'ajoutant à l'entrée textuelle. La raison principale est d'indiquer clairement au modèle quel texte se trouve réellement dans l'image et ne fait pas partie de son contenu sémantique.
Bien que cette approche semble raisonnable, il est en pratique très difficile pour le modèle d'apprendre ce type d'informations complexes (caractères, polices, boîtiers, couleurs, taille, direction, etc.) Même s'il possède 1,3 milliard de paramètres, il reste relativement petit et a du mal à inclure ce nouveau type d'informations dans ses prédictions. Si l'on examine l'article original sur DALL-E et d'autres grands modèles multimodaux, il est clair que les capacités des modèles s'échelonnent en fonction de leur taille et qu'un comportement aussi complexe apparaît lorsque l'on grossit et que l'on grossit encore (c'est ce que l'on appelle les lois d'échelle).
La deuxième raison est que nous disposons d'un ensemble de données relativement petit, avec "seulement" 140 000 images, et que les informations textuelles d'un logo contiennent souvent le nom de la marque et sont donc uniques. Cela permet au modèle de commencer assez facilement à associer les textes un à un avec les images et de commencer à s'adapter de manière excessive. Il en résulte une dégradation des performances du modèle et un effondrement du mode (ce qui signifie que le modèle génère les mêmes échantillons à plusieurs reprises).
Dans l'ensemble, nous sommes très satisfaits des résultats obtenus, sachant qu'il s'agit de la première version opérationnelle d'un démonstrateur de validation de concept. Vous trouverez ci-dessous quelques exemples de messages-guides avec chaque fois quarante logos (non sélectionnés) générés selon l'ordre de CLIP non affiné.
Voici quelques observations que nous avons faites :
Si nous comparons les logos générés avec l'original minDALL-E (ci-dessous), nous constatons que notre approche produit des résultats plus diversifiés, plus cohérents et plus attrayants sur le plan visuel. Si l'on compare avec le récent modèle de diffusion laion-ai / erlich, on constate que notre approche est plus rapide et plus "créative" dans la mesure où les logos générés sont plus diversifiés. Les logos générés par erlich traitent beaucoup mieux le texte et sont plus proches d'un produit final.
Nous sommes convaincus que la génération de logos par l'IA sera bientôt une réalité (et que l'IA pilotera une série d'autres processus créatifs complexes). L'exercice présenté ici a montré que des modèles d'IA générative avancés tels que DALL-E peuvent créer des résultats uniques et de grande qualité, adaptés à la compréhension et à la sémiotique humaines ; ils sont essentiellement capables de rivaliser avec la créativité humaine.
Nous faisons cette déclaration même sur la base de notre modèle relativement "petit", et nous sommes fermement convaincus que l'extension et l'affinement de notre ensemble de données contribueront à rendre nos résultats prêts à être utilisés dans le monde réel. Au-delà de l'ensemble de données, d'autres améliorations peuvent être apportées, par exemple en utilisant un modèle de diffusion latent, par un pré-entraînement ciblé, par exemple pour les polices et les icônes, en utilisant un générateur de légendes basé sur le ML et en affinant CLIP pour ordonner les résultats.
Enfin, cette expérience a une fois de plus démontré la vitesse à laquelle l'IA peut évoluer et apprendre. Cela suggère que l'apport de l'utilisateur, associé à la connaissance du domaine existant, sera un facteur essentiel de réussite. Cela pose un défi aux processus créatifs existants, qui manquent souvent de facteurs de réussite et d'indicateurs clés de performance clairs (par exemple, How Brands Grow - Distinctive Brand Assets pour une tentative de rendre ces facteurs mesurables). L'absence d'un langage de conception clair (qu'est-ce qui est "minimal" pour vous ?) et d'un modèle de notation (un "bon" logo par rapport à un "mauvais") rendra comparativement plus difficile le parcours d'apprentissage de l'IA. Quoi qu'il en soit, l'ajout de classificateurs pertinents (et testés) à la base de données existante et l'apprentissage à partir des commentaires des utilisateurs et des réactions implicites seront essentiels. Il est intéressant de noter que si l'IA est bien gérée, nous pensons qu'elle pourrait en fait ouvrir une nouvelle ère en rendant le marketing plus scientifique.
Vous pouvez tester la démo interactive sur Replicate.
Nous tenons à remercier Bert Christiaens, Karel Haerens, Mathias Leys et Elina Oikonomou pour leur travail sur la démo et ce billet de blog, ainsi que Daan Raemdonck pour avoir partagé son expertise dans le domaine. Nous tenons également à remercier le Vlaams Supercomputer Centrum(VSC) et Tim Jaenen de la Fondation flamande pour la recherche(FWO) pour l'utilisation de leur infrastructure.