Une IA pour la super-résolution photo [gratuit]

Description du problème

Je ne suis pas toujours satisfait de la taille de mes photographies. La méthode la plus simple est toujours de prendre n’importe quel Photoshop (ou équivalent), d’appliquer un changement de taille (avec une méthode Lanczos) pour obtenir 2x ou 3x ou 4x plus de pixels. Ça marche bien et vite, mais ça ne fait que produire une image plus lourde mais un peu floue. Quand il s’agit de faire un tirage en grand format qui risque d’être regardé d’un peu (trop) près, ou pour certaines applications comme l’impression d’un tissu de (très) grandes dimensions, il vaudrait mieux avoir une image avec plus de détails que ce qui a été obtenu en prenant la photo. Pas de miracle, l’image est insuffisante.

Sauf si vous faites appel à un outil comme Topaz Photo AI ou le tout-nouveau Adobe Photoshop “Image Enhancer AI”. Mais c’est cher (c’est pro) : Topaz vaut 199$, ses concurrents sont souvent en abonnement mensuel. Pour un usage amateur pas trop courant, ça ne me semblait pas adapté.

Pourquoi ne pas faire cela soi-même en faisant appel à des outils Open Source (gratuits) ?

J’ai néanmoins rajouté une contrainte supplémentaire : je voulais que ma solution fonctionne sur mon propre PC, sans recourir à un service externe (pas d’abonnement cloud, par exemple, comme sur StableDiffusion).

L’approche générale

Depuis quelques mois, j’ai été impressionné par la multitude de solutions d’Intelligence Artificielle (vous avez entendu parler de ChatGPT ?) et pas seulement pour produire du texte. Des outils comme StableDiffusion, Dall-E ou Midjourney produisent des images tout à fait spectaculaires à partir d’une description originale. Mais, ils intègrent aussi parfois un outil qui leur permet de calculer une (petite) image et de la mettre ensuite à l’échelle pour limiter le cout de calcul.

Ma solution en détail

Je passe sur la recherche de la solution. Voici le résultat que j’ai atteint.

Un PC solide : deux options/directions sont envisageables.

  • Une carte graphique (pas nécessairement nVidia) avec un processeur ultra-puissant.
  • Un PC ultra-puissant mais (surtout) avec beaucoup de mémoire.

Dans mon cas :

  • i9-13900K (avec une grosse ventilation parce que ça va souffler),
  • 64 giga-octets de mémoire DDR4-DRAM (vous verrez que c’est le facteur limitant pour la taille des images).

Mais, vous pourriez (avec plus de patience), espérer travailler avec un processeur moins puissant, ou une configuration Mac.

Ce n’est pas donné, mais ça marche plutôt bien.

Installation de EasyDiffusion

EasyDiffusion est une version gratuite d’un outil très proche de StableDiffusion. Il s’installe sur le PC et tourne soit sur le PC, soit sur la carte graphique.

  • Télécharger le programme d’installation sur la page d’accueil d’EasyDiffusion (selon votre besoin, pour Windows, pour Linux ou pour Mac).
  • L’installer sans se poser de question à partir des quelques informations données sur le site. Il faut être un peu patient (il va télécharger des modèles et autres, il va construire un certain nombre de fichiers pendant l’installation).
  • Lancer le programme depuis le menu “Démarrer” de Windows. Il va ouvrir une fenêtre de commande pour exécuter ses petites affaires, puis ouvrir une fenêtre dans le navigateur pour accéder à l’interface utilisateur de EasyDiffusion.
EasyDiffusion - la page d'accueil après installation
EasyDiffusion – la page d’accueil après installation
  • Pour la première configuration, je vous propose de cliquer en haut de la page sur “Settings” et de cocher les réglages suivants :
    • Auto-save Images : OUI
    • Save Location : choisissez un répertoire pour sauvegarder vos créations.
    • Open browser on startup : OUI
    • GPU memory usage : High (dans le cas de 64 Go de DRAM, on veut s’en servir le plus possible).
    • Use CPU (not GPU) : OUI
    • Beta channel : NON.
EasyDiffusion - les paramètres
EasyDiffusion – les paramètres

Créer un fichier texte dont le nom sera YR_MoreResolutions.plugin.js avec le contenu suivant :

