RandAugment για ταξινόμηση εικόνων με Keras/TensorFlow PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

RandAugment για ταξινόμηση εικόνων με Keras/TensorFlow

Η επαύξηση δεδομένων έχει χρησιμεύσει, για μεγάλο χρονικό διάστημα, ως μέσο αντικατάστασης ενός «στατικού» δεδομένων με μετασχηματισμένες παραλλαγές, ενισχύοντας την αναλλοίωτη Συγκροτήματα Νευρωνικά Δίκτυα (CNN), και συνήθως οδηγεί σε στιβαρότητα στην εισαγωγή.

Σημείωση: Η αναλλοίωτη συνοψίζεται στο να κάνεις τα μοντέλα τυφλά σε ορισμένες αμφιβολίες, όταν παίρνουν αποφάσεις. Μια εικόνα μιας γάτας εξακολουθεί να είναι μια εικόνα μιας γάτας αν την αντικατοπτρίσετε ή την περιστρέψετε.

Ενώ η αύξηση δεδομένων με τη μορφή που χρησιμοποιούσαμε κωδικοποιεί α έλλειψη γνώσης σχετικά με τη μεταφραστική διακύμανση, η οποία είναι σημαντική για την ανίχνευση αντικειμένων, τη σημασιολογική και την τμηματοποίηση παρουσιών κ.λπ. αμετάβλητη παρέχει πολλές φορές ευνοϊκό για τα μοντέλα ταξινόμησης, και έτσι, η αύξηση εφαρμόζεται πιο συχνά και πιο επιθετικά στα μοντέλα ταξινόμησης.

Τύποι Αύξησης

Η αύξηση άρχισε να είναι πολύ απλή – μικρές περιστροφές, οριζόντιες και κάθετες ανατροπές, διακυμάνσεις αντίθεσης ή φωτεινότητας κ.λπ. Τα τελευταία χρόνια, έχουν επινοηθεί πιο περίπλοκες μέθοδοι, όπως κόβω (χωρική εγκατάλειψη που εισάγει τυχαία μαύρα τετράγωνα στις εικόνες εισόδου) και Ανακατεύω (ανάμιξη τμημάτων εικόνων και ενημέρωση αναλογιών ετικετών) και ο συνδυασμός τους – 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 Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Το στρώμα έχει ένα 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 Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Όντας στρώμα - μπορεί να χρησιμοποιηθεί σε μοντέλα ή σε tf.data αγωγών κατά τη δημιουργία συνόλων δεδομένων. Αυτό κάνει RandAugment αρκετά ευέλικτο! Πρόσθετα επιχειρήματα είναι τα augmentations_per_image και rate επιχειρήματα, τα οποία συνεργάζονται.

Για 0...augmentations_per_image, το επίπεδο προσθέτει ένα τυχαίο επίπεδο προεπεξεργασίας στη διοχέτευση που θα εφαρμοστεί σε μια εικόνα. Στην περίπτωση της προεπιλογής 3 – τρεις διαφορετικές λειτουργίες προστίθενται στον αγωγό. Στη συνέχεια, γίνεται δειγματοληψία ενός τυχαίου αριθμού για κάθε αύξηση στον αγωγό – και εάν είναι μικρότερος από rate (προεπιλογή γύρω 0.9) – εφαρμόζεται η επαύξηση.

Ουσιαστικά – υπάρχει 90% πιθανότητα κάθε (τυχαία) αύξηση στη γραμμή που εφαρμόζεται στην εικόνα.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Αυτό φυσικά σημαίνει ότι δεν πρέπει να εφαρμόζονται όλες οι αυξήσεις, ειδικά αν χαμηλώσετε 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 λειτουργεί πολύ καλά μαζί τους για τη δημιουργία ισχυρών ταξινομητών – ας αφήσουμε την κωδικοποίηση one-hot. Επιπλέον, 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 Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Στον μη επαυξημένο αγωγό, το δίκτυο υπερπροσαρμόζεται (η ακρίβεια της εκπαίδευσης φτάνει στο ανώτατο όριο) και η ακρίβεια επικύρωσης παραμένει χαμηλή. Στον επαυξημένο αγωγό, το Η ακρίβεια της εκπαίδευσης παραμένει χαμηλότερη από την ακρίβεια επικύρωσης από την αρχή μέχρι το τέλος.

Με υψηλότερη απώλεια εκπαίδευσης, το δίκτυο έχει πολύ μεγαλύτερη επίγνωση των λαθών που εξακολουθεί να κάνει και μπορούν να γίνουν περισσότερες ενημερώσεις για να γίνει αμετάβλητο στους μετασχηματισμούς. Ο πρώτος δεν βλέπει ανάγκη ενημέρωσης, ενώ ο δεύτερος κάνει και ανεβάζει το ανώτατο όριο των δυνατοτήτων.

Συμπέρασμα

KerasCV είναι ένα ξεχωριστό πακέτο, αλλά εξακολουθεί να είναι μια επίσημη προσθήκη στο Keras, που αναπτύχθηκε από την ομάδα Keras, με στόχο να φέρει βιογραφικό δυναμικό του κλάδου στα έργα Keras σας. Το KerasCV βρίσκεται ακόμη σε ανάπτυξη από τη στιγμή της σύνταξης και περιλαμβάνει ήδη 27 νέα επίπεδα προεπεξεργασίας, RandAugment, CutMix, να MixUp όντας μερικοί από αυτούς.

