[Projet Communautaire] [Deep Learning] Le compresseur d'images de l'IEEE

a marqué ce sujet comme résolu.

Pour ceux qui ont déjà lu le topic : Récapitulatif des liens intéressants


Note concernant l’implémentation déjà existante (https://github.com/kunalrdeshmukh/End-to-end-compression/blob/master/End_to_end_image_compression_stl10.ipynb) : j’ai contacté l’auteur par mail, et les premières conclusions que j’avais eues en lisant ses sources et en les comparant avec le papier sont confirmées, son projet ne marche pas et ne respecte pas du tout ce qui est expliqué dans le papier de recherche (pas d’utilisation d’un encodeur+décodeur JPEG/JPEG2000/BPG, conversion dans ce format après le test du modèle, donc après son entraînement). + réseaux entraînés non-itérativement… L’auteur m’a dit qu’il est intéressé par le projet, et qu’il souhaite être tenu au courant de notre avancée.


Bonjour à tous,

Dans ce topic, je vous propose de participer avec moi à une petite aventure qui devrait nous mener à la réalisation d’un projet innovant basé sur un travail de recherche scientifique récent (papier publié en août 2017). Le résultat de ce travail collaboratif sera sous licence MIT pour pouvoir être réutilisé, modifié et commercialisé par n’importe qui sans aucune restriction, et mettra en valeur ZesteDeSavoir de différentes façons (lire la suite svp).

Présentation du projet

Présenté dans le papier de recherche que je vais vous montrer un peu plus loin, il s’agit d’un outil de compression d’une image permettant de réduire son poids plus encore que les méthodes actuelles, tout en conservant un affichage presque identique à celui de l’image originale, et avec un temps de calcul plus court.

Cet outil est basé sur de l’apprentissage profond ("deep learning") couplé à JPEG, ou bien (au choix) JPEG2000, … Le papier de recherche a été rédigé par un groupe de chercheurs de l’organisme qui standardise l’Internet et les réseaux, l’IEEE.

Qu’est-ce qui m’a motivé à faire ce topic ? Objectif du topic ?

Très clairement, je n’ai pas assez de compétences techniques pour parvenir seul à implémenter ce projet en lisant ce papier ou en consultant l’implémentation déjà créée par un développeur (la seule que j’ai trouvée, semblant partielle de plus car elle ne suit pas très bien les explications du papier).

L’objectif de ce topic est donc d’avoir un lieu d’échanges en plus du GitHub que je vais mettre à notre disposition, de sorte que nous puissions œuvrer ensemble à la réalisation de ce petit projet.

Je pense que ça pourrait intéresser l’ensemble de la communauté de ZesteDeSavoir étant donné que réaliser un tel projet pourrait accroître sa notoriété et sa popularité parmi les sites communautaires d’informatique. Une fois notre travail terminé, nous pourrons en effet publier cette news, au nom de ZesteDeSavoir, dans ZesteDeSavoir, HackerNews, etc. Et même faire un site permettant de tester ça, au nom de ZesteDeSavoir également, qu’en pensez-vous ?

"Une implémentation existe déjà" : pourquoi en faire une autre ?!

Il existe déjà en effet une implémentation de ce papier de recherche. Toutefois, plusieurs aspects techniques me semblent trop différents des explications du papier de recherche, il n’y a également pas de captures d’écran illustrant les résultats obtenus (alors que le développeur en question a écrit "Voici les résultats : " mais il n’y a rien après en fait). D’où l’intérêt de faire la nôtre, une qui soit fonctionnelle et qui sera donc la première à être utilisable.

Autre chose : cette implémentation est réalisée avec PyTorch. Nous, nous la réaliserons avec TensorFlow avec l’API Keras : de plus haut niveau, d’autres développeurs pourront plus facilement comprendre notre code. De plus, c’est Tensorflow(Lite) qui doit être utilisé avec Google Firebase Machine Learning Kit en vue de pouvoir rendre notre outil de compression facilement utilisable sur des sites Web et des applis Android, iOS, etc. !

Licence du projet

En conformité avec le monde de la recherche, et pour que tout le monde puisse le réutiliser, le modifier et le commercialiser sans aucune restriction, nous opterons pour la Licence MIT.

Compétences requises pour collaborer ensemble

  1. Deep-learning : GAN (réseaux adverses génératifs) et CNN (réseaux de neurones à convolution)

  2. Python

  3. TensorFlow

  4. Keras

  5. Prendre le temps de lire le papier de recherche (les parties importantes sont indiquées plus loin)

  6. Selon votre envie : prendre le temps de comprendre l’implémentation déjà existante (présentée plus loin + attention, elle ne me semble pas respecter le papier de recherche et je ne crois pas qu’elle fonctionne bien)

  7. Selon l’étape 6 (autrement dit : si vous comptez comprendre l’implémentation déjà existante, écrite en PyTorch) : PyTorch

Méthode de collaboration

Comment allons-nous travailler ensemble ?

  • Dans l’esprit du bénévolat, du libre, de l’open-source gratuit, dans l’esprit de la philanthropie

  • Un GitHub est mis à notre disposition

  • Ce topic est mis à notre disposition pour des échanges qui ne sont pas en rapport avec le développement informatique du projet. Exemple d’échanges qui ne doivent pas apparaître ici : "LaMatrice, j’ai une question sur telle ou telle fonction : j’ai besoin de réaliser la tâche X, est-ce que je peux la modifier stp ?". Ce genre d’échanges techniques permettent de faire avancer le projet mais flooderaient ce topic. Utilisons plutôt le Discord mis à notre disposition pour cela. En revanche, toute question/information importante (annonce, demande d’information sur le projet, demande de participation) doit être écrite sur ce topic, pour qu’on puisse en garder une trace.

  • Un Discord est mis à notre disposition pour tout ce qui est échange technique (exemple : "LaMatrice, j’ai une question sur telle ou telle fonction : j’ai besoin de réaliser la tâche X, est-ce que je peux la modifier stp ?"). Ce Discord est : https://discord.gg/GSTT8Rz . En revanche, toute question/information importante (annonce, demande d’information sur le projet, demande de participation) doit être écrite sur ce topic, pour qu’on puisse en garder une trace.

Informations concernant notre travail

N’oublions pas ! Pour toute question technique (liée au développement informatique du projet), n’utilisons pas ce topic (qui serait probablement floodé), et préférons discuter sur Discord. Lien du Discord : svp consultez Méthode de collaboration + le lien Discord ! . En revanche, toute question/information importante (annonce, demande d’information sur le projet, demande de participation) doit être écrite sur ce topic, pour qu’on puisse en garder une trace.

Je ne viens pas vers vous avec les mains vides. J’ai commencé cette implémentation. Ci-dessous un récapitulatif de qui fait quoi et a fini de faire (+ travail en cours), et de ce qu’il reste à faire. On utilise Python, TensorFlow, et Keras ; consultez svp la partie Notre environnement de travail.

  • Fait

    • LaMatrice : [TOPOLOGIE ET COMPILATION] Définir les réseaux "Reconstructeur" et "Compacteur" grâce au papier, implémenter les fonctions de coût, mettre en place la compilation des réseaux, mettre en place de l’encodeur / décodeur JPEG2000
    • LaMatrice : [GITHUB] Mettre en place l’espace GitHub
    • LaMatrice : [ALGORITHMES] Définir les parties Test et Entraînement
  • A faire

    • [DONNEES] Choisir les données de test et d’entraînement
    • [COLAB] Mettre en place un Notebook Google Colab lié à un Google Drive pour les tests, avec leur Tesla T4 configurée comme GPU de calcul d’apprentissage automatisé ("machine learning")
    • [CONCRETISATION] Mettre en place, au nom de ZesteDeSavoir, un site et/ou (au choix de notre communauté) une appli illustrant notre travail collaboratif et proposant de tester notre implémentation finie
    • [COMMUNICATION] Publier au nom de ZesteDeSavoir notre implémentation collaborative finie dans ZesteDeSavoir, HackerNews et autres sites d’actualités

Le papier de recherche, quelques explications, l’implémentation déjà existante, notre environnement de travail, et notre GitHub

Le papier de recherche

Disponible en téléchargeant le PDF (bloc "Download:" à droite) ici.

Les pages intéressantes vont de la N°1 à la N°8 toutes deux incluses ; en particulier, voici quelques parties intéressantes :

  • I/Introduction : Explique techniquement le projet sans rentrer dans les détails (topologie, manière d’entraîner, etc.)

  • III/The proposed compression framework : Explique techniquement le projet en indiquant précisément la topologie utilisée, l’algo d’apprentissage (utilisant deux formules qui sont démontrées (la fin de la démonstration est un peu compliquée à comprendre, mais le reste c’est fastoche !)), les fonctions de coût.

  • IV/Experiments : indication du nombre d’epochs, de la taille des images, de l’optimiseur et de ses paramètres

  • V/Conclusion : toujours intéressante à lire !

Quelques explications

Je ne vais pas ré-écrire le papier de recherche, en gros le but est de donner une image au compresseur (un ensemble de deux réseaux de neurones totalement convolutionnels) et celui-ci va faire de son mieux pour compresser celle-ci en perdant le moins d’informations possibles. Cette image originale, après normalisation, est confiée à un premier réseau nommé "ComCNN, pour Compact CNN". Celui-ci génère une version compactée de l’image, qui s’avère optimale pour la reconstruction effectuée par le deuxième réseau "RecCNN, pour Reconstruction CNN". L’image compacte issue du ComCNN va vers un programme qui encodera cette image en une image (matrice 2D) JPEG2000, qui sera ensuite décodée. La version décodée de cette image JPEG2000 sera par la suite confiée à RecCNN comme je l’ai expliqué ci-dessus. Celui-ci va redimensionner cette image compactée décodée JPEG2000 en la taille de l’image originale et va faire en sorte que cette image, de nouveau en taille originale, ressemble à l’image originale. De manière générale, ComCNN et RecCNN sont entraînés à ce que l’image prédite ressemble à l’image originale.

Les schémas présents dans le papier de recherche sont vraiment bien faits.

L’implémentation existante

Disponible sur GitHub ici.

Note : cette implémentation ne semble pas suivre à la lettre le papier de recherche (fonctions de coût différentes, algorithme d’apprentissage différent) et ne semble peut-être pas terminée (absence de screenshots de résultats d’exécution alors même que l’auteur allait les montrer, cf. "The results are as below :"), etc.

Néanmoins je pense que ça peut être intéressant de regarder comment notre collègue s’y est pris. On notera qu’il a utilisé PyTorch (ce qui a moins d’avantages que TensorFlow/Keras).

Notre environnement de travail

Je vous propose de travailler avec TensorFlow en utilisant l’API Keras. Pourquoi ?

  • Keras est une API de haut niveau, permettant ainsi à d’éventuels collègues intéressés par notre travail une fois terminé de le ré-utiliser facilement, de le comprendre, ou encore à des étudiants de se former au deep-learning.

  • De plus, Google met à disposition de tout développeur Web, Android et iOS (ou autre) un outil de sa suite Firebase, qui s’appelle Machine Learning Kit : il permet notamment d’héberger un modèle (notre programme une fois réalisé) sur leurs serveurs. Ainsi, ce dernier peut être utilisé dans le site du développeur Web, ou dans l’appli du développeur Android/iOS très facilement : ça permettra à notre programme d’être facilement utilisable !

Notre GitHub

Disponible ici : Unofficial implementation of the IEEE’s paper on CNN Images Compressor - A ZesteDeSavoir collaborative project - MIT Licence - https://zestedesavoir.com/.

Le mot de la fin

Ainsi, j’espère avoir réussi à vous motiver pour collaborer ensemble à ce projet. Comme vous avez pu le constater, ce n’est pas si long à faire : le papier de recherche n’est pas démesurément compliqué, et l’implémentation existante n’est pas démesurément longue en termes de lignes de code.

Je pense vraiment qu’on peut y arriver ensemble. Il suffit que des étudiants/pros/enseignants-chercheurs parmi vous, habitués au deep-learning, collaborent ensemble et nous pourrions vraiment finir ce projet rapidement.

Sur ce, n’hésitez pas à réagir : voulez-vous participer ? Y a-t-il des choses à ajouter/modifier/supprimer dans ce message de présentation ? Quels sont vos ressentis ?

Bonne continuation à vous !

+0 -0

Salut,

Je suis pas encore rentré en détails dans le sujet

Je trouve super l’initiative de lancer un projet communautaire, bon courage ;)

