[PYTHON] Erstellen eines unbekannten Pokémon mit StyleGAN2 [Teil 1]

Was ist diesmal zu tun?

Es fühlt sich an wie ein Sud, aber ich werde ein Modell der automatischen Generation von Pokemon lernen. Wenn Sie es nachschlagen, haben einige Leute es bereits versucht, basierend auf dem neuesten Modell, StyleGAN2. Der eigentliche Code, der Datensatz und die Implementierung wurden jedoch nicht veröffentlicht, daher möchte ich dies in einem Artikel zusammenfassen.

Was ist StyleGAN2?

StyleGAN2 ist ein von NVIDIA angekündigtes Bilderzeugungsmodell. Es handelt sich um ein Generationsmodell, das durch die Verwendung der Stilkonvertierung gekennzeichnet ist. Es ist ein leistungsstarkes Modell, das derzeit SOTA für mehrere Aufgaben ist.

Offizielle Implementierung von StyleGAN2 Trends bei den Methoden zur Bilderzeugung

Datensatz

Als ich untersuchte, ob es einen guten Datensatz gab, gab es eine Person, die 15.000 Daten im Voraus sammelte und öffentlich machte, also habe ich diese verwendet. MonsterGAN

Außerdem Kaggles Pokemon-Image-Dataset und [One-Shot-Pokemon-Images](https: // www. kaggle.com/aaronyin/oneshotpokemon) ist ebenfalls ein Kandidat. One-Shot-Pokemon-Images enthält einen Pokemon-Kartendatensatz, der eine sehr große Datenmenge enthält. [Pokemon-Kartengenerierungsaufgabe](https://devopstar.com/2019/05/21/ Es scheint, dass es auf stylegan-pokemon-card-generator angewendet wird).

pokemon-stylegan-example.png

Vorhergehender Fall

Es scheint, dass Michael Friese begeistert versucht, Pokemon mit StyleGAN / StyleGAN2 zu generieren. Es scheint, dass StyleGAN bereits ein ziemlich gutes Ergebnis hinterlassen hat. michael-stylegan-pokemon.jpg

Wenn das Transferlernen von einem trainierten Modell wie einer Katze oder einem Pferd durchgeführt wird, funktioniert das Lernen selbst gut und das erzeugte Bild scheint die Atmosphäre der Domäne vor dem Transfer widerzuspiegeln. Es ist wirklich emo.

Transfer vom Pferd horse.jpg

Transfer von Katze cat.jpg

Transfer vom Auto car.jpg

Das Generierungsergebnis mit StyleGAN2 wurde erst zur Hälfte veröffentlicht. Dies ist das Ergebnis des Lernens von bis zu 540 kg. Da ich gerade lerne, habe ich das Gefühl, dass es ziemlich viele Variationen gibt, abgesehen von der Qualität. michael-stylegan2-pokemon-540k.png

Ergebnisse des Selbststudiums

Ich bin noch im Lernprozess, aber ich werde Ihnen den Fortschritt des Lernens mit StyleGAN2 zeigen. Da wir mit RTX1070 trainieren, ist ein unordentliches Modell aufgrund der Speichergröße nicht möglich. Dieses Mal habe ich die Größe aller Datensätze auf 64 x 64 geändert.

Modellübersicht

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                                    

Es tut mir leid, dass ich vergessen habe, die Rastereinstellungen von Snapshot zu ändern, und es ist durcheinander. .. .. Es ist schwer zu lernen, deshalb habe ich es nicht noch einmal versucht.

Beispiel für einen Datensatz (reals.png) reals.png

Generierungsergebnis (288 kimg: 19 Stunden) fakes000288.png Die Konturen wurden nach und nach gebildet, und der Umriss des Pokémon, der wie ein Mensch oder ein Tier aussieht, wurde erstellt.

Frechet Inception Distance (FID) wird ausgegeben, um zu überwachen, ob das Lernen ordnungsgemäß verläuft. Bisher läuft es gut. Die offizielle Seite sagt, dass die FID eine einstellige Zahl ist, aber es ist zu teuer, so viel zu lernen, dass ich aufhören werde zu lernen, wenn das erzeugte Bild mit meinen eigenen Augen gut aussieht.

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

Zusammenfassung

Dieses Mal untersuchte ich den Datensatz und die Präzedenzfälle und schrieb bis zu dem Punkt, an dem ich tatsächlich mit dem Lernen fortfuhr. Der Code, der in meiner Umgebung funktioniert hat, und das generierte Ergebnis nach mehr Lernen werden zu einem späteren Zeitpunkt im zweiten Teil des Artikels zusammengefasst.

Teil 2 → Erstellen eines unbekannten Pokémon mit StyleGAN2 [Teil 2]

Nachtrag: Bericht über den Lernprozess

640kimg Eine einzigartige und ähnliche Sache wurde geboren fakes000640.png

Als das Lernen so weit fortgeschritten war, lief ich auf dem Laufwerk C, sodass die Datenkapazität unzureichend wurde und das Modell leer gespeichert wurde und verschwand ... Denken Sie darüber nach, verschieben Sie es auf Kosten der Lesegeschwindigkeit auf die hinzugefügte Festplatte und führen Sie es erneut aus. Es ist zu schmerzhaft ... die Ergebnisse von zwei Tagen Lernen ...

Es tut mir leid, dass ich an nichts gedacht habe, aber es tut mir leid für diejenigen, die mit mir sympathisieren ...

Beim Speichern des Modells war ich besorgt über die Kapazität und habe jedes Mal nur die neueste überschrieben, aber das schlug fehl. Ich werde das Modell sorgfältig auf der Festplatte speichern.

Recommended Posts

Erstellen eines unbekannten Pokémon mit StyleGAN2 [Teil 1]
Erstellen eines unbekannten Pokémon mit StyleGAN2 [Teil 2]
Ein Ei mit Python erstellen
Python studieren Teil 1 Erstellen einer Umgebung
Erstellen einer Bildaufteilungs-App mit Tkinter
Hinweise beim Erstellen einer Umgebung mit Python
GUI-Programmierung mit kivy ~ Teil 5 Erstellen von Schaltflächen mit Bildern ~
Sandkasten mit neo4j Teil 10
Erstellen einer Umgebung, die automatisch mit Github-Aktionen erstellt wird (Android-Version)
Ich habe mir eine Möglichkeit ausgedacht, ein 3D-Modell aus Fotos zu erstellen. Teil 01 Erstellen einer Umgebung