[PYTHON] Faites sourire les gens avec le Deep Learning

Deep Feature Interpolation for Image Content Changes

L'interpolation profonde des caractéristiques (DFI) est une technique permettant de donner à une image certains attributs (par exemple, «sourire», «personnes âgées», «barbu»). En tant que méthode pour attribuer un attribut spécifique, une méthode utilisant un Réseau Adversaire Génératif (GAN) tel que "Autoencoding au-delà des pixels en utilisant une métrique de similarité apprise" est connue. Cependant, DFI adopte une approche différente de celle du GAN. L'article peut être trouvé à https://arxiv.org//abs/1611.05507.

Aperçu

Comme on le sait dans "A Neural Algorithm of Artistic Style", à partir de la Feature Map (sortie de couche intermédiaire) obtenue en entrant une image dans CNN. , Vous pouvez restaurer l'image. Il y a une explication dans Algorithm for converting style, donc la lecture de ce blog approfondira votre compréhension. Dans DFI, "Feature Map d'une image avec un attribut spécifique" est obtenu en ajoutant un vecteur d'attribut à "Feature Map obtenu à partir d'une image". Ensuite, "l'image avec des attributs spécifiques" est restaurée à partir de la carte des caractéristiques obtenue.

Procédure de conversion d'image

Suivez la procédure ci-dessous pour convertir l'image.

  1. Préparez un CNN à utiliser pour la reconnaissance d'image, tel que Modèle VGG 19 couches.
  2. Préparez l'image source de la conversion (appelée image d'origine).
  3. Décidez des attributs que vous souhaitez attribuer à l'image d'origine (appelés attributs souhaités).
  4. Collectez chacun des ensembles d'images suivants.
  1. Entrez les images contenues dans l'ensemble de cibles dans le CNN pour obtenir la carte des caractéristiques. Calculez sa moyenne $ \ bar {\ phi} ^ {t} $.
  2. De même, pour les images incluses dans l'ensemble source, calculez la moyenne $ \ bar {\ phi} ^ {s} $ de la carte des caractéristiques CNN.
  3. Calculez le vecteur d'attribut $ w = \ bar {\ phi} ^ {t} - \ bar {\ phi} ^ {s} $.
  4. Entrez l'image originale $ x $ dans le CNN pour obtenir la carte des caractéristiques $ \ phi (x) $.
  5. Calculez la somme pondérée $ \ phi (x) + \ alpha w $ de la carte d'entités et du vecteur d'attribut obtenu à partir de l'image originale.
  6. Optimiser l'image convertie $ z $. Optimisez la carte d'entités $ \ phi (z) $ obtenue lorsque vous entrez $ z $ dans le CNN pour qu'elle approche $ \ phi (x) + \ alpha w $.

Voici un diagramme de l'algorithme utilisé dans l'article. Le numéro de l'étape est dans le papier et est différent de cet article.

dfi.jpg

la mise en oeuvre

Je l'ai implémenté avec Chainer. https://github.com/dsanno/chainer-dfi

Faites sourire les gens avec DFI

Utilisons DFI pour donner à l'image du visage un attribut de sourire.

Utiliser des faces étiquetées dans le jeu de données Wild

Dans l'article, la carte des caractéristiques a été calculée à l'aide d'images de l'ensemble de données des faces étiquetées dans la nature (LFW). Le LFW contient plus de 13 000 images et vecteurs de visage qui quantifient les attributs des images de visage tels que «Homme» et «Souriant». Dans le document, en tant qu'image similaire à utiliser comme ensemble source / cible, une image avec de nombreux attributs communs avec l'image d'origine a été sélectionnée. Essayez de faire sourire l'image incluse dans LFW de la même manière. Le résultat est le suivant.

L'image originale Sourire Sourire+Ouvrez la bouche
dfi01_org.jpg out9_04.jpg out20_04.jpg
dfi02_org.jpg out10_04.jpg out22_04.jpg
dfi03_org.jpg out7_04.jpg out21_04.jpg

Les paramètres, etc. sont les suivants.

Utilisez votre propre image

J'ai essayé de convertir l'image distribuée sur Pakutaso.

