[PYTHON] Créer un Pokémon inconnu avec StyleGAN2 [Partie 1]

Que faire cette fois

J'ai l'impression que c'est une décoction, mais je vais apprendre un modèle de génération automatique de Pokémon. Si vous le recherchez, certaines personnes l'ont déjà essayé sur la base du dernier modèle, StyleGAN2. Cependant, le code, l'ensemble de données et l'implémentation réels n'ont pas été publiés, je voudrais donc résumer cela dans un article.

Qu'est-ce que StyleGAN2

StyleGAN2 est un modèle de génération d'images annoncé par NVIDIA. C'est un modèle de génération qui se caractérise par l'utilisation de la conversion de style et est un modèle puissant qui est actuellement SOTA pour plusieurs tâches.

Implémentation officielle de StyleGAN2 Tendances des méthodes de tâche de génération d'images

base de données

Lorsque je cherchais à savoir s'il y avait un bon ensemble de données, il y avait une personne qui a recueilli 15 000 données à l'avance et les a rendues publiques, alors j'ai utilisé cela. MonsterGAN

En outre, le [Pokemon-Image-Dataset] de Kaggle (https://www.kaggle.com/vishalsubbiah/pokemon-images-and-types) et [One-Shot-Pokemon-Images](https: // www. kaggle.com/aaronyin/oneshotpokemon) est également candidat. One-Shot-Pokemon-Images contient un jeu de données de carte Pokemon, qui contient une très grande quantité de données, donc [tâche de génération de carte Pokemon](https://devopstar.com/2019/05/21/ Il semble que cela s'applique à stylegan-pokemon-card-generator).

pokemon-stylegan-example.png

Cas précédent

Il semble que Michael Friese essaie avec enthousiasme de générer des Pokémon en utilisant StyleGAN / StyleGAN2. Il semble que StyleGAN a déjà laissé un assez bon résultat. michael-stylegan-pokemon.jpg

Lorsque l'apprentissage par transfert est effectué à partir d'un modèle entraîné tel qu'un chat ou un cheval, l'apprentissage lui-même fonctionne bien et l'image générée semble refléter l'atmosphère du domaine avant le transfert. C'est vraiment emo.

Transfert de cheval horse.jpg

Transfert de chat cat.jpg

Transfert de voiture car.jpg

Le résultat de la génération utilisant StyleGAN2 n'a été publié qu'à mi-chemin. C'est le résultat de l'apprentissage jusqu'à 540 kmg. Puisque je suis en train d'apprendre, j'ai l'impression qu'il y a pas mal de variations, en laissant de côté la qualité. michael-stylegan2-pokemon-540k.png

Résultats de l'auto-étude

Je suis toujours en train d'apprendre, mais je vais vous montrer les progrès de l'apprentissage avec StyleGAN2. Puisque nous nous entraînons avec RTX1070, un modèle désordonné est impossible en raison de la taille de la mémoire. Cette fois, j'ai redimensionné tous les jeux de données en 64x64.

Aperçu du modèle

G                           Params    OutputShape       WeightShape     
---                         ---       ---               ---             
latents_in                  -         (?, 512)          -               
labels_in                   -         (?, 0)            -               
lod                         -         ()                -               
dlatent_avg                 -         (512,)            -               
G_mapping/latents_in        -         (?, 512)          -               
G_mapping/labels_in         -         (?, 0)            -               
G_mapping/Normalize         -         (?, 512)          -               
G_mapping/Dense0            262656    (?, 512)          (512, 512)      
G_mapping/Dense1            262656    (?, 512)          (512, 512)      
G_mapping/Dense2            262656    (?, 512)          (512, 512)      
G_mapping/Dense3            262656    (?, 512)          (512, 512)      
G_mapping/Dense4            262656    (?, 512)          (512, 512)      
G_mapping/Dense5            262656    (?, 512)          (512, 512)      
G_mapping/Dense6            262656    (?, 512)          (512, 512)      
G_mapping/Dense7            262656    (?, 512)          (512, 512)      
G_mapping/Broadcast         -         (?, 10, 512)      -               
G_mapping/dlatents_out      -         (?, 10, 512)      -               
Truncation/Lerp             -         (?, 10, 512)      -               
G_synthesis/dlatents_in     -         (?, 10, 512)      -               
G_synthesis/4x4/Const       8192      (?, 512, 4, 4)    (1, 512, 4, 4)  
G_synthesis/4x4/Conv        2622465   (?, 512, 4, 4)    (3, 3, 512, 512)
G_synthesis/4x4/ToRGB       264195    (?, 3, 4, 4)      (1, 1, 512, 3)  
G_synthesis/8x8/Conv0_up    2622465   (?, 512, 8, 8)    (3, 3, 512, 512)
G_synthesis/8x8/Conv1       2622465   (?, 512, 8, 8)    (3, 3, 512, 512)
G_synthesis/8x8/Upsample    -         (?, 3, 8, 8)      -               
G_synthesis/8x8/ToRGB       264195    (?, 3, 8, 8)      (1, 1, 512, 3)  
G_synthesis/16x16/Conv0_up  2622465   (?, 512, 16, 16)  (3, 3, 512, 512)
G_synthesis/16x16/Conv1     2622465   (?, 512, 16, 16)  (3, 3, 512, 512)
G_synthesis/16x16/Upsample  -         (?, 3, 16, 16)    -               
G_synthesis/16x16/ToRGB     264195    (?, 3, 16, 16)    (1, 1, 512, 3)  
G_synthesis/32x32/Conv0_up  2622465   (?, 512, 32, 32)  (3, 3, 512, 512)
G_synthesis/32x32/Conv1     2622465   (?, 512, 32, 32)  (3, 3, 512, 512)
G_synthesis/32x32/Upsample  -         (?, 3, 32, 32)    -               
G_synthesis/32x32/ToRGB     264195    (?, 3, 32, 32)    (1, 1, 512, 3)  
G_synthesis/64x64/Conv0_up  2622465   (?, 512, 64, 64)  (3, 3, 512, 512)
G_synthesis/64x64/Conv1     2622465   (?, 512, 64, 64)  (3, 3, 512, 512)
G_synthesis/64x64/Upsample  -         (?, 3, 64, 64)    -               
G_synthesis/64x64/ToRGB     264195    (?, 3, 64, 64)    (1, 1, 512, 3)  
G_synthesis/images_out      -         (?, 3, 64, 64)    -               
G_synthesis/noise0          -         (1, 1, 4, 4)      -               
G_synthesis/noise1          -         (1, 1, 8, 8)      -               
G_synthesis/noise2          -         (1, 1, 8, 8)      -               
G_synthesis/noise3          -         (1, 1, 16, 16)    -               
G_synthesis/noise4          -         (1, 1, 16, 16)    -               
G_synthesis/noise5          -         (1, 1, 32, 32)    -               
G_synthesis/noise6          -         (1, 1, 32, 32)    -               
G_synthesis/noise7          -         (1, 1, 64, 64)    -               
G_synthesis/noise8          -         (1, 1, 64, 64)    -               
images_out                  -         (?, 3, 64, 64)    -               
---                         ---       ---               ---             
Total                       27032600                                    


D                    Params    OutputShape       WeightShape     
---                  ---       ---               ---             
images_in            -         (?, 3, 64, 64)    -               
labels_in            -         (?, 0)            -               
64x64/FromRGB        2048      (?, 512, 64, 64)  (1, 1, 3, 512)  
64x64/Conv0          2359808   (?, 512, 64, 64)  (3, 3, 512, 512)
64x64/Conv1_down     2359808   (?, 512, 32, 32)  (3, 3, 512, 512)
64x64/Skip           262144    (?, 512, 32, 32)  (1, 1, 512, 512)
32x32/Conv0          2359808   (?, 512, 32, 32)  (3, 3, 512, 512)
32x32/Conv1_down     2359808   (?, 512, 16, 16)  (3, 3, 512, 512)
32x32/Skip           262144    (?, 512, 16, 16)  (1, 1, 512, 512)
16x16/Conv0          2359808   (?, 512, 16, 16)  (3, 3, 512, 512)
16x16/Conv1_down     2359808   (?, 512, 8, 8)    (3, 3, 512, 512)
16x16/Skip           262144    (?, 512, 8, 8)    (1, 1, 512, 512)
8x8/Conv0            2359808   (?, 512, 8, 8)    (3, 3, 512, 512)
8x8/Conv1_down       2359808   (?, 512, 4, 4)    (3, 3, 512, 512)
8x8/Skip             262144    (?, 512, 4, 4)    (1, 1, 512, 512)
4x4/MinibatchStddev  -         (?, 513, 4, 4)    -               
4x4/Conv             2364416   (?, 512, 4, 4)    (3, 3, 513, 512)
4x4/Dense0           4194816   (?, 512)          (8192, 512)     
Output               513       (?, 1)            (512, 1)        
scores_out           -         (?, 1)            -               
---                  ---       ---               ---             
Total                26488833                                    

Je suis désolé, j'ai oublié de modifier les paramètres de la grille de l'instantané et c'est foiré. .. .. C'est difficile à apprendre, donc je n'ai pas réessayé.

Exemple de jeu de données (reals.png) reals.png

Résultat de la génération (288 km: 19 heures) fakes000288.png Les contours se forment progressivement et le contour du Pokémon qui ressemble à un type humain ou animal a été créé.

Frechet Inception Distance (FID) est émis pour contrôler si l'apprentissage progresse correctement. Jusqu'à présent, les choses vont bien. La page officielle indique que le FID est à un seul chiffre, mais il est trop cher d'en apprendre autant, alors j'arrêterai d'apprendre lorsque l'image générée me va bien de mes propres yeux.

network-snapshot-              time 19m 34s      fid50k 278.0748
network-snapshot-              time 19m 34s      fid50k 382.7474
network-snapshot-              time 19m 34s      fid50k 338.3625
network-snapshot-              time 19m 24s      fid50k 378.2344
network-snapshot-              time 19m 33s      fid50k 306.3552
network-snapshot-              time 19m 33s      fid50k 173.8370
network-snapshot-              time 19m 30s      fid50k 112.3612
network-snapshot-              time 19m 31s      fid50k 99.9480
network-snapshot-              time 19m 35s      fid50k 90.2591
network-snapshot-              time 19m 38s      fid50k 75.5776
network-snapshot-              time 19m 39s      fid50k 67.8876
network-snapshot-              time 19m 39s      fid50k 66.0221
network-snapshot-              time 19m 46s      fid50k 63.2856
network-snapshot-              time 19m 40s      fid50k 64.6719
network-snapshot-              time 19m 31s      fid50k 64.2135
network-snapshot-              time 19m 39s      fid50k 63.6304
network-snapshot-              time 19m 42s      fid50k 60.5562
network-snapshot-              time 19m 36s      fid50k 59.4038
network-snapshot-              time 19m 36s      fid50k 57.2236

Résumé

Cette fois, j'ai étudié l'ensemble de données et les cas précédents, et j'ai écrit jusqu'au point où j'ai réellement procédé à l'apprentissage. Le code qui a fonctionné dans mon environnement et le résultat généré après plus d'apprentissage seront résumés dans la deuxième partie de l'article à une date ultérieure.

Partie 2 → Créer un Pokémon inconnu avec StyleGAN2 [Partie 2]

Postscript: rapport sur le processus d'apprentissage

640kimg Une chose unique et similaire a commencé à naître fakes000640.png

En fait, lorsque l'apprentissage a progressé jusqu'à présent, je fonctionnais sur le lecteur C, donc la capacité de données est devenue insuffisante et le modèle a été sauvegardé vide et a disparu ... Réfléchissez-y, déplacez-le vers le disque dur ajouté au détriment de la vitesse de lecture, puis réexécutez. C'est trop douloureux ... les résultats de deux jours d'apprentissage ...

Je suis désolé de n'avoir pensé à rien, mais je suis désolé pour ceux qui sympathisent avec moi ...

Lors de la sauvegarde du modèle, j'étais préoccupé par la capacité et je n'ai écrasé que le dernier à chaque fois, mais cela s'est retourné contre lui. Je vais soigneusement enregistrer le modèle sur le disque dur.

Recommended Posts

Créer un Pokémon inconnu avec StyleGAN2 [Partie 1]
Créer un Pokémon inconnu avec StyleGAN2 [Partie 2]
Créer un œuf avec python
Etudier Python Part.1 Créer un environnement
Créer une application de fractionnement d'image avec Tkinter
Remarques lors de la création d'un environnement avec python
Programmation GUI à l'aide de kivy ~ Partie 5 Création de boutons avec des images ~
bac à sable avec neo4j partie 10
Créer un environnement qui se construit automatiquement avec Github Actions (version Android)
J'ai trouvé un moyen de créer un modèle 3D à partir de photos Partie 01 Créer un environnement