Journal G'MIC 1.5.7.2 : Multi-threading, Krita, et autres nouveautés...

58
30
oct.
2013

Sommaire

Bonjour à tous.

Cette semaine, G'MIC, un framework libre pour le traitement d'images s'est enrichi d'une nouvelle mise à jour automnale, estampillée 1.5.7.2. C'est l'occasion pour moi de recenser les avancées réalisées dans cette série 1.5.7.x, depuis mon dernier journal sur ce projet.

Logo

Qu'est-ce que c'est ?

Le projet G'MIC (acronyme de GREYC's Magic for Image Computing) est développé dans l'équipe IMAGE du laboratoire GREYC (UMR CNRS), et propose différentes interfaces utilisateurs pour la manipulation d'images génériques (2d/3d, multi-spectrales,..), dont un plug-in pour GIMP, un web-service, un outil en ligne de commande (gmic), ou encore une bibliothèque C++ (libgmic), et une interface graphique en Qt pour la manipulation d'images provenant de la webcam (ZArt).

Gestion du multi-threading.

La nouveauté majeure de la série 1.5.7.x est la possibilité de lancer des calculs/filtres/effets sur des images, en parallèle, via le lancement de multiples threads. Techniquement parlant, de nouvelles commandes génériques ont été ajoutées permettant une gestion assez fine de la façon dont les calculs parallèles doivent se réaliser. Un utilisateur peut en particulier décider du nombre de threads utilisés pour un calcul, de la façon dont le calcul peut se paralléliser (en parallèle sur plusieurs images simultanément, ou en subdivisant une image, canal par canal ou spatialement).
Et bien sûr, ceci a été ajouté directement dans l'interpréteur G'MIC (le coeur du projet, qui s'occupe de tous les calculs), donc toutes les interfaces utilisateurs en profitent !
Certains filtres utilisent cette possibilité, par exemple les filtres de lissage/débruitage disponibles dans le plug-in pour GIMP. Par exemple, un lissage assez fort sur une image de taille 2048x1365 en RGB donne comparativement :

  • 1 thread -> 20.681 s de temps d'exécution.
  • 2 threads -> 13.454 s de temps d'exécution.
  • 4 threads -> 8.213 s de temps d'exécution.
  • 8 threads -> 5.695 s de temps d'exécution.

Pour info, la machine de test utilisée pour ces timings avait 16 CPUs (mais seulement 8 étaient libres simultanément lors du benchmark). Pas mal de filtres profitent déjà du calcul parallèle, et on va essayer par la suite d'en convertir encore plus. A noter également que les calculs de FFT (Fast Fourier Transform) sont maintenant parallélisés par défaut.
Avoir du multi-threading a demandé pas mal de travail, puisqu'il a fallu dans un premier temps rendre totalement thread-safe les bibliothèques CImg et libgmic sur lesquelles de base G'MIC, avant de pouvoir proposer de nouvelles commandes gérant les threads et les mutex (et le tout, en multi-plateforme).

Début d'intégration dans Krita.

Pour rappel, Krita est un logiciel complet pour la peinture et le dessin numérique.
Grâce au travail acharné de Lukas Tvrdy (développeur employé par la fondation Krita), une ébauche de plug-in fonctionnel intégrant G'MIC dans Krita a été réalisée. Les utilisateurs experts de Krita peuvent commencer à s'amuser avec quelques filtres G'MIC (en particulier pour la colorisation de comics, en compilant la version de devéloppement de Krita. C'est une très bonne nouvelle, et on espère vraiment que ce projet va être mené à son terme !

Autres nouveautés.

Le projet G'MIC continue son petit bonhomme de chemin, avec pas mal d'améliorations/optimisations diverses et variées, et correction de bugs; de nouveaux filtres.
Aujourd'hui, le plug-in pour GIMP comprend 522 filtres disponibles, de quoi occuper les longues soirées d'hiver, en diverses expérimentation sur vos photos de vacances !

plug-in

Quelques nouveautés notables sont listées ici :

  • Toute une panoplie de nouveaux filtres destinés à simuler le rendu colorimétrique de pellicules photographiques spécifiques, ont été ajouté. Ceci a été possible grâce à la collaboration avec un photographe américain Patrick David, fervent utilisateur d'outils libres pour le traitement photo, qui a bien voulu partagé des centaines de profils colorimétriques (faits à la main!). Ceci représente au final plus de 70 Mb de profils couleurs compressés, qui ont été ajoutés à G'MIC. Ci-dessous, un exemple d'un de ces filtres.

fim_emulation

  • Un nouveau filtre permet d'extraire automatiquement des objets distincts sur un fond de couleur fixe (à quelques variations près). Le résultat est une image avec autant de calques que d'objets segmentés. Assez pratique pour récupérer des sprites distincts à partir d'une image d'entrée ou les choses à extraire ont des arrangements complexes.

segment_fixe

  • G'MIC est maintenant capable de générer des fichiers .ggr (GIMP Gradients), et certains filtres permettent par exemple de synthétiser de nouveaux gradients de couleurs, réutilisables dans GIMP par la suite. Par exemple, le filtre suivant synthétise un nouveau gradient en échantillonant des couleurs d'une image le long d'un segment défini par l'utilisateur.

gradient

  • L'installation et la mise à jour de G'MIC sur les machines tournant sous Ubuntu est devenue un jeu d'enfant, grâce au travail acharné du packageur Thorsten "otto" Stettin, qui fournit un PPA pour G'MIC (mais aussi des PPAs pour des versions expérimentales de GIMP 2.9). Il suffit de taper les quelques lignes suivantes :
sudo add-apt-repository ppa:otto-kesselgulasch/gimp
sudo apt-get update
sudo apt-get install gmic gimp-gmic

Merci à lui, je n'ai jamais croisé un packageur aussi rapide, c'est un peu le Lucky Luke du PPA !

  • Des nouvelles démos animées ont été ajoutées "pour le fun", à l'interpréteur G'MIC. Créer ce type d'animations nous permet de tester la rapidité de l'interpréteur, étudier les points bloquants pour la programmation de nouveaux effets, et les optimisations éventuelles de fonctions à effectuer. Ces deux démos sont disponibles à partir de l'interface "ligne de commande" gmic.

demos

  • Ce journal est déjà long, on ne peut donc pas rentrer dans les détails de toutes les nouveautés, mais en vrac : Ajout de nouveaux algorithmes (le Fast Marching par exemple, ou encore le Cross Bilateral Filter), amélioration de l'affichage X11 en mode multi-threadé, amélioration des visualisateurs d'images intégrés, et amélioration générale de la stabilité. Sans compter les nouveaux filtres divers et variés ajoutés dans le plug-in par tous les contributeurs de G'MIC (ils sont responsables de presque la moitié des filtres disponibles, encore merci à eux !).

Bref !

Le projet G'MIC est loin d'être au point mort :)
En particulier, ses nouvelles capacités de multi-threading augurent de bonnes choses pour la suite. Nous n'avons pas de feuille de route particulière en ce qui concerne les futures avancées du projet : tant que ça avance, on suppose que ça va dans la bonne direction. On espère aussi beaucoup que l'intégration dans Krita sera effective un jour.

