RandAugment לסיווג תמונה עם מודיעין נתונים של Keras/TensorFlow PlatoBlockchain. חיפוש אנכי. איי.

RandAugment לסיווג תמונה עם Keras/TensorFlow

הגדלת נתונים שימשה, במשך זמן רב, כאמצעי להחלפת מערך נתונים "סטטי" בגרסאות שעברו טרנספורמציה, מה שמחזק את השונות של רשתות עצביות קונבולוציוניות (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'))

RandAugment לסיווג תמונה עם מודיעין נתונים של Keras/TensorFlow PlatoBlockchain. חיפוש אנכי. איי.

לשכבה יש א 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 – תראה הגדלה הרבה פחות אגרסיבית:

RandAugment לסיווג תמונה עם מודיעין נתונים של Keras/TensorFlow PlatoBlockchain. חיפוש אנכי. איי.

בהיותו שכבה - ניתן להשתמש בו בתוך דגמים או בתוך 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 עוזר:

RandAugment לסיווג תמונה עם מודיעין נתונים של Keras/TensorFlow PlatoBlockchain. חיפוש אנכי. איי.

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

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

סיכום

KerasCV היא חבילה נפרדת, אך עדיין תוספת רשמית ל-Keras, שפותחה על ידי צוות Keras, שמטרתה להביא קורות חיים חזקים בתעשייה לפרויקטים שלך ב-Keras. KerasCV עדיין בפיתוח נכון לכתיבת שורות אלו, וכוללת כבר 27 שכבות עיבוד מקדים חדשות, RandAugment, CutMix, ו MixUp להיות חלק מהם.

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

הולך רחוק יותר - למידה עמוקה מעשית לראייה ממוחשבת

האופי הסקרן שלך גורם לך לרצות ללכת רחוק יותר? אנו ממליצים לבדוק את שלנו קורס: "למידה עמוקה מעשית עבור ראייה ממוחשבת עם Python".

RandAugment לסיווג תמונה עם מודיעין נתונים של Keras/TensorFlow PlatoBlockchain. חיפוש אנכי. איי.

עוד קורס ראיית מחשב?

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

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

מה יש בפנים?

  • העקרונות הראשונים של חזון וכיצד ניתן ללמד מחשבים "לראות"
  • משימות ויישומים שונים של ראייה ממוחשבת
  • כלי המקצוע שיקלו עליכם את העבודה
  • מציאת, יצירה וניצול של מערכי נתונים עבור ראייה ממוחשבת
  • התיאוריה והיישום של רשתות עצביות קונבולוציונליות
  • טיפול בהסטת תחום, התרחשות משותפת והטיות אחרות במערך נתונים
  • העבר למידה וניצול זמן ההדרכה ומשאבי החישוב של אחרים לטובתך
  • בנייה והדרכה של סיווג סרטן שד חדיש
  • כיצד ליישם מנה בריאה של ספקנות על רעיונות מיינסטרים ולהבין את ההשלכות של טכניקות מאומצות באופן נרחב
  • הדמיית "מרחב הקונספט" של ConvNet באמצעות t-SNE ו-PCA
  • תיאורי מקרה של האופן שבו חברות משתמשות בטכניקות ראייה ממוחשבת כדי להשיג תוצאות טובות יותר
  • הערכת מודל נכונה, הדמיית מרחב סמוי וזיהוי תשומת הלב של המודל
  • ביצוע מחקר תחום, עיבוד מערכי נתונים משלך והקמת בדיקות מודל
  • ארכיטקטורות חדשניות, התקדמות רעיונות, מה מייחד אותם וכיצד ליישם אותם
  • KerasCV – ספריית WIP ליצירת צינורות ודגמים מתקדמים
  • כיצד לנתח ולקרוא מאמרים וליישם אותם בעצמך
  • בחירת דגמים בהתאם ליישום שלך
  • יצירת צינור למידת מכונה מקצה לקצה
  • נוף ואינטואיציה על זיהוי אובייקטים עם R-CNN מהירים יותר, RetinaNets, SSDs ו-YOLO
  • מופע ופילוח סמנטי
  • זיהוי אובייקטים בזמן אמת עם YOLOv5
  • הכשרת גלאי אובייקטים של YOLOv5
  • עבודה עם רובוטריקים באמצעות KerasNLP (ספריית WIP בעלת חוזק בתעשייה)
  • שילוב רובוטריקים עם ConvNets ליצירת כיתובים של תמונות
  • חלום עמוק
  • אופטימיזציה של מודל Deep Learning לראייה ממוחשבת

בול זמן:

עוד מ Stackabuse