Il s'agit d'une mise en œuvre pytorch de l'article un algorithme neuronal de style artistique par Leon A. Gatys, Alexander S. Ecker et Matthias Bethge. Le code est basé sur le style neuronal de Justin Johnson.
L'article présente un algorithme pour combiner le contenu d'une image avec le style d'une autre image utilisant des réseaux de neurones convolutionnels. Voici un exemple qui mappe le style artistique de la nuit étoilée sur une photographie nocturne du campus de Stanford:
L'application du style de différentes images à la même image de contenu donne des résultats intéressants. Ici, nous reproduisons la figure 2 du papier, qui rend une photographie du tubingen en Allemagne dans une variété de styles:
Voici les résultats de l'application du style de diverses œuvres d'art à cette photographie du Golden Gate Bridge:
L'algorithme permet à l'utilisateur de compromettre le poids relatif des termes de reconstruction de style et de contenu, comme le montre cet exemple où nous portons le style de l'auto-donc-Portrait de Picasso en 1907 sur Brad Pitt:
En redimentant l'image de style avant d'extraire les fonctionnalités de style, nous pouvons contrôler les types de fonctionnalités artistiques transférées à partir de l'image de style; Vous pouvez contrôler ce comportement avec le drapeau -style_scale . Ci-dessous, nous voyons trois exemples de rendu le Golden Gate Bridge dans le style de la nuit étoilée. De gauche à droite, -style_scale est de 2,0, 1,0 et 0,5.
Vous pouvez utiliser plus d'une image de style pour mélanger plusieurs styles artistiques.
Dans le sens horaire à partir de la haute gauche: "The Starry Night" + "The Scream", "The Scream" + "Composition VII", "Asered Nude" + "Composition VII", et "Sesed Nude" + "The Starry Night"
Lorsque vous utilisez plusieurs images de style, vous pouvez contrôler la mesure dans laquelle elles sont mélangées:
Si vous ajoutez l'indicateur -original_colors 1 , l'image de sortie conservera les couleurs de l'image d'origine.
Dépendances:
Dépendances facultatives:
Après avoir installé les dépendances, vous devrez exécuter le script suivant pour télécharger le modèle VGG:
python models/download_models.py
Cela téléchargera le modèle VGG-19 original. Le modèle VGG-16 original sera également téléchargé. Par défaut, le modèle VGG-19 original est utilisé.
Si vous avez un GPU à mémoire plus petit, l'utilisation du modèle NIN ImageNet sera meilleure et donnera des résultats légèrement pires mais comparables. Vous pouvez obtenir les détails du modèle à partir de BVLC Caffe Modelzoo. Le modèle NIN est téléchargé lorsque vous exécutez le script download_models.py .
Vous pouvez trouver des instructions d'installation détaillées pour Ubuntu et Windows dans le guide d'installation.
Utilisation de base:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
Utilisation du CUDNN avec modèle nin:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
Pour utiliser des images de style multiple, passez une liste séparée par des virgules comme ceci:
-style_image starry_night.jpg,the_scream.jpg .
Notez que les chemins vers les images ne doivent pas contenir le caractère ~ pour représenter votre répertoire personnel; Vous devez plutôt utiliser un chemin relatif ou un chemin absolu complet.
Options :
-image_size : longueur latérale maximale (en pixels) de l'image générée. La valeur par défaut est 512.-style_blend_weights : Le poids pour mélanger le style des images de style multiple, en tant que liste séparée par des virgules, telles que -style_blend_weights 3,7 . Par défaut, toutes les images de style sont également pondérées.-gpu : ID indexé zéro du GPU à utiliser; Pour le mode CPU SET -gpu sur c .Options d'optimisation :
-content_weight : Combien de poids le terme de reconstruction de contenu. La valeur par défaut est 5E0.-style_weight : Combien de poids le terme de reconstruction de style. La valeur par défaut est 1E2.-tv_weight : Poids de la régularisation de la variation totale (TV); Cela aide à lisser l'image. La valeur par défaut est 1E-3. Réglé sur 0 pour désactiver la régularisation de la télévision.-num_iterations : la valeur par défaut est 1000.-init : Méthode pour générer l'image générée; L'un de image random ou. La valeur par défaut est random qui utilise une initialisation de bruit comme dans le papier; image s'initialise avec l'image de contenu.-init_image : remplace l'image d'initialisation par une image spécifiée par l'utilisateur.-optimizer : l'algorithme d'optimisation à utiliser; Soit lbfgs ou adam ; La valeur par défaut est lbfgs . L-BFGS a tendance à donner de meilleurs résultats, mais utilise plus de mémoire. Le passage à Adam réduira l'utilisation de la mémoire; Lorsque vous utilisez Adam, vous devrez probablement jouer avec d'autres paramètres pour obtenir de bons résultats, en particulier le poids du style, le poids du contenu et le taux d'apprentissage.-learning_rate : Taux d'apprentissage à utiliser avec l'optimiseur Adam. La valeur par défaut est 1E1.-normalize_gradients : Si ce drapeau est présent, les gradients de style et de contenu de chaque couche seront normalisés L1.Options de sortie :
-output_image : nom de l'image de sortie. La valeur par défaut est out.png .-print_iter : imprimer progresser chaque print_iter itérations. Réglé sur 0 pour désactiver l'impression.-save_iter : Enregistrez l'image toutes les itérations save_iter . Réglé sur 0 pour désactiver la sauvegarde des résultats intermédiaires.Options de calque :
-content_layers : Liste des noms de calques séparés par des virgules à utiliser pour la reconstruction de contenu. La valeur par défaut est relu4_2 .-style_layers : Liste des noms de calques séparés par des virgules à utiliser pour la reconstruction de style. La valeur par défaut est relu1_1,relu2_1,relu3_1,relu4_1,relu5_1 .Autres options :
-style_scale : échelle à l'extraction des fonctionnalités de l'image de style. La valeur par défaut est 1.0.-original_colors : Si vous le définissez sur 1, l'image de sortie conservera les couleurs de l'image de contenu.-model_file : Chemin vers le fichier .pth pour le modèle VGG CAFFE. La valeur par défaut est le modèle VGG-19 d'origine; Vous pouvez également essayer le modèle VGG-16 original.-pooling : le type de couches de mise en commun à utiliser; l'un des max ou avg . La valeur par défaut est max . Les modèles VGG-19 utilisent des couches de regroupement maximum, mais le papier mentionne que le remplacement de ces couches par des couches de mise en commun moyen peut améliorer les résultats. Je n'ai pas pu obtenir de bons résultats en utilisant la mise en commun moyen, mais l'option est là.-seed : une valeur entière que vous pouvez spécifier pour des résultats reproductibles. Par défaut, cette valeur est aléatoire pour chaque exécution.-multidevice_strategy : une liste séparée par des virgules d'indices de couche pour diviser le réseau lors de l'utilisation de plusieurs appareils. Voir l'échelle multi-GPU pour plus de détails.-backend : nn , cudnn , openmp ou mkl . La valeur par défaut est nn . mkl nécessite le backend MKL d'Intel.-cudnn_autotune : Lorsque vous utilisez le backend CUDNN, passez cet drapeau pour utiliser le Cudnn AutoTUner intégré pour sélectionner les meilleurs algorithmes de convolution pour votre architecture. Cela rendra la première itération un peu plus lente et peut prendre un peu plus de mémoire, mais peut accélérer considérablement le backend CUDNN. Problème: le programme manque de mémoire et meurt
Solution: essayez de réduire la taille de l'image: -image_size 256 (ou plus bas). Notez que différentes tailles d'image nécessiteront probablement des valeurs non défautes pour -style_weight et -content_weight pour des résultats optimaux. Si vous utilisez un GPU, vous pouvez également essayer de fonctionner avec -backend cudnn pour réduire l'utilisation de la mémoire.
Problème: -backend cudnn est plus lent que le backend nn par défaut
Solution: ajoutez le drapeau -cudnn_autotune ; Cela utilisera le Cudnn AutoTuner intégré pour sélectionner les meilleurs algorithmes de convolution.
Problème: Obtenez le message d'erreur suivant:
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
Solution: En raison d'un mélange avec des emplacements de couche, les modèles plus anciens nécessitent une correction pour être compatible avec les versions plus récentes de Pytorch. Le script donwload_models.py inclus effectuera automatiquement ces correctifs après avoir téléchargé les modèles.
Par défaut, neural-style-pt utilise le backend nn pour les convolutions et les L-BFG pour l'optimisation. Ceux-ci donnent de bons résultats, mais peuvent tous deux utiliser beaucoup de mémoire. Vous pouvez réduire l'utilisation de la mémoire avec les éléments suivants:
-backend cudnn pour utiliser le backend CUDNN. Cela ne fonctionnera qu'en mode GPU.-optimizer adam pour utiliser Adam au lieu de L-BFGS. Cela devrait réduire considérablement l'utilisation de la mémoire, mais peut nécessiter un réglage d'autres paramètres pour de bons résultats; En particulier, vous devez jouer avec le taux d'apprentissage, le poids du contenu et le poids du style. Cela devrait fonctionner dans les modes CPU et GPU.-image_size 256 pour générer une image à la moitié de la taille par défaut.Avec les paramètres par défaut, le style neural utilise environ 3,7 Go de mémoire GPU sur mon système; Le passage à Adam et Cudnn réduit l'empreinte de la mémoire GPU à environ 1 Go.
La vitesse peut varier beaucoup en fonction du backend et de l'optimiseur. Voici quelques fois pour exécuter 500 itérations avec -image_size=512 sur une Tesla K80 avec différents paramètres:
-backend nn -optimizer lbfgs : 117 secondes-backend nn -optimizer adam : 100 secondes-backend cudnn -optimizer lbfgs : 124 secondes-backend cudnn -optimizer adam : 107 secondes-backend cudnn -cudnn_autotune -optimizer lbfgs : 109 secondes-backend cudnn -cudnn_autotune -optimizer adam : 91 secondesVoici les mêmes repères sur une GTX 1080:
-backend nn -optimizer lbfgs : 56 secondes-backend nn -optimizer adam : 38 secondes-backend cudnn -optimizer lbfgs : 40 secondes-backend cudnn -optimizer adam : 40 secondes-backend cudnn -cudnn_autotune -optimizer lbfgs : 23 secondes-backend cudnn -cudnn_autotune -optimizer adam : 24 secondes Vous pouvez utiliser plusieurs périphériques CPU et GPU pour traiter les images à des résolutions plus élevées; Différentes couches du réseau seront calculées sur différents appareils. Vous pouvez contrôler quels périphériques GPU et CPU sont utilisés avec l'indicateur -gpu , et vous pouvez contrôler comment diviser les couches sur les appareils à l'aide du drapeau -multidevice_strategy .
Par exemple, dans un serveur avec quatre GPU, vous pouvez donner le Flag -gpu 0,1,2,3 pour traiter sur les GPU 0, 1, 2 et 3 dans cet ordre; En donnant également le drapeau -multidevice_strategy 3,6,12 vous indiquez que les deux premières couches doivent être calculées sur GPU 0, les couches 3 à 5 doivent être calculées sur le GPU 1, les couches 6 à 11 devraient être calculées sur le GPU 2, et les couches -multidevice_strategy devraient être calculées sur le GPU 3. Vous devrez réaliser le maximum.
Nous pouvons obtenir des résultats de très haute qualité à haute résolution en combinant un traitement multi-GPU avec une génération multi-échelles, comme décrit dans l'article contrôlant les facteurs perceptifs dans le transfert de style neuronal par Leon A. Gatys, Alexander S. Ecker, Matthias Bethge, Aaron Hertzmann et Eli Shechtman.
Voici une image 4016 x 2213 générée sur un serveur avec huit GPU Tesla K80:
Le script utilisé pour générer cette image peut être trouvé ici.
Les images sont initialisées avec du bruit blanc et optimisées à l'aide de L-BFGS.
Nous effectuons des reconstructions de style en utilisant les couches conv1_1 , conv2_1 , conv3_1 , conv4_1 et conv5_1 et les reconstructions de contenu à l'aide de la couche conv4_2 . Comme dans le papier, les pertes de reconstruction à cinq style ont des poids égaux.
Si vous trouvez ce code utile pour vos recherches, veuillez le citer en utilisant la citation fournie.