RandAugment do klasyfikacji obrazów z Keras/TensorFlow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

RandAugment do klasyfikacji obrazów za pomocą Keras/TensorFlow

Rozszerzanie danych przez długi czas służyło jako sposób na zastąpienie „statycznego” zbioru danych przekształconymi wariantami, wzmacniając niezmienność Konwolucyjne sieci neuronowe (CNN)i zwykle prowadzi do niezawodności danych wejściowych.

Uwaga: Niezmienność sprowadza się do uczynienia modeli ślepymi na pewne pertubacje przy podejmowaniu decyzji. Obraz kota jest nadal obrazem kota, jeśli go odbijesz lub obrócisz.

Podczas gdy powiększanie danych w formie, której używaliśmy, koduje a brak wiedzy o wariancji translacyjnej, która jest ważna dla wykrywania obiektów, segmentacji semantycznej i instancji itp. – niezmienność zapewnia, że ​​jest to często korzystne dla modeli klasyfikacyjnych, a zatem augmentacja jest częściej i bardziej agresywnie stosowana do modeli klasyfikacyjnych.

Rodzaje augmentacji

Augmentacja zaczęła być bardzo prosta – małe obroty, odwracanie w poziomie i pionie, wahania kontrastu lub jasności itp. W ostatnich latach opracowano bardziej wymyślne metody, m.in. Odetnij (przestrzenne zanikanie wprowadzające losowo czarne kwadraty na obrazach wejściowych) oraz mieszać (pomieszanie części obrazów i aktualizacja proporcji etykiet) oraz ich łączenie – WytnijMix. Nowsze metody rozszerzania faktycznie uwzględniają etykiety, a metody takie jak CutMix zmieniają proporcje etykiet tak, aby były równe proporcjom obrazu zajmowanego przez pomieszane części każdej klasy.

Wraz z rosnącą listą możliwych ulepszeń, niektórzy zaczęli stosować je losowo (lub przynajmniej część z nich), z założeniem, że losowy zestaw ulepszeń wzmocni solidność modeli i zastąpi oryginalny zestaw znacznie większym przestrzeń obrazów wejściowych. To jest gdzie RandAugment wskakuje!

KerasCV i RandAugment

KerasCV jest osobnym pakietem, ale wciąż oficjalnym dodatkiem do Keras, opracowanym przez zespół Keras. Oznacza to, że otrzymuje tyle samo dopracowania i intuicyjności co pakiet główny, ale też bezbłędnie integruje się ze zwykłymi modelami Keras i ich warstwami. Jedyną różnicą, jaką kiedykolwiek zauważysz, jest telefon keras_cv.layers... zamiast keras.layers....

KerasCV jest wciąż rozwijany w momencie pisania i zawiera już 27 nowych warstw przetwarzania wstępnego, RandAugment, CutMix, MixUp będąc jednym z nich. Przyjrzyjmy się, jak wygląda zastosowanie RandAugment do obrazów i jak możemy wytrenować klasyfikator z losowym rozszerzaniem i bez niego.

Najpierw zainstaluj keras_cv:

$ pip install keras_cv

Uwaga: KerasCV wymaga do działania TensorFlow 2.9. Jeśli jeszcze go nie masz, biegnij $ pip install -U tensorflow pierwszy.

Teraz zaimportujmy TensorFlow, Keras i KerasCV, razem z zestawami danych TensorFlow, aby uzyskać łatwy dostęp do Imagenette:

import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds

Załadujmy obraz i wyświetlmy go w oryginalnej formie:

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)

A teraz złóżmy wniosek RandAugment do niego kilka razy i spójrz na wyniki:

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 do klasyfikacji obrazów z Keras/TensorFlow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Warstwa ma magnitude argument, który domyślnie to 0.5 i można je zmienić, aby zwiększyć lub zmniejszyć efekt augmentacji:

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'))

Po ustawieniu na niską wartość, taką jak 0.1 – zobaczysz znacznie mniej agresywną augmentację:

RandAugment do klasyfikacji obrazów z Keras/TensorFlow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Będąc warstwą – można ją stosować w modelach lub w tf.data potoki podczas tworzenia zestawów danych. To sprawia RandAugment dość elastyczny! Dodatkowymi argumentami są augmentations_per_image i rate argumenty, które ze sobą współgrają.

