How does resizing a picture work?

Antrenamentul Perfect pentru Datele Tale Vizuale în Keras

06/05/2024

Rating: 4.97 (3074 votes)

În lumea fitness-ului, știm cu toții că un antrenament bine structurat și o pregătire adecvată a corpului sunt esențiale pentru a atinge performanțe de top. La fel se întâmplă și în inteligența artificială, în special când vorbim despre viziune computerizată și rețele neuronale convoluționale. Pentru ca modelele noastre să fie robuste și eficiente, este crucial să pregătim datele de intrare într-un mod optim. Două dintre cele mai importante tehnici în acest sens sunt redimensionarea imaginilor și augmentarea datelor.

How do I resize a dataset using Keras in imagedatagenerator?
As Keras did in ImageDataGenerator, it's better to do it batch by batch. As far as I know, there're 2 ways to achieve this other than operating the whole dataset: You can use Lambda Layer to create a layer and then feed original training data to it. The output is the resized you need.

Acest ghid detaliază diverse metode și strategii pentru a gestiona dimensiunea imaginilor și a crește diversitatea setului tău de date folosind Keras și TensorFlow, transformându-ți imaginile într-o "sală de antrenament" plină de oportunități pentru modelul tău.

Cuprins

De Ce Este Redimensionarea Imaginilor Crucială?

Imaginați-vă că încercați să construiți un robot care să recunoască fructe. Dacă îi arătați când o imagine mică, când una uriașă, când una alungită, când una turtită, fără o anumită coerență, robotul va fi confuz. Modelele de învățare automată funcționează similar: ele au nevoie de intrări de o formă consistentă. Seturile de date de imagini conțin adesea imagini de dimensiuni și proporții variate, dar rețelele neuronale necesită ca toate imaginile dintr-un "lot" (batch) să aibă aceleași dimensiuni (înălțime și lățime) pentru a putea fi procesate eficient.

Redimensionarea imaginilor la o dimensiune țintă uniformă este, prin urmare, un pas fundamental în preprocesarea datelor, asigurând că modelul primește intrări standardizate, indiferent de dimensiunea originală a imaginii.

Redimensionarea cu ImageDataGenerator

Una dintre cele mai populare metode pentru a încărca și preprocesa imagini în Keras este `ImageDataGenerator`. Când lucrezi cu imagini stocate în directoare, `flow_from_directory(directory)` este funcția ideală. Aceasta nu doar generează imagini augmentate, ci necesită și parametrul `target_size`.

De ce este `target_size` necesar aici? Deoarece `flow_from_directory` citește imagini din fișiere, care pot avea dimensiuni arbitrare. Pentru a le aduce la o formă uniformă înainte de a le introduce în model, `target_size` specifică dimensiunea (lățime, înălțime) la care toate imaginile vor fi redimensionate. Astfel, indiferent dacă imaginea originală este 640x480 sau 1920x1080, ea va fi transformată la, să zicem, 224x224 pixeli.

How do I resize a keras image?
You should use `dataset.take(k).cache().repeat()` instead. You can use the Keras preprocessing layers to resize your images to a consistent shape (with tf.keras.layers.Resizing), and to rescale pixel values (with tf.keras.layers.Rescaling). Note: The rescaling layer above standardizes pixel values to the [0, 1] range.

Pe de altă parte, dacă lucrezi cu imagini deja stocate în memorie sub formă de matrici NumPy (de exemplu, `X` și `y`), folosind `flow(X, y)`, nu este nevoie de parametrul `target_size`. Acest lucru se datorează faptului că poți preprocesa și redimensiona cu ușurință aceste matrici NumPy înainte de a le trimite către generator. Instrumente precum `scipy.misc.imresize`, `PIL.Image.resize` sau `cv2.resize` sunt adesea preferate pentru operațiile pe date NumPy.

Redimensionarea cu Straturi de Preprocesare Keras