Sinon 3 remarques :

  • les liens au début de ton message m’envoient tous sur une erreur 403 : "Vous n’avez pas les droits suffisants pour accéder à cette page". Ils sont réservés au staff ?
  • l’implémentation existante n’indique pas de licence, ce qui veut dire qu’elle est copyright, malgré que les sources soit accessible, non ?
  • Dans le travail à réaliser, je pense que c’est une étape à part entière de "collecter des données pour contituer la base"
+0 -0

Salut,

Je suis pas encore rentré en détails dans le sujet

Je trouve super l’initiative de lancer un projet communautaire, bon courage ;)

Sinon 3 remarques :

  • les liens au début de ton message m’envoient tous sur une erreur 403 : "Vous n’avez pas les droits suffisants pour accéder à cette page". Ils sont réservés au staff ?
  • l’implémentation existante n’indique pas de licence, ce qui veut dire qu’elle est copyright, malgré que les sources soit accessible, non ?
  • Dans le travail à réaliser, je pense que c’est une étape à part entière de "collecter des données pour contituer la base"
romantik

Comme indiqué dans mon précédent message, me revoilà ! Dans l’ordre de tes remarques :

  • Ce fut une erreur de ma part, j’avais laissé le terme "editer" dans l’URL, d’où ton manque de droits.

  • Sans doute, mais j’ai contacté l’auteur à ce sujet. De toute façon il ne s’agit pas de copier ses lignes de code (qui sont de plus en PyTorch alors que nous allons travailler en TensorFlow/Keras) mais de comprendre les étapes qu’il a identifiées dans le papier, pour compléter notre lecture de ce dernier.

  • Oui, c’est ce qui correspond à mes points "Choisir les données d’entraînement" et "Choisir les données de tests", à moins que j’ai mal compris ta remarque ? Notons que le développeur a utilisé deux ensemble de données fournies dans PyTorch, donc certainement libres de droit. Il y a plusieurs autres ensemble de données libres de droit aussi :) .