W razie zamówieenia projektu 0...augmentations_per_image, warstwa dodaje losową warstwę wstępnego przetwarzania do potoku, która zostanie zastosowana do obrazu. W przypadku niewywiązania się z płatności 3 – do rurociągu zostają dodane trzy różne operacje. Następnie dla każdej augmentacji w potoku pobierana jest losowa liczba – i jeśli jest niższa niż rate (domyślnie około 0.9) – stosowane jest rozszerzenie.

W skrócie – istnieje 90% prawdopodobieństwo, że każda (losowa) augmentacja w potoku zostanie zastosowana do obrazu.

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

To oczywiście oznacza, że ​​nie trzeba stosować wszystkich ulepszeń, zwłaszcza jeśli obniżysz rate. Możesz także dostosować, które operacje są dozwolone za pomocą RandomAugmentationPipeline warstwa, która RandAugment jest szczególnym przypadkiem. Osobny przewodnik na temat RandomAugmentationPipeline zostanie wkrótce opublikowany.

Szkolenie klasyfikatora z RandAugment i bez niego

Aby uprościć aspekt przygotowania/ładowania danych i skupić się na RandAugment, użyjmy tfds aby załadować porcję 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)) 

Załadowaliśmy tylko część danych uczących, aby ułatwić przepełnienie zestawu danych w mniejszej liczbie epok (w efekcie nasz eksperyment będzie przebiegał szybciej). Ponieważ obrazy w Imagenette mają różne rozmiary, stwórzmy preprocess() funkcja, która zmienia ich rozmiar, aby zmapować zestaw danych, a także augment() funkcja powiększająca obrazy w 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']

Teraz – zakodowaliśmy etykiety na gorąco. Niekoniecznie musieliśmy, ale dla ulepszeń takich jak CutMix że majstrujesz przy etykietach i ich proporcjach, będziesz musiał. Ponieważ możesz chcieć zastosować te, a także RandAugment bardzo dobrze z nimi współpracuje, tworząc solidne klasyfikatory – zostawmy kodowanie one-hot. Dodatkowo, RandAugment bierze słownik z obrazkami i etykietami właśnie z tego powodu – niektóre rozszerzenia, które możesz dodać, faktycznie zmienią etykiety, więc są one obowiązkowe. Możesz wyodrębnić rozszerzone obrazy i etykiety z outputs słownik łatwo, więc jest to dodatkowy, ale prosty krok do wykonania podczas augmentacji.

Zmapujmy istniejące zbiory danych zwrócone z tfds z preprocess() funkcji, grupuj je i rozszerzaj tylko zestaw treningowy:

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)

Wytrenujmy sieć! keras_cv.models ma wbudowane sieci, podobne do keras.applications. Chociaż lista jest wciąż krótka – z czasem się rozrośnie i przejmie kontrolę keras.applications. Interfejs API jest bardzo podobny, więc dla większości praktyków przenoszenie kodu będzie dość łatwe:


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)

Alternatywnie możesz użyć prądu 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)

Skutkuje to modelem, który naprawdę nie radzi sobie zbyt dobrze:

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

Teraz wytrenujmy tę samą konfigurację sieci na rozszerzonym zestawie danych. Każda partia jest indywidualnie augmentowana, więc za każdym razem, gdy pojawi się ta sama partia obrazów (w następnej epoce), będą miały różne augmentacje:

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

Dużo lepiej! Chociaż nadal chcesz zastosować inne rozszerzenia, takie jak CutMix i MixUp, obok innych technik szkoleniowych, aby zmaksymalizować dokładność sieci – po prostu RandAugment znacznie pomógł i może być porównywalny z dłuższym rurociągiem augmentacji.

Jeśli porównasz krzywe treningowe, w tym trening i krzywe walidacji – staje się jasne, ile RandAugment pomaga:

RandAugment do klasyfikacji obrazów z Keras/TensorFlow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

W rurociągu nierozszerzonym następuje przeciążenie sieci (dokładność treningu osiąga pułap), a dokładność walidacji pozostaje niska. W rozszerzonym rurociągu dokładność treningu pozostaje niższa niż dokładność walidacji od początku do końca.

Przy większej utracie treningu sieć jest znacznie bardziej świadoma błędów, które wciąż popełnia, i można wprowadzić więcej aktualizacji, aby uczynić ją niezmienną w stosunku do transformacji. Ten pierwszy nie widzi potrzeby aktualizacji, podczas gdy drugi to robi i podnosi pułap potencjału.

Wnioski