TensorFlow și Keras oferă straturi de preprocesare dedicate, care pot fi integrate direct în model sau aplicate setului de date, oferind o flexibilitate sporită:

  • `tf.keras.layers.Resizing(IMG_SIZE, IMG_SIZE)`: Acest strat redimensionează imaginile la o înălțime și lățime specificate.
  • `tf.keras.layers.Rescaling(1./255)`: Pe lângă redimensionare, este adesea necesară și scalarea valorilor pixelilor. Majoritatea imaginilor au valori de pixel între 0 și 255. Scalarea acestora la un interval între 0 și 1 (sau -1 și 1) ajută la stabilizarea antrenamentului modelului. De exemplu, `1./255` normalizează pixelii în intervalul [0, 1].

Aceste straturi pot fi combinate într-un `tf.keras.Sequential` pentru a forma o conductă de preprocesare eficientă:

resize_and_rescale = tf.keras.Sequential([
layers.Resizing(IMG_SIZE, IMG_SIZE),
layers.Rescaling(1./255)
])

Redimensionarea Inteligentă: Păstrarea Proporțiilor

O simplă redimensionare, cum ar fi `tf.image.resize(img, size)`, poate distorsiona raportul de aspect al imaginilor dacă dimensiunea țintă (`size`) nu are același raport de aspect ca imaginea originală. Acest lucru poate fi problematic în anumite cazuri, cum ar fi modelele de generare de imagini, unde distorsiunea este inacceptabilă.

Aici intervine `tf.keras.preprocessing.image.smart_resize`. Această funcție redimensionează imaginile la o dimensiune țintă fără distorsiuni ale raportului de aspect. Cum funcționează? Procesul este în doi pași:

  1. Se ia cea mai mare decupare centrată a imaginii care are același raport de aspect ca dimensiunea țintă. De exemplu, dacă dimensiunea țintă este (200, 200) și imaginea de intrare are dimensiunea (340, 500), se ia o decupare de (340, 340) centrată pe lățime.
  2. Imaginea decupată este apoi redimensionată la dimensiunea țintă. În exemplul de mai sus, decuparea (340, 340) este redimensionată la (200, 200).

Astfel, imaginile de ieșire vor avea dimensiunea exactă (200, 200), fără a fi distorsionate, iar părțile imaginii care nu se încadrează în dimensiunea țintă sunt pur și simplu decupate.

Tabel Comparativ: Redimensionare Simplă vs. Redimensionare Inteligentă

Caracteristicătf.image.resize() (fără preserve_aspect_ratio)tf.keras.preprocessing.image.smart_resize()
Păstrează raportul de aspectNu (poate distorsiona)Da (prin decupare)
Dimensiune ieșireExact dimensiunea țintăExact dimensiunea țintă
Gestionare conținutComprimă/întinde imagineaDecupează părțile care nu se potrivesc
Cazuri de utilizareCând distorsiunea este acceptabilă sau necesarăCând păstrarea proporțiilor este crucială (e.g., generare, recunoaștere facială)

Augmentarea Datelor: Antrenamentul Intensiv pentru Modelul Tău

După ce am asigurat o dimensiune consistentă a imaginilor, pasul următor este să le facem mai "rezistente" și mai "adaptabile". Aici intervine augmentarea datelor. Aceasta este o tehnică puternică pentru a crește diversitatea setului de antrenament prin aplicarea de transformări aleatorii (dar realiste), cum ar fi rotația, răsturnarea, modificarea luminozității sau a contrastului.

De ce este importantă augmentarea? Gândiți-vă la un sportiv care se antrenează doar într-un singur tip de condiții. Când va fi pus într-o situație nouă (vânt, ploaie, teren diferit), performanța sa ar putea scădea. La fel, un model antrenat pe un set de date limitat, fără variații, poate suferi de supraantrenare (overfitting). Aceasta înseamnă că modelul învață prea bine detaliile specifice ale datelor de antrenament, dar nu reușește să generalizeze pe date noi, nevăzute. Augmentarea previne supraantrenarea, făcând modelul mai robust și mai capabil să generalizeze.

