Hallo, hier ist Alex von DEV STORIES DOT EU. Pillow: The Imaging Library, Folge 4 von 5. Machine Learning Frameworks wie PyTorch oder TensorFlow wissen eigentlich gar nicht, was ein JPEG oder ein PNG ist. Sie verstehen nur Mathe, was bedeutet, dass sie nur mehrdimensionale Arrays verstehen. Wenn du eine Bilddatei direkt an ein Model übergibst, schlägt das fehl. Du brauchst einen Weg, diese encodierten Bytes in ein rein mathematisches Format zu übersetzen. Die Array Bridge: Moving Pixels to PyTorch ist genau die Lösung dafür.
Pillow fungiert als universeller Übersetzer im AI-Stack. Wenn du ein Bild mit Pillow öffnest, bekommst du ein Image-Objekt. Um das in eine Data Pipeline einzuspeisen, übergibst du dieses Pillow-Objekt direkt an
Numpy, und zwar mit der as array Funktion. Unter der Haube stellt Pillow ein Standard Buffer Interface bereit. Numpy liest diesen Memory Buffer und verpackt ihn in ein mehrdimensionales Array. Für ein Standard-Farbfoto bekommst du ein dreidimensionales Array, das die Höhe, die Breite und die Color Channels repräsentiert.
Hier wird es interessant. Wenn du diese Konvertierung machst, verlässt du das Pillow-Ökosystem komplett. Das resultierende Array enthält keinerlei Metadata von Pillow. Die DPI-Settings, die EXIF-Daten, die ICC-Farbprofile und die Farbpaletten werden komplett entfernt. Was übrig bleibt, sind reine, rohe numerische Pixelwerte. Wenn dein Originalbild palettenbasiert war, wie zum Beispiel ein GIF-File, musst du es innerhalb von Pillow in ein RGB-Bild konvertieren, bevor du es an Numpy übergibst. Sonst bekommst du nur ein Array mit bedeutungslosen Paletten-Indexnummern anstelle der tatsächlichen Farben.
Sobald deine Pixel in Array-Form vorliegen, kann dein Framework seine Tensor-Operationen ausführen, Filter anwenden oder ein Computer Vision Model ausführen. Aber irgendwann bekommst du ein Ergebnis zurück. Ein Model gibt vielleicht ein neues Array aus, das ein generiertes Bild oder eine Segmentation Mask darstellt. Um dieses Ergebnis anzusehen oder zu speichern, musst du die Brücke in die entgegengesetzte Richtung überqueren. Du nimmst dieses Output-Array und übergibst es an die Pillow-Funktion namens from array. Pillow liest den Shape und den Data Type des Numpy-Arrays, um herauszufinden, wie die Zahlen interpretiert werden sollen. Wenn es ein Array von Unsigned Eight-Bit Integers mit drei Channels sieht, erstellt es standardmäßig ein RGB-Bild. Wenn es einen einzelnen Channel sieht, erstellt es ein Grayscale-Bild. Du hast auch die Möglichkeit, den Color Mode selbst explizit zu übergeben, wenn du das Default-Verhalten überschreiben musst. Sobald Pillow das Image-Objekt rekonstruiert hat, rufst du einfach die save Methode auf, um es direkt auf deine Festplatte zu schreiben.
Memory zwischen verschiedenen Libraries hin und her zu schieben, kann teuer sein. Wenn du ein riesiges Dataset an hochauflösenden Bildern verarbeitest, erzeugt das Hin- und Herkopieren von Pixeldaten einen signifikanten Bottleneck. Um das zu lösen, unterstützt Pillow das Apache Arrow Format über eine Funktion namens from arrow. Arrow ist ein Standard für In-Memory-Daten. Wenn du die from arrow Funktion nutzt, konstruiert Pillow ein Bild direkt aus der Arrow Data Structure, und zwar mit Zero-Copy Shared Memory. Das bedeutet, dass Pillow und deine anderen Tools auf exakt dieselbe physische Memory Location zeigen. Die Daten werden niemals dupliziert. Es ist ein hocheffizienter Weg, um große Mengen an Pixeln in moderne Pipelines einzuspeisen, ohne deinen System Memory auszuschöpfen.
Die wahre Stärke einer Imaging Library in einem AI-Stack liegt nicht nur darin, das File zu öffnen, sondern darin, elegant aus dem Weg zu gehen, damit die Mathe passieren kann. Danke, dass du ein paar Minuten mit mir verbracht hast. Bis zum nächsten Mal, mach's gut.