Ciao, sono Alex di DEV STORIES DOT EU. Pillow: The Imaging Library, episodio 4 di 5. I framework di machine learning come PyTorch o TensorFlow non sanno effettivamente cosa sia un JPEG o un PNG. Capiscono solo la matematica, il che significa che capiscono solo array multidimensionali. Se passi un file immagine direttamente a un modello, fallirà. Ti serve un modo per tradurre quei byte codificati in un formato puramente matematico. The Array Bridge: Moving Pixels to PyTorch è esattamente come risolvi questo problema.
Pillow fa da traduttore universale nello stack AI. Quando apri un'immagine usando Pillow, ottieni un oggetto Image. Per darlo in pasto a una data pipeline, passi quell'oggetto Pillow direttamente a
Numpy usando la funzione as array. Dietro le quinte, Pillow espone un'interfaccia buffer standard. Numpy legge questo memory buffer e lo incapsula in un array multidimensionale. Per una fotografia a colori standard, ottieni un array tridimensionale che rappresenta l'altezza, la larghezza e i canali colore.
Ed è qui che la cosa si fa interessante. Quando fai questa conversione, esci completamente dall'ecosistema di Pillow. L'array risultante non contiene nessuno dei metadata di Pillow. Le impostazioni DPI, i dati EXIF, i profili colore ICC e le palette colori vengono completamente rimossi. Ti rimangono solo i puri valori numerici raw dei pixel. Se la tua immagine originale era basata su palette, come un file GIF, devi convertirla in un'immagine RGB all'interno di Pillow prima di passarla a Numpy. Altrimenti, otterrai solo un array di numeri indice della palette senza significato, invece dei colori veri e propri.
Una volta che i tuoi pixel sono in formato array, il tuo framework può eseguire le sue operazioni sui tensor, applicare filtri o eseguire un modello di computer vision. Ma alla fine, ti torna indietro un risultato. Un modello potrebbe restituire in output un nuovo array che rappresenta un'immagine generata o una segmentation mask. Per visualizzare o salvare questo risultato, devi attraversare il ponte nella direzione opposta. Prendi quell'array di output e lo passi alla funzione di Pillow chiamata from array. Pillow legge la shape e il data type dell'array Numpy per capire come interpretare i numeri. Se vede un array di unsigned eight-bit integers con tre canali, di default crea un'immagine RGB. Se vede un singolo canale, crea un'immagine in scala di grigi. Hai anche l'opzione di passare esplicitamente il color mode tu stesso, se hai bisogno di fare l'override del comportamento di default. Una volta che Pillow ricostruisce l'oggetto Image, ti basta chiamare il metodo save per scriverlo direttamente sul tuo hard drive.
Spostare memoria tra librerie diverse può essere costoso. Se stai processando un dataset enorme di immagini ad alta risoluzione, copiare i dati dei pixel avanti e indietro crea un bottleneck significativo. Per risolvere questo problema, Pillow supporta il formato Apache Arrow tramite una funzione chiamata from arrow. Arrow è uno standard per i dati in-memory. Quando usi la funzione from arrow, Pillow costruisce un'immagine direttamente dalla data structure di Arrow usando la zero-copy shared memory. Questo significa che Pillow e i tuoi altri tool puntano esattamente alla stessa locazione di memoria fisica. I dati non vengono mai duplicati. È un modo estremamente efficiente per dare in pasto grandi volumi di pixel alle pipeline moderne senza esaurire la memoria di sistema.
Il vero potere di una libreria di imaging in uno stack AI non sta solo nell'aprire il file, ma nel farsi da parte con eleganza per permettere alla matematica di fare il suo corso. Grazie per aver passato qualche minuto con me. Alla prossima, stammi bene.