How do you resize an image?
The resizing process is: Take the largest centered crop of the image that has the same aspect ratio as the target size. For instance, if size = c (200, 200) and the input image has size (340, 500), we take a crop of (340, 340) centered along the width. Resize the cropped image to the target size.

Augmentarea cu Straturi de Preprocesare Keras

Keras oferă o suită de straturi de preprocesare dedicate augmentării datelor:

  • `tf.keras.layers.RandomFlip("horizontal_and_vertical")`: Răstoarnă imaginile orizontal și/sau vertical.
  • `tf.keras.layers.RandomRotation(0.2)`: Rotește imaginile aleatoriu cu un anumit factor (aici, 20% din 2π radiani).
  • `tf.keras.layers.RandomContrast`: Ajustează contrastul.
  • `tf.keras.layers.RandomCrop`: Decupează aleatoriu o porțiune din imagine.
  • `tf.keras.layers.RandomZoom`: Aplică un zoom aleatoriu.

Aceste straturi pot fi, de asemenea, combinate într-un `Sequential` și aplicate imaginii:

data_augmentation = tf.keras.Sequential([
layers.RandomFlip("horizontal_and_vertical"),
layers.RandomRotation(0.2),
])

Augmentarea Personalizată: Control Total

Pentru un control mai fin sau pentru transformări specifice, puteți crea straturi de augmentare personalizate. Acest lucru se poate face în două moduri:

  • Folosind `tf.keras.layers.Lambda`: O modalitate concisă de a încapsula o funcție arbitrară într-un strat Keras. Utile pentru operații simple.
  • Subclasând `tf.keras.layers.Layer`: Oferă cel mai mare control, permițându-vă să definiți logica de inițializare (`__init__`) și logica de apelare (`call`) a stratului.

Ambele abordări vă permit să implementați transformări unice, cum ar fi inversarea aleatorie a culorilor, bazată pe o anumită probabilitate.

Utilizarea Utilităților `tf.image` pentru Augmentare

Pentru un control și mai precis, puteți utiliza direct utilitățile `tf.image`. Acestea oferă funcții pentru operații specifice pe imagini:

  • `tf.image.flip_left_right(image)`: Răstoarnă imaginea orizontal.
  • `tf.image.rgb_to_grayscale(image)`: Convertește imaginea în tonuri de gri.
  • `tf.image.adjust_saturation(image, factor)`: Saturează imaginea.
  • `tf.image.adjust_brightness(image, delta)`: Modifică luminozitatea.
  • `tf.image.central_crop(image, central_fraction)`: Decupează o porțiune centrală.
  • `tf.image.rot90(image)`: Rotește imaginea cu 90 de grade.

Pentru transformări aleatorii, `tf.image` oferă operații "stateless" (fără stare), cum ar fi `tf.image.stateless_random_brightness`, `tf.image.stateless_random_contrast`, `tf.image.stateless_random_crop`. Acestea sunt funcționale pure, adică ieșirea depinde doar de intrare, și necesită o valoare `seed` (o tuplă de două numere întregi) la fiecare pas pentru a asigura reproductibilitatea. Această abordare este preferată față de vechile operații `tf.image.random*`.

Integrarea Redimensionării și Augmentării în Modelul Tău

Există două modalități principale de a integra aceste straturi de preprocesare și augmentare în fluxul de lucru al modelului tău Keras, fiecare cu avantaje și dezavantaje:

Opțiunea 1: Straturile de Preprocesare ca Parte a Modelului

În această abordare, straturile de `Resizing`, `Rescaling` și `DataAugmentation` sunt incluse direct în arhitectura modelului tău:

