Salut, sunt Alex de la DEV STORIES DOT EU. Pillow: The Imaging Library, episodul 4 din 5. Framework-urile de machine learning precum PyTorch sau TensorFlow nu știu, de fapt, ce este un JPEG sau un PNG. Ele înțeleg doar matematica, ceea ce înseamnă că înțeleg doar array-uri multidimensionale. Dacă pasezi un fișier imagine direct unui model, va da eroare. Ai nevoie de o modalitate de a traduce acei bytes encodați într-un format matematic pur. The Array Bridge: Moving Pixels to PyTorch este exact modul în care rezolvi această problemă.
Pillow acționează ca un traducător universal în stack-ul de AI. Când deschizi o imagine folosind Pillow, primești un obiect Image. Pentru a o introduce într-un data pipeline, pasezi acel obiect Pillow direct în
Numpy folosind funcția as array. În spate, Pillow expune o interfață standard de buffer. Numpy citește acest memory buffer și îi face wrap într-un array multidimensional. Pentru o fotografie color standard, primești un array tridimensional care reprezintă înălțimea, lățimea și canalele de culoare.
Aici devine interesant. Când faci această conversie, părăsești complet ecosistemul Pillow. Array-ul rezultat nu conține nimic din metadata din Pillow. Setările de DPI, datele EXIF, profilele de culoare ICC și paletele de culori sunt complet eliminate. Rămâi cu valori numerice pure, raw, ale pixelilor. Dacă imaginea ta originală era bazată pe paletă, cum ar fi un fișier GIF, trebuie să o convertești într-o imagine RGB în interiorul Pillow înainte de a o pasa către Numpy. Altfel, vei obține doar un array de numere de index de paletă fără sens, în loc de culori reale.
Odată ce pixelii tăi sunt sub formă de array, framework-ul tău poate rula operațiile cu tensori, poate aplica filtre sau poate executa un model de computer vision. Dar, în cele din urmă, primești un rezultat înapoi. Un model ar putea da ca output un nou array care reprezintă o imagine generată sau o mască de segmentare. Pentru a vizualiza sau salva acest rezultat, trebuie să traversezi podul în direcția opusă. Iei acel output array și îl pasezi funcției Pillow numite from array. Pillow citește shape-ul și tipul de date ale array-ului Numpy pentru a-și da seama cum să interpreteze numerele. Dacă vede un array de întregi unsigned pe opt biți cu trei canale, creează implicit o imagine RGB. Dacă vede un singur canal, creează o imagine grayscale. De asemenea, ai opțiunea de a pasa explicit color mode-ul dacă trebuie să faci override la comportamentul default. După ce Pillow reconstruiește obiectul imagine, trebuie doar să apelezi metoda save pentru a-l scrie direct pe hard disk.
Mutarea memoriei între diferite library-uri poate fi costisitoare. Dacă procesezi un dataset masiv de imagini high-resolution, copierea datelor pixelilor înainte și înapoi creează un bottleneck semnificativ. Pentru a rezolva asta, Pillow suportă formatul Apache Arrow printr-o funcție numită from arrow. Arrow este un standard pentru date in-memory. Când folosești funcția from arrow, Pillow construiește o imagine direct din structura de date Arrow folosind zero-copy shared memory. Asta înseamnă că Pillow și celelalte tool-uri ale tale pointează exact către aceeași locație fizică de memorie. Datele nu sunt niciodată duplicate. Este o modalitate extrem de eficientă de a introduce volume mari de pixeli în pipeline-uri moderne fără a epuiza memoria sistemului.
Adevărata putere a unui imaging library într-un AI stack nu constă doar în deschiderea fișierului, ci în a se da la o parte cu grație pentru ca matematica să se poată întâmpla. Mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.