מבוא לנתונים של תמונה
- 10 דקות
בראיית מחשב, בדרך כלל פותרים אחת מהבעיות הבאות:
- סיווג תמונות הוא המשימה הפשוטה ביותר, כאשר עלינו לסווג תמונה לאחת מקטגוריות מוגדרות מראש, לדוגמה, להבחין בין חתול לכלב בתמונה, או לזהות ספרה בכתב יד.
- זיהוי אובייקטים הוא משימה מעט קשה יותר, שבה צריך למצוא אובייקטים ידועים בתמונה ולמקם אותם, כלומר להחזיר את תיבת הגבול של כל אובייקט מזוהה.
- סגמנטציה דומה לזיהוי אובייקטים, אך במקום לתת תיבת הגבלה, עלינו להחזיר מפת פיקסלים מדויקת שמסמנת כל אחד מהאובייקטים המזוהה.
תמונה מקורס CS231n בסטנפורד
תמונות כטנזורים
ראיית מחשב עובדת עם תמונות. כפי שאתם בטח יודעים, תמונות מורכבות מפיקסלים, ולכן אפשר לחשוב עליהן כאוסף מלבני (מערך) של פיקסלים.
בחלק הראשון של המודול הזה נטפל בזיהוי ספרות בכתב יד. נשתמש במאגר הנתונים של MNIST, שמורכב מתמונות בגווני אפור של ספרות בכתב יד, בגודל 28x28 פיקסלים. כל תמונה יכולה להיות מיוצגת כמערך בגודל 28x28, ואיברים במערך זה יסמנו את עוצמת הפיקסל המתאים - או בטווח של 0 עד 1 (אז משתמשים במספרים מרחפים), או מ-0 עד 255 (מספרים שלמים). ספריית פייתון פופולרית שנקראת numpy משמשת לעיתים קרובות למשימות ראיית מחשב, כי היא מאפשרת לך לפעול עם מערכים רב-ממדיים בצורה יעילה.
כדי להתמודד עם תמונות צבעוניות, אנחנו צריכים דרך לייצג צבעים. ברוב המקרים, אנו מייצגים כל פיקסל ב-3 ערכי עוצמה, המתאימים לרכיבים אדום (R), ירוק (G) וכחול (B). קידוד צבע זה נקרא RGB, ולכן תמונת צבע בגודל W×H תוצג כמערך בגודל H×W×3 (לפעמים סדר הרכיבים שונה, אך הרעיון זהה). בייצוג מערכים, הגובה (מספר השורות) מגיע לפני הרוחב (מספר העמודות), שהוא ההפך מהקונבנציה הנפוצה של W×H.
מערכים רב-ממדיים נקראים גם טנזורים. שימוש בטנזורים לייצוג תמונות גם הוא בעל יתרון, כי אפשר להשתמש בממד נוסף כדי לאחסן רצף של תמונות. לדוגמה, כדי לייצג קטע וידאו המורכב מ-200 פריימים במימד 800x600 (רוחב × גובה), ניתן להשתמש בטנזור בגודל 200x600x800x3. זכרו שממדי טנזורים משתמשים בסדר H×W (שורה ראשית), ולא בקונבנציה W×H הנפוצה בעורכי תמונות. הסדר כאן הוא הפריימים × גובה (600) × רוחב (800) × ערוצים. סדר זה נקרא channels_last והוא ברירת המחדל ב-TensorFlow; מסגרות אחרות ממקמות ערוצים לפני גובה ורוחב (channels_first).
import tensorflow as tf
import keras
import matplotlib.pyplot as plt
import numpy as np
# Prints the installed TensorFlow version
print(tf.__version__)
אנחנו הולכים להשתמש במסגרת Keras לניסויים שלנו. במהלך המודול הזה אנו משתמשים import keras ב(סגנון הייבוא העצמאי של Keras 3), שדורש TensorFlow 2.16 או מאוחר יותר (או התקנה עצמאית דרך pip install keras>=3.0). אם אתה משתמש בגרסת TensorFlow 2.x ישנה, החלף import keras ב- from tensorflow import keras.
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Output: (60000, 28, 28) (60000,)
print(x_train.shape, y_train.shape)
# Output: (10000, 28, 28) (10000,)
print(x_test.shape, y_test.shape)
המחשת מערך הנתונים של הספרות
עכשיו כשהורדנו את מאגר הנתונים אנחנו יכולים להמחיש כמה מהספרות:
fig, ax = plt.subplots(1, 7)
for i in range(7):
ax[i].imshow(x_train[i])
ax[i].set_title(y_train[i])
ax[i].axis('off')
# Displays a row of seven handwritten digit images with their labels
מבנה מערך הנתונים
יש לנו בסך הכל 60,000 תמונות אימון ו-10,000 תמונות בדיקה, וכל תמונה בגודל 28×28 פיקסלים:
print('Training samples:', len(x_train))
print('Test samples:', len(x_test))
print('Tensor size:', x_train[0].shape)
print('First 10 digits are:', y_train[:10])
print('Type of data is ', type(x_train))
# Output:
# Training samples: 60000
# Test samples: 10000
# Tensor size: (28, 28)
# First 10 digits are: [5 0 4 1 9 2 1 3 1 4]
# Type of data is <class 'numpy.ndarray'>
כפי שאתה רואה, סוג הנתונים הוא numpy מערך. כל עוצמת פיקסל מיוצגת על ידי ערך שלם בין 0 ל-255:
print('Min intensity value: ', x_train.min())
print('Max intensity value: ', x_train.max())
# Output:
# Min intensity value: 0
# Max intensity value: 255
הסיבה שהוא בין 0 ל-255 היא שכל פיקסל מיוצג על ידי מספר שלם בן 8 ביט. במקרים רבים, במיוחד בעבודה עם רשתות עצביות, נוח יותר להגדיל את כל הערכים לטווח [0, 1] על ידי חלוקה ב-255. תהליך זה נקרא נרמליזציה:
x_train = x_train.astype(np.float32) / 255.0
x_test = x_test.astype(np.float32) / 255.0
# Pixel values are now floating point numbers in the range [0, 1]
עכשיו יש לנו את הנתונים, ואנחנו מוכנים להתחיל לאמן את רשת העצבים הראשונה שלנו!
בדוק את הידע שלך
משוב
האם עמוד זה היה מועיל?
לא
זקוק לעזרה בנושא זה?
רוצה לנסות להשתמש ב'שאל את Learn' כדי להבהיר או להדריך אותך בנושא זה?