Cześć, tu Alex z DEV STORIES DOT EU. Pillow: The Imaging Library, odcinek 4 z 5. Frameworki do machine learningu, takie jak PyTorch czy TensorFlow, tak naprawdę nie wiedzą, czym jest JPEG czy PNG. Rozumieją tylko matematykę, co oznacza, że rozumieją tylko wielowymiarowe arraye. Jeśli przekażesz plik obrazu bezpośrednio do modelu, dostaniesz błąd. Potrzebujesz sposobu, żeby przetłumaczyć te zakodowane bajty na czysty format matematyczny. The Array Bridge: Moving Pixels to PyTorch to dokładnie to, jak możesz to rozwiązać.
Pillow działa jak uniwersalny translator w stacku AI. Kiedy otwierasz obraz za pomocą Pillow, dostajesz obiekt Image. Żeby wrzucić go do pipeline'u danych, przekazujesz ten obiekt Pillow bezpośrednio do
Numpy, używając funkcji as array. Pod spodem Pillow wystawia standardowy buffer interface. Numpy odczytuje ten memory buffer i opakowuje go w wielowymiarowy array. Dla standardowej, kolorowej fotografii dostajesz trójwymiarowy array reprezentujący wysokość, szerokość i kanały kolorów.
I tu robi się ciekawie. Kiedy robisz tę konwersję, całkowicie opuszczasz ekosystem Pillow. Wynikowy array nie zawiera żadnych metadanych z Pillow. Ustawienia DPI, dane EXIF, profile kolorów ICC i palety kolorów są całkowicie usuwane. Zostajesz z czystymi, surowymi wartościami liczbowymi pikseli. Jeśli twój oryginalny obraz był oparty na palecie, jak plik GIF, musisz go przekonwertować na obraz RGB wewnątrz Pillow, zanim przekażesz go do Numpy. W przeciwnym razie dostaniesz po prostu array bezsensownych numerów indeksów palety zamiast rzeczywistych kolorów.
Kiedy twoje piksele są już w formie arraya, twój framework może odpalić swoje operacje na tensorach, nałożyć filtry albo wykonać model computer vision. Ale w końcu dostajesz wynik z powrotem. Model może zwrócić nowy array reprezentujący wygenerowany obraz albo maskę segmentacji. Żeby zobaczyć lub zapisać ten wynik, musisz przejść przez most w odwrotnym kierunku. Bierzesz ten wyjściowy array i przekazujesz go do funkcji Pillow o nazwie from array. Pillow odczytuje shape i typ danych arraya Numpy, żeby ogarnąć, jak zinterpretować te liczby. Jeśli zobaczy array ośmiobitowych intów bez znaku z trzema kanałami, domyślnie tworzy obraz RGB. Jeśli zobaczy pojedynczy kanał, tworzy obraz w skali szarości. Masz też opcję, żeby jawnie przekazać tryb kolorów samemu, jeśli musisz nadpisać domyślne zachowanie. Kiedy Pillow zrekonstruuje obiekt Image, po prostu wywołujesz metodę save, żeby zapisać go prosto na dysk twardy.
Przenoszenie pamięci między różnymi bibliotekami może być kosztowne. Jeśli przetwarzasz ogromny dataset obrazów w wysokiej rozdzielczości, kopiowanie danych pikseli w tę i z powrotem tworzy poważny bottleneck. Żeby to rozwiązać, Pillow wspiera format Apache Arrow poprzez funkcję o nazwie from arrow. Arrow to standard dla danych in-memory. Kiedy używasz funkcji from arrow, Pillow konstruuje obraz bezpośrednio ze struktury danych Arrow, używając pamięci współdzielonej zero-copy. To oznacza, że Pillow i twoje inne narzędzia wskazują na dokładnie tę samą fizyczną lokalizację w pamięci. Dane nigdy nie są duplikowane. To bardzo wydajny sposób, żeby wrzucać duże ilości pikseli do nowoczesnych pipeline'ów bez wyczerpywania pamięci systemowej.
Prawdziwa moc biblioteki do obsługi obrazów w stacku AI nie polega tylko na otwieraniu pliku, ale na zgrabnym usunięciu się z drogi, żeby matematyka mogła się zadziać. Dzięki za spędzenie ze mną tych kilku minut. Do usłyszenia następnym razem, trzymaj się.