Génération de trombinoscope en pdf automatique, à partir d'une liste et d'un ensemble de photos.
- auteur: Sebastien Kramm
- statut: stabilisé en v1 (2022-09-03)
- home page: https://github.com/skramm/trombino
- licence: WTFPL
Outil en ligne de commande, calibré pour des groupes jusqu'à 20 personnes par page, pour une année d'une promo de type universitaire (20-100 ou plus personnes, réparties en plusieurs groupes).
(mais avec des photos anonymisées, pour des raisons évidentes)
- bash (incluant le calculateur
bc) - LaTeX, avec le package
tabularx - Python3 & Opencv, pour l'extension de recadrage assisté (voir section "Extension")
- ImageMagick, pour l'extension sur le traitement préalable des photos (voir section "prétraitement")
Tout ceci a été developpé sous Linux/Ubuntu et devrai donc fonctionner sans problème sur des OS basés Linux, mais ces outils étant assez commun, un usage sous Mac/OSX devrait pouvoir fonctionner également (non-testé!). Pour ceux travaillant (encore) sous Windows, je vous laisse essayer.
Le plus simple consiste à cloner le dépot localement, mais pour ceux peu au fait de l'utilisation de git, une archive d'installation est prévue.
A partir du dépot, et sur une machine Debian ou dérivé, on l'installe sur la machine locale avec:
$ sudo ./install
Ceci va copier les exécutables dans /usr/local/bin/ et le fichier de configuration (fichier d'en-tête LaTeX) dans /etc/trombino/.
Il faut avoir une liste des personnes, et prendre une photo par personne, dans l'ordre de la liste. En cas d'absence, il faut prendre une photo vide, pour conserver l'ordre.
Ensuite, un petit traitement batch des photos peut être réalisé (recadrage, augmentation de la luminosité, conversion en N&B, etc). Ceci se fait facilement avec des outils comme Imagemagik, mais ce package propose un script permettant de faire ça rapidement.
Pour le recadrage, un outil permettant de le faire facilement est proposé, voir la section "3 - Extension" ci-dessous.
Dans l'idéal, il faudrait avoir des photos de quelques dizaines de ko.
Le script peut générer le trombinoscope en deux formats, pdf (via LaTeX, si installé) et en HTML. Chaque format va générer deux fichiers, l'un global, avec tous les noms, l'autre classé par groupe:
trombi_global.pdf(ou.html): trombinoscope global, sur plusieurs pages;trombi_groupes.pdf(ou.html): trombinoscope avec une page par groupe, avec les étudiants faisant partie de ce groupe.
(Le concept de "page" ne s'applique évidemment qu'à la version pdf)
- une liste en CSV contenant sur 3 champs:
Groupe, Nom, Prénom
A coller dans le dossier racine. Les lignes vides seront ignorées. - copier dans un sous-dossier
photosles photos, dans l'ordre de la liste.
Attention, il doit y avoir autant de photos que de lignes dans le fichier d'entrée!
L'exécution se fait dans un terminal ouvert dans le dossier où se trouve le fichier-liste et le dossier des photos:
$ trombino
On peut avoir les options disponibles avec:
$ trombino -h
(voir ci-dessous).
- éditer le fichier
head_left.txtet y mettre ce que vous souhaitez pour l'en-tête gauche (par exemple, le nom de l'établissement, de la promo, etc.) - éditer le fichier
head_right.txtet y mettre ce que vous souhaitez pour l'en-tête de droite. Si ce fichier est absent, l'année courante y sera imprimée.
Des valeurs par défaut sont prévues, mais on peut passer des options pour les modifier.
$ trombino [-hs] [-l fichier_liste] [-p dossier_photos] [-o nom_pdf] [-c nb_cols]
-l: pour spécifier un autre nom du fichier csv d'entrée (liste des étudiants)-p: pour indiquer un autre dossier pour les photos-o: pour donner un autre nom au fichier pdf généré (sans extension!!)
Par exemple,-o aaaproduira les deux fichiersaaa_global.pdfetaaa_groupes.pdf-c: pour modifier le nombre de colonnes. La taille des photos est automatiquement ajustée.-s: permute nom - prénom-f: permet de spécifier le séparateur de champs du fichier "liste". C'est ',' par défaut. On peut le changer pour des ';' avec-f ";". A noter que l'usage de l'espace (ASCII 32) est déconseillé, comme il est probable d'avoir des étudiants avec des noms composés.-w: Génère les deux versions en web (html)-x: pas de génération en pdf (utile si LaTeX pas installé)-h: affiche cette aide-d: active le mode "debug", ce qui imprimera le nom du fichier de la photo avec la photo (utile en cas d'erreur nom/photo)
Plusieurs situations peuvent mener le programme à l'échec.
Une erreur fréquente se produit lorsque le nombre de noms n'est pas égal au nombre de photos
(lorsqu'on a oublié d'insérer une photo vide en cas d'absence par exemple).
Dans ce cas, le trombi n'est pas généré, mais un message d'erreur est affiché, et le programme génère dans un sous-dossier
BUILD/matching la série de photos avec en surimpression le nom correspondant.
Ceci permet de vérifier rapidement si noms et photos correspondent, et voir à quel endroit il y a un décalage.
Pour les autres erreurs n'amenant pas à un échec, on peut ajouter au lancement le flag -d qui va provoquer des messages supplémentaires à l'exécution, qui peuvent indiquer la nature du problème.
Ce mode va également ajouter dans le trombinoscope produit le nom du fichier image ajouté avec chaque nom.
Des données de démo dont incluses, vous pouvez tester directement. Il y a:
- une liste de noms (thx: https://fossbytes.com/tools/random-name-generator)
- une liste de "photos" (thx: https://multiavatar.com/).
Ces avatars sont générés via le script
gen_avatars.sh(requires Imagemagick)
Tapez la commande suivante dans le dossier racine, une fois le repo cloné:
$ ./trombino
Ceci doit vous donner dans un fichier trombi.pdf, similaire à celui qui est fourni (trombi_exemple.pdf).
Vous pouvez aussi essayer ceci pour voir les mêmes données en 5 colonnes:
$ ./trombino -c 5
L'un des problèmes que l'on rencontre avec cette approche est le fait qu'il nécessite en pratique un "cropping" des photos. En effet, en général le cadrage fait qu'il est peu pratique d'avoir dès la prise de vue un cadrage type "photo d'identité". Le cropping peut se faire à la main, photo par photo, à l'aide d'un outil ad hoc, mais c'est évidemment fastidieux. On peut aussi l'automatiser via un script (utilisant par exemple imagemagick) qui prend chaque photo et lui applique un cropping fixe, mais il faut alors prédéterminer la bonne "bounding box", ce qui prend du temps. Sans compter que on aura toujours des étudiants qui sont un peu trop à gauche, un peu trop à droite, et donc le cropping identique pour toutes les photos va générer soit des "coupages de têtes", soit des images avec un cadrage un peu trop "large".
Depuis 2024/09, une extension utilisant Python3 et la bibliothèque OpenCv est incluse dans ce projet et permet d'avoir un cropping assisté, par une détection de visage dans la photo.
Il faut donc avoir ces deux outils installé localement (Python3 est en général déjà présent). Pour Opencv, l'installation est assez facile, via:
$ pip install opencv-python
Ceci a été testé avec la version 4.5.5, mais devrait aussi fonctionner avec des versions 3.
Il faudra aussi installer un autre paquet Python:
pip install opencv-contrib-python --upgrade
L'utilisation se fait via l'appel du programme autocrop depuis le dossier courant.
Ce programme prend deux arguments:
- Le premier est le nom du dossier dans lequel se trouve les photos brutes.
- Le second est le nom du dossier dans lequel seront placés les images "croppées" (sera crée s'il n'existe pas).
Par exemple:
$ autocrop src dst
Ce programme est un script bash qui lance pour chaque fichier du dossier de photos le programme Python trombino_autocrop_gui.py.
Ce dernier va lancer lancer une cascade de classifieurs pour tenter de trouver un visage
(voir
https://docs.opencv.org/3.4/d1/de5/classcv_1_1CascadeClassifier.html
pour des détails), avec des valeurs de paramètres par défaut.
Si les paramètres par défaut ne trouvent pas de visage, alors une interface graphique est démarrée
(basée sur le module "HighGui" de OpenCV).
Des sliders permettent d'ajuster les paramètres, le plus important étant l'échelle ("scale").
Une fois un visage trouvé, il faut alors appuyer sur "espace" pour sauvegarder l'image recadrée.
Dans le cas où il s'agit d'une photo vide, un appui sur ESC va sauvegarder la photo telle quelle.
Ce package inclut un script permettant de réaliser de façon rapide différents traitements sur un ensemble de photos. Il s'appuie sur ImageMagick, très facilement installable avec
$ sudo apt install imagemagick
Motivation:
Très souvent, les photos ont une résolution très élevée, nullement nécessaire pour un simple trombinoscope. De plus, le poids de ces photos va alourdir considérablement la taille des pdf générés. Il est donc pertinent de réduire la taille des photos de façon à avoir un pdf final de taille raisonnable.
De même pour la couleur: les photos en N&B sont en général largement suffisantes pour reconnaitre les personnes, il est donc souvent inutile d'inclure des photos en couleur dans le trombi. Cela allègera le poids du pdf final.
Enfin, les photos peuvent avoir une luminosité faible ou un contraste insuffisant, qui risque de rendre les photos peu lisibles en impression.
Le programme bphotos permet de corriger ces défauts de façon rapide.
On donne en argument:
- le nom du dossier contenant les photos
- le nom du dossier destination (qui sera crée s'il n'existe pas)
- Une commande parmi les 3 suivantes:
Bpour corriger luminosité et contraste. Il faut donner un 4è et un 5è argument dans la plage [-100;+100], la valeur 0 correspondant à aucune modification.Wpour convertir en N&BRpour reduire la taille des photos. il faut donner un 4è argument qui sera le taux de réduction en %.
Exemples:
$ bphotos src dst R 20va générer des images dans un dossierdstdont la taille sera -20% de celles présentes dans le dossiersrc$ bphotos src dst Wva convertir les photos présentes dans le dossiersrcen N&B et les placer dans le dossierdst$ bphotos src dst B 20 10va augmenter la luminosité de 20% et le contraste de 10%
Si vous avez un nombre de photos considérables, et en particulier pour la modification de luminosité et contraste, il pourra être pertinent de faire d'abord des essais sur un nombre réduit de photos et de trouver de façon empirique les bons réglages.
