Deep learning & Style transfer

-
4
 m de lecture
-
deep learning

Avez-vous déjà souhaité pouvoir peindre comme Van Gogh? Reproduire l’esthétique de Monet dans des paysages modernes?

Dans cet article, nous allons vous présenter une technique utilisant le Deep Learning pour appliquer à une image d’origine le style d’une autre. Cette technique d’optimisation est connue sous le nom de neural style transfer (ou transfert de style), décrite pour la première fois dans l’article de Leon A. Gatys, A Neural Algorithm of Artistic Style.

Qu’est ce que le style transfer ?

Le style transfer est une des applications les plus créatives des Réseaux de Neurones Convolutifs (pour en savoir plus sur les CNN, nous avons publié récemment un article sur le sujet)

Elle permet de récupérer le style d’une image et de le restituer à n’importe quelle autre image. C’est une technique intéressante qui permet de mettre en évidence les capacités et les représentations internes des réseaux de neurones. Elle peut s’avérer également utile dans certains domaines scientifiques pour l’augmentation ou la simulation de données images.

Les combinaisons presque infinies de contenus et de styles possibles font émerger des résultats uniques et toujours plus créatifs chez les adeptes de réseaux de neurones, et parfois même de vrais chefs-d’œuvre.

Pour fonctionner, il est nécessaire de choisir une image de référence pour le contenu et d’une image de référence pour le style (comme l’œuvre d’art d’un peintre célèbre). Une troisième image, initialisée avec l’image de contenu est ensuite optimisée petit à petit, jusqu’à ce qu’elle ressemble à l’image de contenu, mais « peinte » dans le style de la seconde image.

Le principe du transfert de style consiste principalement à définir deux fonctions de distance:

  • l’une qui décrit la différence entre le contenu de deux images
  • l’autre qui décrit la différence entre deux images par rapport à leurs styles

Il suffit ensuite de minimiser ces deux distances, en utilisant une technique de rétropropagation pour obtenir après optimisation, une image qui correspond au contenu de l’image de contenu et au style de l’image de style.

Les distances que nous utiliserons seront décrites plus bas et seront calculées à partir des images extraites de couches intermédiaires du réseau de neurones. 

Un aspect impressionnant de cette technique est qu’aucun nouvel entraînement de réseaux de neurones  n’est nécessaire – l’utilisation de réseaux pré-entrainés comme VGG19 suffit et fonctionne amplement. Vous vous demandez comment cela fonctionne, n’hésitez pas à consulter notre article sur le Transfer Learning

Dans cet article je vous présenterai un exemple concret d’utilisation du transfert de style en utilisant la bibliothèque Tensorflow

La démarche utilisée ici imite le plus fidèlement possible les méthodes du papier originale. Le code complet de cet article est disponible à l’adresse suivante.

En utilisant seulement deux images de base à la fois, nous pourrons créer des chefs-d’œuvre comme cette représentation de  La Naissance de Vénus de Botticelli, si elle avait été peinte par Marc Chagall 4 siècles plus tard.

Pour notre exemple, nous avons besoin de deux images de base que nous voulons « mélanger » ensemble. La première représente le contenu que nous souhaitons conserver. Dans mon cas, j’utiliserai cette peinture bien connue de La Naissance de Vénus de Sandro Botticelli   :

La seconde image contiendra le style que nous voulons garder et appliquer à la première.

Ici, je choisis le style incomparable du peintre emblématique du 20ème siècle, Marc Chagall, grâce à l’une de ses œuvres intitulée La vie.

Chargement et pre-processing des images

Nous allons dans un premier temps charger et préparer les données pour leur appliquer  le même processus de prétraitement que celui utilisé pour l’entraînement des réseaux VGG. Puis nous allons également créer une fonction qui effectue le processing inverse pour pouvoir afficher notre image finale.

[]

Comment discerner le style et le contenu d’une image ?

Lorsqu’un réseau de neurones convolutif (comme VGG19) est entraîné pour effectuer une classification d’images, il doit comprendre l’image.

À l’inverse du Machine Learning ‘classique’, en Deep Learning, les features sont généré par le réseau lui-même pendant l’apprentissage par rétropropagation.

