v12.1 — Ediția 2026. Un ghid concis despre utilizarea Pillow pentru procesarea imaginilor și modul în care se integrează în proiecte mai mari de AI și machine learning (v12.1 - 2026).
Explorăm clasa Image din Pillow și modul în care aceasta acționează ca o poartă către setul tău de date pentru computer vision. Vei învăța cum să deschizi imagini și să extragi metadate instantaneu folosind lazy loading.
4m 02s
2
Standardizarea tensorilor: Moduri de imagine și conversii
Înțelegerea modurilor de imagine este critică înainte de a introduce date într-o rețea neuronală. Analizăm diferența dintre canalele Grayscale, RGB și RGBA și modul în care poți folosi metoda convert pentru a-ți standardiza datele de intrare.
4m 33s
3
Geometrie pentru modele: Redimensionare, decupare și padding
Abordăm problema remodelării imaginilor pentru intrări de model cu dimensiuni stricte. Vei învăța diferența dintre turtirea unei imagini cu resize, decuparea cu fit și adăugarea de benzi negre (letterboxing) cu pad.
3m 58s
4
Puntea Array: Mutarea pixelilor în PyTorch
Pillow acționează ca o punte între fișierele de imagine brute și array-urile matematice. Acoperim modul de traducere a imaginilor în tensori NumPy și formate PyArrow, precum și modul de conversie a ieșirilor modelului înapoi în imagini vizibile.
4m 21s
5
Augmentare ușoară: Modulul ImageOps
Nu ai întotdeauna nevoie de biblioteci grele pentru a-ți augmenta setul de date. Explorăm modulul ImageOps din Pillow pentru a aplica mirror, flip și a ajusta cu ușurință contrastul, cu scopul de a-ți extinde artificial datele de antrenament.
3m 55s
Episoade
1
Poarta către viziune: Lazy Loading și metadate
4m 02s
Explorăm clasa Image din Pillow și modul în care aceasta acționează ca o poartă către setul tău de date pentru computer vision. Vei învăța cum să deschizi imagini și să extragi metadate instantaneu folosind lazy loading.
Salut, sunt Alex de la DEV STORIES DOT EU. Pillow: The Imaging Library, episodul 1 din 5. Poți scana un dataset de un milion de imagini în câteva secunde fără să-ți umpli memoria. Secretul este că librăria ta nu încarcă de fapt datele pixelilor decât în ultimul moment posibil. The Vision Gateway: Lazy Loading și Metadata este mecanismul care face posibilă gestionarea unor directoare masive de imagini.
Când construiești un dataset AI, începi adesea cu un web scrape necurățat. Te uiți la un director cu milioane de fișiere necunoscute. Trebuie să le filtrezi înainte de training. Să zicem că modelul tău necesită imagini de exact 512 pe 512 pixeli, salvate ca JPEG-uri, full color. O concepție greșită comună este că deschiderea unui fișier imagine într-un script va încărca imediat fiecare pixel în memorie. Dacă asta ar fi adevărat, scanarea unui milion de imagini high-resolution ar consuma cantități masive de RAM și, în cele din urmă, ți-ar da crash la sistem. În schimb, Pillow gestionează asta folosind un concept numit lazy loading.
Entry point-ul pentru citirea unei imagini în Pillow este funcția open, situată în modulul Image. Îi pasezi acestei funcții un file path, iar ea returnează un obiect Image. Aici este ideea cheie. Apelarea funcției open nu decodează datele raster. Ea doar deschide fișierul pe disc și citește header-ul fișierului. Header-ul conține fix atâtea informații cât să identifice fișierul și să-i înțeleagă geometria de bază. Greul propriu-zis al decompresiei și mapării datelor pixelilor este amânat.
Pentru că Pillow citește header-ul imediat, scriptul tău primește acces instant la metadata imaginii. Aceste metadata sunt stocate ca atribute pe obiectul Image. Sunt trei atribute principale pe care le vei folosi pentru a evalua fișierele. Primul este atributul format. Acesta identifică tipul fișierului sursă, returnând un string precum JPEG sau PNG. Al doilea este atributul size. Acesta returnează un tuple cu două elemente care conține lățimea și înălțimea imaginii în pixeli. Al treilea este atributul mode. Mode definește numărul și numele benzilor de pixeli din imagine, cum ar fi RGB pentru culori standard, RGBA pentru culori cu transparență, sau litera L pentru grayscale.
Cu aceste trei atribute, data engineer-ul nostru poate procesa în siguranță acel web scrape masiv. El scrie un loop care apelează funcția open pe fiecare fișier din director. Scriptul verifică metadata. Formatul este egal cu JPEG? Dimensiunea este egală cu 512 pe 512? Mode-ul este egal cu RGB? Dacă fișierul pică oricare dintre aceste verificări, scriptul îl ignoră și merge mai departe.
Pillow lasă datele pixelilor complet în pace pe parcursul întregului proces. Datele raster sunt decodate și încărcate în memorie doar dacă codul tău apelează în cele din urmă o metodă care îl forțează să acționeze asupra pixelilor, cum ar fi cropping-ul imaginii sau aplicarea unui filtru vizual. Pentru sutele de mii de imagini incorecte din director, acea extragere a pixelilor nu are loc niciodată. Memory footprint-ul rămâne minuscul. Scriptul tău procesează directorul la fel de repede cum poate unitatea ta de stocare să citească acele mici headere de fișiere.
Lazy loading-ul transformă funcția open dintr-o operațiune grea de randare într-un scanner de metadata extrem de eficient, menținându-ți pipeline-urile de date rapide și utilizarea memoriei constantă. Dacă vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mulțumesc pentru ascultare și continuă să construiești!
2
Standardizarea tensorilor: Moduri de imagine și conversii
4m 33s
Înțelegerea modurilor de imagine este critică înainte de a introduce date într-o rețea neuronală. Analizăm diferența dintre canalele Grayscale, RGB și RGBA și modul în care poți folosi metoda convert pentru a-ți standardiza datele de intrare.
Salut, sunt Alex de la DEV STORIES DOT EU. Pillow: The Imaging Library, episodul 2 din 5. Lași un vision model la antrenat peste noapte, doar ca să te trezești și să vezi că loop-ul a dat crash cu ore în urmă. Vinovatul a fost o singură imagine încărcată de un user, formatată puțin diferit față de restul. Rezolvarea acestei inconsistențe înainte să ajungă la modelul tău este rolul Standardizării Tensorilor: Image Modes și Conversii.
Rețelele neuronale sunt rigide. Dacă layer-ul tău convoluțional așteaptă un input tensor cu trei canale de culoare, iar tu îi dai o imagine cu patru canale, sau cu un singur canal, matematica se strică și pipeline-ul se oprește. În computer vision, standardizarea formatelor datelor de imagine este un pas obligatoriu de pre-processing.
Ca să gestionezi asta în Pillow, trebuie să înțelegi două proprietăți conectate: bands și modes. O imagine în Pillow este formată din unul sau mai multe bands de date. Te poți gândi la un band ca la un array bidimensional distinct care conține o componentă specifică a imaginii. De exemplu, valorile de roșu din întreaga imagine formează un singur band. Pillow permite existența mai multor bands într-un singur obiect imagine, atâta timp cât au aceleași dimensiuni și aceeași adâncime.
Un mode este un string care definește tipul și adâncimea unui pixel din imagine. Acest mode îi spune lui Pillow exact ce înseamnă acele bands subiacente. Există trei modes pe care le vei întâlni constant în pipeline-urile de machine learning. Mode L vine de la luminanță. Aceasta este o imagine grayscale standard pe opt biți și conține exact un band. Mode RGB este formatul tău standard true color. Acesta cuprinde trei bands pe opt biți: roșu, verde și albastru. Apoi, există mode RGBA. Oamenii se gândesc adesea la o imagine RGBA ca la o simplă poză obișnuită cu un fundal transparent. Nu așa o tratează computerul. Matematic, o imagine RGBA posedă un al patrulea canal de date complet — canalul alpha, care dictează opacitatea fiecărui pixel în parte.
Iată partea care contează. Când un user uploadează o poză de profil PNG transparentă, acea imagine ajunge în pipeline-ul tău ca RGBA. Ea conține patru bands de date. Dacă image classifier-ul tău așteaptă un tensor RGB, dacă îi dai acel PNG raw va declanșa imediat o eroare de dimension mismatch. Trebuie să o standardizezi. Realizezi asta folosind metoda convert.
Când apelezi metoda convert pe un obiect imagine, pasezi string-ul target mode ca argument. Ca să rezolvi problema cu PNG-ul, deschizi imaginea, apoi apelezi convert pasând string-ul RGB. Apelarea metodei convert nu modifică imaginea originală in place. Ea returnează un obiect imagine nou construit care conține datele pixelilor traduși.
Procesul de conversie nu este întotdeauna o simplă ștergere a datelor în plus. Când convertești o imagine RGBA în RGB, Pillow face drop la canalul alpha, dar nu păstrează în mod magic felul în care credeai tu că arată fundalul transparent. By default, Pillow înlocuiește transparența cu negru. Dacă convertești o imagine RGB în mode L pentru un model grayscale, Pillow nu face doar o medie leneșă a celor trei color bands. Aplică o formulă matematică ponderată specifică pe canalele de roșu, verde și albastru pentru a calcula o luminanță percepută de om cu o acuratețe foarte mare. Imaginea mode L rezultată are exact un band.
Dacă apelezi convert și ceri acel mode în care imaginea se află deja, Pillow returnează pur și simplu o copie a originalului fără să irosească compute cycles. Asta înseamnă că poți rula orbește o comandă convert to RGB pe absolut fiecare fișier din dataset-ul tău, fără să-ți faci griji că le vei penaliza pe cele care sunt deja formatate corect.
Presupune întotdeauna că imaginile furnizate de useri au channel depths imprevizibile. Impunerea unei conversii stricte de mode la granița pipeline-ului tău este cea mai ieftină poliță de asigurare pe care o ai împotriva erorilor de dimensiune la runtime.
Asta e tot pentru acest episod. Mersi că m-ai ascultat și continuă să construiești!
3
Geometrie pentru modele: Redimensionare, decupare și padding
3m 58s
Abordăm problema remodelării imaginilor pentru intrări de model cu dimensiuni stricte. Vei învăța diferența dintre turtirea unei imagini cu resize, decuparea cu fit și adăugarea de benzi negre (letterboxing) cu pad.
Salut, sunt Alex de la DEV STORIES DOT EU. Pillow: The Imaging Library, episodul 3 din 5. Introduci o fotografie de pe smartphone în rețeaua ta neuronală, iar acuratețea ei scade. Problema nu sunt weights-urile sau arhitectura ta. Dacă pur și simplu turtești o fotografie dreptunghiulară într-un tensor pătrat, distorsionezi feature-urile înainte măcar ca modelul să le vadă. Acest episod acoperă Geometria pentru Modele: Resize, Crop și Padding.
Pregătești fotografii de pe smartphone pentru un model ResNet care așteaptă un input exact de 224 pe 224 de pixeli. Fotografiile din lumea reală vin în toate formele. Ai peisaje wide și portrete înalte, dar modelul tău cere un pătrat perfect. Trebuie să acoperi acest decalaj fără să distrugi datele de la bază. Cea mai frecventă greșeală este să apelezi metoda standard resize pe imagine și să îi pasezi dimensiunile de 224 pe 224. Resize este un instrument brut. Forțează imaginea în acele dimensiuni exacte și ignoră complet aspect ratio-ul original. Dacă imaginea originală era un dreptunghi lat, va fi turtită orizontal. Cercurile devin ovale înguste. Rețeaua neuronală învață din aceste forme distorsionate, ceea ce îi degradează performanța în lumea reală. Metoda resize nu dă fit inteligent unei imagini; ci doar o deformează orbește.
Pentru a evita distorsiunea, ai putea să dai crop manual imaginii. Metoda standard crop primește un tuple de patru coordonate care definește limitele left, upper, right și lower. Ai putea să calculezi pătratul central al imaginii și să dai crop la restul. Asta păstrează aspect ratio-ul și evită turtirea feature-urilor. Totuși, aruncă datele de pe margini, iar să scrii matematica pentru a calcula exact box-ul central pentru fiecare dimensiune de imagine primită este o bătaie de cap.
Iată ideea cheie. Pillow are un modul ImageOps conceput special pentru a rezolva exact această problemă de geometrie. Dacă vrei să dai crop fără să faci calculele, folosești metoda fit din ImageOps. Îi spui dimensiunea exactă pe care o vrei, cum ar fi 224 pe 224. Calculează aspect ratio-ul dimensiunii cerute, dă scale down imaginii astfel încât latura cea mai scurtă să se potrivească cu targetul tău, apoi dă crop automat la excesul din centru. Obții un pătrat perfect și zero distorsiuni, subiectul fiind de obicei păstrat fix în mijloc.
Ce faci dacă nu îți permiți să pierzi marginile imaginii? Dacă subiectul este descentrat, un center crop l-ar putea tăia în jumătate. În acest caz, treci la metoda pad din ImageOps. Pad dă scale down imaginii astfel încât latura cea mai lungă să încapă în targetul tău de 224 de pixeli. Latura mai scurtă va fi acum mai mică de 224. Pentru a compensa diferența, metoda pad adaugă margini de culoare solidă pentru a umple pătratul. Asta e cunoscută în mod obișnuit sub numele de letterboxing. Întreaga imagine originală este păstrată, aspect ratio-ul rămâne complet intact, iar modelul primește în continuare pătratul exact.
Ori de câte ori modifici dimensiunea unei imagini cu oricare dintre aceste metode, Pillow trebuie să calculeze noii pixeli. Pentru modelele de machine learning unde detaliile la nivel de pixel contează, vrei un filtru de resampling de înaltă calitate. Când apelezi fit, pad sau resize, poți pasa un argument de resampling. Un filtru precum BICUBIC este o alegere standard solidă aici. Se uită la pixelii din jur pentru a calcula tranziții line, păstrând claritatea marginilor pe care se bazează layerele tale convoluționale. O rețea neuronală poate învăța cu ușurință să ignore padding-ul negru, dar nu poate repara un feature distorsionat. Asta e tot pentru acest episod. Mersi că m-ai ascultat și continuă să construiești!
4
Puntea Array: Mutarea pixelilor în PyTorch
4m 21s
Pillow acționează ca o punte între fișierele de imagine brute și array-urile matematice. Acoperim modul de traducere a imaginilor în tensori NumPy și formate PyArrow, precum și modul de conversie a ieșirilor modelului înapoi în imagini vizibile.
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.
5
Augmentare ușoară: Modulul ImageOps
3m 55s
Nu ai întotdeauna nevoie de biblioteci grele pentru a-ți augmenta setul de date. Explorăm modulul ImageOps din Pillow pentru a aplica mirror, flip și a ajusta cu ușurință contrastul, cu scopul de a-ți extinde artificial datele de antrenament.
Salut, sunt Alex de la DEV STORIES DOT EU. Pillow: The Imaging Library, episodul 5 din 5. Imporți un framework masiv de computer vision, descărcând gigabytes de dependencies, doar ca să dai flip câtorva imagini de training. Nu ai mereu nevoie de o library greoaie și specializată pentru a construi un pipeline robust de augmentation. Uneori, tot ce îți trebuie este lightweight augmentation: modulul ImageOps.
Înainte să ne uităm la funcții, trebuie să separăm ImageOps de modulul ImageFilter. Ascultătorii le mai confundă uneori. ImageFilter aplică convolution kernels pe o imagine, calculând noi valori ale pixelilor pe baza vecinilor pentru a crea blur sau a găsi edges. ImageOps este complet diferit. Oferă operațiuni de pixel-mapping gata făcute. Acestea sunt transformări directe și rapide, care manipulează culoarea sau poziția pixelilor individuali, fără să se bazeze pe matematică complexă cu vecinii.
Dacă pregătești un dataset pentru machine learning, ImageOps îți oferă tool-uri instantanee ca să-ți multiplici datele. Ai spatial augmentations deterministe. Funcția mirror dă flip imaginii pe orizontală, inversând stânga cu dreapta. Funcția flip îi dă flip pe verticală, inversând susul cu josul. Ambele operațiuni păstrează dimensiunile exacte ale datelor originale, doar că le reorientează.
Ai, de asemenea, acces imediat la ajustări de culoare și contrast. Funcția grayscale convertește imaginea într-un format alb-negru pe opt biți. Asta se folosește frecvent pentru a reduce dimensionalitatea datelor de input, atunci când culoarea nu este relevantă pentru task-ul de clasificare. Funcția invert inversează toate canalele de culoare. Un pixel pe opt biți cu valoarea zero devine două sute cincizeci și cinci, transformând un background alb în negru și pixelii roșii în cyan. Asta este foarte eficient când generezi negative masks pentru task-uri de segmentation.
Iată ideea esențială. Funcția autocontrast este deosebit de utilă pentru standardizarea de raw datasets cu iluminare inconsistentă. Calculează o histogramă a imaginii, găsește cei mai întunecați și cei mai deschiși pixeli, și întinde range-ul de culori astfel încât cel mai întunecat pixel devine negru pur, iar cel mai deschis devine alb pur. Poți pasa un procent de cutoff funcției autocontrast. Asta îi spune lui Pillow să ignore pixelii outlier extremi, cum ar fi o reflexie puternică a soarelui, atunci când calculează noua curbă de contrast.
Gândește-te că vrei să construiești un data generator simplu pentru imagini din satelit. Fotografiile din satelit arată valid din orice orientare, așa că poți dubla în siguranță training set-ul cu spatial shifts. Scrii o funcție care ia un director de imagini. Pentru fiecare fișier, încarci imaginea. Generezi un integer random. Dacă acel integer este par, pasezi imaginea funcției mirror din ImageOps. Dacă acel integer este impar, o pasezi funcției flip. Apoi salvezi imaginea rezultată sub un nou filename, la care adaugi tipul transformării. Tocmai ți-ai multiplicat dataset-ul folosind o library standard, păstrând deployment environment-ul excepțional de light.
În loc să apelezi la pachete grele de machine learning pentru data preparation de bază, verificarea documentației oficiale pentru soluții native previne dependency bloat. Experimentarea hands-on cu aceste tool-uri built-in îți va simplifica drastic scripturile de preprocessing. Dacă vrei să sugerezi subiecte pentru o nouă serie, vizitează devstories dot eu. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
Tap to start playing
Browsers block autoplay
Share this episode
Episode
—
Copy this episode in another language:
Acest site nu folosește cookie-uri. Furnizorul nostru de hosting ar putea înregistra adresa ta IP în scopuri de analiză. Află mai multe.