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
-
Deep-learning : GAN (réseaux adverses génératifs) et CNN (réseaux de neurones à convolution)
-
Python
-
TensorFlow
-
Keras
-
Prendre le temps de lire le papier de recherche (les parties importantes sont indiquées plus loin)
-
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)
-
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 !