model = tf.keras.Sequential([
resize_and_rescale,
data_augmentation,
layers.Conv2D(16, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
# Restul modelului tău...
])

Avantaje:

  • Accelerație GPU: Augmentarea datelor se execută pe dispozitiv (GPU), sincronizat cu restul straturilor, beneficiind de accelerarea hardware.
  • Portabilitate: Când exportați modelul (cu `model.save`), straturile de preprocesare sunt salvate împreună cu modelul. Aceasta înseamnă că modelul va standardiza automat imaginile la inferență, economisind efortul de a reimplementa logica de preprocesare pe partea de server.
  • Inactivitate la testare: Augmentarea datelor este inactivă în timpul testării, deci imaginile de intrare vor fi augmentate doar în timpul apelurilor `Model.fit` (nu `Model.evaluate` sau `Model.predict`).

Opțiunea 2: Aplicarea Straturilor de Preprocesare la Setul de Date

Această metodă implică aplicarea straturilor de preprocesare direct setului de date, folosind `Dataset.map`:

aug_ds = train_ds.map(lambda x, y: (resize_and_rescale(x, training=True), y))

Avantaje:

  • Procesare asincronă pe CPU: Augmentarea datelor are loc asincron pe CPU și nu blochează antrenamentul modelului pe GPU. Puteți suprapune antrenamentul modelului pe GPU cu preprocesarea datelor, folosind `Dataset.prefetch`.

Dezavantaje:

  • Straturile de preprocesare nu vor fi exportate cu modelul la `model.save`. Va trebui să le atașați modelului înainte de salvare sau să le reimplementați pe partea de server la inferență.

Tabel Comparativ: Integrarea Straturilor de Preprocesare

CaracteristicăStraturi parte a modeluluiStraturi aplicate setului de date
Locul execuțieiPe dispozitiv (GPU)Asincron pe CPU
Impact asupra performanțeiBeneficiază de accelerare GPUPermite suprapunerea preprocesării cu antrenamentul
Portabilitate modelIncluse la salvarea modeluluiNu sunt incluse la salvarea modelului
FlexibilitateSimplu de implementatNecesită gestionarea manuală a preprocesării la inferență

Optimizarea Performanței cu `tf.data`

Pentru a asigura o "dietă" bogată și eficientă de date pentru modelul tău, este esențial să optimizezi conductele de date folosind API-ul `tf.data`. Tehnici precum încărcarea paralelă și prefetching-ul (preluarea anticipată în memorie) pot reduce semnificativ timpii de așteptare:

  • `num_parallel_calls=AUTOTUNE`: Permite execuția paralelă a transformărilor pe mai multe nuclee CPU.
  • `ds.prefetch(buffer_size=AUTOTUNE)`: Preluarea anticipată a datelor în buffer, astfel încât GPU-ul să nu aștepte niciodată după CPU. Acesta este un aspect crucial pentru eficiență, similar cu modul în care un sportiv își planifică mesele pentru a avea energie constantă.

Augmentarea datelor trebuie aplicată doar setului de antrenament, nu și seturilor de validare sau testare, pentru a asigura o evaluare imparțială a performanței modelului pe date reale.

Întrebări Frecvente (FAQ)

1. De ce trebuie să redimensionez imaginile înainte de a le antrena un model?

Modelele de învățare profundă, în special rețelele neuronale convoluționale, necesită intrări de o dimensiune uniformă. Imaginile din seturile de date pot proveni din surse variate și pot avea dimensiuni diferite. Redimensionarea standardizează aceste imagini la o dimensiune fixă, permițând gruparea lor în loturi (batches) și procesarea eficientă de către model. Fără redimensionare, modelul nu ar ști ce formă de intrare să aștepte.

2. Ce este augmentarea datelor și de ce este importantă?

Augmentarea datelor este o tehnică prin care se creează noi exemple de antrenament prin aplicarea de transformări realiste (cum ar fi rotații, răsturnări, modificări de luminozitate, zoom) imaginilor existente. Este importantă deoarece:

  • Previne supraantrenarea (overfitting): Modelul învață să generalizeze mai bine, fiind expus la variații ale imaginilor, în loc să memoreze doar exemplele exacte din setul de antrenament.
  • Crește diversitatea setului de date: Este utilă mai ales când setul de date original este mic, oferind modelului mai multe "unghiuri" din care să învețe.
  • Îmbunătățește robustețea modelului: Modelul devine mai rezistent la variații minore ale imaginilor din lumea reală.

3. Când ar trebui să folosesc straturile Keras de preprocesare versus funcțiile `tf.image` pentru augmentare?

Straturile Keras de preprocesare (`layers.RandomFlip`, `layers.RandomRotation`, etc.) sunt ideale pentru o integrare rapidă și ușoară, mai ales dacă doriți ca preprocesarea să facă parte din graficul modelului (ceea ce ajută la salvarea și implementarea modelului). Ele sunt convenabile și adesea suficient de flexibile.

How do I resize a dataset using Keras in imagedatagenerator?
As Keras did in ImageDataGenerator, it's better to do it batch by batch. As far as I know, there're 2 ways to achieve this other than operating the whole dataset: You can use Lambda Layer to create a layer and then feed original training data to it. The output is the resized you need.

Funcțiile `tf.image` (`tf.image.flip_left_right`, `tf.image.adjust_brightness`, etc.) oferă un control mai granular și sunt utile atunci când construiți conducte de date personalizate complexe sau când aveți nevoie de operații specifice care nu sunt direct disponibile ca straturi Keras predefinite. De asemenea, sunt esențiale pentru implementarea transformărilor aleatorii "stateless" cu un control explicit al seminței (seed).

4. Cum funcționează `smart_resize` și de ce este preferabilă redimensionării simple?

`tf.keras.preprocessing.image.smart_resize` redimensionează o imagine la o dimensiune țintă fără a-i distorsiona raportul de aspect. Aceasta realizează acest lucru prin două etape:

  1. Decupează o porțiune centrată din imaginea originală care are același raport de aspect ca dimensiunea țintă.
  2. Redimensionează această decupare la dimensiunea țintă.

Este preferabilă redimensionării simple (`tf.image.resize` fără `preserve_aspect_ratio`) deoarece redimensionarea simplă poate comprima sau întinde imaginea, distorsionând obiectele și caracteristicile importante. `smart_resize` păstrează proporțiile, asigurând că obiectele din imagine își mențin forma originală, chiar dacă unele părți ale imaginii sunt decupate.

5. Augmentarea datelor încetinește antrenamentul modelului?

Da, augmentarea datelor introduce calcule suplimentare (transformările imaginilor), ceea ce poate adăuga un overhead de timp procesului de antrenament. Însă, impactul depinde de modul în care este implementată:

  • Dacă este făcută pe CPU și se folosește `tf.data.Dataset.map` cu `num_parallel_calls` și `prefetch`, procesarea datelor poate fi suprapusă cu antrenamentul pe GPU, minimizând timpii morți.
  • Dacă straturile de augmentare sunt integrate direct în model și se rulează pe GPU, ele beneficiază de accelerarea hardware, dar pot adăuga o ușoară întârziere per pas de antrenament.

În general, beneficiile augmentării (model mai robust, generalizare mai bună, prevenirea supraantrenării) depășesc cu mult costul mic al timpului suplimentar de antrenament. Este o investiție care se amortizează prin performanța superioară a modelului.

Concluzie

Așa cum un antrenor de fitness știe că pregătirea corpului este cheia succesului, la fel și un specialist în învățare automată înțelege importanța pregătirii datelor. Redimensionarea și augmentarea imaginilor nu sunt doar pași opționali, ci tehnici fundamentale pentru a construi modele de viziune computerizată eficiente și robuste. Prin aplicarea corectă a acestor metode, fie că folosiți `ImageDataGenerator`, straturi de preprocesare Keras, sau utilități `tf.image`, veți oferi modelului dumneavoastră "antrenamentul" de care are nevoie pentru a performa la cel mai înalt nivel. Investiția în preprocesarea datelor este, fără îndoială, o investiție în succesul proiectelor dumneavoastră de inteligență artificială.

Dacă vrei să descoperi și alte articole similare cu Antrenamentul Perfect pentru Datele Tale Vizuale în Keras, poți vizita categoria Fitness.

Go up