Comment faire un bot qui transforme une photo en bande dessinée. Deuxième partie Formation modèle

⇨ La première partie
⇨ Troisième partie

Bonjour encore!

Comme vous pouvez le voir, les vacances ont quelque peu paralysé la chronologie des articles.
Je pense que beaucoup pendant cette période ont réussi, sinon à former pleinement leur modèle, au moins à expérimenter avec différents ensembles de données.
1. Mettez la distribution
2. Téléchargement d'images
3. ???
4. Profit!
Si vous n'étiez pas à la hauteur de ces réseaux de neurones, ou si vous commencez à lire cet article, alors, comme on dit, il n'y a pas de temps pour expliquer, nous prenons le kit de distribution, téléchargeons les photos nécessaires, et c'est parti!

Des instructions détaillées figurent dans l'article précédent de la série .

La première crêpe est grumeleuse


Lorsque j'ai formé le modèle pour @ photo2comicsbot pour la première fois, sans plus tarder, je viens de mettre environ 1000 pages de bandes dessinées dans un ensemble de données.
Oui, ainsi que des couvertures, des annonces et d'autres charges.

À l'entrée, cela ressemblait à ceci:



Le résultat est correspondant:







Plus d'images

















Le modèle transmet parfaitement les différences générales entre les bandes dessinées et les photos:

  • Étalonnage de couleur typique
  • Sélection des contours
  • Blocage
  • Nuage de texte

En principe, cette option peut être tout à fait suffisante pour la production.

Mais je me demandais quels résultats peuvent être obtenus sur un ensemble de données plus «propre».

Prenez deux


Pour l'expérience suivante, j'ai laissé les pages avec un bloc, et du reste j'ai découpé les plus grandes pièces, constituées d'un bloc, afin de se débarrasser des lignes de séparation verticales et horizontales dans le modèle final.
Si vous apportez des modifications à votre jeu de données, par exemple, supprimez ou ajoutez des photos, n'oubliez pas d'enregistrer la version précédente. Vous aurez un endroit où retourner en cas de problème.
Le deuxième ensemble de données ressemblait à ceci:



Le résultat, comme on dit, est évident:







Plus d'images












Les lignes de division ont disparu, mais avec elles l'expressivité laissée dans les nuages ​​avec le texte: elles ont commencé à se rencontrer beaucoup moins souvent dans l'ensemble de données et ont cessé d'être la caractéristique principale.

L'espace vide qui était auparavant rempli de texte est maintenant rempli de bruit psychédélique.

La troisième fois est un charme


J'ai décidé de me débarrasser complètement du texte, ne laissant que les parties de la bande dessinée où il ne se trouve pas. Personne n'a survécu: pas de nuage, pas de titres ou de noms de séries.

Jeu de données après le «génocide linguistique»:



Le résultat final:







Plus d'images










D'une part, il y a moins d'artefacts, d'autre part, l'expressivité a disparu. Étant donné que dans la formation GAN, la qualité du résultat est largement déterminée par vous et moi, il n'y a pas de recette unique pour un bon modèle.

La beauté est dans l'œil du spectateur, alors n'ayez pas peur d'expérimenter et de choisir ce que vous aimez le plus.

À l'arme!


Eh bien, nous avons déjà parlé des principaux pièges et des méthodes pour y faire face, il est temps de passer aux choses sérieuses.

Accédez au dossier dans lequel nous avons téléchargé la distribution. Permettez-moi de vous rappeler qu'il s'appelait pytorch-CycleGAN-and-pix2pix

Puisque nous avons des instructions pour les nuls, nous ne toucherons pas au code de distribution, car tous les paramètres nécessaires peuvent être définis à partir de la ligne de commande.

Dans cette distribution, l'entraînement par défaut se déroule sur deux cents époques, avec une atténuation linéaire du rythme d'apprentissage après la centième époque.
La résolution maximale que ma carte de huit gigaoctets était capable de maîtriser était de 400x400. La formation complète m'a pris environ 33 heures, nous allons donc utiliser un petit hack de vie. Tout d'abord, nous formerons le modèle en images 128x128, puis 256x256, et ce n'est qu'au stade final que nous lui montrerons notre magnifique 400x400.
La première étape durera 100 époques, la deuxième et la troisième - 50 chacune, ce qui nous permettra de réduire le temps d'entraînement de près de moitié.

Comme le montre la pratique, le résultat de cette approche n'est pas pire, et parfois meilleur, que lors d'un entraînement immédiat à une résolution maximale.
Peut-être assez de théorie, il est temps de passer à la pratique.

