Aujourd'hui, l'apprentissage en profondeur peut produire des résultats étonnants dans le domaine de la synthèse et du traitement d'images. Nous avons déjà vu des exemples de sites Web qui illusent les gens d'imagination, des vidéos montrant des célébrités disant des choses qu'elles n'ont jamais dites et des outils qui font danser les gens. Ces exemples sont assez vrais pour tromper la plupart d'entre nous. L'un des nouveaux exploits est FaceShifter [1], qui est un modèle d'apprentissage en profondeur qui peut échanger des visages dans des images supérieures aux dernières technologies. Dans cet article, nous allons comprendre comment cela fonctionne.
Énoncé du problème
Nous avons une image de visage source Xₛ et une image de visage cible Xₜ. Nous voulons générer une nouvelle image de visage Yₛ, qui a les attributs de Xₜ (posture, éclairage, lunettes, etc.), mais qui a l'identité de la personne en Xₛ. La figure 1 résume cette déclaration de problème. Maintenant, nous continuons d'expliquer le modèle.
Graphique 1. Modifier l'énoncé du problème de visage. Les résultats affichés proviennent du modèle FaceShifter. Adapté de [1].
Modèle FaceShifter
FaceShifter se compose de deux réseaux, appelés réseau AEI et réseau HEAR. Le réseau AEI génère un résultat d'échange facial préliminaire et le réseau HEAR optimise la sortie. Analysons les deux séparément.
Réseau AEI
Le réseau AEI est l'abréviation de "Adaptive Embedded Integrated Network". En effet, le réseau AEI se compose de 3 sous-réseaux:
- Encodeur d'identité: Un encodeur qui intègre Xₛ dans un espace qui décrit l'identité d'un visage dans une image.
- Encodeur d'attribut à plusieurs niveaux: encodeur qui incorpore Xₜ dans un espace qui décrit les attributs à conserver lors de l'échange de faces.
- Générateur AAD: un générateur qui intègre la sortie des deux premiers sous-réseaux pour générer l'échange de faces dans le logo Xₜ et Xₛ.
Le réseau AEI est illustré à la figure 2. Concrétisons ses détails.
Graphique 2. L'architecture du réseau AEI. Adapté de [1].
Encodeur d'identité
Ce sous-réseau projette l'image source Xₛ dans un espace d'entités de faible dimension. La sortie est juste un vecteur, que nous appelons zᵢ, comme le montre la figure 3. Ce vecteur code pour l'identité du visage en Xₛ, ce qui signifie qu'il doit extraire les caractéristiques que nous, les humains, utilisons pour distinguer les différents visages humains, tels que la forme des yeux, la distance entre les yeux et la bouche, la courbure de la bouche, etc.
L'auteur utilise un encodeur pré-formé. Ils ont utilisé un réseau de reconnaissance faciale qualifié. Cela devrait répondre à nos exigences, car le réseau pour distinguer les visages doit extraire les fonctionnalités liées à l'identité.
Graphique 3. Encodeur d'identité. Adapté de [1].
Encodeur d'attribut à plusieurs niveaux
Le sous-réseau code l'image cible X. Il génère plusieurs vecteurs, chacun décrivant les attributs de Xₜ avec différentes résolutions spatiales. Il y a généralement 8 vecteurs de caractéristiques appelés zₐ. L'attribut se réfère ici à la structure du visage dans l'image cible, comme la posture, le contour, l'expression du visage, la coiffure, la couleur de la peau, l'arrière-plan, l'éclairage de la scène, etc. du visage. Comme le montre la figure 4, il s'agit d'un ConvNet avec une structure de réseau en forme de U, dans laquelle le vecteur de sortie n'est qu'une carte des caractéristiques de chaque niveau dans la section haut de gamme / décodage. Veuillez noter que ce sous-réseau n'est pas pré-formé.
Figure 4. Architecture d'encodeur d'attribut à plusieurs niveaux. Adapté de [1].
Représenter Xₜ comme plusieurs intégrations est nécessaire parce que l'utilisation d'une intégration à une seule résolution spatiale entraînera la perte d'informations dans l'image de sortie souhaitée qui génère la surface d'échange (c'est-à-dire que nous voulons conserver trop de détails fins de Xₜ, ce qui rend la compression L'image n'est pas réalisable). Cela est évident dans les études d'ablation effectuées par les auteurs, qui ont essayé d'utiliser uniquement les 3 premiers zeddings au lieu de 8 zₐ plongements pour représenter Xₜ, ce qui a rendu la sortie de la figure 5 plus floue.
Figure 5. Utilisez plusieurs incorporations pour représenter l'effet de la cible. Si les 3 premiers zₐ plongements sont utilisés, la sortie est compressée; si les 8 noyaux sont utilisés, la sortie est AEI Net. Adapté de [1].
Générateur AAD
Le générateur AAD est l'abréviation de "Adaptive Attention Denormalization Generator". Il synthétise la sortie des deux premiers sous-réseaux pour améliorer la résolution spatiale, produisant ainsi la sortie finale du réseau AEI. Il est obtenu en superposant un nouveau bloc AAD Resblock, comme illustré à la figure 6.
Figure 6. L'architecture du générateur AAD dans l'image de gauche et le resblock AAD dans l'image de droite. Adapté de [1].
La nouvelle partie de ce bloc est la couche AAD. Nous le divisons en 3 parties, comme le montre la figure 7. À un niveau supérieur, la partie 1 nous explique comment modifier la carte d'entités en entrée hᵢ pour la rendre plus semblable à Xₜ en termes d'attributs. Plus précisément, il produit deux tenseurs de la même taille que hᵢₙ, un tenseur contient la valeur d'échelle multipliée par chaque cellule en hᵢₙ, et l'autre tenseur contient la valeur de décalage. L'entrée de la couche 1 est l'un des vecteurs d'attributs. De même, la partie 2 nous expliquera comment modifier la carte d'entités hᵢ pour la rendre plus semblable à Xₛ.
Figure 7. Architecture de la couche AAD. Adapté de [1].
La tâche de la partie 3 est de sélectionner la partie (2 ou 3) sur laquelle nous devons nous concentrer sur chaque cellule / pixel. Par exemple, au niveau de la cellule / pixel liée à la bouche, le réseau nous dira de nous concentrer davantage sur la partie 2 car la bouche est plus liée à l'identité. Ceci est prouvé empiriquement par une expérience illustrée à la figure 8.
Figure 8. Une expérience montrant ce qui a été appris dans la partie 3 de la couche AAD. L'image de droite montre la sortie de la troisième partie du nombre asynchrone / résolution spatiale dans tout le générateur AAD. La zone claire indique que nous devons prêter attention à l'identité de la cellule (c'est-à-dire la partie 2), la zone noire signifie que nous prêtons attention à la partie 1. Notez qu'à haute résolution spatiale, notre objectif principal est la partie 1.
De cette façon, le générateur AAD sera en mesure de construire l'image finale étape par étape. À chaque étape, il déterminera la meilleure façon d'agrandir la carte de caractéristiques actuelle pour une identité et un code d'attribut donnés.
Nous avons maintenant un réseau, le réseau AEI, qui peut intégrer Xₛ et Xₜ et les intégrer de manière à atteindre nos objectifs. Nous appelons la sortie de AEI Net Yₛₜ *.
Fonction de perte d'entraînement
D'une manière générale, la perte est une formule mathématique qui, nous l'espérons, permettra au réseau d'atteindre son objectif. Il y a 4 pertes dans la formation du réseau AEI:
- Nous voulons qu'il produise un vrai visage humain, nous aurons donc une perte contradictoire, comme tout réseau contradictoire.
- Nous espérons que le visage généré aura l'identité de Xₛ. Notre seul objet mathématique pouvant représenter une identité est zᵢ. Par conséquent, cet objectif peut s'exprimer par les pertes suivantes:
- Nous voulons que la sortie ait Xₜ attributs. Les pertes sont:
- L'auteur ajoute une autre perte basée sur la vue que le réseau devrait produire Xₜ (si Xₜ et Xₛ sont en fait la même image):
Je crois que cette dernière perte est nécessaire pour piloter l'attribut de codage réel zₐ, car il n'est pas pré-formé comme zᵢ. Sans cela, le réseau AEI peut ignorer Xₜ et faire en sorte que zₐ ne produise que 0.
Notre perte totale n'est qu'une somme pondérée des pertes antérieures.
Entendre le réseau
Le réseau AEI n'est pas seulement un réseau complet capable de changer de visage. Cependant, ce n'est pas assez bon pour être cohérent. Plus précisément, chaque fois que quelque chose dans l'image cible masque une partie du visage (comme des lunettes, un chapeau, des cheveux ou des mains) qui devrait apparaître dans la sortie finale, le réseau AEI la supprime. Ces choses devraient toujours exister, car cela n'a rien à voir avec le logo à changer. Par conséquent, l'auteur a mis en place un réseau supplémentaire appelé "réseau de raffinement de confirmation d'erreur heuristique", qui n'a qu'une seule tâche de récupérer une telle occlusion.
Ils ont remarqué que lorsqu'ils définissaient l'entrée du réseau AEI (c'est-à-dire Xₛ & Xₜ) sur la même image, il ne conservait toujours pas l'occlusion comme le montre la figure 9.
Figure 9. La sortie de AEI Net lorsque nous entrons la même image que Xₛ & Xₜ. Remarquez comment la chaîne du foulard est perdue dans la sortie. Adapté de [1].
Par conséquent, ils n'ont pas utilisé Yₛₜ * et Xₜ comme entrée pour le réseau HEAR, mais l'ont défini sur Yₛₜ * & (Xₜ-Yₜₜ *), où Yₜₜ * est la sortie du réseau AEI lorsque Xₛₜ * et Xₜ sont la même image. Cela dirigera le réseau HEAR à occlure les pixels non réservés. Comme le montre la figure 10.
Figure 10. La structure du réseau HEAR. Adapté de [1].
Fonction de perte d'entraînement
La fonction de perte du réseau HEAR est:
- Pertes dues à la conservation de l'identité:
- Ne modifie pas substantiellement la perte de Yₛₜ *:
- Si Xₛ et Xₜ sont la même image, alors la sortie du réseau HEAR doit être Xₜ:
La perte totale est la somme de ces pertes.
Le résultat
L'effet du changeur de visage est incroyable. Dans la figure 11, vous pouvez trouver quelques exemples de ses performances de généralisation sur des images autres que l'ensemble de données sur lequel il est conçu (c'est-à-dire à partir d'un ensemble de données plus large). Remarquez comment cela fonctionne correctement dans des conditions différentes et difficiles.
Figure 11. Les résultats montrent que le convertisseur a de bonnes performances. Adapté de [1].
Auteur: Ahmed Maher
Traduit par: tensor-zhang