// ==UserScript==
// @name Ski-SDUI-MoreResolutions
// @version 0.1-YR
// @description More Resolution Options
// @author Super.Skirv, JeLuF, YR
// ==/UserScript==

(function() {

options="";
for(i=6; i<=32; i++) {
    options += '<option value="' + (64*i) + '">' + (64*i) + '</option>';
}
options += '<option value="' + 3072 + '">' + 3072 + '</option>';
options += '<option value="' + 4096 + '">' + 4096 + '</option>';
options += '<option value="' + 4640 + '">' + 4640 + '</option>';
options += '<option value="' + 6960 + '">' + 6960 + '</option>';
options += '<option value="' + 8192 + '">' + 8192 + '</option>';
document.getElementById('width').innerHTML = options;
document.getElementById('height').innerHTML = options;

})();

  • Installer le plugin, en copiant le fichier YR_MoreResolutions.plugin.js dans le répertoire C:\EasyDiffusion\plugins\ui

Fonctionnement, utilisation

En arrivant sur la page d’accueil de EasyDiffusion sur votre PC, il va falloir lui servir l’image à agrandir et les options pour cela :

EasyDiffusion - la page de configuration pour agrandir une image
EasyDiffusion – la page de configuration pour agrandir une image
  • Choisir l’image source avec le bouton “Browse”.
  • Custom VAE: None
  • Image size : 3072 (width) by 2048 (height) – pour 64 giga-octets de DRAM.
    • Ce paramètre est dicté par :
      • Le besoin de travailler sur une image la plus grande possible
      • La limitation en taille mémoire. Si vous n’avez que 16 giga-octets de mémoire DRAM, il faudra réduire ces paramètres chacun dans un rapport 2 environ : 1536 par 1024. Mais, vous pouvez explorer l’optimum pour votre configuration.
    • Inverser les deux paramètres si l’image est en format portrait (vertical)
  • Inference steps: 50 (c’est pratiquement sans influence, laisser la valeur par défaut)
  • Prompt strength: 0 (c’est LE point critique : il s’agit de faire en sorte que l’IA d’EasyDiffusion ne s’occupe pas de générer une nouvelle image artificielle à partir du texte du prompt, mais se contente de travailler sur l’upscaling).
  • Output format : choisir le format du fichier de sortie.
  • Show a live preview : NON
  • Scale up by 4x with RealESRGAN_x4plus (évitez absolument RealESRGAN_4xplus_anime_6B qui est grossièrement inadapté à la photographie)
  • Le prompt (en haut de page), le Seed (dans les “image settings”) ne servent à rien, sauf à donner le nom du fichier de sortie.

Si vous n’avez pas assez de mémoire, réduisez la taille d’image (Image size) ou vous verrez un message comme :

EasyDiffusion - exemple d'erreur d'exécution si vous n'avez pas assez de mémoire DRAM
EasyDiffusion – exemple d’erreur d’exécution si vous n’avez pas assez de mémoire DRAM

Le message indique la taille mémoire qu’il a essayé d’obtenir. Cela indique à peu près comment réduire la taille d’image.

Si vous êtes correctement configuré, après quelques minutes, vous verrez :

EasyDiffusion - Résultat d'une bonne exécution de la routine, avec une image à super-haute résolution
EasyDiffusion – Résultat d’une bonne exécution de la routine, avec une image à super-haute résolution

L’information intéressante : la nouvelle résolution est maintenant de 12288 x 8192 pixels (nous partions de 6960 x 4640 pixels, pour arriver à 100 mega-pixels). Mais, surtout, l’Intelligence Artificielle (du réseau ESRGAN) a déterminé des pixels non seulement, interpolés, mais imaginés comme parfaitement crédibles. Dans l’image qui est utilisée ici, on ne s’arrêtera pas sur le fond, mais sur les détails les plus fins dans la structure des ailes de la libellule. Ce n’est pas parfait (un entomologiste reconnaîtra quelques erreurs), mais les nervures comme les reflets sont naturelles, même dans les zones de l’image qui étaient partiellement floues. Il en va de même pour les antennes ou les yeux de la libellule.

Par contre, ne croyez pas la proposition de passer un cran au-dessus (20032 x 13376) ; vous aviez optimisé l’usage de la mémoire. Vous n’irez pas plus loin avec seulement 64 Go.

Si vous voulez comparer les deux images de manière vraiment exigeante :