Nous avons récemment publié un module python kawaii-gen qui génère de jolies images de visage d'idoles. Dans cet article, j'expliquerai le modèle stylegan utilisé dans ce module et le pipeline de données implémenté pour créer un jeu de données pour stylegan.
stylegan est un GAN qui peut générer une résolution de 1024x1024 pixels et des images de type photo, et possède une séparabilité linéaire et une complémentarité élevées dans l'espace variable caché. Cette fois, j'ai utilisé StyleGAN et l'ai essayé avec 256x256 et super-résolution 512x512.
En ce qui concerne le pipeline de données, stylegan a besoin d'un grand nombre d'images car le jeu de données FFHQ est de 70 000 images, nous avons donc utilisé l'idée d'apprentissage actif pour réduire le nombre d'annotations manuelles, et un peu plus de 2000 images. J'ai rendu possible de retirer automatiquement uniquement le visage féminin avec l'annotation de.
StyleGAN est un GAN avec les caractéristiques suivantes.
La performance complémentaire est la propriété que des objets similaires sont placés les uns à côté des autres dans l'espace variable caché. Dans le cas des images faciales, ils sont alignés dans l'ordre des sourires ou des lunettes. L'image du visage sur laquelle est accrochée est comme être proche dans l'espace.
Un meilleur démêlage est la possibilité de créer un espace où les axes sont presque indépendants. La relation entre un tel espace et un espace proche de la séparation linéaire, mais sensuellement, il est plus facile de créer une logique de classification, etc. en utilisant des quantités de caractéristiques indépendantes, donc un espace avec des axes indépendants (= les quantités de caractéristiques sont indépendantes) Semble avoir une meilleure séparation linéaire.
Dans StyleGAN, Z n'est pas un espace facile à séparer linéairement (figure 2), mais le réseau qui convertit Z en W dans l'architecture (figure 1) convertira Z en un espace facile à séparer linéairement.
Fig.1
Fig.2
J'ai utilisé le code du [Dépôt officiel] de stylegan (https://github.com/NVlabs/stylegan) presque tel quel. Il existe des scripts qui convertissent divers ensembles de données au format TFRecords et des scripts d'apprentissage qui vous permettent de modifier facilement les options. J'écris toutes les options dans Dictionaryu de Python,
C'était plus facile à changer que prévu, plutôt que d'ajouter des arguments avec argparse.
Voir le README officiel pour plus de détails, mais utilisez simplement la commande dataset_tool.py create_from_images
pour créer un jeu de données au format tfrecord que le script d'entraînement train.py
accepte et exécutez-le en jouant avec les arguments de train.py
. ..
Le flux de données et les composants de traitement sont indiqués dans la figure ci-dessus. Au début du processus, un robot d'exploration à usage général et spécifique au site collecte des images faciales. Après cela, le visage est détecté à partir de l'image, le visage masculin est supprimé, diverses occlusions sont supprimées, puis Le traitement d'alignement est effectué pour aligner les positions des yeux et des fleurs, et l'alignement est supprimé. L'image alignée est enregistrée dans le jeu de données d'entraînement.
Cette fois, j'ai utilisé l'algorithme cnn de dlib. Cet algorithme de détection de visage utilise cnn pour déterminer si l'intérieur de la fenêtre glissante est un visage. Dlib fournit également des fonctionnalités de porc et un algorithme qui utilise svm pour la discrimination, et le porc qui ne peut prendre que l'image de face peut être le plus approprié lors du démarrage de la génération d'image de visage.
Une autre méthode consiste à utiliser un modèle tel que SSD ou Retina Net, et il peut être possible d'accélérer par exécution par lots sur GPU avec EndToEnd. Le dlib cnn est également optimisé pour l'implémentation, ce qui est assez rapide.
Normaliser les données d'entraînement pour réduire la charge d'entraînement de StyleGAN. En alignant la position et la direction des yeux et du nez, les variations sont réduites.
J'ai utilisé l'alignement StyleGAN presque tel quel. Refaites le rectangle et corrigez la direction en fonction des positions des repères sur les yeux et le nez de l'image du visage. Les blancs créés lors de la rotation ou du déplacement sont rembourrés en blanc, mais ceux avec une zone de remplissage trop grande sont supprimés. C'est parce que certains cheveux et visage peuvent être trop enlevés.
Pour la détection des points de repère, j'ai utilisé le Module de détection de points de repère compatible avec l'occlusion.
À l'origine, je voulais créer un classificateur de visage d'idole, j'ai donc annoté environ 2000 images de visage. Nous avons extrait les traits du visage avec dlib, les avons regroupés dans l'espace des traits du visage, étiquetés similaires à la fois, puis étiqueté ceux avec des scores de confiance faibles.
Il y avait des photos avec des microphones, des mains, des lettres, de la nourriture, etc. sur mon visage, alors j'ai créé une fonction pour les détecter. Nous avons également créé une fonction pour filtrer autre que le visage face à l'avant. Comme il faut beaucoup de temps pour traiter des centaines de milliers d'images, cette fonction est désactivée car il n'y a aucune perspective d'augmenter le nombre de GPU. Cependant, il y a des images où des objets mystérieux peuvent être aperçus faiblement sur le visage, et je pense que le support d'occlusion est essentiel pour les éliminer.
Recommended Posts