ConSinGAN: J'ai essayé d'utiliser le GAN qui peut être généré à partir d'une image

introduction

La technologie appelée GAN (Genarative Adversarial Network), qui génère de nouvelles images à partir d'images existantes par apprentissage en profondeur, est la technologie qui m'a le plus impressionné dans l'apprentissage en profondeur, mais comme l'apprentissage nécessite généralement une énorme quantité de données d'entraînement et de temps, c'est assez individuel. Je n'ai pas pu l'essayer. À ce moment-là, j'ai vu l'article suivant qui développait un GAN pouvant être généré à partir d'une seule image de formation, et je l'ai examiné.

Improved Techniques for Training Single-Image GANs

Il s'agit d'un article soumis en mars de cette année, qui a été soumis l'année dernière.

SinGAN: Learning a Generative Model from a Single Natural Image

Cela semble être une amélioration de SinGAN (Single-Image-GAN) proposée dans.

GAN Le GAN (Hostile Generation Network) lui-même est bien connu et est expliqué sur de nombreux sites, je vais donc omettre les détails. Veuillez consulter ici. Le GAN est l'un des "modèles de génération" qui apprend la distribution des données d'entraînement et génère des données similaires. Créez un générateur qui génère de fausses données et un discriminateur qui les distingue du réel, et formez-les en alternance. Cela finira par générer des données indiscernables de la réalité. Ceci est souvent comparé à la fabrication de fausses factures. Le contrefacteur (Generator) apprend à tromper la police (Discriminator), et la police apprend à détecter le billet contrefait. Ici, les données d'entraînement sont $ \ boldsymbol {x} $, le bruit est $ z $, la distribution de probabilité est $ p (\ boldsymbol {x}) $, $ p (z) $, le générateur est $ G $ et le discriminateur est $ D. Si la probabilité que $, Discriminator identifie correctement $ \ boldsymbol {x} $ est $ D (\ boldsymbol {x}) $, et les données générées à partir de $ z $ de Generator sont $ G (z) $, la fonction objectif est la suivante. On dirait.

{\rm min}_{G}{\rm max}_{D}V(D,G)=\mathbb{E}_{\boldsymbol{x}\sim p_{data}(\boldsymbol{x})}[{\rm log}D(\boldsymbol{x})]+\mathbb{E}_{z\sim p_{z}(z)}[{\rm log}(1-D(G(z)))]

Generator confond le vrai pour un faux ($ D (\ boldsymbol {x}) \ à 0 ) et le faux pour un vrai ( D (G (z)) \ à 1 $), donc $ V (D) , G) $ apprend à être plus petit et Discriminator apprend le contraire de sorte que $ V (D, G) $ est plus grand. Il existe de nombreux dérivés du GAN, et de nombreuses technologies étonnantes telles que la conversion d'image (dessin au trait, photo, photo d'été, photo d'hiver) et la génération d'images d'êtres humains inexistants ont été créées. (Pour plus de détails, cliquez ici](https://qiita.com/shionhonda/items/330c9fdf78e62db3402b#%E7%94%BB%E5%83%8F%E5%A4%89%E6%8F%9B))

SinGAN Le GAN conventionnel nécessite une grande quantité de données de formation pour l'apprentissage, mais SinGAN (Single-Image-GAN) est un GAN qui peut être appris à partir d'une seule image comme son nom l'indique. Les tâches de SinGAN incluent la génération d'image inconditionnelle et l'harmonisation d'image. (Voir ci-dessous)

Méthode d'apprentissage

Dans SinGAN, multiple comme indiqué sur la figure (extrait de Paper Short Summary) À l'aide du générateur, chaque générateur reçoit l'image de sortie du générateur précédent en entrée. De plus, chaque Générateur apprend individuellement, et le poids du Générateur précédent est fixé au moment de l'apprentissage. (Tout d'abord, apprenez G0, corrigez G0 et apprenez G1, corrigez G0 et G1 et apprenez G2 ...) Le point important ici est que Discriminator vous permet de voir l'image comme un patch plutôt que dans son ensemble, créant une image qui ressemble à la réalité à un moment donné mais qui est différente dans son ensemble. (Split Colosseo sur la figure)

ConSinGAN Depuis qu'il a été découvert que la méthode ci-dessus limite l'interaction entre les générateurs, la méthode nouvellement proposée est ConSinGAN (Concurrently-Single-Image-GAN) qui apprend simultanément (simultanément) sans fixer le générateur. est.

Méthode d'apprentissage

Si vous apprenez tous les générateurs en même temps, vous allez sur-adapter, donc les deux points suivants sont incorporés dans le document.

  1. Apprenez les trois derniers générateurs en même temps.
  2. Diminuez le taux d'apprentissage de 1/10 à chaque fois que vous accédez au générateur précédent. Cela ressemble à la figure (citée de Paper Short Summary) .. La méthode d'optimisation est Adam.

La réduction du taux d'apprentissage ici crée une variété d'images générées, de sorte que la reproductibilité de l'image d'entraînement est perdue et il y a une relation de compromis.