KerasCV jest osobnym pakietem, ale nadal oficjalnym dodatkiem do Keras, opracowanym przez zespół Keras, mającym na celu wprowadzenie CV do twoich projektów Keras. KerasCV jest wciąż rozwijany w momencie pisania i zawiera już 27 nowych warstw przetwarzania wstępnego, RandAugment, CutMix, MixUp będąc jednym z nich.

W tym krótkim przewodniku przyjrzeliśmy się, jak możesz używać RandAugment zastosować liczbę losowych przekształceń z danej listy zastosowanych przekształceń i jak łatwo jest uwzględnić je w dowolnym potoku uczącym Keras.

Idąc dalej – praktyczne uczenie głębokie dla wizji komputerowej

Twoja dociekliwość sprawia, że ​​chcesz iść dalej? Zalecamy sprawdzenie naszego Kurs: „Praktyczne uczenie głębokie dla widzenia komputerowego z Pythonem”.

RandAugment do klasyfikacji obrazów z Keras/TensorFlow PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Kolejny kurs na temat wizji komputerowej?

Nie będziemy robić klasyfikacji cyfr MNIST ani mody MNIST. Swoją rolę pełnili dawno temu. Zbyt wiele zasobów edukacyjnych koncentruje się na podstawowych zestawach danych i podstawowych architekturach, zanim zaawansowane architektury czarnoskrzynkowe poniosą ciężar wydajności.

Chcemy się skupić demistyfikacja, praktyczność, zrozumienie, intuicja i realne projekty. Chcieć się nauczyć w jaki sposób możesz zrobić różnicę? Zabierzemy Cię na przejażdżkę od sposobu, w jaki nasze mózgi przetwarzają obrazy, przez pisanie klasyfikatora głębokiego uczenia się na poziomie badań naukowych w zakresie raka piersi, do sieci głębokiego uczenia się, które „halucynują”, ucząc Cię zasad i teorii poprzez praktyczną pracę, wyposażając Cię w know-how i narzędzia, aby stać się ekspertem w stosowaniu uczenia głębokiego do rozwiązywania wizji komputerowych.

Co jest w środku?

  • Pierwsze zasady widzenia i jak nauczyć komputery „widzieć”
  • Różne zadania i zastosowania wizji komputerowej
  • Narzędzia handlu, które ułatwią Ci pracę
  • Znajdowanie, tworzenie i wykorzystywanie zbiorów danych do wizji komputerowej
  • Teoria i zastosowanie splotowych sieci neuronowych
  • Obsługa zmiany domeny, współwystępowania i innych błędów w zbiorach danych
  • Transfer uczenia się i wykorzystanie czasu szkolenia innych i zasobów obliczeniowych dla Twojej korzyści
  • Budowanie i szkolenie najnowocześniejszego klasyfikatora raka piersi
  • Jak zastosować zdrową dawkę sceptycyzmu do głównych idei i zrozumieć konsekwencje powszechnie stosowanych technik?
  • Wizualizacja „przestrzeni koncepcyjnej” ConvNet za pomocą t-SNE i PCA
  • Studia przypadków, w jaki sposób firmy wykorzystują techniki widzenia komputerowego do osiągania lepszych wyników
  • Właściwa ocena modelu, wizualizacja przestrzeni utajonej i identyfikacja uwagi modelu
  • Wykonywanie badań domenowych, przetwarzanie własnych zbiorów danych i tworzenie testów modelowych
  • Najnowocześniejsze architektury, progresja pomysłów, co czyni je wyjątkowymi i jak je wdrażać
  • KerasCV – biblioteka WIP do tworzenia najnowocześniejszych rurociągów i modeli
  • Jak analizować i czytać artykuły i samodzielnie je wdrażać
  • Wybór modeli w zależności od aplikacji
  • Tworzenie kompleksowego procesu uczenia maszynowego
  • Krajobraz i intuicja w wykrywaniu obiektów za pomocą szybszych sieci R-CNN, sieci RetinaNet, dysków SSD i YOLO
  • Segmentacja instancyjna i semantyczna
  • Rozpoznawanie obiektów w czasie rzeczywistym za pomocą YOLOv5
  • Szkolenie wykrywaczy obiektów YOLOv5
  • Praca z transformatorami przy użyciu KerasNLP (biblioteka przemysłowa WIP)
  • Integracja Transformers z ConvNets w celu generowania podpisów obrazów
  • DeepDream
  • Optymalizacja modelu Deep Learning dla wizji komputerowej

Znak czasu:

Więcej z Nadużycie stosu