Lors de l’entraînement, le réseau de neurones se sert des pixels des images fournies afin d’en construire une représentation interne par le biais de transformations diverses.  Une fois le réseau entraîné, l’image brute en entrée est transformée  en une succession de caractéristiques complexes présentes dans l’image afin de prédire la classe à laquelle elle appartient.

Ainsi, dans les couches intermédiaires du réseau, il est possible d’extraire certaines des caractéristiques d’une image afin de décrire son contenu et son style.

Afin d’obtenir à la fois le contenu et le style de nos images, nous allons donc extraire certaines couches intermédiaires de notre modèle.  En partant de la couche d’entrée du réseau, les premières activations de couche représentent des caractéristiques de bas niveau comme les bords et les textures. Les dernières couches représentent les caractéristiques de plus haut niveau, comme les oreilles ou les yeux.

Nous utiliserons donc une des dernières couches pour représenter le contenu, et un ensemble de 5 couches (les premières de chaque bloc) pour représenter le style des images.

Nous chargeons le modèle pré-entraîné avec ses poids et créons un nouveau modèle qui prend en entrée une image et retourne les couches intermédiaires correspondant au contenu et au style de l’image.

Définition et création des fonctions de perte

Notre définition de la fonction de perte pour le  contenu est assez simple. Nous transmettons au réseau à la fois l’image du contenu souhaité et notre image d’entrée de base. Cela permettra de renvoyer les sorties des couches intermédiaires  de notre modèle. Ensuite, nous prenons simplement l’erreur quadratique moyenne entre les deux représentations intermédiaires de ces images.

Le but de cette fonction de perte est de s’assurer que l’image générée garde certaines des caractéristiques « globales » de l’image de contenu. 

Dans notre exemple, nous voulons nous assurer que l’image générée restitue la pose de la déesse debout dans la conque d’un coquillage, ainsi que les personnages qui l’entourent. Cela signifie que des formes telles que les corps, les cheveux, et le coquillage doivent être reconnaissables.

Nous effectuons la rétropropagation de la manière habituelle de manière à minimiser cette perte de contenu. Nous modifions donc l’image initiale jusqu’à ce qu’elle génère une réponse similaire en sortie de la couche intermédiaire choisie,  à celle de l’image de contenu original.

Pour le style, en raison du nombre de couches, la fonction de perte sera différente.

Au lieu de comparer les sorties des couches intermédiaires brutes de l’image d’entrée de base et de l’image de style, les auteurs du papier original  utilisent la différence entre les matrices de Gram des couches sélectionnées.

La matrice de Gram est une matrice carrée qui contient les produits des points entre chaque filtre vectorisé de la couche. La matrice de Gram peut donc être considérée comme une matrice de corrélation non-normalisée pour les filtres d’une couche.

Pour générer un style pour notre image d’entrée, nous effectuons une descente en gradient à partir de l’image de contenu pour la transformer en une image qui copiera le style de l’image de style. Vous ne connaissez pas la descente de gradient ? Pas de panique ! DataScientest vous l’explique en vidéo !

Il ne nous reste plus qu’à créer une fonction pour charger nos différentes images, les faire passer dans notre modèle pour retourner les représentations de contenu et de style, puis de calculer les fonctions de perte et le gradient afin de passer à l’optimisation

Et voilà !

Nous pouvons ensuite appliquer la méthode à un certain nombre d’images pour tester notre style transfer. En voici quelques exemples :

Vous aimeriez aller plus loin dans votre apprentissage du Deep Learning ? Démarrez prochainement l’une de nos formations Data Scientist ! 

Facebook
Twitter
LinkedIn

DataScientest News

Inscrivez-vous à notre Newsletter pour recevoir nos guides, tutoriels, et les dernières actualités data directement dans votre boîte mail.

Vous souhaitez être alerté des nouveaux contenus en data science et intelligence artificielle ?

Laissez-nous votre e-mail, pour que nous puissions vous envoyer vos nouveaux articles au moment de leur publication !

Newsletter icone
icon newsletter

DataNews

Vous souhaitez recevoir notre
newsletter Data hebdomadaire ?