הגדלת נתונים שימשה, במשך זמן רב, כאמצעי להחלפת מערך נתונים "סטטי" בגרסאות שעברו טרנספורמציה, מה שמחזק את השונות של רשתות עצביות קונבולוציוניות (CNN), ובדרך כלל מוביל לחוסן לקלט.
הערה: חוסר השונות מסתכם בהפיכת מודלים לעיוורים להפרעות מסוימות, בעת קבלת החלטות. תמונה של חתול היא עדיין תמונה של חתול אם אתה משקף אותו או מסובב אותו.
בעוד שהגדלת נתונים בצורה שבה השתמשנו בה אכן מקודדת א חוסר של ידע על שונות תרגום, שחשובה לזיהוי אובייקטים, פילוח סמנטי ומופעים וכו' - בלתי משתנה היא מספקת לעתים קרובות חיובית עבור מודלים של סיווג, ולפיכך, הגדלה מיושמת באופן נפוץ ואגרסיבי יותר על מודלים של סיווג.
סוגי הגדלה
הגדלה התחילה להיות פשוטה מאוד - סיבובים קטנים, סיבובים אופקיים ואנכיים, תנודות ניגודיות או בהירות וכו'. בשנים האחרונות התפתחו שיטות משוכללות יותר, כולל לחתוך (נשירה מרחבית המציגה ריבועים שחורים באופן אקראי בתמונות הקלט) ו MixUp (ערבוב חלקי תמונות ועדכון פרופורציות של תווית), ושילובם - CutMix. שיטות ההגדלה החדשות יותר למעשה מתייחסות לתוויות, ושיטות כמו CutMix משנות את פרופורציות התוויות כך שיהיו שוות לפרופורציות של התמונה שנלקחת על ידי חלקים מכל מחלקה המעורבבים.
עם רשימה הולכת וגדלה של הגדלות אפשריות, חלקם התחילו ליישם אותם באופן אקראי (או לפחות תת-קבוצה כלשהי מהם), מתוך מחשבה שסט אקראי של הגדלות יחזק את החוסן של הדגמים, ויחליף את הסט המקורי בסט גדול בהרבה. מרחב של תמונות קלט. זה איפה RandAugment
נכנס לפעולה!
KerasCV ו-RandAugment
KerasCV היא חבילה נפרדת, אך עדיין תוספת רשמית ל-Keras, שפותחה על ידי צוות Keras. זה אומר שהוא מקבל את אותה כמות ליטוש ואינטואיטיביות של החבילה הראשית, אבל הוא גם משתלב ללא מראה עם דגמי Keras הרגילים, והשכבות שלהם. ההבדל היחיד שאי פעם תבחין הוא להתקשר keras_cv.layers...
במקום keras.layers...
.
KerasCV עדיין בפיתוח נכון לכתיבת שורות אלו, וכוללת כבר 27 שכבות עיבוד מקדים חדשות, RandAugment
, CutMix
, ו MixUp
להיות חלק מהם. בואו נסתכל איך זה נראה ליישם RandAugment
לתמונות, וכיצד אנו יכולים לאמן מסווג עם ובלי הגדלה אקראית.
ראשית, התקן keras_cv
:
$ pip install keras_cv
הערה: KerasCV דורש את TensorFlow 2.9 כדי לעבוד. אם עדיין אין לך את זה, רוץ $ pip install -U tensorflow
ראשון.
כעת, בואו לייבא את TensorFlow, Keras ו-KerasCV, לצד מערכי נתונים של TensorFlow לגישה קלה ל-Imagenette:
import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds
בואו נטען בתמונה ונציג אותה בצורתה המקורית:
import matplotlib.pyplot as plt
import cv2
cat_img = cv2.cvtColor(cv2.imread('cat.jpg'), cv2.COLOR_BGR2RGB)
cat_img = cv2.resize(cat_img, (224, 224))
plt.imshow(cat_img)
עכשיו, בואו נגיש מועמדות RandAugment
אליו, כמה פעמים ותסתכל על התוצאות:
fig = plt.figure(figsize=(10,10))
for i in range(16):
ax = fig.add_subplot(4,4,i+1)
aug_img = keras_cv.layers.RandAugment(value_range=(0, 255))(cat_img)
ax.imshow(aug_img.numpy().astype('int'))
לשכבה יש א magnitude
ארגומנט, שברירת המחדל הוא 0.5
וניתן לשנותו כדי להגביר או להקטין את השפעת ההגדלה:
fig = plt.figure(figsize=(10,10))
for i in range(16):
ax = fig.add_subplot(4,4,i+1)
aug_img = keras_cv.layers.RandAugment(value_range=(0, 255), magnitude=0.1)(cat_img)
ax.imshow(aug_img.numpy().astype('int'))
כאשר מוגדר לערך נמוך כגון 0.1
– תראה הגדלה הרבה פחות אגרסיבית:
בהיותו שכבה - ניתן להשתמש בו בתוך דגמים או בתוך tf.data
צינורות בעת יצירת מערכי נתונים. זה עושה RandAugment
די גמיש! טיעונים נוספים הם ה augmentations_per_image
ו rate
טיעונים, שפועלים יחד.
בעד 0...augmentations_per_image
, השכבה מוסיפה שכבת עיבוד מקדים אקראית לצינור המיועדים להחלה על תמונה. במקרה של ברירת המחדל 3
– מתווספות לצינור שלוש פעולות שונות. לאחר מכן, נדגם מספר אקראי עבור כל הגדלה בצנרת - ואם הוא נמוך מ rate
(ברירת המחדל היא סביב 0.9
) - ההגדלה מוחלת.
בעיקרו של דבר - יש סבירות של 90% לכל הגדלה (אקראית) בצנרת שתחול על התמונה.
עיין במדריך המעשי והמעשי שלנו ללימוד Git, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות Git ולמעשה ללמוד זה!
זה אומר כמובן שלא כל ההגדלות חייבות להיות מיושמות, במיוחד אם מורידים את rate
. אתה יכול גם להתאים אישית אילו פעולות מותרות דרך א RandomAugmentationPipeline
שכבה, אשר RandAugment
הוא המקרה המיוחד של. מדריך נפרד על RandomAugmentationPipeline
יפורסם בקרוב.
הכשרת מסווג עם ובלי RandAugment
כדי לפשט את היבט הכנת/טעינת הנתונים ולהתמקד בו RandAugment
, בואו נשתמש tfds
כדי לטעון בחלק של Imagenette:
(train, valid_set, test_set), info = tfds.load("imagenette",
split=["train[:70%]", "validation", "train[70%:]"],
as_supervised=True, with_info=True)
class_names = info.features["label"].names
n_classes = info.features["label"].num_classes
print(f'Class names: {class_names}')
print('Num of classes:', n_classes)
print("Train set size:", len(train))
print("Test set size:", len(test_set))
print("Valid set size:", len(valid_set))
טענו רק חלק מנתוני האימון, כדי להקל על התאמת מערך הנתונים בפחות תקופות (כך שהניסוי שלנו יפעל מהר יותר, למעשה). מכיוון שהתמונות ב-Imagenett הן בגדלים שונים, בואו ניצור א preprocess()
פונקציה שמשנה את גודלם כדי למפות את מערך הנתונים איתו, כמו גם an augment()
פונקציה שמגדילה תמונות ב-a tf.data.Dataset
:
def preprocess(images, labels):
return tf.image.resize(images, (224, 224)), tf.one_hot(labels, 10)
def augment(images, labels):
inputs = {"images": images, "labels": labels}
outputs = keras_cv.layers.RandAugment(value_range=(0, 255))(inputs)
return outputs['images'], outputs['labels']
עכשיו - קידדנו חד-חם את התוויות. לא היינו צריכים בהכרח, אלא להגדלות כמו CutMix
שתתעסק בתוויות ובפרופורציות שלהן, תצטרך. מכיוון שאולי תרצה ליישם את אלה גם כן RandAugment
עובד איתם ממש טוב כדי ליצור מסווגים חזקים - בואו נשאיר את הקידוד החם אחד בפנים. בנוסף, RandAugment
לוקח מילון עם תמונות ותוויות בדיוק בגלל זה - כמה הגדלות שאתה יכול להוסיף למעשה ישנו את התוויות, אז הן חובה. אתה יכול לחלץ את התמונות והתוויות המוגדלות מה- outputs
מילון בקלות, אז זהו צעד נוסף, אך פשוט, שיש לבצע במהלך ההגדלה.
בואו נמפה את מערכי הנתונים הקיימים שהוחזרו מהם tfds
עם preprocess()
לתפקד, לקבץ אותם ולהגדיל רק את ערכת האימונים:
valid_set = valid_set.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set = train.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set_aug = train.map(preprocess).map(augment_data,
num_parallel_calls=tf.data.AUTOTUNE).batch(32).prefetch(tf.data.AUTOTUNE)
בואו להכשיר רשת! keras_cv.models
יש כמה רשתות מובנות, בדומה ל keras.applications
. למרות שהרשימה עדיין קצרה - היא תתרחב עם הזמן ותשתלט keras.applications
. ה-API דומה מאוד, כך שהעברת הקוד תהיה קלה למדי עבור רוב המתרגלים:
effnet = keras_cv.models.EfficientNetV2B0(include_rescaling=True, include_top=True, classes=10)
effnet.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
history = effnet.fit(train_set, epochs=25, validation_data = valid_set)
לחלופין, אתה יכול להשתמש בזרם keras.applications
:
effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
history1 = effnet.fit(train_set, epochs=50, validation_data=valid_set)
זה מביא למודל שלא ממש מצליח:
Epoch 1/50
208/208 [==============================] - 60s 238ms/step - loss: 2.7742 - accuracy: 0.2313 - val_loss: 3.2200 - val_accuracy: 0.3085
...
Epoch 50/50
208/208 [==============================] - 48s 229ms/step - loss: 0.0272 - accuracy: 0.9925 - val_loss: 2.0638 - val_accuracy: 0.6887
כעת, בואו נאמן את אותה הגדרת רשת במערך הנתונים המוגדל. כל אצווה מוגברת בנפרד, אז בכל פעם שאותה אצווה של תמונות (בעידן הבא) מגיעה - יהיו להן הגדלות שונות:
effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
history2 = effnet.fit(train_set_aug, epochs=50, validation_data = valid_set)
Epoch 1/50
208/208 [==============================] - 141s 630ms/step - loss: 2.9966 - accuracy: 0.1314 - val_loss: 2.7398 - val_accuracy: 0.2395
...
Epoch 50/50
208/208 [==============================] - 125s 603ms/step - loss: 0.7313 - accuracy: 0.7583 - val_loss: 0.6101 - val_accuracy: 0.8143
הרבה יותר טוב! בעוד שאתה עדיין רוצה ליישם הגדלות אחרות, כגון CutMix
ו MixUp
, לצד טכניקות אימון אחרות כדי למקסם את דיוק הרשת – פשוט RandAugment
עזר משמעותית וניתן להשוות לצינור הגדלה ארוך יותר.
אם משווים את עקומות האימון, כולל האימון ו עקומות אימות - רק מתברר עד כמה RandAugment
עוזר:
בצנרת הלא-מוגברת, הרשת מתאימה יתר על המידה (דיוק האימון מגיע לתקרה) ודיוק האימות נשאר נמוך. בצינור המוגדל, ה דיוק האימון נשאר נמוך מדיוק האימות מתחילתו ועד סופו.
עם אובדן אימון גבוה יותר, הרשת מודעת הרבה יותר לטעויות שהיא עדיין עושה, וניתן לבצע עדכונים נוספים כדי להפוך אותה ללא שינוי לשינויים. הראשון לא רואה צורך לעדכן, בעוד שהאחרון כן ומעלה את תקרת הפוטנציאל.
סיכום
KerasCV היא חבילה נפרדת, אך עדיין תוספת רשמית ל-Keras, שפותחה על ידי צוות Keras, שמטרתה להביא קורות חיים חזקים בתעשייה לפרויקטים שלך ב-Keras. KerasCV עדיין בפיתוח נכון לכתיבת שורות אלו, וכוללת כבר 27 שכבות עיבוד מקדים חדשות, RandAugment
, CutMix
, ו MixUp
להיות חלק מהם.
במדריך הקצר הזה, בדקנו איך אתה יכול להשתמש RandAugment
להחיל מספר טרנספורמציות אקראיות מתוך רשימה נתונה של טרנספורמציות מיושמות, וכמה קל זה לכלול בכל צינור אימון של Keras.
הולך רחוק יותר - למידה עמוקה מעשית לראייה ממוחשבת
האופי הסקרן שלך גורם לך לרצות ללכת רחוק יותר? אנו ממליצים לבדוק את שלנו קורס: "למידה עמוקה מעשית עבור ראייה ממוחשבת עם Python".
עוד קורס ראיית מחשב?
לא נעשה סיווג של ספרות MNIST או אופנת MNIST. הם שירתו את תפקידם מזמן. משאבי למידה רבים מדי מתמקדים במערך נתונים בסיסיים ובארכיטקטורות בסיסיות לפני שהם מאפשרים לארכיטקטורות מתקדמות של קופסאות שחורות לשאת בנטל הביצועים.
אנחנו רוצים להתמקד דה-מיסטיפיקציה, מעשיות, הבנה, אינטואיציה ו פרויקטים אמיתיים. רוצה ללמוד אֵיך אתה יכול לעשות שינוי? ניקח אותך לסיבוב מהאופן שבו המוח שלנו מעבד תמונות לכתיבת סיווג למידה עמוקה לסרטן השד בדרגת מחקר לרשתות למידה עמוקה ש"הזויה", מלמדת אותך את העקרונות והתיאוריה באמצעות עבודה מעשית, ומציידה אותך ב ידע וכלים כדי להפוך למומחה ביישום למידה עמוקה לפתרון ראייה ממוחשבת.
מה יש בפנים?
- העקרונות הראשונים של חזון וכיצד ניתן ללמד מחשבים "לראות"
- משימות ויישומים שונים של ראייה ממוחשבת
- כלי המקצוע שיקלו עליכם את העבודה
- מציאת, יצירה וניצול של מערכי נתונים עבור ראייה ממוחשבת
- התיאוריה והיישום של רשתות עצביות קונבולוציונליות
- טיפול בהסטת תחום, התרחשות משותפת והטיות אחרות במערך נתונים
- העבר למידה וניצול זמן ההדרכה ומשאבי החישוב של אחרים לטובתך
- בנייה והדרכה של סיווג סרטן שד חדיש
- כיצד ליישם מנה בריאה של ספקנות על רעיונות מיינסטרים ולהבין את ההשלכות של טכניקות מאומצות באופן נרחב
- הדמיית "מרחב הקונספט" של ConvNet באמצעות t-SNE ו-PCA
- תיאורי מקרה של האופן שבו חברות משתמשות בטכניקות ראייה ממוחשבת כדי להשיג תוצאות טובות יותר
- הערכת מודל נכונה, הדמיית מרחב סמוי וזיהוי תשומת הלב של המודל
- ביצוע מחקר תחום, עיבוד מערכי נתונים משלך והקמת בדיקות מודל
- ארכיטקטורות חדשניות, התקדמות רעיונות, מה מייחד אותם וכיצד ליישם אותם
- KerasCV – ספריית WIP ליצירת צינורות ודגמים מתקדמים
- כיצד לנתח ולקרוא מאמרים וליישם אותם בעצמך
- בחירת דגמים בהתאם ליישום שלך
- יצירת צינור למידת מכונה מקצה לקצה
- נוף ואינטואיציה על זיהוי אובייקטים עם R-CNN מהירים יותר, RetinaNets, SSDs ו-YOLO
- מופע ופילוח סמנטי
- זיהוי אובייקטים בזמן אמת עם YOLOv5
- הכשרת גלאי אובייקטים של YOLOv5
- עבודה עם רובוטריקים באמצעות KerasNLP (ספריית WIP בעלת חוזק בתעשייה)
- שילוב רובוטריקים עם ConvNets ליצירת כיתובים של תמונות
- חלום עמוק
- אופטימיזציה של מודל Deep Learning לראייה ממוחשבת