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

Dernière fois a montré le contour et le résultat de la génération. Cette fois, je présenterai les changements de l'implémentation officielle de StyleGAN2 afin de travailler réellement avec GTX1070.

Le modèle entraîné a été époustouflé pour diverses raisons, alors j'aimerais également en prendre note!

Implémentation officielle de StyleGAN2

Modifications officielles de la mise en œuvre

En fait, j'ai joué avec run_training.py et training / dataset.py.

Les données du modèle sont d'environ 300 Mo, ce qui est assez lourd, donc si vous ne tenez pas compte de la fréquence de stockage, la capacité sera épuisée et l'apprentissage se terminera. Dans mon cas, l'apprentissage s'est arrêté au milieu et je l'avais réglé pour écraser le modèle, il a donc été écrasé vide et le modèle entraîné pendant deux jours a été époustouflé. Il est recommandé d'enregistrer régulièrement plusieurs modèles.

run_training.py


def run(...):
  ...
  #L'échantillon généré est sorti pour chaque tick ・ Le réseau est une fois tous les 5 ticks
  train.image_snapshot_ticks = 1
  train.network_snapshot_ticks = 5

  #Cette fois, j'ai créé un modèle avec une taille d'image de 64
  dataset_args = EasyDict(tfrecord_dir=dataset, resolution = 64)

Ici Correction de l'erreur de mémoire

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)

De plus, si le traitement GPU devient trop long, la tâche d'apprentissage sera supprimée. J'ai également été frappé par cela. En guise de contre-mesure, il semble que le délai d'expiration doit être coupé en définissant la valeur DWORD. (Http://www.field-and-network.jp/rihei/20121028223437.php) Il est recommandé de le régler avant d'apprendre.

Indice d'évaluation du modèle / suivi des apprentissages

L'évaluation quantitative du GAN est l'une des tâches difficiles, mais dans de nombreuses études, la qualité de l'image générée est évaluée par une méthode appelée FID (Frechet Inception Distance). Il s'agit d'une méthode de saisie de l'image de l'ensemble de données et de l'image générée dans le modèle d'extraction de quantité de caractéristiques et de calcul de la distance de Frechet entre les distributions de la quantité de caractéristiques.

En raison du nombre de dimensions de la distribution normale multivariée à traiter, il est nécessaire de préparer au moins 4000 ensembles de données à partir de l'ensemble de données et de l'image générée, et il faut du temps pour lire l'ensemble de données en particulier. Si ce processus est omis, l'index disparaîtra, donc je ne sais pas quand arrêter l'apprentissage, donc je ne peux pas l'effacer, mais est-ce quelque chose qui ne peut pas être accéléré?

Étant donné que le FID est affiché dans les résultats /.../metrix-fid50k.txt, vous devrez vérifier régulièrement si l'apprentissage se déroule correctement.

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

Si l'apprentissage s'arrête au milieu

Si la formation s'arrête en raison d'une erreur comme moi, vous pouvez commencer à apprendre à partir de là en chargeant le modèle network-snapshot- *. Pkl enregistré sous les résultats. La description nécessaire est la suivante.

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

Pour train.resume_time, il n'y a pas de problème si vous convertissez la sortie du temps de calcul lorsque le modèle est enregistré à partir de log.txt etc. en sec et entrez-la.

Peut-être que l'apprentissage par transfert peut être effectué en spécifiant un modèle entraîné en utilisant la même méthode. Il est nécessaire de régler manuellement la fixation des poids et d'autres détails après le chargement du modèle. Si vous souhaitez transférer avec une tâche comme celle-ci, je sens que vous pouvez tout réapprendre ...

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

Des résultats au point où j'ai pu apprendre

Je suis tombé à 640kimg faute de rangement (pleurs) C'est trop triste car le FID a bien été abaissé. fakes000640.png

Le contour se précise et non seulement la forme du corps mais aussi le visage commencent à se reproduire.

J'aimerais voir les résultats d'apprentissage dans le futur le plus tôt possible, mais comme je réapprends, il semble que ce sera dans un proche avenir. Le résultat sera ajouté dès que l'apprentissage progressera.

Je crains d'avoir introduit toutes les modifications par rapport à l'implémentation d'origine, j'ai donc répertorié le code ci-dessous. L'utilisation est également écrite sur GitHub, alors s'il vous plaît.

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

Les références

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
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 ~
Procédure de création d'une application avec Django avec Pycharm ~ Préparation ~
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