Nous avons parlé des projets de fin d'études des diplômés des cours semestriels sur le développement mobile au Technopark (Université technique d'État Bauman de Moscou) (publications précédentes: " Développement d'applications pour iOS ", " Développement d'applications pour Android "). Aujourd'hui, nous partageons des projets intéressants d'étudiants du deuxième semestre de la Technosphère - un projet éducatif conjoint avec l'Université d'État de Moscou avec un programme de formation annuel dans le domaine de l'analyse et du travail avec de grandes quantités de données. Les étudiants suivent des cours d'apprentissage automatique, de recherche d'informations, de réseaux de neurones et d'autres disciplines. La méthode projet est utilisée dans l'enseignement, nous résumons donc les résultats du semestre sur la défense des projets étudiants.
Les expériences jouent un rôle important dans le processus éducatif. Les projets étudiants ne peuvent pas se passer d'eux: les gars essaient différentes approches, méthodes, architectures, outils. Souvent après l'expérience, les étudiants abandonnent le choix de la technologie et de l'algorithme au profit d'une nouvelle approche. C'est une grande partie de l'expérience et de l'apprentissage. Ci-dessous, nous parlerons de ces étapes dans le développement de deux projets étudiants.
- Projet d'affiches de cinéma GAN / embed.
- Projet Cyrclegan sur la série de dessins animés.
CycleGAN sur la série de dessins animés
Les auteurs de ce projet ont décidé d'utiliser la technique CycleGAN pour transférer des images d'un film d'animation à un autre. GAN (Generative adversarial network) est une méthode de formation de modèles image à image. Deux réseaux de neurones sont formés: le discriminateur et le générateur, qui sont dans des relations conflictuelles. Le générateur essaie d'augmenter l'erreur de classification, le discriminateur essaie de la diminuer. Et CycleGAN est une méthode de transfert de l'apprentissage image-image en mode non supervisé.
Disons qu'il y a deux domaines d'image - A et B. Deux générateurs et deux discriminateurs sont créés: gen_A2B, gen_B2A, disc_A, disc_B. Il est nécessaire que le générateur gen_A2B crée la même image à partir de l'image de A, mais pour qu'elle soit dans le domaine B.Pour ce faire, entrez la perte de cohérence de cycle:
l1loss(gen_b2a(gen_a2b(a)), a)
Dans ce cas, le générateur générera des images qui trompent le discriminateur, mais en même temps conservent le contenu original.
Architecture de la solution:
Générateur:
Les blocs Resnet vous permettent de vous souvenir de l'image d'origine. Nous avons également utilisé la normalisation d'instance au lieu de la normalisation par lots, car cette dernière ajoute du bruit provenant d'autres images.
Discriminateur:
Il n'y avait pas de jeu d'images prêtes à l'emploi, nous avons donc choisi des images à partir d'images clés de longs métrages d'anime: pour A, nous avons utilisé "Spirited Away" de Hayao Miyazaki et pour B - "Your Name" de Makoto Shinkai. Puisque CycleGAN n'est pas très adapté aux changements drastiques (par exemple, la forme), les auteurs ont pris les deux domaines de l'anime.
Le LSGAN a d'abord été utilisé comme fonction de perte, puis WGAN GP, car LSGAN a créé des artefacts étranges et perdu des couleurs pendant l'entraînement.
Pour la formation, nous avons utilisé un modèle pré-entraîné sur horse2zebra (les poids n'ont été trouvés que pour les générateurs). Elle comprend déjà qu'elle a besoin de sauvegarder le contenu de l'image, de sorte que les auteurs au tout début ont obtenu un bon auto-encodeur, qui n'avait besoin que d'apprendre à tromper le discriminateur.
Au tout début de la formation, nous avons défini une valeur élevée pour la perte d'identité de perte de cycle et l'écrêtage de gradient, mais lorsque suffisamment d'époques se sont écoulées, nous avons décidé de diminuer progressivement ces valeurs afin que le générateur commence à essayer de tricher un peu plus le discriminateur.
Nous avons également essayé d'utiliser de grands réseaux pré-formés (VGG, RESNET, Inception) comme discriminateur, mais ils sont très volumineux et la formation a beaucoup ralenti.
En conséquence, le travail a réussi à obtenir le fait que le style est transféré près de l'original, tout en conservant la palette de couleurs générale (originaux en haut, images générées ci-dessous):
Code du projet: https://github.com/IlyasKharunov/Cyclegan_project
Équipe du projet: Ilyas Kharunov, Oleg Verbin.
Vidéo avec protection de projet .
Affiches de cinéma GAN / embed
Le projet suivant est intéressant du point de vue du chemin parcouru par l'élève. Contrairement à d'autres projets d'étudiants, Dmitry a fait le travail seul. Ce chemin s'est avéré plus difficile que celui des autres, mais les résultats et les conclusions sont intéressants.
L'auteur a décidé de créer un réseau qui générerait des affiches pour des films pour les genres donnés. Par exemple, pour avoir des affiches pour des films d'horreur dans des couleurs sombres, pour des comédies dans des couleurs claires, etc.
Sur le site IMDB, l'auteur a pris 41 mille affiches pour des films dans vingt genres pour la période 1970-2020. Plus tard, il s'est avéré qu'il y avait trop peu d'images pour certains genres, donc Dmitry a équilibré l'ensemble par genres et, par conséquent, il restait 32000 affiches.
Ensuite, l'étudiant a appliqué un réseau neuronal avec une architecture DCGAN pour générer des images sans genre. Elle a travaillé avec des affiches au format 64x128.
Les résultats sont ridicules:
Ensuite, l'auteur a essayé l'architecture CVAE + DCGAN:
Et aussi VAE sans GAN et GAN avec classificateur. Je suis arrivé à la conclusion que le jeu d'affiches assemblé est trop complexe pour ces méthodes. Ensuite, l'auteur a appliqué le GAN conditionnel: c'est la même chose que DCGAN, seuls les genres sont désormais introduits à la fois dans le générateur et dans le discriminateur. Le vecteur latent z a été pris avec une longueur de 100, les genres au format chaud avec une longueur de 20, résultant en un vecteur avec une longueur de 120. Le genre a été ajouté à la réponse et une course supplémentaire a été effectuée sur une couche linéaire.
J'ai réussi à obtenir le résultat suivant:
Comme vous pouvez le voir, l'élève souhaitait essayer différentes approches et les résultats étaient intéressants. Auto a reçu beaucoup de nouvelles expériences, est arrivé à la conclusion que pour mettre en œuvre une telle idée, il est nécessaire de prendre immédiatement un réseau de neurones plus complexe, par exemple, StyleGAN.
Processus d'apprentissage en réseau:
Équipe du projet: Dmitry Piterkin.
Vidéo avec protection de projet .
Bientôt, nous vous parlerons des projets de diplôme les plus intéressants dans le développement C ++ et Go, le développement front-end et la création d'interfaces. Vous pouvez en savoir plus sur nos projets éducatifs sur ce lien . Et le plus souvent aller sur la chaîne Technostream , apparaissent régulièrement de nouvelles vidéos de formation sur la programmation, le développement et d'autres disciplines.