הגדלת כמות התמונות ללמידת מכונה באמצעות augmentation

מחבר:
בתאריך:

אחת הבעיות העיקריות באימון רשתות נוירונויות הוא מחסור בדוגמאות שמהם הרשת אמורה ללמוד. לדוגמה, אם אנחנו רוצים להציב מצלמות ביערות מזרח אסיה במטרה לזהות מין נמר שחור נכחד אז תהיה לנו בעיה כי אין לנו כמעט תמונות של נמרים שחורים באסיה. וגם לגבי דוגמאות שימוש יותר קונבנציונליות ייתכן שהמידע הזמין לנו הוא מצומצם מכדי לספק לנו תוצאות מדויקות כתוצאה מאימון הרשת הנוירונית.

אחת הדרכים שבאמצעותה ניתן להרחיב את מאגר המידע ממנו יכולה ללמוד הרשת הנוירונית היא באמצעות גישה של augmentation, ולשמחתנו Keras מציעה את הפונקציה ImageDataGenerator שיכולה להפיק תמונות מגוונות ושונות זו מזו על בסיס תמונה מקורית שנספק לה. המגוון בא לידי ביטוי בשינויים ויזואליים דוגמת סיבוב, צביעה, בהירות וחדות. כך נוכל באמצעות פקודה אחת פשוטה להגדיל את כמות התמונות היכולות לשמש לאימון הרשת הנוירונית בסדרי גודל.

 

יבוא ספריות הקוד הבסיסיות שישמשו במדריך

import numpy as np
import matplotlib.pyplot as plt
  • Numpy משמשת לביצוע חישובים מהירים על מערכים וטנסורים.
  • Matplotlib תשמש אותנו להציג את התמונה שנזין לפונקציה של Keras שתבצע את האוגמנטציה כמו גם את הפלט של התמונות שנקבל כתוצאה מהתהליך.

 

הפונקציה של Keras שמבצעת את האוגמנטציה

from keras.preprocessing.image import ImageDataGenerator
# Keras function to augment the image
image_gen = ImageDataGenerator(rotation_range=30,
         width_shift_range=0.1,
         height_shift_range=0.1,
         shear_range=0.15,
         zoom_range=[0.9, 1.1],
         horizontal_flip=True,
         vertical_flip=False,
         fill_mode='reflect',
         data_format='channels_last',
         brightness_range=[0.5, 1.5])

הפרמטרים שהפונקציה מקבלת כוללת את השינויים שהפונקציה תפעיל באקראי כדי להפיק את מגוון התמונות. לדוגמה, מידת מיקוד (זום), הפיכה לרוחב ולאורך של התמונות, מידת השינוי של הבהירות, ועוד.

 

3. טעינת התמונה המקורית

נגדיר את נתיב התמונה:

img_path = './marilyn_monroe.jpg';

נוודא שהיא אכן נמצאת היכן שאנחנו מצפים שתהיה:

from pathlib import Path
my_file = Path(img_path)
if my_file.is_file():
    print('OK')
else:
    print('No image')

נייבא את התמונה באופן שאחר כך נוכל להזין ל-Keras:

from scipy import ndimage
# Obtain image from disk : ndimage.imread()
# Make the image dimensions for use with our code : np.expand_dims()
img = np.expand_dims(ndimage.imread(img_path),0)

 

נציג את התמונה:

plt.imshow(img[0])

התמונה שעליה נעשה אוגמנטציה באמצעות Keras

 

3. נפיק את מגוון התמונות מהתמונה המקורית

# Generate batches of augmented images from the original image
aug_iter = image_gen.flow(img)
# Get 9 samples of augmented images
aug_images = [next(aug_iter)[0].astype(np.uint8) for i in range(9)]

מגוון התמונות מאוחסנות עכשיו בתוך הרשימה aug_images

נשתמש בפונקציה פשוטה שכתבתי כדי להציג את 9 התמונות שהפקנו באמצעות טבלה:

# Plot the augmented images with the help of a function
def plot_images(images, rows=1, cols=1):
    f, axarr = plt.subplots(rows,cols)

    counter = 0
    for r in range(rows):
        for c in range(cols):
            axarr[r,c].imshow(images[counter])
            counter = counter+1


plot_images(aug_images, 3, 3)

9 התמונות שנוצרו בתהליך האוגמנטציה

 

לסיכום

בכלל לא משנה מה הסיבה שאתה צריך יותר תמונות כדי לאמן את הרשת הנוירונית שלך, הפונקציה ImageDataGenerator יכולה להגדיל את מסד התמונות שעומד לרשותך בסדרי גודל באופן פשוט מאוד.

לכל המדריכים בנושא של למידת מכונה

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים