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'))
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ę:
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:
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”.
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