תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

הגדלת כמות התמונות ללמידת מכונה באמצעות 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 כוכבים

 

 

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

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

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

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

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך קוראים בעברית לצ`ופצ`יק של הקומקום?

 

תמונת המגיב

יש מצב שיש טעות בפונקציה? בתאריך: 30.07.2019

נקודה או מקף תחתון
from keras.preprocessing.image import ...
from keras_preprocessing.image import ...