sample.png

Je vais faire l'expression qui me fait ressentir un petit sourire nerveux. Le paramètre de poids $ \ alpha $ a été modifié dans la plage 0,1-0,5. Si le poids est trop important, la distorsion de l'image augmentera également.

Poids 0.1 Poids 0.2 Poids 0.3
sample_w01.png sample_w02.png sample_w03.png
Poids 0.4 Poids 0.5
sample_w04.png sample_w05.png

Avez-vous vraiment des attributs?

J'ai montré ci-dessus que vous pouvez faire sourire une image de visage, mais cette méthode ajoute-t-elle vraiment des attributs à l'image? Je pense que non. Le CNN utilisé est à des fins de reconnaissance d'image et sa carte des caractéristiques n'apprend pas des attributs spécifiques. Par conséquent, ce qui peut être généré en utilisant la différence de la carte des caractéristiques entre la source et l'ensemble cible est la «différence d'image moyenne entre la source et la cible». Si l'attribut est sourire, cela signifie qu'une image de sourire est générée en ajoutant «une différence d'image entre un visage qui ne rit pas et un sourire» à l'image d'origine.

Étant donné que nous ajoutons uniquement des différences d'image, il est nécessaire d'aligner la disposition des parties du visage entre l'image d'origine et l'image source / cible. En fait, si l'image d'origine et l'image source / cible n'ont pas la même position de visage, les lèvres peuvent apparaître dans une position étrange. L'ensemble de données d'image de visage utilisé n'inclut pas les informations de placement des pièces ou les attributs d'orientation du visage, mais la position et la taille du visage dans l'image sont alignées, donc je pense que cela fonctionne généralement. Afin d'effectuer une conversion d'image plus naturelle, je pense qu'il est nécessaire de sélectionner l'image source / cible en tenant compte de la disposition des parties du visage.

Comparaison avec la méthode basée sur le GAN

Le document compare également les images générées avec des méthodes basées sur le GAN. Veuillez consulter le papier pour les images réellement générées. Ici, nous comparerons les caractéristiques des méthodes.

DFI Base GAN
Avez-vous besoin d'un modèle formé? nécessaire Inutile
Pré-apprentissage Inutile Besoin de former le modèle de génération d'image
Un temps de génération d'image(Lors de l'utilisation du GPU) Des dizaines de secondes Cela prend moins d'une seconde
Image requise pour la génération d'image Des dizaines à des centaines d'images similaires sont nécessaires lors de la génération d'images Aucun

À propos de la mise en œuvre

J'écrirai sur la différence entre la description de l'article et la mise en œuvre utilisée cette fois. Si vous n'êtes pas intéressé par les détails de l'implémentation, vous pouvez l'ignorer.

S'il faut normaliser la carte des caractéristiques

Le papier dit "Nous utilisons les couches convolutives du réseau VGG-19 normalisé pré-entraîné sur ILSVRC2012", et vous pouvez voir que la carte des caractéristiques est normalisée. La normalisation de la carte des caractéristiques est décrite dans "Comprendre les représentations d'images profondes en les inversant", mais cela signifie diviser la carte des caractéristiques par la norme L2. La normalisation n'a pas été effectuée pour les raisons suivantes.

S'il faut combiner des cartes d'entités

Dans l'article, conv3_1, conv4_1 et conv5_1 parmi les couches intermédiaires des couches VGG-19 sont utilisées comme cartes d'entités. Ce point est le même pour cette implémentation. De plus, l'article déclare: "Le vecteur $ \ phi (x) $ consiste en des activations concaténées du Il dit convnet lorsqu'il est appliqué à l'image x ", et vous pouvez voir que plusieurs cartes d'entités sont combinées. Cependant, cela fonctionnait sans combiner les cartes d'entités, donc il n'a pas été combiné dans cette implémentation.

Normalisation des vecteurs d'attributs

