Salut, c'est Alex de DEV STORIES DOT EU. Pillow : The Imaging Library, épisode 4 sur 5. Les frameworks de machine learning comme PyTorch ou TensorFlow ne savent pas vraiment ce qu'est un JPEG ou un PNG. Ils ne comprennent que les maths, ce qui veut dire qu'ils ne comprennent que les arrays multidimensionnels. Si tu passes directement un fichier image à un modèle, il va planter. Tu as besoin d'un moyen de traduire ces bytes encodés vers un format purement mathématique. The Array Bridge : Moving Pixels to PyTorch, c'est exactement comme ça que tu résous ce problème.
Pillow agit comme le traducteur universel dans la stack IA. Quand tu ouvres une image avec Pillow, tu obtiens un objet Image. Pour l'injecter dans un data pipeline, tu passes cet objet Pillow directement à
Numpy en utilisant la fonction as array. Sous le capot, Pillow expose une interface de buffer standard. Numpy lit ce buffer mémoire et le wrap dans un array multidimensionnel. Pour une photo couleur standard, tu obtiens un array en trois dimensions qui représente la hauteur, la largeur et les channels de couleur.
C'est là que ça devient intéressant. Quand tu fais cette conversion, tu quittes complètement l'écosystème Pillow. L'array qui en résulte ne contient aucune des metadata de Pillow. Les paramètres DPI, les données EXIF, les profils de couleur ICC et les palettes de couleurs sont complètement supprimés. Il ne te reste que des valeurs numériques de pixels pures et brutes. Si ton image d'origine était basée sur une palette, comme un fichier GIF, tu dois la convertir en image RGB dans Pillow avant de la passer à Numpy. Sinon, tu vas juste obtenir un array de numéros d'index de palette qui ne veulent rien dire, au lieu des vraies couleurs.
Une fois que tes pixels sont sous forme d'array, ton framework peut lancer ses opérations sur les tensors, appliquer des filtres ou exécuter un modèle de computer vision. Mais au final, tu récupères un résultat. Un modèle peut sortir un nouvel array qui représente une image générée ou un masque de segmentation. Pour voir ou sauvegarder ce résultat, tu dois traverser le pont dans l'autre sens. Tu prends cet array d'output et tu le passes à la fonction Pillow qui s'appelle from array. Pillow lit la shape et le data type de l'array Numpy pour comprendre comment interpréter les nombres. S'il voit un array d'entiers non signés de huit bits avec trois channels, il crée par défaut une image RGB. S'il voit un seul channel, il crée une image en niveaux de gris. Tu as aussi l'option de passer explicitement le mode de couleur toi-même si tu as besoin d'override le comportement par défaut. Une fois que Pillow a reconstruit l'objet image, tu as juste à appeler la méthode save pour l'écrire directement sur ton disque dur.
Déplacer de la mémoire entre différentes libraries peut coûter cher. Si tu traites un dataset massif d'images en haute résolution, copier les données des pixels dans un sens puis dans l'autre crée un bottleneck important. Pour résoudre ça, Pillow supporte le format Apache Arrow via une fonction qui s'appelle from arrow. Arrow est un standard pour les données in-memory. Quand tu utilises la fonction from arrow, Pillow construit une image directement à partir de la data structure Arrow en utilisant de la mémoire partagée zero-copy. Ça veut dire que Pillow et tes autres outils pointent vers le même emplacement mémoire physique exact. La data n'est jamais dupliquée. C'est un moyen super efficace pour injecter de gros volumes de pixels dans des pipelines modernes sans épuiser la mémoire de ton système.
La vraie puissance d'une library d'imagerie dans une stack IA, ce n'est pas juste d'ouvrir le fichier, mais de s'effacer gracieusement pour laisser les maths se faire. Merci d'avoir passé quelques minutes avec moi. À la prochaine, porte-toi bien.