En réduisant le nombre de générateurs avec cette méthode d'apprentissage ConSinGAN cette fois, le temps d'apprentissage est d'environ 1/6 de celui de SinGAN et les performances sont plus élevées.

Architecture modèle

image.png

Genarator et Discriminator ont tous deux une structure dans laquelle plusieurs couches de pliage sont empilées comme le montre la figure (cité dans Paper). Ici, la carte de caractéristiques qui sera l'entrée du prochain générateur est le suréchantillonnage, puis le bruit est ajouté pour la diversité et la sortie est connectée par une connexion résiduelle afin qu'elle ne s'écarte pas de manière significative.

Fonction objective

La fonction objectif à l'étape $ n $ est la suivante.

{\rm min}_{G_{n}}{\rm max}_{D_{n}}L_{\rm adv}(G_n,D_n)+\alpha L_{\rm rec}(G_n)

Ici, $ L_ {\ rm adv} (G_n, D_n) $ utilise la distance de Wasserstein comme fonction objectif WGAN-GP (Paper //arxiv.org/abs/1704.00028)) est un terme qui exprime la précision de l'identification, et $ L_ {\ rm rec} (G_n) $ exprime la stabilité de l'apprentissage par la distance entre l'image générée et l'image d'apprentissage. C'est un terme.

L_{\rm adv}(G_n,D_n)=\mathbb{E}_{z\sim p_{z}(z)}[D(G(z))]-\mathbb{E}_{{\boldsymbol x}\sim p_{data}}[D({\boldsymbol x})]+\lambda \mathbb{E}_{{\hat{\boldsymbol x}}\sim p_{{\hat{\boldsymbol x}}}}[(||\nabla_{{\hat{\boldsymbol x}}} D({\hat{\boldsymbol x}})||_2-1)^2]\\

L_{\rm rec}(G_n)=||G_n(x_0)-x_n||_2^2

$ \ Alpha $ est les 10 constantes par défaut, $ {\ hat {\ boldsymbol x}} $ est le point sur la ligne droite reliant les données d'entraînement et les données générées, $ \ lambda $ est la constante, $ x_n $ est l'image d'entraînement, $ x_0 $ est l'image d'entrée de $ G_n $. Cependant, l'entrée de $ L_ {\ rm adv} (G_n, D_n) $ diffère selon la tâche, par exemple, dans la génération d'image inconditionnelle, le bruit est donné, mais dans l'harmonisation d'image, l'image de formation est augmentée (découper une partie ou changer de couleur, etc. Il semble qu'il valait mieux donner une image avec (ajout de bruit).

tâche

Cette fois, j'ai essayé d'utiliser la génération d'image inconditionnelle et l'harmonisation d'image. D'autres tâches intéressantes sont mentionnées, donc si vous êtes intéressé, veuillez consulter l'article.

Unconditional Image Generation Aléatoire à l'image de la formation comme indiqué sur la figure (cité dans Short Summary) Vous pouvez ajouter du bruit $ z $ pour créer une image réaliste et inexistante tout en préservant la structure globale. (Vous pouvez voir qu'il est ajusté même si vous modifiez la taille de l'image.)

a

Image Harmonization Image de formation (peinture) comme indiqué sur la figure (citée de Paper Short Summary) Etc.) et harmonisez les objets ajoutés avec le style de l'image entraînée.

Réglage fin

Avec l'harmonisation d'image, vous pouvez obtenir de meilleurs résultats en perfectionnant le modèle entraîné avec une image naïve (Naive dans la figure ci-dessus). (Ajustez la figure ci-dessus)

la mise en oeuvre

J'ai cloné le public GitHub et l'ai exécuté sur Google Colaboratory, qui peut utiliser le GPU gratuitement.

Setup


#Clone du référentiel
!git clone https://github.com/tohinz/ConSinGAN.git
#Installation de la bibliothèque utilisée
pip install -r requirements.txt

Sur le chemin, j'ai eu une erreur disant que la version de l'outil Colaboratory était différente, mais il n'y a pas eu de problème avec l'opération.

Unconditional Generation Placez les images d'entraînement dans Images / Generation /. J'utiliserai le pont du Rialto (rialto.jpg 1867 x 1400 pixels) qui était précédemment pris à Venise.

Unconditional_Generation


!python main_train.py --gpu 0 --train_mode generation --input_name Images/Generation/rialto.jpg

--gpu utilise le GPU (0 par défaut), --train_mode spécifie la tâche (génération, harmonisation, etc.) et --input_name spécifie le chemin de l'image d'entraînement. Bien que cela n'ait pas été changé cette fois, le taux d'apprentissage (--lr_scale) et le nombre de générateurs (--train_stage) peuvent être modifiés à volonté. Par défaut, le nombre de générateurs est de 5, et chacun apprend avec 2000 itérations. La formation a duré 69 minutes, probablement en raison de sa grande taille. Le résultat est TrainedModels / rialto / yyyy_mm_dd_hh_mm_ss_generation_train_depth_3_lr_scale_0.1_act_lrelu_0.05. Voici quelques exemples générés.

gen_sample_4.jpggen_sample_8.jpggen_sample_23.jpg

C'est un peu bruyant, mais un pont spongieux a été créé.

Image Harmonization

Peinture × Chat

Associons l'image du chat avec la peinture (faire du foin). L'image d'entraînement (300 x 300 pixels hoshikusa.jpg) est à gauche, et l'image naïve (142 x 130 pixels hoshikusa_naive.jpg) est à droite. Placez-les dans Image / Harmonisation /. À l'origine, il semble placer une image de masque qui découpe la partie de l'objet à ajouter, mais je ne pouvais pas le faire, donc je le crée sans masque.

Entraînement


!python main_train.py --gpu 0 --train_mode harmonization --train_stages 3 --min_size 120 --lrelu_alpha 0.3 --niter 1000 --batch_norm --input_name Images/Harmonization/hoshikusa.jpg 

Le temps de formation était de 15 minutes. Appliquez ensuite l'image naïve au modèle d'entraînement.

Évaluation


!python evaluate_model.py --gpu 0 --model_dir TrainedModels/hoshikusa/yyyy_mm_dd_hh_mm_ss_harmonization_train_depth_3_lr_scale_0.1_BN_act_lrelu_0.3 --naive_img Images/Harmonization/hoshikusa_naive.jpg

Le résultat peut être TrainedModels / hoshikusa / yyyy_mm_dd_hh_mm_ss_harmonization_train_depth_3_lr_scale_0.1_BN_act_lrelu_0.3 / Evaluation /.

La résolution est mauvaise, mais la couleur du chat sur la photo a changé. Je vais essayer de peaufiner.

Réglage fin


!python main_train.py --gpu 0 --train_mode harmonization --input_name Images/Harmonization/hoshikusa.jpg --naive_img Images/Harmonization/hoshikusa_naive.jpg --fine_tune --model_dir TrainedModels/hoshikusa/yyyy_mm_dd_hh_mm_ss_harmonization_train_depth_3_lr_scale_0.1_BN_act_lrelu_0.3

Lorsque le nombre d'itérations par défaut était de 2000 fois (11 minutes), il était intégré à la couleur d'arrière-plan comme indiqué à gauche et sur-ajusté. Le papier déclare que 500 fois est suffisant. (droite)

Fond noir et blanc × Ramen

Convertissons la photo en style cartoon. La gauche est l'image d'entraînement (pen_building.jpg 600 x 337 pixels) et la droite est l'image naïve (pen_building_naive.jpg 283 x 213 pixels).

Quand je l'ai couru de la même manière, le résultat était le suivant (temps d'entraînement 9 minutes). La gauche est une évaluation normale et la droite est un réglage fin (100 itérations).