Le mot de la fin : N'hésitez pas à l'installer chez vous, le tester, et faire des retours (positifs ou négatifs) sur son utilisation. Et merci à tous les contributeurs qui permettent de faire vivre ce projet. Vous pouvez également suivre les avancées au jour le jour, en suivant le flux Google+ dédié.

  • # Génération d'image

    Posté par . Évalué à 3.

    J'ai une question. G'MIC permet de traiter des images et d'avoir des pipelines assez complexes. Est-il prévu un jour d'intégrer des fonctions de générations, notamment pour générer des textures, éventuellement avec du bruit cohérent ? Les exemples données sur libnoise sont tous codés mais je me dis que ça pourrait être intégré.

    • [^] # Re: Génération d'image

      Posté par (page perso) . Évalué à 6.

      Il y a déjà pas mal de commandes existantes pour créer des images, à partir de "rien".
      On peut facilement créer une image vide et y ajouter tout un tas de bruits différents (uniforme, gaussien, poissonien, ricien,..), on peut génerer des patterns ou des textures (algorithme diamond-square par exemple), des fractales (Mandelbrot, fonctions itérées), manipuler les images dans l'espace fréquentiel (pour les textures, c'est pas mal aussi). Aussi bien en 2d qu'en 3d (textures animées).
      Au niveau des possibilités, je crois qu'il y a ce qu'il faut pour s'amuser.
      On peut également dessiner des formes géométriques quelconques (ellipses, polygones, segments, …), et on peut créer des pipelines avec des boucles, des conditions, etc.. Donc là encore, il y a moyen de faire des choses amusantes.

      De ce que je vois de libnoise, c'est du bruit de Perlin, et je pense que c'est assez facile à réaliser aussi (si je me rappelle bien, c'est juste des sommes de bruits lissés à différentes échelles). C'est assez proche de ce que donne l'algorithme diamond-square.

      • [^] # Re: Génération d'image

        Posté par . Évalué à 2.

        Merci pour cette réponse. J'avais vu quelques trucs parmi tout ça au fil des articles mais je pensais pas qu'il y avait déjà tellement de choses.

      • [^] # Re: Génération d'image

        Posté par . Évalué à 2.

        j'ai regardé dans la doc et je n'ai pas trouvé de diamond-square. On est d'accord qu'on peut le faire avec G'mic, mais que ce n'est pas encore fait?

  • # gmic contre imagemagick

    Posté par . Évalué à 4.

    Je ne sais plus si ça avait été précisé ailleurs mais comment se place gmic par rapport à imagemagick ou qu'est-ce qui les différencie le plus au niveau des fonctionnalités ?

    • [^] # Re: gmic contre imagemagick

      Posté par . Évalué à 5. Dernière modification le 31/10/13 à 10:56.

      Je réponds en tant qu'utilisateur qui utilisait Image Magick avant.

      Pour moi la plus grande différence vient de la facilité avec laquelle il est possible d'enchainer les commandes. Le code G'mic se lit de gauche à droite. Ça en fait un outil parfait pour tester rapidement des algorithmes même complexes. Avec Image Magick, il est possible de faire un truc en regardant un tuto, mais en enchainer 2 de suites me donnait des migraines.

      Par contre, G'mic ne permet pas certaines petites choses comme par exemple ce que fait "identify".

  • # sse ?

    Posté par . Évalué à 5. Dernière modification le 31/10/13 à 10:31.

    Toujours pas de gentil code pour le SSE ? (gcc est capable de faire le boulot tout seul si le code a la bonne forme)

    On peut encore doubler les perfs dans certain cas.

    Est-ce que le threading utilise openMP ? Cela marche pas mal en général.

    "La première sécurité est la liberté"

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.