À l'invite de commande, entrez.

Première étape


python train.py --dataroot {dataset root folder} --name {model name} --model cycle_gan --crop_size 128 --load_size 180 --init_type kaiming --netG resnet_9blocks --no_dropout --batch_size 4 

N'oubliez pas de remplacer les accolades par vos propres valeurs.

Nous analyserons plus en détail certains paramètres:

 --batch_size {number} 

Ce paramètre est responsable du nombre d'images traitées par cycle, affectant positivement la vitesse et négativement sur la gourmandise du modèle.

À chaque étape, sélectionnez le maximum --batch_size, qui ne provoque pas d'erreurs en raison du manque de mémoire GPU.

 -- dataroot {dataset root folder} 

- dossier avec notre jeu de données. À l'intérieur, il devrait y avoir les dossiers trainA, trainB, testA, testB, comme décrit dans l'article précédent.

 --name {model name} 

- Le nom de votre projet. Cela peut être arbitraire, mais je recommande d'inclure l'architecture du modèle, la résolution maximale et le nom de l'ensemble de données dans le nom.
Par exemple: "resnet9_128to400_comics8"
Ainsi, vous pouvez distinguer les expériences avec divers paramètres et données.

La première étape de la formation peut être arrêtée à la centième ère.

Vous pouvez observer la progression depuis le navigateur: localhost : 8097 /
(ou un autre lien qui sera visible dans la console)

Étape deux


 python train.py --dataroot {dataset root folder} --name {model name} --model cycle_gan --crop_size 256 --load_size 290 --init_type kaiming --netG resnet_9blocks --no_dropout --batch_size 2 --epoch 100 --epoch_count 0 --continue_train 

Il est important d'indiquer l'époque à laquelle nous avons terminé nos études dans la première étape.
"--Epoch 100" signifie que nous chargerons le modèle à partir du point de contrôle de la centième ère
«--Epoch_count 0» signifie que nous allons commencer l'entraînement à partir de zéro, avec la vitesse d'apprentissage maximale.

La deuxième étape de la formation peut être arrêtée à la 50e ère.

Troisième étape


 python train.py --dataroot {dataset root folder} --name {model name} --model cycle_gan --crop_size 400 --load_size 430 --init_type kaiming --netG resnet_9blocks --no_dropout --batch_size 1 --epoch 50 --epoch_count 0 --continue_train 


La troisième étape de l'entraînement peut être arrêtée à la 50e ère, mais c'est une question de goût. Vous pouvez terminer jusqu'à la fin et choisir le résultat intermédiaire que vous aimez. Il est important de se rappeler que le résultat sur la 200e ère peut être pire que sur la 150e.

Maintenant, sortez et voyez ce que vous avez fait


Pendant l'entraînement, le modèle et les résultats intermédiaires seront enregistrés dans un dossier
/ pytorch-CycleGAN-and-pix2pix / checkpoints / {nom du modèle}

Pour tester le modèle, entrez simplement la ligne de commande:

 python test.py --dataroot {dataset root folder} --name {model name} --model cycle_gan --netG resnet_9blocks --crop_size 512 --load_size 580 --epoch {epoch name} 

Vous pouvez voir le résultat sur un jeu de données de test pour n'importe quel point de contrôle, il suffit de le spécifier comme {nom de l'époque}. Si {nom d'époque} n'est pas spécifié, le dernier point de contrôle sera pris.

Le résultat sera enregistré dans le dossier:
/pytorch-CycleGAN-and-pix2pix/results/{model name}/test_{epoch name}
Afin de ne pas confondre quel modèle sur quel ensemble de données donne quel résultat,
commencez à tenir un petit journal. Enregistrer les données de référence et les résultats d'apprentissage.

Par exemple, la ligne de commande et l'époque à laquelle vous avez atteint. Ces données sont suffisantes pour enregistrer les paramètres d'entraînement et l'ensemble de données sur lequel nous nous sommes entraînés.

Après tout, quelle est la différence entre une expérience scientifique et une farce? Le fait que tout soit documenté avec nous!
C'est tout pour aujourd'hui! Dans le prochain article, nous apprendrons comment exporter un modèle fini et l'héberger dans le cloud.

N'ayez pas peur d'expérimenter. Assurez-vous d'essayer plusieurs ensembles de données différents, de comparer les résultats et de les partager dans les commentaires!

A très bientôt!

⇨ Partie suivante

Source: https://habr.com/ru/post/fr483168/


All Articles