• Aucun résultat trouvé

Une fois les deux modèles basiques créés et la preuve de concept établie, nous avons entraîné un modèle plus complexe afin de prendre en compte la texture de la peau en plus de la position du visage. Celui-ci ayant cent fois plus de paramètres (200 000 contre 20 millions) et une architecture plus lourde, il a été bien plus difficile de l’entraîner.

2.2.1 Écueils classiques

Avant d’arriver aux véritables résultats, nous pensons intéressant de montrer les écueils fréquents lors de l’entraînement de tels modèles.

Les réseaux génératifs étant deux modèles essayant de remporter une bataille d’optimisation, l’équilibre à atteindre est souvent délicat à trouver. Il est donc important de montrer le déséquilibre dans de telles optimisations.

La première est un problème de convergence, il peut venir du modèle ou d’une mauvaise paramétrisation. Cela entraîne le modèle à converger dans des régions sous optimales et par la suite, continuer à optimiser des points non nécessaires. Figure 2.4 on peut voir que des semblants de formes et de couleurs sont appris, mais même en laissant le modèle s’entraîner plusieurs jours le résultat sera sensiblement le même.

Le deuxième écueil est une mauvaise balance entre le générateur et le discriminateur.

Bien que le modèle converge et ne tombe pas dans le problème ci-dessus, si l’un des deux adversaires réussit à prendre le dessus on obtient une convergence totalement biaisée. Ces deux problèmes amènent à un réseau inexploitable par la suite et l’entraînement est à revoir. À la figure2.5 le générateur est devenu trop puissant, le fait de placer des artefacts sur les yeux et la bouche (ciblés par les modules d’attention) permet de tromper le discriminateur à tous les coups. En effet, ce dernier apprenant en même temps, mais de façon plus lente croit que cette représentation est celle d’un visage réaliste. Le générateur continue donc dans cette voie, car le discriminateur ayant appris de mauvaises caractéristiques se trompe trop souvent et donne un retour positif au générateur.

Figure 2.4 – Exemple de mauvaise optimisation. Une mauvaise convergence amène le réseau dans un état irrécupérable. Il y reste ensuite bloqué et il faut revoir l’entraînement. À droite le

visage voulu, à gauche les landmarks donnés en entrée et au centre l’image générée

Le problème est identique si le discriminateur devient trop puissant. On retombe dans des images proches de celle figure 2.4. En effet, le discriminateur réussit dans ce cas à détecter comme faux, à tous les coups, les images du générateur. Celui-ci n’a donc plus aucune chance d’avoir un retour et donc d’apprendre et continuera à générer des images n’ayant aucune structure.

Pour remédier à cela, nous avons combiné plusieurs méthodes existantes : — Changer les taux d’apprentissage des deux modèles [89].

— Optimiser un des deux adversaires x fois plus souvent que l’autre [89].

— Rendre l’apprentissage pour le discriminateur plus difficile en bruitant les images réelles [90].

— Normaliser les données "de l’intérieur" [62] — Normaliser les données "de l’extérieur" [68]

Les méthodes de normalisation apportent de la stabilité au modèle en général. C’est ensuite au cas par cas qu’il faut adapter le taux d’apprentissage et les itérations d’optimisation. Dans notre cas la première étape a été de bruiter les images réelles. Puis, pour obtenir de meilleures performances, nous avons changé les taux d’apprentissages et d’optimisation de façon empirique afin d’arriver au meilleur résultat possible.

Figure 2.5 – Générateur gagnant. La chronologie est de haut en bas. Le générateur trouve bon de placer des artefacts sur les yeux et la bouche ce qui trompe à tous les coups le

discriminateur.

2.2.2 Résultats

Le modèle développé pour générer des visages texturés est plus petit que celui d’origine [44]. Il a été développé en tenant compte des contraintes matérielles et temporelles que nous avions. Bien que moins performant que celui du papier dont nous nous sommes inspirés, il répond à nos attentes.

Un des points clefs pour entraîner plus rapidement le modèle tout en gardant une certaine qualité a été de concaténer certaines couches de l’embedder avec celles du générateur (cf. couches colorées figure 1.8). Bien qu’apportant un effet de copier-coller, il donne rapidement beaucoup d’information au générateur ce qui améliore la rapidité de convergence.

À la figure2.6on peut voir que le réseau crée un mélange des images données à l’embeddeur. En effet, cela lui apporte une récompense minimale stable. Par la suite, il apprend à extraire les caractéristiques clefs des couches que l’on concatène. Enfin, le réseau apprend à faire la part des choses et l’image devient plus nette.

Figure 2.6 – Effet copier-coller du générateur. En haut à gauche, un mélange des informations de l’embeddeur. En haut à droite, une meilleure extraction des informations. En

bas un réseau entraîné correctement.

Cette méthode crée une certaine dépendance aux images données dans l’embeddeur, mais nous a apporté la rapidité et nous a permis de créer un modèle plus petit (9 millions de paramètres contre 80 dans le modèle original).