J'ai fait des ramen comme un dessin animé. Cette tâche semble être suffisante sans réglage fin.

Résumé

Cette fois, j'ai lu un article sur ConSinGAN, qui est une version améliorée de SinGAN qui peut être générée avec une seule image de formation, en utilisant un modèle GAN qui m'intéressait personnellement. C'est amusant car il existe de nombreux modèles de technologie de génération d'images qui sont impressionnants et les résultats sont faciles à comprendre. Cependant, il est dommage que je ne puisse pas publier ce que j'ai fait avec mes images animées et dessinées préférées en raison de problèmes de droits d'auteur.

Recommended Posts

ConSinGAN: J'ai essayé d'utiliser le GAN qui peut être généré à partir d'une image
J'ai essayé d'utiliser PI Fu pour générer un modèle 3D d'une personne à partir d'une image
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé d'utiliser Headless Chrome de Selenium
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [1]. (La profondeur peut maintenant être modifiée en PNG.)
J'ai essayé de faire une application mémo qui peut être pomodoro, mais un enregistrement de réflexion
Quantité d'entités pouvant être extraite des données de séries chronologiques
J'ai essayé de détecter l'iris à partir de l'image de la caméra
Enregistrement d'image ANT qui peut être utilisé en 5 minutes
J'ai essayé d'utiliser PySpark de Jupyter 4.x sur EMR
J'ai essayé de lire les données d'un fichier en utilisant Node.js.
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai fait un module qui peut être glitch facilement, mais je ne peux pas passer l'argument de entry_points
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
Notes diverses sur l'utilisation de python pour les projets
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
J'ai étudié le prétraitement qui peut être fait avec PyCaret
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
[Flask] J'ai essayé de résumer la "configuration docker-compose" qui peut être créée rapidement pour les applications Web
[Diplômé de l'encombrement d'articles] J'ai essayé de développer un service qui peut répertorier les articles par objectif
J'ai essayé de l'étendre pour que la base de données puisse être utilisée avec le logiciel d'analyse de Wiire
J'ai essayé la classification d'image d'AutoGluon
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé d'utiliser RandomForest
J'ai essayé d'utiliser BigQuery ML
J'ai essayé d'utiliser Amazon Glacier
J'ai essayé d'utiliser git inspector
J'ai essayé d'utiliser magenta / TensorFlow
J'ai essayé d'utiliser AWS Chalice
J'ai essayé d'utiliser l'émojinateur Slack
[Python] J'ai créé ma propre bibliothèque qui peut être importée dynamiquement
J'ai créé une IA qui recadre joliment une image en utilisant Saliency Map