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

Letztes Mal zeigte den Umriss und das Generierungsergebnis. Dieses Mal werde ich die Änderungen gegenüber der offiziellen Implementierung von StyleGAN2 vorstellen, um tatsächlich mit GTX1070 arbeiten zu können.

Das trainierte Modell wurde aus verschiedenen Gründen weggeblasen, deshalb möchte ich das auch zur Kenntnis nehmen!

Offizielle Implementierung von StyleGAN2

Offizielle Implementierungsänderungen

Ich habe tatsächlich mit run_training.py und training / dataset.py rumgespielt.

Die Modelldaten sind ungefähr 300 MB groß, was ziemlich schwer ist. Wenn Sie also die Speicherfrequenz nicht berücksichtigen, wird die Kapazität knapp und das Lernen endet. In meinem Fall hörte das Lernen in der Mitte auf und ich hatte es so eingestellt, dass es das Modell überschrieb, sodass es leer überschrieben wurde und das trainierte Modell für zwei Tage weggeblasen wurde. Es wird empfohlen, regelmäßig in mehreren Modellen zu speichern.

run_training.py


def run(...):
  ...
  #Das generierte Sample wird für jeden Tick ausgegeben. ・ Das Netzwerk besteht einmal alle 5 Ticks
  train.image_snapshot_ticks = 1
  train.network_snapshot_ticks = 5

  #Diesmal habe ich ein Modell mit einer Bildgröße von 64 erstellt
  dataset_args = EasyDict(tfrecord_dir=dataset, resolution = 64)

Hier Der Speicherfehler wurde behoben

training/dataset.py


class TFRecordDataset:
  def __init__(...):
    ...
    # Load labels.
    assert max_label_size == 'full' or max_label_size >= 0
    #self._np_labels = np.zeros([1<<30, 0], dtype=np.float32)
    self._np_labels = np.zeros([1<<20, 0], dtype=np.float32)

Wenn die GPU-Verarbeitung zu lang wird, wird die Lernaufgabe beendet. Das hat mich auch getroffen. Als Gegenmaßnahme sollte das Zeitlimit durch Festlegen des DWORD-Werts abgeschnitten werden. (Http://www.field-and-network.jp/rihei/20121028223437.php) Es wird empfohlen, es vor dem Lernen einzustellen.

Modellbewertungsindex / Überwachung des Lernens

Die quantitative Bewertung von GAN ist eine der schwierigen Aufgaben, aber in vielen Studien wird die Qualität des erzeugten Bildes mit einer Methode namens FID (Frechet Inception Distance) bewertet. Dies ist eine Methode zum Eingeben des Bildes des Datensatzes und des erzeugten Bildes in das Merkmalmengenextraktionsmodell und zum Berechnen des Frechet-Abstands zwischen den Verteilungen der Merkmalsmenge.

Aufgrund der Anzahl der Dimensionen der zu behandelnden multivariaten Normalverteilung ist es erforderlich, mindestens 4000 Datensätze aus dem Datensatz und dem generierten Bild vorzubereiten, und es dauert insbesondere einige Zeit, den Datensatz zu lesen. Wenn dieser Prozess weggelassen wird, verschwindet der Index, sodass ich nicht weiß, wann ich mit dem Lernen aufhören soll, damit ich ihn nicht löschen kann. Aber kann er nicht beschleunigt werden?

Da die FID in den Ergebnissen /.../metrix-fid50k.txt ausgegeben wird, müssen Sie regelmäßig überprüfen, ob der Lernvorgang reibungslos verläuft.

metrix-fid50k.txt


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
network-snapshot-              time 19m 40s      fid50k 56.9055
network-snapshot-              time 19m 47s      fid50k 56.5965
network-snapshot-              time 19m 34s      fid50k 56.5844
network-snapshot-              time 19m 38s      fid50k 56.4158
network-snapshot-              time 19m 34s      fid50k 54.0568
network-snapshot-              time 19m 32s      fid50k 54.0307
network-snapshot-              time 19m 40s      fid50k 54.0492
network-snapshot-              time 19m 32s      fid50k 54.1482
network-snapshot-              time 19m 38s      fid50k 53.3513
network-snapshot-              time 19m 32s      fid50k 53.8889
network-snapshot-              time 19m 39s      fid50k 53.5233
network-snapshot-              time 19m 40s      fid50k 53.9403
network-snapshot-              time 19m 43s      fid50k 53.1017
network-snapshot-              time 19m 39s      fid50k 53.3370
network-snapshot-              time 19m 36s      fid50k 53.0706
network-snapshot-              time 19m 43s      fid50k 52.6289
network-snapshot-              time 19m 39s      fid50k 51.8526
network-snapshot-              time 19m 35s      fid50k 52.3760
network-snapshot-              time 19m 42s      fid50k 52.7780
network-snapshot-              time 19m 36s      fid50k 52.3064
network-snapshot-              time 19m 42s      fid50k 52.4976

Wenn das Lernen in der Mitte aufhört

Wenn das Training aufgrund eines Fehlers wie mir abgebrochen wird, können Sie von dort aus mit dem Lernen beginnen, indem Sie das unter den Ergebnissen gespeicherte Netzwerk-Snapshot- *. Pkl-Modell laden. Die notwendige Beschreibung lautet wie folgt.

run_training.py


def run(...):
  ...
  train.resume_pkl = "./results/00000-stylegan2-tf_images-1gpu-config-f/network-snapshot-00640.pkl"
  train.resume_kimg = 640
  train.resume_time = 150960

Für train.resume_time ist es in Ordnung, wenn Sie die Ausgabe der Berechnungszeit beim Speichern des Modells aus log.txt usw. in sec konvertieren und eingeben.

Möglicherweise kann das Transferlernen durchgeführt werden, indem ein trainiertes Modell mit derselben Methode angegeben wird. Nach dem Laden des Modells muss die Fixierung von Gewichten und anderen Details manuell eingestellt werden. Wenn Sie mit einer Aufgabe wie dieser übertragen möchten, können Sie meiner Meinung nach alles neu lernen ...

log.txt


dnnlib: Running training.training_loop.training_loop() on localhost...
...
tick 40    kimg 640.1    lod 0.00  minibatch 32   time 1d 17h 56m   sec/tick 2588.1  sec/kimg 161.76  maintenance 1203.1 gpumem 5.1

Ergebnisse bis zu dem Punkt, an dem ich lernen konnte

Ich fiel bei 640kimg wegen mangelnder Lagerung (Weinen) Es ist zu traurig, weil der FID gut gesenkt wurde. fakes000640.png

Der Umriss wird klarer und nicht nur die Form des Körpers, sondern auch das Gesicht beginnt sich zu reproduzieren.

Ich würde gerne die Lernergebnisse in Zukunft so schnell wie möglich sehen, aber da ich neu lerne, scheint es, dass es in naher Zukunft sein wird. Das Ergebnis wird hinzugefügt, sobald das Lernen fortschreitet.

Ich mache mir Sorgen, dass ich alle Änderungen gegenüber der ursprünglichen Implementierung eingeführt habe, daher habe ich den folgenden Code aufgelistet. Die Verwendung ist auch auf GitHub geschrieben, also bitte.

https://github.com/Takuya-Shuto-engineer/PokemonGAN

Verweise

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
Hinweise beim Erstellen einer Umgebung mit Python
GUI-Programmierung mit kivy ~ Teil 5 Erstellen von Schaltflächen mit Bildern ~
Verfahren zum Erstellen einer Anwendung mit Django mit Pycharm ~ Vorbereitung ~
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