Salut,

Ta présentation est bien écrite. Tu sembles t’investir à fond, c’est super ! :)

Mais je suis un peu confus sur quelques points après lecture du projet :

  1. À combien de temps estimes-tu la durée du projet ?
  2. Quelles compétences précises avoir si l’on souhaite y participer ?
  3. Le projet est-il financé ou contribue-t-on sur base bénévole ?

Je ne pense pas avoir le bon profil, mais je suis intéressé d’avoir des news sur l’avancement du projet ! :)

Salut,

Ta présentation est bien écrite. Tu sembles t’investir à fond, c’est super ! :)

Mais je suis un peu confus sur quelques points après lecture du projet :

  1. À combien de temps estimes-tu la durée du projet ?
  2. Quelles compétences précises avoir si l’on souhaite y participer ?
  3. Le projet est-il financé ou contribue-t-on sur base bénévole ?

Je ne pense pas avoir le bon profil, mais je suis intéressé d’avoir des news sur l’avancement du projet ! :)

CH4

Hello,

  1. Ça dépend de nos compétences, mais par exemple j’ai déjà mis en place le réseau juste en lisant le papier. Si l’un d’entre vous a des compétences en apprentissage profond, le reste peut être mis en place en 1 après-midi ou 2. Je vais continuer à essayer d’avancer, je mettrai à jour le GitHub au fur et à mesure, mais ça va prendre pas mal de temps si je suis seul dans cette entreprise. Je bloque au niveau de l’apprentissage et de la normalisation des données.

  2. Il faut clairement avoir des compétences en deep learning (GAN et CNN plus précisément), en Python, TensorFlow et Keras, prendre le temps de lire le papier de recherche (ça ne prend pas beaucoup de temps). On peut aussi prendre le temps de lire l’implémentation déjà réalisée même si elle s’éloigne (ou semble s’éloigner) du papier (auquel cas il faut connaître Python et PyTorch). Je vais mettre à jour l’OP pour expliquer quelles compétences il faut avoir effectivement, bonne idée !

  3. Ah bah non c’est du bénévolat du coup, l’idée c’est qu’on collabore ensemble selon la philosophie du libre de droit et de l’open-source gratuit :p !!! :) . Il faut savoir que cette technologie est présentée comme le dernier-cri de la compression, ZesteDeSavoir pourrait tout à fait être le premier site francophone, voire européen voire même mondial à l’utiliser (en effet, je ne suis pas au courant que cet outil ait été complètement implémenté selon le papier de recherche, puis utilisé fonctionnellement dans un projet).