Σε αυτόν τον σύντομο οδηγό, ρίξαμε μια ματιά στο πώς μπορείτε να χρησιμοποιήσετε RandAugment να εφαρμόσετε έναν αριθμό τυχαίων μετασχηματισμών από μια δεδομένη λίστα εφαρμοζόμενων μετασχηματισμών και πόσο εύκολο είναι να συμπεριληφθεί σε οποιονδήποτε αγωγό εκπαίδευσης Keras.

Going Further – Πρακτική βαθιά μάθηση για το Computer Vision

Η περιπετειώδης φύση σας σας κάνει να θέλετε να πάτε παραπέρα; Σας προτείνουμε να ελέγξετε το δικό μας Πορεία: "Πρακτική βαθιά μάθηση για την όραση υπολογιστή με Python".

RandAugment για ταξινόμηση εικόνων με Keras/TensorFlow PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Ένα άλλο μάθημα Computer Vision;

Δεν θα κάνουμε ταξινόμηση ψηφίων MNIST ή μόδας MNIST. Υπηρέτησαν το μέρος τους εδώ και πολύ καιρό. Πάρα πολλοί πόροι εκμάθησης εστιάζουν σε βασικά σύνολα δεδομένων και βασικές αρχιτεκτονικές πριν αφήσουν τις προηγμένες αρχιτεκτονικές μαύρου κουτιού να επωμιστούν το βάρος της απόδοσης.

Θέλουμε να επικεντρωθούμε απομυθοποίηση, πρακτικότητα, κατανόηση, διαίσθηση και πραγματικά έργα. Θέλω να μάθω πως μπορείς να κάνεις την διαφορά? Θα σας μεταφέρουμε από τον τρόπο με τον οποίο ο εγκέφαλός μας επεξεργάζεται εικόνες έως τη σύνταξη ενός ταξινομητή βαθιάς μάθησης για τον καρκίνο του μαστού σε δίκτυα βαθιάς μάθησης που «παραισθάνονται», διδάσκοντάς σας τις αρχές και τη θεωρία μέσω πρακτικής εργασίας, εξοπλίζοντάς σας με τεχνογνωσία και εργαλεία για να γίνετε ειδικός στην εφαρμογή της βαθιάς μάθησης για την επίλυση της όρασης υπολογιστή.

Τι είναι μέσα?

  • Οι πρώτες αρχές της όρασης και πώς οι υπολογιστές μπορούν να διδαχθούν να «βλέπουν»
  • Διαφορετικές εργασίες και εφαρμογές της όρασης υπολογιστή
  • Τα εργαλεία του εμπορίου που θα κάνουν τη δουλειά σας πιο εύκολη
  • Εύρεση, δημιουργία και χρήση συνόλων δεδομένων για την όραση υπολογιστή
  • Η θεωρία και η εφαρμογή των συνελικτικών νευρωνικών δικτύων
  • Χειρισμός μετατόπισης τομέα, συνεμφάνισης και άλλων προκαταλήψεων στα σύνολα δεδομένων
  • Μεταφέρετε τη μάθηση και χρησιμοποιείτε τον χρόνο εκπαίδευσης και τους υπολογιστικούς πόρους άλλων προς όφελός σας
  • Κατασκευή και εκπαίδευση ενός υπερσύγχρονου ταξινομητή καρκίνου του μαστού
  • Πώς να εφαρμόσετε μια υγιή δόση σκεπτικισμού στις επικρατούσες ιδέες και να κατανοήσετε τις επιπτώσεις των ευρέως υιοθετημένων τεχνικών
  • Οπτικοποίηση του «εννοιολογικού χώρου» ενός ConvNet χρησιμοποιώντας t-SNE και PCA
  • Μελέτες περίπτωσης για το πώς οι εταιρείες χρησιμοποιούν τεχνικές όρασης υπολογιστή για να επιτύχουν καλύτερα αποτελέσματα
  • Σωστή αξιολόγηση μοντέλου, οπτικοποίηση λανθάνοντος χώρου και αναγνώριση της προσοχής του μοντέλου
  • Εκτέλεση έρευνας τομέα, επεξεργασία των δικών σας συνόλων δεδομένων και δημιουργία δοκιμών μοντέλων
  • Αρχιτεκτονικές αιχμής, η εξέλιξη των ιδεών, τι τις κάνει μοναδικές και πώς να τις εφαρμόσετε
  • KerasCV – μια βιβλιοθήκη WIP για τη δημιουργία αγωγών και μοντέλων τελευταίας τεχνολογίας
  • Πώς να αναλύετε και να διαβάζετε έγγραφα και να τα εφαρμόζετε μόνοι σας
  • Επιλογή μοντέλων ανάλογα με την εφαρμογή σας
  • Δημιουργία ενός αγωγού μηχανικής εκμάθησης από άκρο σε άκρο
  • Τοπίο και διαίσθηση για την ανίχνευση αντικειμένων με ταχύτερα R-CNN, RetinaNets, SSD και YOLO
  • Παρουσίαση και σημασιολογική κατάτμηση
  • Αναγνώριση αντικειμένων σε πραγματικό χρόνο με το YOLOv5
  • Εκπαίδευση ανιχνευτών αντικειμένων YOLOv5
  • Εργασία με μετασχηματιστές χρησιμοποιώντας KerasNLP (βιβλιοθήκη WIP με αντοχή στη βιομηχανία)
  • Ενσωμάτωση Transformers με ConvNets για τη δημιουργία λεζάντων εικόνων
  • DeepDream
  • Βελτιστοποίηση μοντέλου Deep Learning για όραση υπολογιστή

Σφραγίδα ώρας:

Περισσότερα από Stackabuse