Session du 19 décembre 2024 à 21h00
Veille & Discussions
Style Transfert @morpheus5828
Je vous propose une vidéo sur une notion appelé style transfer. Je vais vous parler de son fonctionnement et d'une implémentation que j'ai réalise sur celle ci afin de voir un petit peu son fonctionnement.
00:00:00 :Bonsoir à tous et à toutes, merci d'être venus pour cette nouvelle vidéo sur le transfertde style. C'est quelque chose que j'ai découvert il y a quelques temps quand j'ai fait des cours
00:00:12 :en master en computer vision. C'est quelque chose qui est assez sympa parce qu'en faitcomme les neurones sont assez malléables, on est toujours dans le domaine du deep learning,il y a pas mal d'expériences qui ont été réalisées en fait sur les images, sur le son etc.
00:00:29 :Et là on va se concentrer plus sur les images et notamment en fait on va prendre... Alors c'est pastrès compliqué à faire. Il y a en fait la suivante, vous avez des images, donc vous avez une image de
00:00:42 :contenu, d'accord, qui est une image un peu lambda qu'on peut trouver, donc là j'ai pris une imagede chat et une image en fait, vous avez une image de style. Donc là c'est plus une image artistique,
00:00:54 :d'accord, une peinture etc. Et en fait le but en fait ça va être de pouvoir relier les deux,d'accord, afin de générer une image pour transférer le style. Alors là par exemple quand j'ai pris la
00:01:07 :vague de Kusaï avec le chat, ça a donné ceci. Donc là j'ai fait un transfert de style et jetrouve ça assez sympa parce qu'on voyait pas mal d'exemples sur internet où par exemple on avaitla nuit étoilée de Van Gogh où les étoiles étaient remplacées par des coquillages et j'ai trouvé ça
00:01:23 :assez stylé. Donc voilà, je vais vous présenter un petit peu ce soir comment ça a marché, on va voir un peul'architecture qu'il y a dedans et on va faire un petit peu de live coding, donc je vous présenterai un peu lenotebook qui m'a permis de générer ça. Alors pour faire ce truc là, vous avez besoin, donc là vous
00:01:40 :avez le lien Kaggle où j'ai mis le code. Donc le fonctionnement est assez... il est pas très compliqué.Vous avez vos deux images, vous extrayez les matrices qui contiennent les valeurs dechacune d'un pixel, d'accord, étant donné qu'on est en trois dimensions, du coup vous avez trois matrices,d'accord, une matrice par canal, d'accord, donc canal RGB. Si il y en a un qui s'en souviennent pas trop, j'avais
00:02:05 :fait une vidéo sur ça sur les autres vidéos de ma chaîne. Et ensuite ce qui va sepasser c'est que tout va se faire à partir de l'image du contenu, c'est-à-dire que l'image ducontenu, alors déjà oui on va normaliser un peu toutes ces valeurs là, puisque comme elles sont
00:02:21 :entre 0 et 255, bon envoyer, faire tourner ces matrices-là sur desréseaux de neurones, d'accord, comme c'est assez gourmand, nous on aime bien normaliser donc on va toutdiviser par la valeur max qui est 255 pour avoir des valeurs entre 0 et 1, d'accord. Bon soit je l'ai
00:02:38 :ajouté, mais je l'avais déjà un petit peu expliqué pour que ça aille beaucoup plus vite. Donc en fait l'idéec'est qu'on va prendre un modèle qui a été entraîné sur une grande base de données d'images, d'accord,donc là j'ai pris l'exemple de VGG16 qui a été entraîné sur Imagine, si je ne dis pas de bêtises, donc
00:02:55 :c'est une base de données où il y a une centaine, une millier de classes, et dedans il y aenviron quelques millions d'images. On va prendre ce modèle-là, on va récupérer, donc on va le télécharger,
00:03:09 :il y a des librairies comme Keras, PyTorch, et en fait on ne va pas mettre à jour lemodèle à proprement dit, c'est-à-dire que toutes les couches de convolution qu'il y a à l'intérieur,les couches dense, etc, on va tout freeze, d'accord. Donc quand je dis freeze, c'est qu'en fait on ne va pas
00:03:26 :mettre à jour le gradient, vous vous rappelez quand je disais qu'on va à chaque fois minimiser, etc, ça on ne va pasle faire directement. Par contre on va utiliser cette image-là, on va la faire rentrer dans VGG16,
00:03:38 :et ensuite on va faire l'aménagement des fonctions de perte. Alors les fonctions de perte, rappelez-vous, c'est ce quej'aimerais minimiser, d'accord, c'est les opérations mathématiques que je vais faire pour mettre à jouren fait une partie du code, d'accord. Et en fait l'aménagement va se faire grâce à l'image du style.
00:03:53 :Dans la slide présente, on verra un petit peu comment fonctionnent ces images, ces fonctions de perte,d'accord. Et ensuite, en fait, j'effectue tout ça N fois, d'accord, ça peut être sur 300 époques, sur 400 époques,
00:04:07 :d'accord, jusqu'à ce qu'il y ait une convergence des fonctions de perte, d'accord, donc ça, ça va être monenseignement. Mais les modèles ils freezent, d'accord. Donc ça, comment on fait pour avoir ce transfert de style-là ?
00:04:20 :Moi, ce que je vais faire, en fait, c'est, je vais avoir deux fonctions de perte. La première, en fait, je vais vouloirminimiser la différence entre la fSource et la fTarget. Donc la fSource, c'est la matrice source, donc c'est la,
00:04:33 :quand je dis la matrice, c'est l'image source et l'image target, d'accord. J'aimerais, en fait, que chacune des valeursdans mes deux matrices soient les plus proches possibles, d'accord. Donc tout simplement, je vais faire une norme, d'accord,
00:04:47 :au carré, ou une minSquare, d'accord, c'est le nombre de cette fonction de loss, là. Et ensuite, je vais mettre à jour,en fait, une deuxième fonction de perte, d'accord, qui va être la loss du style. Et là, la loss du style, en fait,
00:05:03 :je vais faire un petit peu pareil, alors, il me manque une parenthèse ici, je vais faire un petit peu pareil que dans la loss content,sauf que d'abord, ma matrice de source, d'accord, je vais la faire passer dans une matrice qui s'appelle matrice de grammes.
00:05:19 :Alors, en fait, cette matrice de grammes-là, on peut la voir comme une matrice qui va faire ressortir des traits de caractéristiquesqui vont être révélateurs de l'image. Je ne rentre pas trop dans l'étage, je vais faire un petit résumé de comment ça fonctionne.
00:05:33 :Elle prend juste en entrée, en fait, la fonction, enfin la matrice source et sa matrice transposée, d'accord.Ça calcule un produit vectoriel avec d'autres petits trucs au milieu. Et ensuite, je vais récupérer le résultat
00:05:56 :Alors, en code, comment ça fonctionne ? Ben, tout simplement, en fait, je fais des MSE, ok, de ce truc-là, d'accord.Donc, ça, c'est bien joli et en fait, ça fonctionne, grosso modo, comme ça. C'est pas plus bête, ça casse d'ordre.
00:06:28 :J'ai extrait les codes de convolution que j'avais besoin. Et ensuite, du coup, au fur et à mesure, à partir de toutes les 50 époques,on peut voir que, ben, l'image de chat, au final, on a le style qui est transféré. Alors, au début, on peut voir qu'en fait, la partie floutée qui est ici,
00:06:45 :d'accord, qui est située au milieu de l'image à l'arrière, on peut voir qu'en fait, ici, elle restera floutée, d'accord. Donc là, dans une première...Ça, c'est les 50 premières itérations. Ben, on constate qu'il y a quelques pigments qui apparaissent, les couleurs qui changent.
00:07:10 :Et on a bien les couleurs qui ressemblent à la vague de poussailles. Donc ça, c'est... Voilà, c'est quelque chose qui est assez simple.Alors, les petites conditions qu'il faut faire attention pour que ça puisse fonctionner quand vous voulez tester sur des images à vous, c'est que la...
00:07:23 :L'image de peinture que vous récupérez sur Internet et l'image de contenu que vous voulez, il faut que ça fasse à peu près les mêmes dimensions,parce que sinon, en fait, ça va pas marcher.
00:07:34 :Maintenant, ce que je vais faire, c'est que je vais vous... Je vais montrer un petit peu le code de tout ça, d'accord ?Donc, en fait, je vais vous expliquer au fur et à mesure ce qu'on fait, d'accord ? Je vais plus orienter maintenant les vidéos sur le code, parce que...
00:07:48 :Ça sera beaucoup plus simple à commencer à vous parler un petit peu de PyTorch, etc., qu'à libraire, en fait, pour générer la zone neurone.Il y a aussi Keras, mais là, dans ce cas-là, vu qu'on rentre pas mal dans les détails, on va utiliser ça.
00:07:59 :Donc là, première chose, bon, ben, j'importe mes librairies, ça, c'est basique à Python.Ensuite, je save mon device pour faire mon calcul.Donc là, comme j'expliquais dans la précédente vidéo, sur les calculs CUDA, là, on va faire tourner sur ma GPU hors local, parce que...
00:08:15 :Parce que sur CPU, ça met trop de temps.Donc, on initialise notre fameux CUDA.Ensuite, on prend une image size, donc à 700x800.Je ne l'ai pas pris plus grand, parce qu'après, ma GPU a un peu du mal, donc, voilà, des trucs raisonnables.
00:08:30 :On définit une fonction pour loader les images, d'accord, pour les convertir en format RGB, et ce forme de tenseur PyTorch, d'accord.Et ensuite, on va envoyer le tout vers notre GPU, d'accord.
00:08:44 :Donc là, c'est la transform compose qui s'appampe ce truc-là.Et ensuite, du coup, voilà, là, j'ai mes deux images qui apparaissent là, d'accord.Donc, ils sont loadés grâce à ça.
00:08:56 :Tout ce code-là, en fait, je l'ai récupéré directement sur la documentation de PyTorch.Donc, vous pouvez le récupérer.Il y a des petits tutoriels pour le faire, donc, en fait, je l'ai fait, je l'ai un petit peu modifié à ma source pour l'adapter à ce que j'ai besoin de faire.
00:09:08 :Donc, ensuite, vous définissez vos deux fonctions de loss, d'accord.Donc, la première, comme je l'ai, c'est la MSE entre l'input et la target.Et la deuxième, du coup, c'est la MSE entre la matrice de gramme et la target, d'accord.
00:09:23 :Donc, la matrice de gramme est définie ici, ok.Là, vous importez votre modèle, d'accord.Alors, j'aurais pu prendre VGG19, j'aurais pu prendre VGG16.Bon, ça, c'est un peu arbitraire, il faut quand même empêcher un gros réseau qui a été entraîné.
00:09:38 :Là, vous pouvez voir un petit peu la carcasse du réseau.Bon, on a en tout 36 couches, 36 calculs différents.Donc, on a des relus, des couches de convolution partout.
00:09:52 :Bon, ça, c'est un réseau qui est assez énorme si on regarde sur l'adopteur de VGG19.Hop, tac, j'ai pas trop les trucs en tête, mais là, vous pouvez trouver sur l'adopteur de Keras.
00:10:06 :Bon, donc, ça a été entraîné sur des images entre 124 et 124.Et là, vous avez le détail ensuite, si vous vous intéressez sur exactement comment ça fonctionne.
00:10:18 :Voilà, ça a été entraîné sur ImageNet.Donc, je reviens à mon petit truc.Ensuite, ce que je vais faire, c'est que, ah oui, quelque chose que j'ai pas parlé, c'est quepour le contenu et pour le style, en fait, je vais pas récupérer toutes les couches de convolution.
00:10:32 :D'accord ?Parce qu'en fait, comme toutes les couches vont être freeze, d'accord ?Moi, ce qui va m'intéresser, c'est vraiment de récupérer que certaines couches.
00:10:38 :D'accord ?Donc, moi, j'ai pris la couche 4 pour la convolution 4, pour le content.Et la couche de style, j'ai pris de la 1 à la 5.
00:10:45 :Si vous voulez plus de détails, vous rajoutez des couches de convolution.Si vous voulez moins de détails, vous en enlevez.Ok ?On fait une petite normalisation ici, d'accord ?
00:10:53 :Par la moyenne et par l'écart type, pour avoir des images entre 0 et 155.Euh, voilà.Donc, ensuite, ça c'est le code permettant de récupérer les couches de convolution du réseau.
00:11:05 :Et les losses ont déjà été calculées.Et là, vous avez la boucle principale.D'accord ?Donc là, j'entre pas trop dans le détail, parce que pour ceux qui ont jamais vu de codepar PyTorch, ça a l'air un peu...
00:11:16 :ça a l'air un peu difficile comme ça.Euh, mais ce qu'il faut retenir, c'est que, en fait, quand vous reprenez la...la slide que j'ai mise sur l'architecture du réseau, d'accord ?
00:11:27 :En fait, tout se passe dans la fonction Def Closure.C'est-à-dire que là, vous allez mettre votre modèle en mode évaluation.D'accord ?Donc, ça veut dire qu'il ne va pas mettre à jour vos gradients.
00:11:39 :Donc, il n'y a pas les poids qui vont être mis à jour.Ça va être freeze complètement.Et ensuite, sur... vous allez effectuer 350 époques.
00:11:46 :D'accord ?Donc, 350 fois où vous allez faire aller-retour avec les fonctions de loss et les mises à jour, etc.Et vous allez ensuite minimiser.
00:11:53 :Voilà.Donc là, je les run au fur et à mesure.Étant donné que le but, ça va être de réduire au maximum, d'accord ?Donc, les fonctions de perte, afin de converger vers des...
00:12:05 :vers des valeurs qui sont très petites.D'accord ?Donc, si je reprends un petit peu ici.Hop.Là, vous avez en fait les résultats que ça a donné.
00:12:14 :Donc, la fonction de style au début, elle est assez grande.D'accord ?Donc, elle peut dépasser 120, etc.Moi, sur des images que j'ai testées, sur des vraies images, d'accord ?
00:12:24 :Que j'ai converties en basse résolution, enfin de petite taille.Bon, des fois, je montais à 350-500 et je convergeais jusqu'à 27.Par exemple, je peux pas aller plus bas.
00:12:35 :Par contre, ce qui est intéressant de voir, c'est que la loss du contenu, par contre,elle, elle converge directement.Alors, là, on le voit pas très bien, mais il y a une petite variation qui va se faire ici.
00:12:44 :D'accord ?Là, si je reprends un petit peu le...Tac.Voilà.Là, au début, on a une petite variation de 16-9.Après, comme c'est des images qui sont assez petites, ça fait 700 par 800.
00:12:55 :Euh...Bon, ça va...Ça sera relativement impossible à prendre ça.Je ferai assez rapidement, d'accord ?Les 350 époques, ça va vraiment durer quelques...quelques minutes, ok ?
00:13:05 :Donc, voilà.Ça, c'était un petit...Voilà, j'ai terminé ce que je voulais vous dire ce soir.Donc, voilà, merci de m'avoir écouté.Si vous avez des questions, je vais bien y répondre.
00:13:18 :Donc, c'était quelque chose...C'était une vidéo qui était pas très difficile, en soi, parce que c'est des notionsoù vous avez pas forcément besoin de comprendre à 100% comment monter un réseau,parce que là, en soi, on l'a pas monté.
00:13:31 :On récupère, en fait, un réseau qui est déjà entraîné, d'accord ?On fait juste une importation.Donc, vous avez pas besoin de créer vous-même votre architecture.
00:13:40 :Voilà, vous en portez quelque chose qui est à tout fait.Seulement, en fait, le calcul pour les fonctions de lossest assez différent.Donc, voilà, c'est quelque chose qui est assez...
00:13:49 :Qui est assez sympa à voir.Et puis, vous pouvez tester chez vous avec vos images, vos images du style.Alors là, ce que je voulais faire aussi...
00:13:55 :Peut-être qu'on peut le faire en...En live, par exemple.Ça serait de tester, donc, avec la...Qu'on s'appelle la nuit toilette Van Gogh.Pour montrer un peu les résultats.
00:14:06 :Alors, c'est...Je l'appelais comme ça.Hop.Les deux, non.Jpg.Hop.Alors, tac.Donc, je lance ensuite ma petite extraction.Voilà.Donc là, j'ai mon tableau.
00:14:27 :Là, j'ai mon image de contenu.Ensuite, je vais run toutes mes cellules.Hop.Alors...Tac, tac, tac.Bon, ça va prendre un peu de temps, du coup.
00:14:38 :En attendant, si vous avez des questions, n'hésitez pas, du coup.Non, en fait, pas de questions.Pas de questions.Ok, alors, on va voir un peu ce que ça va donner.
00:15:09 :Donc là, vous voyez, les valeurs, elles sont proches de 224.Donc, elles sont assez grandes.Alors, vous m'entendez ?J'ai peur que... Oui.Non, c'est bon, on t'entend.
00:15:24 :T'inquiète pas.Mais finalement, tu travailles quand même sur des images qui sont assez grandespar rapport à ce qui se fait en général, il me semble.
00:15:33 :Alors, en fait, comme le réseau, il a été entraîné sur des...Là, pardon, j'ai pris... Moi, c'était VG17.Donc là, j'ai pris VG19.C'est entraîné sur des images qui sont 24 sur 24.
00:15:45 :En fait, là, on n'est pas trop, trop loin, d'accord, dans le...Enfin, dans le sens... Alors, on est un peu loinpuisqu'on prend des images qui sont sur 2700 par 800.
00:15:56 :Mais on n'est pas des images qui font 2000 par 3000.Donc, le réseau est habitué à faire ce changement-là.Donc, c'est des trucs qui sont assez simples.
00:16:03 :Par contre, dès qu'on voit... Moi, au début, j'ai été entrainéavec des images qui sont beaucoup plus grandes,de prendre des images style celle-là qui fait du 6000 par 4000.
00:16:12 :Là, ça marche pas.Ça marche pas parce qu'en fait, de ce que je veux faire comme hypothèse,c'est qu'en gros, comme les images de peinturene sont pas très grandes, qu'on récupère,l'adaptation de 1 peut être assez dure.
00:16:28 :Et puis, ce qui peut être aussi assez chiant,c'est que le réseau n'est pas habitué à avoir des images aussi grandes.Donc, en fait, il va galérer.
00:16:36 :Donc, après, il faut prendre des réseaux qui sontentraînés sur des plus grosses images.Donc, là, je n'en ai pas en tête.Donc, il y a tout un aspect un peu tricky à faire attention sur ça.
00:16:49 :Mais oui, je suis d'accord avec toi.Attends, je vais juste faire un petit game show.Ok, ça, c'est pas celui-là.Hop, voilà.Donc, là, après, il faut faire un peu des tests.
00:17:10 :Donc, là, par exemple, on voit le petit miaou avec la nuit étoile de Van Gogh.Bon, après, le côté esthétique, ça se discute.Alors, moi, ce que j'avais essayé de faire aussi,j'avais touché un petit peu au code.
00:17:23 :C'était d'enlever un peu les couches de convolutions, par exemple.Alors, ce qu'on peut faire aussi, par exemple,ça va être d'afficher, au fur et à mesure de l'entraînement,les images que ça peut donner.
00:17:41 :Alors, ça, ça prend un peu plus de temps, par contre.Mais, par exemple, dans le japot, j'ai utilisé pas mal d'imagesque je vous ai mises, du coup, où j'avais fait,par exemple, le chat avec Kousaï.
00:17:53 :J'avais fait un petit affichage du rentrement,qu'est-ce que ça peut donner.Par contre, il faut relancer toutes les cellules.Dans le modèle, il a déjà vergé.
00:18:05 :Alors, j'espère que ça ne va pas prendre trop de temps.Il en est là.Bon, on va faire un petit restart.Ça ne prend pas trop de temps de manière de le faire.
00:18:20 :Tac.Alors, là, c'est bon.Là, c'est bon.Là, c'est bon.Là, c'est bon.Tac.Donc, vous voyez, si vous pouvez tourner sur CPU,j'avais testé, même avec le TAI 700-800,ça avait quand même pas mal de temps.
00:18:46 :Donc, il faut soit essayer de le faire tourner sur Collab.Donc, au moins, vous avez...Voilà, déjà, là, on peut voir un peu l'évolution du miaou.
00:18:54 :Dès le début, en fait, on a déjà les couleurs bleuesqui apparaissent, comme sur la peinture.Après, là, les couleurs en fond, les couleurs chaudes,ils écartent.
00:19:02 :Et après, au fur et à mesure, du coup,ça va disparaître.Après, là, comme il converge direct,là, il est à 16,il passe directement à 2.
00:19:12 :Bon, après, il faut tester.Il faut tester avec différentes configurations.Des fois, des peintures, ça n'a pas marché.Des fois, ça a marché.Blouse, je vous laisse faire un petit peu pour regarder.
00:19:22 :De toute façon, vous pouvez tester.Le code, il est en open source.Moi, je me suis adapté du code qui vient de là.Donc, tac.
00:19:30 :De PyTorch.Donc, vous avez tout le code qui est ici.Donc, là, ils ont priscette peinture-là.Cette petite image-là.Après, ils ont mélangé avec des vagues.
00:19:42 :Bon, ça donne des choses un petit peu...Ça donne une chose assez drôle.Vous avez tout le...Si jamais ça vous intéresse, aussi,pour l'écureuil,vous avez tout le papier qui a étéfait, en fait,filmé dans la vidéo.
00:19:58 :Pour la théorie Kedarsa, ça doit être 2015.Donc, là, ils avaient fait des tests.Voilà.On vous donne un peu une idée.Là, c'est un peu plus joli.
00:20:10 :Vous voyez, la nuit toilée, ça marche beaucoup mieux.Là, le cri, ça marche bien.Donc, j'ai testéavec Picasso le chat, aussi.Bon, c'est assez fun.
00:20:20 :Après, libre à vousde tester.Donc...Voilà, voilà.Hop, on revient là.Est-ce que vous avez des questions, par hasard ?Ah, je suis un peu sur le...
Aucune occurrence trouvée pour « ».