Vecteur d'attribut dans le papierw = \bar{\phi}^{t} - \bar{\phi}^{s},w / ||w||Et L2 normalisé et utilisé. En effet, le facteur de pondération d'attribut $ \ alpha $ rend la sélection de l'image originale, de la source et de la cible robuste (de sorte que le même $ \ alpha $ est utilisé). Cependant, la normalisation des vecteurs d'attributs n'est valide que si la carte d'entités est normalisée. Si la carte des caractéristiques n'est pas normalisée, il est naturel de déterminer la longueur du vecteur d'attribut en tenant compte de la taille de la carte des caractéristiques, donc dans l'implémentationw / ||w||Le vecteur d'attribut est le vecteur obtenu en multipliant par la norme L2 de la carte des caractéristiques de l'image d'origine.

Les références

Recommended Posts

Faites sourire les gens avec le Deep Learning
Essayez l'apprentissage en profondeur avec TensorFlow
Apprentissage profond du noyau avec Pyro
Essayez le Deep Learning avec FPGA
Générez des Pokémon avec Deep Learning
Essayez le Deep Learning avec les concombres FPGA-Select
Identification de la race de chat avec Deep Learning
Essayez l'apprentissage en profondeur avec TensorFlow Partie 2
Vérifiez la forme de squat avec l'apprentissage en profondeur
Catégoriser les articles de presse grâce au Deep Learning
Prévisions des ventes de collations avec apprentissage en profondeur
L'apprentissage en profondeur
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker
Classez les visages d'anime avec l'apprentissage en profondeur avec Chainer
Créez votre propre PC pour un apprentissage en profondeur
Essayez avec Chainer Deep Q Learning - Lancement
Essayez l'apprentissage profond de la génomique avec Kipoi
Analyse émotionnelle des tweets avec apprentissage en profondeur
Mémorandum d'apprentissage profond
Commencer l'apprentissage en profondeur
Apprentissage en profondeur Python
L'histoire de l'apprentissage profond avec TPU
99,78% de précision avec apprentissage en profondeur en reconnaissant les hiragana manuscrits
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker 2 Multi-host edition
Créer des couches Lambda avec Lambda
Premier apprentissage profond ~ Lutte ~
Apprendre Python avec ChemTHEATER 03
Une histoire de prédiction du taux de change avec Deep Learning
Apprendre Python avec ChemTHEATER 05-1
Python: pratique du Deep Learning
Fonctions d'apprentissage en profondeur / d'activation
Apprentissage profond à partir de zéro
Créez un Yuma avec Discord.py
Deep learning 1 Pratique du deep learning
Apprentissage profond / entropie croisée
Premier apprentissage profond ~ Préparation ~
Première solution d'apprentissage en profondeur ~
[AI] Apprentissage métrique profond
Apprendre Python avec ChemTHEATER 02
J'ai essayé le deep learning
Apprentissage par renforcement 37 Démarrez automatiquement avec l'enrubanneuse Atari
Apprendre Python avec ChemTHEATER 01
Prédire les tags en extrayant des fonctionnalités musicales avec Deep Learning
Classer les visages d'anime par suite / apprentissage profond avec Keras
Python: réglage du Deep Learning
Technologie d'apprentissage en profondeur à grande échelle
Créer des diapositives avec iPython
Fonction d'apprentissage profond / softmax
J'ai essayé de faire d'Othello AI que j'ai appris 7,2 millions de mains par apprentissage profond avec Chainer
Essayez de créer un réseau de neurones / d'apprentissage en profondeur avec scratch
Créez un environnement pour "Deep Learning from scratch" avec Docker
(Maintenant) Construisez un environnement GPU Deep Learning avec GeForce GTX 960
Reconnaissez votre patron avec Deep Learning et masquez l'écran
[Apprentissage en profondeur] Classification d'images avec un réseau neuronal convolutif [DW jour 4]
J'ai capturé le projet Toho avec Deep Learning ... je le voulais.
Apprentissage en profondeur avec Shogi AI sur Mac et Google Colab
J'ai essayé d'écrire dans un modèle de langage profondément appris
HIKAKIN et Max Murai avec vidéo de jeu en direct et apprentissage en profondeur
Estimation de la courbe des signes avec module d'apprentissage en profondeur (python) + LSTM
L'apprentissage automatique appris avec Pokemon