MyPhotoShare est un générateur de site Web statique de galerie de médias (licence GPLv3), à partir d’une arborescence de répertoires contenant des photos et des vidéos. Donc vous prenez ce gros répertoire où vous accumulez toutes ces photos ou vidéos depuis tant d’années, vous exécutez l’indexeur de MyPhotoShare en le pointant vers ce répertoire, et celui-ci vous construit un site Web statique avec lequel vous pouvez montrer vos photos au reste de l’univers…
Mais attention, site Web statique ne signifie pas fonctions limitées ! En effet, MyPhotoShare propose plusieurs fonctions de navigation ou de recherche de vos médias, par mot clé ou par date, par localisation géographique sur une carte. Les métadonnées associées aux médias, soit dans les images JPEG soit dans des fichiers album.ini
externes, facilitent la classification ou l’affichage de descriptions. Enfin, des extensions basées sur des réseaux neuronaux permettent d’ajouter l’identification automatique des personnes ou des scènes.
De nouvelles fonctions sont ajoutées très fréquemment à MyPhotoShare qui en est rendu actuellement à la version 5.3.10. Bien que MyPhotoShare soit peu connu, le principal développeur est très dynamique et fait évoluer rapidement l’application ou corrige les bogues qui lui sont remontés. Nous allons vous présenter ce qui différencie MyPhotoShare des autres applications de galerie.
Probablement comme tout le monde qui possède un appareil photo numérique ou un téléphone intelligent, vous avez accumulé au fil du temps un nombre incommensurable de photos. Peut-être avez-vous fait le tri de ces photos qui reposent dans de nombreux répertoires, et maintenant vous souhaitez les partager, sur le Web, avec vos amis ou votre famille. Mais vous voulez garder le contrôle sur ces photos et éviter qu’elles soient utilisées par les géants du Web à des fins pas tout le temps humanitaires. Bref, vous voulez les présenter dans une galerie Web, peut-être sur votre petit serveur à la maison ou chez un hébergeur.
Entre en scène MyPhotoShare… Cette application va vous permettre de parcourir l’arborescence des répertoires de photos pour générer un site Web de galerie média. La particularité de MyPhotoShare est que le site Web de la galerie est statique, c’est-à-dire que ce n’est pas une application qui s’exécute sur le serveur Web et qu’il n’utilise pas de base de données. Le programme d’indexation des médias (le scanner
de MyPhotoShare) construit tous les fichiers pour l’affichage du site Web à l’avance, qui seront mis en page dans le navigateur Web du visiteur. Vous pouvez imaginer cette opération d’indexation des médias comme la préparation d’un gros cache sur le disque du serveur web. Le serveur web est donc réduit à récupérer et envoyer des fichiers, chose qu’il sait faire de façon efficace, plutôt que d’exécuter du code PHP ou autre pour retrouver l’image à afficher et à la dimensionner pour l’affichage…
Comme nous venons de le voir, le premier avantage se situe au niveau de la performance. Puisque tous les éléments constituants la page HTML qui sera affichée dans le navigateur Web sont déjà prêts, le travail du serveur Web se limite à les récupérer sur le disque et à les envoyer au navigateur du visiteur. À titre d’exemple, cette caractéristique me permet d’héberger MyPhotoShare sur un Chromebook qui ne brille pas par sa puissance.
D’autre part, les médias, photos et vidéos, sont rarement modifiés. Donc si une photo est redimensionnée à l’avance pour un affichage sur un téléphone portable, le résultat pourra être réutilisé par tous les visiteurs utilisant leur téléphone intelligent. Il suffit de conserver ce fichier dans un cache. C’est ce dont se charge le scanner
de MyPhotoShare. Il prépare tous les fichiers, pour tous les cas de figures. Et comme il y a généralement peu de changements d’une exécution à l’autre, peut-être l’ajout de quelques photos, cette opération s’effectue rapidement, car le scanner
ne considère que les fichiers médias nouveaux ou modifiés. En effectuant cette opération de préparation du contenu à un moment où le serveur est moins sollicité, on réserve sa puissance pour les moments achalandés. Globalement, le serveur Web peut accepter plus de sessions simultanées, car il n’exécute pas de code dynamique, contrairement à une galerie écrite en PHP par exemple.
Une autre conséquence de cette façon de procéder est d’améliorer la sécurité globale du serveur Web. En effet, le scanner
peut effectuer son travail avec un compte utilisateur qui permet d’écrire sur le disque alors que le compte utilisateur du serveur Web peut être limité uniquement à de la lecture de ces fichiers. En réduisant le périmètre d’attaque du serveur Web et en limitant les tâches qu’il réalise, on s’assure d’une bonne sécurité. Il sera difficile pour un hacker de perturber le fonctionnement de la galerie média.
Si un site Web statique est à la fois performant et sécurisé, quels sont ses désavantages ? Le principal est qu’il n’est pas aussi dynamique qu’une application Web qui pourrait utiliser toutes les capacités du serveur, avec une base de données et des calculs dynamiques. On ne peut pas avoir le beurre et l’argent du beurre ! Mais dans le cas d’une galerie média, ces possibilités dynamiques ne sont pas nécessaires. D’ailleurs MyPhotoShare offre des fonctions de navigation ou de recherche évoluées sans nécessiter de calculs dynamiques du serveur Web.
Un autre désavantage est que l’utilisateur du site Web ne peut pas pousser d’information vers le serveur. En effet, comme nous l’avons dit, celui-ci est en lecture seule. Il est donc impossible d’y conserver les résultats d’un formulaire Web, ni même de le traiter, car il n’utilise pas de langage tel que PHP ou Python, ou de conserver des informations de l’internaute. Vous cherchiez une galerie qui vous offre le contrôle de vos fichiers, et en plus vous garantissez à vos visiteurs qu’ils ne laisseront pas de traces !
Comme je l’ai déjà dit, le scanner
est un programme d’indexation des fichiers photo et vidéo (les médias) contenus dans les répertoires (les albums). Il crée des fichiers JSON qui sont l’équivalent des fichiers d’index d’une base de données. Lorsqu’un internaute consulte un site MyPhotoShare, son navigateur va charger la page d’accueil de la galerie. Le JavaScript contenu dans cette page va charger, en fonction des actions de l’utilisateur, les fichiers JSON correspondants ainsi que les images nécessaires au rendu de la page. Pour que ça fonctionne, il faut que le scanner
ait généré à l’avance tous les fichiers JSON pour toutes les actions possibles !
Et oui, on peut voir cette façon de procéder comme un avantage et un désavantage. Le site statique doit préparer le rendu des pages à l’avance, indépendamment des requêtes des différents visiteurs. C’est vrai qu’il est possible que certaines pages générées à l’avance ne soient jamais affichées et que l’indexeur ait travaillé inutilement, mais si le site est populaire la probabilité que ce travail soit inutile diminue. Au contraire, un serveur dynamique recréerait à chaque fois le contenu d’une page pour tout nouveau visiteur. Le site web statique optimise donc l’effort à court terme (répondre à une requête HTTP) et sur le long terme (préparer le travail et le garder dans un cache permanent). Et comme je l’ai dit précédemment, la fréquence de modification du contenu peut jouer également en faveur ou en défaveur d’un site Web statique, mais dans le cas d’une galerie média, c’est bien souvent un avantage, car les changements sont peu fréquents.
Si vous voulez voir à quoi MyPhotoShare ressemble, il y a quelques sites de démonstration dans les liens de la dépêche.
Le site principal de démonstration, en anglais, a été construit pour tester la version de développement et présenter certaines fonctions de MyPhotoShare. En particulier, vous pouvez utiliser le mot de passe pwd pour afficher et naviguer dans le contenu protégé.
Une version au contenu média identique, mais en français, est hébergée sur mon petit serveur à la maison. Tout comme pour le site principal, le mot de passe pwd dévoilera un album protégé.
MyPhotoShare possède les fonctions classiques auxquelles on pourrait s’attendre d’une galerie moderne, comme l’affichage des médias aussi bien sur un ordinateur qu’une tablette ou un téléphone mobile. Je vais plutôt présenter les fonctions qu’on ne s’attendrait pas à trouver sur un site Web statique.
Les métadonnées ajoutent de l’information aux photos et vidéos conservées. Certaines métadonnées techniques sont injectées automatiquement par l’appareil photo dans les zones EXIF, IPTC ou XMP des fichiers JPEG, telles que la résolution de l’image, l’ouverture de l’objectif, la date de la capture ou les coordonnées GPS de la prise de vue. L’utilisateur peut ajouter d’autres métadonnées descriptives en donnant un nom significatif au fichier JPEG, ou en éditant les zones EXIF.
MyPhotoShare va extraire les métadonnées des fichiers médias, mais va également permettre à l’utilisateur de définir des métadonnées dans des fichiers album.ini
qui sont placés dans les répertoires de photos et vidéos. Ces fichiers album.ini
permettent d’y définir de nouvelles métadonnées descriptives ou techniques, sans toucher aux fichiers originaux. En effet, les métadonnées provenant de l’album.ini
ont priorité sur celles présentes dans le JPEG. Si par exemple, je numérise en 2021 une diapositive prise en 1978, je peux préciser dans le fichier album.ini
la véritable date de la prise de vue. Je peux également y ajouter une description avec une mise en forme HTML que MyPhotoShare peut ou non afficher, suivant les désirs du visiteur du site Web.
En dehors de ne pas avoir à modifier les fichiers médias originaux, l’avantage des fichiers de métadonnées album.ini
est qu’ils sont associés aux répertoires (les albums) et donc que l’on peut les transférer lorsqu’on recopie le répertoire. En plus, ils sont éditables avec un simple éditeur de texte et ils peuvent donc être enrichis facilement sans nécessiter d’autre logiciel ou d’éditeur d’image. Enfin, ils ouvrent la porte à l’ajout d’information automatique à partir d’autres outils, sans risquer de perdre les photos originales, ce dont je parlerai un peu plus loin.
Dans le futur, j’espère que les fichiers album.ini
permettront de changer le fonctionnement du scanner
en fonction des informations qu’ils contiennent. Actuellement, les paramètres de l’indexeur sont définis dans le fichier de configuration, par défaut dans /etc/myphotoshare/myphotoshare.conf
et ces paramètres s’appliquent pour l’ensemble de l’arborescence des albums. On peut imaginer qu’il sera possible de modifier localement ces paramètres, dans le cadre d’un répertoire contenant un fichier album.ini
, afin d’avoir une couleur de page Web différente ou pour afficher automatiquement les descriptions…
MyPhotoShare utilise les métadonnées dans de nombreuses fonctions :
Les médias sont disposés dans des répertoires sur le disque du serveur. Naturellement, MyPhotoShare traduit ces répertoires en albums et en propose l’affichage. Mais il ajoute des répertoires virtuels qui enrichissent la navigation dans les photos. Ainsi, MyPhotoShare offre un affichage des médias dans des albums triés par date: année, mois et jour. Il est également possible d’afficher les médias par dans des albums répartis par emplacement géographique: pays, région ou province, ville.
Sur ce dernier point, la navigation par carte, accessible en cliquant sur l’icône d’épingle, permet d’afficher les photos suivant les lieux.
Les résultats de recherche sont également regroupés dans un album virtuel. Et il est aussi possible de combiner plusieurs albums. Par exemple, sélectionner une région sur la carte pour ensuite afficher les photos correspondant aux résultats d’une recherche par mot clé.
Retrouver une photo parmi toutes celles accumulées depuis des années s’avère souvent une tâche difficile. La navigation temporelle de MyPhotoShare va permettre de retrouver la photo du mariage du cousin Émile, mais encore faut-il se souvenir de la date du mariage ! Heureusement que les appareils photos numériques incluent automatiquement la date de prise de vue dans les fichiers JPEG… De même, on pourra essayer de retrouver la photo d’Émile en navigant par emplacement géographique, si le téléphone portable a consigné les coordonnées GPS dans les métadonnées, ou si celles-ci ont été ajoutées ultérieurement.
Si le propriétaire a enrichi sa collection de médias de métadonnées descriptives, au minimum en nommant les fichiers médias ou les répertoires, idéalement en renseignant les champs de métadonnées EXIF ou ceux des album.ini
, MyPhotoShare va utiliser ces informations pour permettre des recherches textuelles par mot clé.
Il peut paraître étonnant qu’un site Web statique propose des options de recherche telles que la recherche partielle dans les mots, ou sans tenir compte de l’accentuation. MyPhotoShare supporte également d’affiner les recherches en les combinant. Si avec ça on ne retrouve pas Émile dans son costume trois pièces !
Chaque visiteur de la galerie peut personnaliser l’affichage suivant son goût. MyPhotoShare dispose d’options de base :
Les choix de l’utilisateur sont conservés dans un cookie qui lui permettra de retrouver ses préférences lors des visites ultérieures.
Bien sûr, le propriétaire du site Web va définir des options d’affichage globales dans le fichier de configuration myphotoshare.conf
, telles que la couleur de fond de page, la langue d’affichage par défaut ou la taille des vignettes, etc.
Pour le moment, l’affichage est relativement figé: une galerie MyPhotoShare ne se distinguera pas tellement d’une autre galerie MyPhotoShare. On y trouve soit des albums, soit une planche contact de médias, soit une photo principale et un ruban. J’aimerais que MyPhotoShare évolue, dans le futur, pour pouvoir organiser l’affichage par album, pour que ceux-ci soient le support visuel d’une histoire…
Vous avez enfin retrouvé les photos du cousin Émile ! Il ne reste plus qu’à effectuer une sélection où l’oncle Robert apparaît et les lui envoyer. MyPhotoShare vous permet de sélectionner des médias. Avez-vous remarqué la boite à cocher dans les vignettes de médias, au coin bas gauche, des captures d’écran précédentes ? Il suffit de cliquer sur cette boite pour ajouter le média correspondant à la sélection. Ou bien de sélectionner tous les médias affichés en utilisant le menu. Ou encore sélectionner tous les résultats d’une recherche…
Une fois que tous les médias ont été ajoutés dans votre sélection, MyPhotoShare vous permet de les télécharger. L’application construit un fichier Zip que vous pouvez sauvegarder sur votre ordinateur. Avant de recevoir le fichier Zip, on peut sélectionner les types de fichiers (photos et/ou vidéos) et si la sélection doit intégrer les sous-albums.
Mais peut-être préférez-vous partager un lien dans un courriel ou sur une plateforme sociale ? Les icônes de partage, affichés sur le bord gauche de la galerie, servent justement à ça. Si vous cliquez sur l’enveloppe, votre client de messagerie construit un courriel avec le lien de la page courante. De même, en cliquant sur le [f], vous pourrez partager les médias de la page courante sur Facebook. S’il s’agit d’un album, MyPhotoShare construit une vignette mosaïque avec le contenu.
Ces fonctions de partage social ont donné à la galerie son nom …Share. Elles sont les seules requiérant l’utilisation de PHP par le serveur Web, et qui font que la page d’accueil soit index.php
. Si ces fonctions ne vous sont pas utiles, vous pouvez utiliser la version statique index.html
.
Les sites de partage social, affichés par leur icône, sont paramétrables dans le fichier de configuration myphotoshare.conf
du site. Ceux affichés dans les captures d’écrans sont ceux par défaut. Il faut parfois publier quelques photos sur les gros sites sociaux pour rappeler aux internautes que le Web existe en dehors de Facebook…
De base, si OpenCV est installé sur le serveur, alors le programme d’indexation scanner
l’utilisera pour déterminer si un visage apparaît sur une photo et s’arrangera pour centrer le visage lors de la préparation de la vignette. C’est plus pratique d’avoir des vignettes où l’on reconnaît immédiatement qui s’y trouve!
J’ai développé deux extensions pour ajouter des fonctions avancées à MyPhotoShare. La première est la reconnaissance des visages. À partir de répertoires contenant des photos et des fichiers album.ini
qui identifient des personnes sur ces photos, le script Python mps_autofaces
va apprendre à reconnaître ces personnes à l’aide d’un réseau de neurones. Puis il va re-parcourir l’arborescence des albums et des photos, et modifier les métadonnées des fichiers album.ini
pour y ajouter le nom des personnes qui apparaissent sur les photos.
Les résultats produits par cette extension sont époustouflants. J’ai parfois du mal à reconnaître une personne sur une photo, mais mps_autofaces
est capable de l’identifier s’il l’a déjà apprise. Comme expliqué sur la page Gitlab du projet en anglais, j’utilise un répertoire contenant des photos de portraits ou des photos d’identité, afin que l’apprentissage du réseau de neurone soit facilité. Mais même avec une seule photo d’un individu, cette extension est capable de reconnaître cette personne dans des contextes variables ou à des âges différents.
Bien sûr, les grands sites d’hébergements de photos ou des réseaux sociaux ont des fonctions similaires, probablement plus performantes que mps_autofaces
car celles-ci doivent pouvoir reconnaître des personnes que vous ne connaissez même pas! Mais je préfère garder le contrôle de mes photos et de l’utilisation de mon image personnelle.
La deuxième extension s’attaque à la reconnaissance des scènes et des objets dans les photos. Le principe est le même que pour la reconnaissance des individus: le programme entraîne un réseau de neurones à reconnaître des objets et des situations à partir d’une base d’images d’apprentissage. J’utilise les collections d’images de Visual Genome et MS COCO pour cette opération. Ces bases d’images contiennent à elles deux plus de 400 000 images exemples annotées décrivant les scènes et les objets présents. Ce jeu d’apprentissage est amélioré par diverses techniques, par exemple, en appliquant un effet miroir aux images pour doubler le nombre d’exemples d’apprentissage. Comme la phase d’apprentissage est très longue, de multiples sauvegardes du réseau de neurones sont réalisées.
Une fois que le réseau de neurones fournit de bons résultats de reconnaissance sur les images de test, il peut appliquer ses connaissances sur le contenu des albums de MyPhotoShare avec la commande mps_autoscenes
. Ce script modifie également les fichiers album.ini
pour y ajouter les étiquettes correspondantes aux objets ou scènes reconnues automatiquement.
Comme MyPhotoShare propose une interface utilisateur dans plusieurs langues (actuellement le français, l’italien, l’anglais et l’espagnol), il était nécessaire que les étiquettes automatiques des objets et scènes soient dans la langue du site Web. Ceci est rendu possible par l’utilisation de la base lexicale WordNet qui permet une traduction des concepts, à partir de l’anglais qui a servi pour les annotations, vers la langue du site.
Malheureusement, même avec des centaines de milliers d’exemples, et plusieurs jours d’apprentissage sur mes ordinateurs personnels, les résultats ne sont pas au même niveau que la reconnaissance des visages. mps_autoscenes
est capable de reconnaître de nombreux objets (des fleurs, des animaux, des véhicules ou des personnes, etc.) dans mes photos. Il ne commet pas d’erreur d’interprétation dans environ 50% des cas, ce qui signifie que dans les 50% restants, il confondra le portrait du cousin Félicien avec une cafetière! Je ne dispose pas des moyens nécessaires pour améliorer ces résultats pour le moment. Et comme MyPhotoShare ne dispose pas encore d’une fonction de recherche avec pondération dans les étiquettes, je suis obligé de réviser manuellement les étiquettes automatiques ajoutées par mps_autoscenes
.
MyPhotoShare possède de nombreuses autres fonctions sur lesquelles je ne m’étendrai pas. Regardez la liste complète sur le site Gitlab du projet. On notera :
Tout cela est bien beau, mais est-ce que ça va fonctionner sur ma machine ?
S’il s’agit d’un ordinateur qui roule Debian ou Ubuntu, le plus simple est d’utiliser un paquet d’une livraison récente qui se chargera de vérifier les dépendances. Si la toute dernière version de MyPhotoShare n’est pas encore disponible empaquetée, construisez vous-même le paquet en anglais.
Sinon si votre ordinateur carbure avec Linux ou un système assimilé, la procédure d’installation en anglais vous guidera pas-à-pas pour y installer les logiciels et modules nécessaires et vous indiquera même comment configurer votre serveur Web.
Nous n’avons jamais essayé d’installer MyPhotoShare sur un ordinateur Windows. Si vous tentez l’expérience, partagez vos résultats ! MyPhotoShare est programmé principalement en Python, donc techniquement ce ne devrait pas être impossible…
MyPhotoShare a fait le choix de générer un site Web statique plutôt que d’utiliser du code serveur en PHP ou en Python. Cette décision, prise il y a de nombreuses années par l’auteur initial, s’est avérée un bon choix. Ainsi la galerie est capable de fonctionner même sur de très petits serveurs économes en puissance électrique. C’est à vous, propriétaires de Raspberry v1 ou Cubox-i qui dorment inutilisés sur des étagères, auxquels je parle !
Voici quelques chiffres tirés des tests de Paolo Benvenuto, le développeur principal qui maintient et améliore MyPhotoShare.
À titre de comparaison, sur un PC de bureau, avec les albums de médias sur une partition NAS :
La conversion des vidéos prend beaucoup plus de temps que celle des photos, d’autant plus que leur durée est grande.
L’indexation de 45 000 médias nécessite 1,5 Go/2,1 Go de mémoire vive/virtuelle.
Le code JavaScript est optimisé et la galerie gère facilement 40 000 médias.
Cependant, si un album contient plus de 1000 photos, il faut s’attendre à quelques lenteurs d’affichage. Malgré tout, la galerie reste utilisable.
Bien sûr, la performance se paie au prix de l’espace disque utilisé par le cache. Nous avons essayé de le garder dans des limites raisonnables. Le ratio de la taille du cache par rapport à la taille des albums originaux dépend de nombreux facteurs tels que le nombre de tailles d’images intermédiaires que vous désirez (voir l’option reduced_sizes
dans le fichier de configuration) et des options de transcodage vidéo (voir video_preset
par exemple), ou bien sûr de la durée des vidéos. Il faut noter que ces chiffres ont été obtenus alors que le scanner
était configuré pour créer trois images de tailles différentes, alors que la configuration par défaut actuelle se limite à deux images.
Site | Nombre de médias | Taille des albums | Taille du cache | Ratio cache/albums |
---|---|---|---|---|
Démo AlternaTV | 95 images | 675 Mo | 116 Mo | 17% |
Site de production #1 | 14k médias dont 20 vidéos | 95 Go | 25 Go | 26% |
Site de production #2 | 20k médias dont 439 vidéos | 92 Go | 66 Go | 77% |
Site de production #3 | 26k médias dont 430 vidéos | 232 Go | 82 Go | 35% |
MyPhotoShare est une branche de PhotoFloat, galerie développée par Jason A. Donenfeld, vers 2016, lorsque son auteur a arrêté de le développer. La branche a été enrichie par Jerome Charaoui pour supporter les vidéos, avec les contributions de Paolo Benvenuto et de Pierre Métras. Paolo en est maintenant le développeur principal, l’enrichissant de nouvelles fonctions au fil des versions.
Les idées ne manquent pas pour améliorer le logiciel. Ce sont plus les ressources et le temps de les mettre en œuvre qui font défaut. Si vous cherchez un projet en source ouvert pour occuper quelques soirées, n’hésitez pas à indiquer votre intérêt sur le Gitlab du projet ou dans les commentaires de la dépêche. Voici quelques sujets tirés de ma boite à idées :
L’avenir de MyPhotoShare est donc devant nous, tant qu’on ne se retourne pas comme disait Pierre Dac. Comme cette galerie est à code source ouvert sous licence GPLv3, vous aussi pouvez y contribuer. Une première étape serait de l’essayer et de partager vos photos sur le Web.
Déserts médicaux, services publics : quel bilan de Macron sur la ruralité ?
Les meilleurs téléphones en 2021 pour la photo et la vidéo
Quel est le meilleur smartphone Oppo à choisir ?
Quel est le meilleur smartphone Xiaomi ?