RandAugment لتصنيف الصور باستخدام ذكاء بيانات Keras / TensorFlow PlatoBlockchain. البحث العمودي. عاي.

RandAugment لتصنيف الصور باستخدام Keras / TensorFlow

كانت زيادة البيانات ، لفترة طويلة ، بمثابة وسيلة لاستبدال مجموعة بيانات "ثابتة" بمتغيرات محولة ، مما يعزز ثبات الشبكات العصبية التلافيفية (CNNs)، وعادة ما يؤدي إلى المتانة في المدخلات.

ملحوظة: يتلخص مبدأ الثبات في جعل النماذج عمياء عن بعض الارتباطات عند اتخاذ القرارات. لا تزال صورة القطة صورة قطة إذا عكستها أو قمت بتدويرها.

أثناء زيادة البيانات بالشكل الذي كنا نستخدمه ، فإنه يقوم بترميز ملف نقص المعرفة حول التباين متعدية ، وهو أمر مهم لاكتشاف الكائن ، وتجزئة الدلالات والمثيلات ، وما إلى ذلك - الثبات إنه يوفر في كثير من الأحيان مناسبًا لنماذج التصنيف ، وبالتالي ، يتم تطبيق الزيادة بشكل أكثر شيوعًا وأكثر قوة على نماذج التصنيف.

أنواع التكثيف

بدأ التعظيم في أن يكون بسيطًا جدًا - دورات صغيرة ، تقلبات أفقية ورأسية ، تباين أو تقلبات السطوع ، إلخ. في السنوات الأخيرة ، تم ابتكار طرق أكثر تفصيلاً ، بما في ذلك انقطع (التسرب المكاني إدخال المربعات السوداء بشكل عشوائي في صور الإدخال) و مزج (خلط أجزاء من الصور وتحديث نسب الملصق) ، وتركيبها - 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 ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling 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)) 

لقد حمّلنا جزءًا فقط من بيانات التدريب في هذا القسم ، لتسهيل الإفراط في تجهيز مجموعة البيانات في فترات أقل (مما يجعل تجربتنا تعمل بشكل أسرع ، في الواقع). نظرًا لأن الصور في Imagenette ذات أحجام مختلفة ، فلنقم بإنشاء ملف preprocess() تعمل على تغيير حجمها لتعيين مجموعة البيانات بها ، بالإضافة إلى ملف augment() الوظيفة التي تزيد من الصور في ملف 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. واجهة برمجة التطبيقات متشابهة جدًا ، لذا سيكون رمز النقل سهلًا إلى حد ما بالنسبة لمعظم الممارسين:


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 - مكتبة العمل قيد التقدم لإنشاء خطوط الأنابيب والنماذج الحديثة
  • كيف تحلل وتقرأ الأوراق وتنفذها بنفسك
  • اختيار النماذج حسب التطبيق الخاص بك
  • إنشاء خط أنابيب تعلم آلي شامل
  • المناظر الطبيعية والحدس في اكتشاف الكائنات باستخدام شبكات R-CNN و RetinaNets و SSDs و YOLO أسرع
  • المثيل والتجزئة الدلالية
  • التعرف على الكائنات في الوقت الفعلي باستخدام YOLOv5
  • تدريب كاشفات الأجسام YOLOv5
  • العمل مع المحولات باستخدام KerasNLP (مكتبة WIP ذات قوة الصناعة)
  • دمج المحولات مع ConvNets لإنشاء تسميات توضيحية للصور
  • ديب دريم
  • تحسين نموذج التعلم العميق لرؤية الكمبيوتر

الطابع الزمني:

اكثر من ستاكابوز