2017-02-27T00:00+02:00
Peu de gens ayant accès à Internet ont échappé à la déferlante du Neural Style cette dernière année. Ce qui était originalement une publication forte mêlant CNNs et travail de l'image est en passe de devenir un nouveau mode de création artistique à part entière. De nombreuses applications ont, depuis, reproduit ce concept pour le proposer à leurs utilisateurs. L'implémentation était souvent limitée dans ses résultats et rendait rarement hommage aux chercheurs qui ont mis en place ces algorithmes, mais s'est peu à peu propagée dans l'ensemble des réseaux sociaux.
Nous vous proposons ici de reparcourir cette épopée en trois grands moments. Pour commencer, nous reviendrons aujourd'hui sur le travail originel de Neural Style, sa logique et ses résultats. Les articles suivants aborderont l'adaptation du Neural Style aux Texture Nets (avec un énorme gain en performance), pour enfin s'attarder sur le Video Neural Style.
On décrit souvent le Neural Style de la manière suivante : prenez une photographie et une peinture de votre choix, et le réseau génèrera une nouvelle image avec le contenu de la photographie en suivant le style de la peinture. Cette description a l'avantage de la simplicité, mais limite fortement la compréhension du phénomène et tend ainsi à le caricaturer.
Rendons à César ce que d'autres lui volent sans vergogne, la publication originale est A Neural Algorithm of Artistic Style Leon A. Gatys Alexander S. Ecker and Matthias Bethge. Le code original, lui, est disponible sous framework Torch sur Github(https://github.com/jcjohnson/neural-style).
Sans aller trop loin dans les détails, il faut comprendre que les auteurs sont repartis d'un réseau (CNN) originellement dédié à la classification d'images, le VGG. Ce réseau, pour réussir ses classifications, génère donc dans ses couches de nouvelles représentations intermédiaires de l'image jusqu'au résultat final, la classification estimée. Ce sont ces représentations intermédiaires qui ont interessé les auteurs, ces fameuses "feature maps". Il est en effet possible, à partir d'une des couches du réseau, de reconstruire une image et ainsi de "voir" quelles informations a conservé cette couche Understanding Deep Image Representations by Inverting Them - Mahendran et al. On peut ainsi retrouver, à différentes étapes du réseau, dans quelle mesure le contenu original a été conservé ou transformé :
Ce processus permet ainsi de retrouver, au sein du réseau, le contenu de l'image. Se pose maintenant la fameuse question du style. Gatys et al., dans ["Texture synthesis and the controlled generation of natural stimuli using convolutional neural networks](http://arxiv.org/abs/1505.07376. A)", ont développé une logique permettant de générer des textures à partir des feature maps d'une couche. En calculant la matrice de Gram composée des corrélations entre les différentes feature maps d'une couche, ils extraient ainsi ce fameux "style" à différents niveaux :
L'idée fondamentale des auteurs est que ces deux visions, contenu et style, sont séparables, et qu'il est ainsi possible d'entrainer un réseau à trouver une image qui, d'un côté, se rapproche "en contenu" d'une image 1, et de l'autre, se rapproche "en style" d'une image 2. Il en découle une fonction de coût spécifique qui mélange ces deux données, ce mélange étant une pondération que l'on peut faire évoluer.
Le schéma ci-dessous montre ainsi l'image générée en choisissant différentes couches du réseau original (axe vertical), avec différentes pondérations des deux contenus (axe horizontal)
Le code est accessible (en Lua avec Torch) depuis le début sur Neural-style . Libre à vous de cloner le code original et de vous amuser avec. Nous ne saurions trop vous conseiller de jouer avec les différents paramètres exposés. Vous observerez que le comportement peut changer radicalement selon le style utilisé. Un style présentant une découpe nette (pointillisme, traits de pinceaux en évidence) aura besoin d'un "style_weight" moins important qu'un style de peinture plus lisse. De même, le "style_scale" définiera à quelle échelle le réseau recherche un style. On peut caricaturer ce paramètre en considérant que plus il est grand, plus le réseau utilisera un style de trait d'une taille importante. Ultimement, rien ne vous interdit de choisir une autre collection de couches de style (paramètre "style_layers" par défaut à 'relu1_1, relu2_1, relu3_1, relu4_1, relu5_1') pour la représentation. Evidemment, une machine puissante est recommandée pour ne pas mourir de frustration sous la lourdeur des calculs...
Pour conclure, ce sujet est l'occasion de voir la limite entre, d'un côté, une compréhension intuitive d'un algorithme (l'application d'un style à une image) et le processus mathématique (utilisation d'une fonction de coût générée depuis les couches intermédiaires d'un réseau et les matrices de Gram). Car dans de nombreux cas, ce que vous estimerez être le "vrai style" d'une image sera totalement ignoré par le réseau de neurones, là où dans d'autres, les résultats sont bluffants.
Prochaine étape : les Fast Neural Style avec les Texture Nets.