En revanche, sans concaténation, le réseau est tout de même capable de générer un visage, mais sans tous les détails. Aussi, des caractéristiques plus fines comme les poils (barbe, cheveux), les lunettes, les couleurs, les rides mettent beaucoup plus de temps à être apprises sans concaténation. Au final, en ayant appliqué de la concaténation et en ayant évité les écueils, nous parvenons à recréer des visages comme dans la figure 2.8. On peut voir que même si l’image possède encore quelques artefacts, le visage est plus réaliste. On voit aussi que le visage se place bien dans la position donnée en entrée et correspond bien a l’image de référence. Notre modèle est donc capable de générer un visage dans la position que l’on désire en ayant seulement quelques images dans des positions differentes en guise de contexte.

Nous avons donc dépassé le but envisagé au départ. Après avoir recréé des landmarks qui nous permettront d’analyser un comportement, nous sommes aussi parvenus à générer un visage réaliste. Grâce aux landmarks donnés en entrée, nous sommes en mesure de spécifier la position du visage que nous voulons. Nous pouvons donc créer un portrait dans la pose que

Figure 2.7 – Générateur sans concaténation

Figure 2.8 – Résultats du GAN de visages. À droite le visage voulu, à gauche les landmarks données en entrée et au centre l’image générée

nous souhaitons. De plus, ces résultats ont été générés avec seulement 8 images différentes d’une même personne. Cela signifie qu’au lieu d’embaucher des acteurs, nous pouvons prendre 8 images (ou plus pour plus de précision) d’un étudiant, et de venir modifier la position du visage à notre guise. L’intelligence artificielle nous permet donc de générer les données dont nous avons besoin.

2.2.3 Métriques

Les métriques de ce projet sont biaisées et n’ont donc pas été présentées dans cette section. En effet, le score de chaque visage pourrait être calculé grâce au discriminateur ou par une différence entre les images, mais celles-ci ont étés utilisées pour l’entraînement ce qui apporte un biais non négligeable. Aussi, des méthodes existent pour calculer la variance des données générées [91, 92] afin de voir si celles-ci couvrent un spectre large. Dans notre cas, les données proviennent du jeu de données et nous ne faisons que modifier la position ce qui rend cette métrique caduque. D’autres métriques plus classiques permettent aussi de comparer deux

images2 3 mais le biais introduit lors de l’entrainement à été jugé trop important pour les

utiliser. Aussi, puisque cette méthode est novatrice, aucune comparaison de ces métriques n’est disponible. Nous avons donc préféré optimiser nos modèles et les vérifier par nous même puisqu’il s’agit de découvrir le sujet et d’approcher un nouveau problème grâce a des preuves de concept.

2.2.4 Détails d’implantation

La composition exacte et les détails sont donnés dans la section A.2.

Pour l’architecture, nous avons utilisé des ResidualBlocks comme BigGans [33]. Nous avons pris les "grand" blocs, car, paradoxalement, ils ont moins de paramètres et donnent les mêmes résultats que les plus petits. En effet, les gros modules utilisent des goulots qui réduisent le nombre de paramètres en gardant la même performance. Plus formellement, des convolutions avec un noyau de taille 1 sont appliquées afin de diminuer le nombre de canaux par 4 avant de réaliser les convolutions avec un noyau de taille 3 qui possèdent plus de paramètres (et donc auront moins de canaux a traité).

Ces blocs sont insérés dans l’architecture de [93] qui donne un bon squelette de base sur lequel travailler.

La normalisation spectrale [94] a été utilisée sur toutes les couches de convolutions. Elle force une normalisation des poids des noyaux de convolution ce qui renforce la stabilité du modèle en empêchant les poids d’exploser ou de disparaître.

Nous avons rajouté des couches d’auto attention comme [37] (c.f sectionA.2). L’auto attention permet d’apprendre à pondérer certaines régions de l’image (via les résultats des convolutions) et donc de donner plus d’importance à des caractéristiques spécifiques. De ce fait les détails peuvent être générés grâce à des indices donnés par les positions de certaines caractéristiques. De plus le discriminateur peut vérifier que les détails de plus haut niveau, répartis à différents endroits de l’image sont identiques. Nous avons d’ailleurs vu à la figure 2.5 que l’attention pouvait aider le générateur à tromper le discriminateur.

Pour la concaténation des couches entre l’embedder et le discriminateur, nous avons pris les couches 4, 5 et 6 du modèle (sur un total de 6 couches). Nous n’avons pas retenu les couches 1, 2 et 3, car ce ne sont pas des couches assez profondes et les informations sont de trop haut niveau ce qui amène un effet de copier-coller trop fort par le générateur. En effet, une feature map de trop hauts niveaux ressemblent trop à l’image d’origine, car le réseau n’aura pas encore transformé complètement l’image dans sa représentation interne. En donnant une feature map de trop haut niveau, le générateur utilisera donc des informations de l’image d’origine et non celles qu’il aura apprises. Cela pénalisera donc plus qu’il n’aidera l’apprentissage.

Pour obtenir les landmarks, nous avons utilisé le framework d’Adrian Bulat [60], avec son module python, [59] mais d’autres méthodes comme [95] sont possibles. La méthode utilisée à été choisie car elle était directement implantable et à l’état de l’art du problème de détections de landmarks.

Documents relatifs