+0 -0

Nouveauté ! Je mets à disposition un serveur Discord. Lien du Discord : https://discord.gg/GSTT8Rz. Utilisons-le surtout pour des questions techniques liées au développement informatique du projet (pour ne pas flooder ce topic). En revanche, toute question/information importante (annonce, demande d’information sur le projet, demande de participation) doit être écrite sur ce topic, pour qu’on puisse en garder une trace.

Bonjour LaMatrice,

Un projet est bien plus abouti que celui que tu présentes : https://github.com/Justin-Tan/generative-compression.

Et certains chercheurs sont déjà passés au Saliency Attentive Model à base de LSTM pour tenir compte des points d’accroches de la vision humaine sur une image : https://theinformaticists.com/2019/03/22/saliency-conditioned-generative-compression/

Le sujet est intéressant. Une question qui me vient en tête : c’est comment rendre l’algorithme suffisamment performant pour accueillir toutes les images et tailles d’images ? Je veux dire c’est un simple auto encodeur ; les problématiques sont connues : taille d’image limitée, incohérences sur des thématiques d’images non apprises, sensible au One-Pixel Attack etc. Sur de la génération d’images, ce genre de chose ce n’est pas trop un problème … mais sur de la compression, ce n’est pas commode.

Après ce n’est pas du tout un propos d’expert ; il me reste encore beaucoup à apprendre. ;) ne serait-ce qu’à comprendre un papier scientifique - je ne suis même pas sûr qu’en Français, j’arriverai à piper grand chose à toutes ces formules (T_T je pars m’enterrer quelque part []->).

