Skip to content

Upsampling - Interpolation

L’upsampling est une étape clé dans les architectures de réseaux de neurones utilisés pour des tâches telles que la segmentation d’image ou le super-résolution. L’objectif de l’upsampling est d’augmenter la résolution spatiale des cartes de caractéristiques pour obtenir une sortie de la même taille que l’image d’entrée ou pour permettre une meilleure interprétation des informations spatiales.

Voici deux méthodes couramment utilisées pour réaliser l’upsampling : le scaling simple (ou interpolation) et les convolutions transposées.


1. Scaling simple (Interpolation bilinéaire ou bicubique)

Le scaling simple est une technique d’upsampling qui consiste à augmenter la taille d’une carte de caractéristiques ou d’une image en ajustant directement les pixels via une méthode d’interpolation. Il s’agit d’une méthode relativement rapide et simple, bien qu’elle ne prenne pas en compte de manière détaillée les relations locales des pixels comme le ferait une couche de convolution.

a) Interpolation bilinéaire

L’interpolation bilinéaire est l’une des formes les plus simples de scaling. Elle fonctionne en calculant une moyenne pondérée des pixels voisins pour estimer les nouveaux pixels dans l’image de sortie. Les poids sont déterminés en fonction de la distance entre les nouveaux pixels et les pixels existants.

Exemple :

Si nous avons une image 2x2 et que nous voulons la redimensionner à 4x4, l’interpolation bilinéaire calculera les valeurs des nouveaux pixels en fonction des quatre pixels les plus proches dans l’image originale.

b) Interpolation bicubique

L’interpolation bicubique est une méthode d’upsampling plus sophistiquée que l’interpolation bilinéaire. Elle utilise 16 pixels voisins pour calculer la valeur d’un nouveau pixel (contre 4 pixels pour l’interpolation bilinéaire). Cela conduit à une transition plus douce et des résultats généralement plus précis, mais elle est également plus coûteuse en termes de calcul.

Avantages du scaling simple :

  • Simplicité et rapidité : L’interpolation ne nécessite pas d’entraînement ni de calculs lourds. C’est une méthode très simple à implémenter, souvent utilisée pour des applications où la rapidité est essentielle.
  • Peu de paramètres : Aucun paramètre d’apprentissage supplémentaire n’est requis, contrairement à d’autres méthodes plus complexes comme la convolution transposée.

Inconvénients du scaling simple :

  • Perte de détails : Bien qu’il puisse être rapide, le scaling simple ne capture pas aussi bien les relations spatiales complexes entre les pixels. Cela peut entraîner des pertes de détails dans les prédictions, notamment pour des tâches nécessitant une segmentation fine ou des bordures précises.
  • Manque de flexibilité : Il ne peut pas apprendre à ajuster les détails fins au cours de l’entraînement, car il repose uniquement sur des interpolations statiques.

Exemple de code pour un upsampling par interpolation dans TensorFlow :

import tensorflow as tf
# Création d'une couche d'upsampling par interpolation bilinéaire
upsample_layer = tf.keras.layers.UpSampling2D(size=(2, 2), interpolation='bilinear')
# Exécution de l'upsampling sur un tenseur
input_tensor = tf.random.normal([1, 64, 64, 3]) # Par exemple une image 64x64 avec 3 canaux
output_tensor = upsample_layer(input_tensor)
print(output_tensor.shape) # Sortie : (1, 128, 128, 3)

Dans cet exemple, la couche UpSampling2D double la taille de la carte de caractéristiques de 64x64 à 128x128 à l’aide de l’interpolation bilinéaire.


2. Convolutions transposées (Déconvolutions)

Les convolutions transposées (parfois appelées déconvolutions) sont une autre méthode populaire pour l’upsampling dans les réseaux de neurones convolutionnels. Contrairement à l’interpolation simple, les convolutions transposées permettent au réseau d’apprendre à reconstruire les détails lors du processus d’upsampling.

Comment fonctionnent les convolutions transposées ?

Les convolutions transposées “inversent” l’opération de convolution. Plutôt que de réduire la taille spatiale d’une carte de caractéristiques, elles l’augmentent. Elles utilisent des filtres appris pour déterminer la valeur des nouveaux pixels dans l’image de sortie, ce qui permet au modèle de restaurer les détails qui ont été perdus lors de la phase de downsampling (lors de convolutions standard ou de pooling).

Processus d’une convolution transposée :

  • Imaginez une petite carte de caractéristiques de 2x2.
  • Lors d’une convolution transposée avec un filtre 3x3 et un stride de 2, chaque pixel de la carte de caractéristiques est “étendu” sur une grille plus grande, où les filtres apprennent à remplir les nouveaux pixels avec des informations pertinentes.
  • Le résultat est une carte de caractéristiques de résolution supérieure, par exemple de 4x4 ou 8x8, en fonction des hyperparamètres comme le stride et la taille du filtre.

Avantages des convolutions transposées :

  • Apprentissage des détails : Contrairement à l’interpolation, les convolutions transposées apprennent des filtres qui permettent au modèle de restaurer les détails perdus lors de la phase de réduction. Cela rend la méthode plus puissante pour des tâches complexes comme la segmentation d’image.
  • Précision dans la reconstruction : Étant donné que l’upsampling est basé sur des filtres appris pendant l’entraînement, les convolutions transposées peuvent mieux s’adapter à des tâches spécifiques et donner des résultats plus précis qu’une interpolation simple.

Inconvénients des convolutions transposées :

  • Coût de calcul : Les convolutions transposées nécessitent plus de calculs que l’interpolation, ce qui peut augmenter le temps d’entraînement et la complexité du modèle.
  • Artefacts indésirables : Les convolutions transposées peuvent parfois produire des artefacts (effet de “peigne”) si les filtres appris ne sont pas suffisamment lissés ou si le stride et la taille des filtres ne sont pas bien ajustés.

Exemple de code pour une convolution transposée dans TensorFlow :

import tensorflow as tf
# Création d'une couche de convolution transposée
deconv_layer = tf.keras.layers.Conv2DTranspose(filters=3, kernel_size=(3, 3), strides=(2, 2), padding='same')
# Exécution de la convolution transposée sur un tenseur
input_tensor = tf.random.normal([1, 64, 64, 3]) # Par exemple une image 64x64 avec 3 canaux
output_tensor = deconv_layer(input_tensor)
print(output_tensor.shape) # Sortie : (1, 128, 128, 3)

Dans cet exemple, la couche Conv2DTranspose applique une convolution transposée pour augmenter la résolution de 64x64 à 128x128.


Comparaison entre le Scaling simple et les Convolutions transposées

CaractéristiqueScaling simple (Interpolation)Convolutions transposées
ComplexitéTrès simple, peu coûteux en calculPlus complexe et gourmand en ressources
Prédiction des nouveaux pixelsBasée sur des méthodes d’interpolation fixesBasée sur des filtres appris pendant l’entraînement
Précision des résultatsMoins précis pour des détails complexesPlus précis car les filtres apprennent les détails
VitesseRapidePlus lent en raison des filtres et des calculs
FlexibilitéMéthode statiqueApprend à adapter les détails à l’aide des filtres

Conclusion

Les deux méthodes d’upsampling, scaling simple et convolutions transposées, ont leurs avantages et inconvénients. Le scaling simple est rapide et efficace pour les tâches où la précision n’est pas cruciale, tandis que les convolutions transposées permettent de restaurer des détails plus fins dans les images, mais au prix d’un calcul plus intensif. En fonction de la tâche à accomplir (par exemple, segmentation d’image, super-résolution), l’une ou l’autre méthode peut être plus adaptée.