"A Neural Algorithm of Artistic Style" (ci-après style Neural) est célèbre comme méthode de conversion de style utilisant le réseau de neurones convolutifs (CNN) et l'implémentation suivante il y a.
Une autre méthode de conversion de style est "Combining Markov Random Fields and Convolutional Neural Networks for Image Synthesis" (ci-après "conversion de style à l'aide de MRF"). Je vais vous présenter ceci.
J'ai implémenté cette technique dans Chainer. Le code source peut être trouvé à https://github.com/dsanno/chainer-neural-style.
https://github.com/chuanli11/CNNMRF
Image générée | Image de contenu | Image de style | |
---|---|---|---|
Peinture à l'huile | |||
Aquarelle | De Chihiro Iwasaki "Hanaguruma」 | ||
Dessin au stylo |
Source de l'image:
La conversion de style à l'aide de MRF génère l'image suivante.
La différence est que le style Neural rapproche le style général de l'image de l'image de style, tandis que MRF rapproche le style local de l'image de style.
Le titre inclut "Markov Random Field (MRF, Markov Random Field)", mais comme MRF n'est pas le cœur de l'algorithme, je vais omettre l'explication.
Entrez l'image du contenu et l'image de style. Les images de contenu sont représentées par $ x_c $ et les images de style sont représentées par $ x_s $. L'image générée à afficher est représentée par $ x $.
CNN
Cette méthode utilise un CNN pour la reconnaissance d'image tel que VGG comme dans le style Neural.
La sortie d'un calque particulier lorsque l'image $ x $ est entrée dans le CNN est représentée par $ \ Phi (x) $. La sortie du calque lorsqu'une image de contenu est entrée est $ \ Phi (x_c) $, et la sortie du calque lorsqu'une image de style est entrée est $ \ Phi (x_s) $.
Générez un patch à partir de la sortie de la couche CNN. Un patch est une collection de $ k \ fois k $ zones de sortie de couche en une seule, et est un vecteur de longueur $ k \ fois k \ fois C $ ($ C $ est le nombre de canaux dans la sortie de couche). Vous pouvez générer plusieurs patchs à partir d'une couche, et le $ i $ th patch est représenté par $ \ Psi_i (\ Phi (x)) $.
Cet algorithme définit l'énergie en fonction de $ x $. Puis calculez $ x $ pour minimiser l'énergie. La définition de la fonction énergétique est la suivante. L'explication de chaque section est expliquée ci-dessous.
E(x) = E_s(\Phi(x), \Phi(x_s)) + \alpha_1 E_c(\Phi(x), \Phi(x_c)) + \alpha_2 \Upsilon(x)
MRFs loss function
Un élément $ E_s $ est appelé fonction de perte MRF et sa définition est la suivante.
E_s(\Phi(x), \Phi(x_s)) = \sum^{m}_{i=1}||\Psi_i(\Phi(x)) - \Psi_{NN(i)}(\Phi(x_s))||^2
Cependant, $ NN (i) $ est défini par la formule suivante.
NN(i) := \mathop{\rm arg\,max}\limits_{j=1,...,m_s} \frac{\Psi_i(\Phi(x)) \cdot \Psi_j(\Phi(x_s))}{|\Psi_i(\Phi(x))| \cdot |\Psi_j(\Phi(x_s))|}
Dans l'article, c'est argmin, mais quand je regarde l'implémentation, argmax semble être correct. Cette formule a les significations suivantes.
Content loss function
Les deux éléments $ E_c $ sont appelés la fonction de perte de contenu et leurs définitions sont les suivantes.
E_c(\Phi(x), \Phi(x_c)) = ||\Phi(x) - \Phi(x_c)||^2
Cela signifie que plus la couche CNN générée à partir de $ x $ et la couche CNN générée à partir de $ x_c $ sont proches, plus l'énergie est petite.
Regularizer
Les trois éléments $ \ Upsilon $ sont des termes de régularisation pour lisser l'image. La définition est la suivante, $ x_ {i, j} $ est la valeur du pixel dont la coordonnée x est $ i $ et la coordonnée y est $ j $. Plus la différence entre les pixels adjacents est petite, plus l'énergie est petite.
\Upsilon(x) = \sum_{i,j}((x_{i,j+1} - x_{i,j})^2 + (x_{i+1,j} - x_{i,j})^2)
Je l'ai implémenté avec Chainer. Le CNN utilise le modèle VGG 16 couches, qui est également familier à Chainer-gogh. Le code source peut être trouvé à https://github.com/dsanno/chainer-neural-style.
Le temps d'exécution est plus court que le style Neural. Le style neuronal nécessite des milliers d'itérations, tandis que la conversion de style à l'aide de MRF nécessite des centaines d'itérations.
Avec le style Neural, l'utilisation des couleurs change radicalement, mais la conversion de style à l'aide de MRF ne change pas de manière significative l'utilisation des couleurs, et j'ai l'impression que le toucher de l'image change.
Il existe neural-doodle comme application de conversion de style utilisant MRF. neural-doodle vous permet de spécifier quel style spécifier dans quelle zone de l'image. Comme vous pouvez le voir en regardant l'image liée, la photo du visage est convertie au style de portrait de Goch, mais en spécifiant le style pour chaque zone, une conversion plus naturelle est réalisée.
Dans neural-doodle, la spécification de style est réalisée en concaténant le vecteur représentant le numéro de style (vecteur one-hot indiquant à quel style le patch correspond) au vecteur de patch sorti de la couche CNN.
Recommended Posts