+0 -0

Un projet est bien plus abouti que celui que tu présentes : https://github.com/Justin-Tan/generative-compression.

On voit beaucoup trop la différence avec l’image originale contrairement à mon papier de recherche, je trouve. Et puis le mien a l’intérêt d’utiliser JPEG, JPEG2000 ou BPG, ce qui est plus utile d’après les chercheurs pour les entreprises.

Et certains chercheurs sont déjà passés au Saliency Attentive Model à base de LSTM pour tenir compte des points d’accroches de la vision humaine sur une image : https://theinformaticists.com/2019/03/22/saliency-conditioned-generative-compression/

ça par contre c’est intéressant mais bon.

Le sujet est intéressant. Une question qui me vient en tête : c’est comment rendre l’algorithme suffisamment performant pour accueillir toutes les images et tailles d’images ? Je veux dire c’est un simple auto encodeur ; les problématiques sont connues : taille d’image limitée, incohérences sur des thématiques d’images non apprises, sensible au One-Pixel Attack etc. Sur de la génération d’images, ce genre de chose ce n’est pas trop un problème … mais sur de la compression, ce n’est pas commode.

Après ce n’est pas du tout un propos d’expert ; il me reste encore beaucoup à apprendre. ;) ne serait-ce qu’à comprendre un papier scientifique - je ne suis même pas sûr qu’en Français, j’arriverai à piper grand chose à toutes ces formules (T_T je pars m’enterrer quelque part []->).

Je sais pas mais les chercheurs n’ont pas relevé ce genre de pbs, apparemment leur implémentation à eux marche au poil :B

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte