Az adatkiegészítés hosszú ideje a „statikus” adatkészletek transzformált változatokkal való helyettesítésének eszközeként szolgált, megerősítve az adatok változatlanságát. Konvolúciós neurális hálózatok (CNN-ek), és általában a bevitel robusztusságához vezet.
Jegyzet: A változatlanság abban rejlik, hogy a modellek vakok lesznek bizonyos pertubációkra a döntéshozatal során. A macska képe továbbra is macska képe, ha tükrözi vagy elforgatja.
Míg az általunk használt formában történő adatbővítés kódolja a hiánya a transzlációs varianciával kapcsolatos ismeretek, amelyek fontosak az objektumok észleléséhez, a szemantikai és példányszegmentációhoz stb. változatlanság Ez gyakran kedvező az osztályozási modellek számára, így az augmentációt gyakrabban és agresszívebben alkalmazzák az osztályozási modellekre.
Az augmentáció típusai
A kibővítés kezdett nagyon egyszerűnek lenni – kis forgatások, vízszintes és függőleges átfordítások, kontraszt- vagy fényerő-ingadozások stb. Az utóbbi években bonyolultabb módszereket dolgoztak ki, mint pl. Kivág (térbeli kiesés fekete négyzeteket véletlenszerűen bevezetve a bemeneti képekbe) és Összekever (képrészletek összekeverése és a címkearányok frissítése), és ezek kombinációja – CutMix. Az újabb kiegészítési módszerek tulajdonképpen a címkéket veszik figyelembe, és az olyan módszerek, mint a CutMix, úgy változtatják meg a címke arányait, hogy egyenlők legyenek az egyes osztályok összekeveredett részei által felvett kép arányaival.
A lehetséges kiegészítések egyre növekvő listája miatt egyesek véletlenszerűen kezdték alkalmazni őket (vagy legalábbis egy részhalmazukat), azzal az elképzeléssel, hogy a véletlenszerű kiegészítések megerősítik a modellek robusztusságát, és az eredeti készletet sokkal nagyobbra cserélik. bemeneti képek tere. Ez az, ahol RandAugment
beüt!
KerasCV és RandAugment
KerasCV egy külön csomag, de még mindig a Keras hivatalos kiegészítése, amelyet a Keras csapata fejlesztett ki. Ez azt jelenti, hogy ugyanannyi fényezést és intuitivitást kap, mint a főcsomag, de a szokásos Keras modellekkel és azok rétegeivel is látszólag illeszkedik. Az egyetlen különbség, amit valaha is észrevesz, a hívás keras_cv.layers...
helyett keras.layers...
.
A KerasCV még mindig fejlesztés alatt áll, és már 27 új előfeldolgozási réteget tartalmaz, RandAugment
, CutMix
és MixUp
lévén néhány közülük. Nézzük meg, hogyan néz ki az alkalmazás RandAugment
képekhez, és hogyan taníthatunk osztályozót véletlenszerű kiegészítéssel és anélkül.
Először telepítse keras_cv
:
$ pip install keras_cv
Jegyzet: A KerasCV működéséhez TensorFlow 2.9 szükséges. Ha még nincs meg, fuss $ pip install -U tensorflow
először.
Most importáljunk TensorFlow-t, Keras-t és KerasCV-t a TensorFlow-adatkészletek mellé az Imagenette-hez való könnyű hozzáférés érdekében:
import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds
Töltsünk be egy képet és jelenítsük meg eredeti formájában:
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)
Most pedig jelentkezzünk RandAugment
többször, és nézze meg az eredményeket:
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'))
A rétegnek van a magnitude
argumentum, amely az alapértelmezett 0.5
és módosítható az augmentáció hatásának növelése vagy csökkentése érdekében:
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'))
Alacsony értékre állítva, mint pl 0.1
– sokkal kevésbé agresszív növekedést fog látni:
Réteg lévén – használható modelleken belül vagy belül tf.data
adathalmazok létrehozása közben. Ez teszi RandAugment
elég rugalmas! További érvek a augmentations_per_image
és a rate
érvek, amelyek együtt működnek.
A 0...augmentations_per_image
, a réteg egy véletlenszerű előfeldolgozó réteget ad a folyamathoz, amelyet a képre kell alkalmazni. Az alapértelmezett esetén 3
– három különböző művelettel egészül ki a csővezeték. Ezután egy véletlen szám mintát vesz a folyamatban lévő minden egyes kiegészítéshez – és ha ez kisebb, mint rate
(alapértelmezetten kb 0.9
) – a kiegészítést alkalmazzák.
Lényegében – 90% a valószínűsége annak, hogy a folyamatban lévő minden egyes (véletlenszerű) kiegészítést alkalmazzák a képen.
Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!
Ez természetesen azt jelenti, hogy nem kell minden növelést alkalmazni, különösen, ha csökkenti a rate
. Azt is testreszabhatja, hogy mely műveletek engedélyezettek a RandomAugmentationPipeline
réteg, amely RandAugment
speciális esete. Egy külön útmutató RandomAugmentationPipeline
hamarosan közzétesszük.
Osztályozó képzése RandAugmenttel és anélkül
Az adat-előkészítési/betöltési szempont egyszerűsítése és a fókuszálás RandAugment
, használjuk tfds
az Imagenette egy részének betöltéséhez:
(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))
Csak a betanítási adatok egy részét töltöttük be, hogy megkönnyítsük az adatkészlet túlillesztését kevesebb korszakban (gyorsabbá téve ezzel a kísérletünket). Mivel az Imagenette-ben lévő képek különböző méretűek, készítsünk a preprocess()
függvény, amely átméretezi őket az adatkészlet leképezéséhez, valamint egy augment()
funkció, amely kiegészíti a képeket 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']
Most – egyhangúan kódoltuk a címkéket. Nem feltétlenül kellett, de olyan bővítésekhez, mint pl CutMix
ha megzavarja a címkéket és azok arányait, akkor muszáj lesz. Mivel érdemes alkalmazni azokat is RandAugment
nagyon jól működik velük robusztus osztályozók létrehozásához – hagyjuk a one-hot kódolást. Ezenkívül RandAugment
pontosan emiatt vesz fel egy szótárat a képekkel és címkékkel – egyes kiegészítések, amelyeket hozzáadhat, ténylegesen megváltoztatják a címkéket, ezért ezek kötelezőek. A kibővített képeket és címkéket a outputs
szótár könnyen, így ez egy extra, de mégis egyszerű lépés a bővítés során.
Leképezzük a meglévő adatkészleteket, amelyekről visszajöttek tfds
a ... val preprocess()
funkciót, kötegelni kell őket, és csak az edzéskészletet bővíteni:
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)
Neveljünk hálózatot! keras_cv.models
-hoz hasonló beépített hálózatokkal rendelkezik keras.applications
. Bár a lista még mindig rövid, idővel bővülni fog, és átveszi a helyét keras.applications
. Az API nagyon hasonló, így a kódhordozás meglehetősen egyszerű lesz a legtöbb gyakorló számára:
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)
Alternatív megoldásként használhatja az áramot 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)
Ez egy olyan modellt eredményez, amely nem igazán működik túl jól:
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
Most tanítsuk meg ugyanazt a hálózati beállítást a kiterjesztett adatkészleten. Minden köteg külön-külön kibővítve van, így amikor ugyanaz a képköteg (a következő korszakban) jelenik meg, különböző kiegészítések lesznek:
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
Sokkal jobb! Miközben továbbra is szeretne más növeléseket alkalmazni, mint pl CutMix
és a MixUp
, más képzési technikák mellett a hálózat pontosságának maximalizálása érdekében – csak RandAugment
jelentősen segített, és összehasonlítható egy hosszabb augmentációs csővezetékkel.
Ha összehasonlítja az edzési görbéket, beleértve az edzést is és a érvényesítési görbéket – csak az derül ki, hogy mennyi RandAugment
segít:
A nem bővített csővezetékben a hálózat túlilleszkedik (a képzési pontosság eléri a plafont), és az érvényesítési pontosság alacsony marad. A bővített csővezetékben a a képzési pontosság az elejétől a végéig alacsonyabb marad, mint az érvényesítési pontosság.
Magasabb képzési veszteség esetén a hálózat sokkal jobban tudatában van a még elkövetett hibáknak, és több frissítést lehet végrehajtani, hogy változatlan legyen az átalakításokhoz. Előbbi nem látja szükségét a frissítésre, míg az utóbbi igen, és megemeli a potenciál plafonját.
Következtetés
KerasCV egy külön csomag, de még mindig a Keras hivatalos kiegészítése, amelyet a Keras csapata fejlesztett ki, és célja, hogy iparágilag erős önéletrajzot vigyen Keras projektjeibe. A KerasCV még mindig fejlesztés alatt áll, és már 27 új előfeldolgozási réteget tartalmaz, RandAugment
, CutMix
és MixUp
lévén néhány közülük.
Ebben a rövid útmutatóban megvizsgáltuk, hogyan használhatja RandAugment
hogy számos véletlenszerű transzformációt alkalmazzon az alkalmazott transzformációk adott listájából, és milyen könnyen beépíthető bármely Keras képzési folyamatba.
Továbblépve – Gyakorlati mélytanulás a számítógépes látáshoz
Érdeklődő természete arra készteti, hogy tovább menjen? Javasoljuk, hogy tekintse meg nálunk Tanfolyam: „Practical Deep Learning for Computer Vision with Python”.
Újabb számítógépes látás tanfolyam?
Nem végezzük az MNIST számjegyek osztályozását vagy az MNIST divatot. Régen kiszolgálták a részüket. Túl sok tanulási erőforrás összpontosít az alapvető adatkészletekre és alapvető architektúrákra, mielőtt a fejlett feketedoboz-architektúrákra hagyná a teljesítmény terhét.
Mi arra szeretnénk koncentrálni demisztifikáció, gyakorlatiasság, megértés, intuíció és a valódi projektek. Tanulni akar hogyan tudsz változtatni? Elvezetjük Önt az agyunk képfeldolgozási módjától a mellrák kutatási szintű mélytanulási osztályozójának megírásáig a mély tanulási hálózatokig, amelyek „hallucinálnak”, gyakorlati munkán keresztül megtanítjuk az alapelveket és az elméletet, felkészítve a know-how és eszközök ahhoz, hogy szakértővé váljon a mélytanulás alkalmazásában a számítógépes látás megoldásában.
Mi van benne?
- A látás első alapelvei és hogyan lehet a számítógépeket „látni” tanítani
- A számítógépes látás különböző feladatai és alkalmazásai
- A szakma eszközei, amelyek megkönnyítik a munkáját
- Adatkészletek keresése, létrehozása és felhasználása számítógépes látáshoz
- A konvolúciós neurális hálózatok elmélete és alkalmazása
- Tartományeltolódás, együttes előfordulás és egyéb torzítások kezelése az adatkészletekben
- Transzfer Tanulás és mások képzési idejének és számítási erőforrásainak felhasználása az Ön javára
- Korszerű emlőrák osztályozó felépítése és betanítása
- Hogyan alkalmazzunk egy egészséges adag szkepticizmust a mainstream ötletekhez, és hogyan értsük meg a széles körben elfogadott technikák következményeit
- A ConvNet „koncepcióterének” megjelenítése t-SNE és PCA segítségével
- Esettanulmányok arról, hogy a vállalatok hogyan használják a számítógépes látástechnikákat a jobb eredmények elérése érdekében
- Megfelelő modellértékelés, látens tér vizualizáció és a modell figyelmének azonosítása
- Domainkutatás végzése, saját adatkészletek feldolgozása és modelltesztek létrehozása
- Élvonalbeli architektúrák, az ötletek fejlődése, mi teszi őket egyedivé és hogyan valósítsuk meg őket
- KerasCV – WIP-könyvtár a legkorszerűbb csővezetékek és modellek létrehozásához
- Hogyan elemezze és olvassa el a dolgozatokat, és saját maga hajtsa végre azokat
- Modellek kiválasztása az alkalmazástól függően
- Végpontok közötti gépi tanulási folyamat létrehozása
- Tájkép és intuíció a tárgyfelismeréshez a gyorsabb R-CNN-ekkel, RetinaNetekkel, SSD-kkel és YOLO-val
- Példány és szemantikai szegmentáció
- Valós idejű objektumfelismerés a YOLOv5 segítségével
- YOLOv5 objektumdetektorok képzése
- Transzformátorokkal való munkavégzés KerasNLP-vel (ipari erősségű WIP-könyvtár)
- Transformers integrálása ConvNetekkel a képek feliratainak létrehozásához
- Deepdream
- Deep Learning modell optimalizálása számítógépes látáshoz