RandAugment za klasifikacijo slik s podatkovno inteligenco Keras/TensorFlow PlatoBlockchain. Navpično iskanje. Ai.

RandAugment za klasifikacijo slik s Keras/TensorFlow

Povečevanje podatkov je dolgo časa služilo kot sredstvo za zamenjavo "statičnega" nabora podatkov s transformiranimi različicami, s čimer se krepi nespremenljivost Konvolucijske nevronske mreže (CNN)in običajno vodi do robustnosti vnosa.

Opomba: Invariantnost se zmanjša na to, da so modeli pri sprejemanju odločitev slepi za določene pertubacije. Slika mačke je še vedno slika mačke, če jo zrcalite ali zavrtite.

Medtem ko povečanje podatkov v obliki, ki jo uporabljamo, kodira a Pomanjkanje znanja o prevodni varianti, ki je pomembna za odkrivanje objektov, pomensko in instančno segmentacijo itd. – invariantnost zagotavlja, da je pogosto ugoden za klasifikacijske modele, zato se razširitev pogosteje in bolj agresivno uporablja za klasifikacijske modele.

Vrste povečanja

Povečevanje je bilo na začetku zelo preprosto – majhni zasuki, vodoravni in navpični preobrati, nihanja kontrasta ali svetlosti itd. V zadnjih letih so bile oblikovane bolj dodelane metode, vključno z izrezati (prostorski izpad, ki v vhodne slike naključno uvaja črne kvadratke) in Pomešati (mešanje delov slik in posodabljanje razmerij nalepk) in njihova kombinacija – CutMix. Novejše metode povečanja dejansko upoštevajo oznake, metode, kot je CutMix, pa spremenijo razmerja oznak tako, da so enaka razmerjem slike, ki jo zavzamejo deli vsakega razreda, ki se pomeša.

Z naraščajočim seznamom možnih razširitev so jih nekateri začeli uporabljati naključno (ali vsaj nekatere njihove podmnožice), z idejo, da bo naključni niz razširitev okrepil robustnost modelov in nadomestil prvotni niz z veliko večjim prostor vhodnih slik. Tukaj je RandAugment udari!

KerasCV in RandAugment

KerasCV je ločen paket, vendar še vedno uradni dodatek Kerasu, ki ga je razvila ekipa Keras. To pomeni, da ima enako polnost in intuitivnost kot glavni paket, vendar se tudi nevidno integrira z običajnimi modeli Keras in njihovimi plastmi. Edina razlika, ki jo boste kdaj opazili, je klicanje keras_cv.layers... Namesto keras.layers....

KerasCV je v času pisanja še vedno v razvoju in že vključuje 27 novih plasti za predprocesiranje, RandAugment, CutMixin MixUp biti nekateri izmed njih. Poglejmo, kako izgleda prijava RandAugment do slik in kako lahko usposobimo klasifikator z in brez naključnega povečanja.

Najprej namestite keras_cv:

$ pip install keras_cv

Opomba: KerasCV za delovanje potrebuje TensorFlow 2.9. Če ga še nimate, tecite $ pip install -U tensorflow najprej.

Zdaj pa uvozimo TensorFlow, Keras in KerasCV skupaj z nabori podatkov TensorFlow za enostaven dostop do Imagenette:

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

Naložimo sliko in jo prikažimo v izvirni obliki:

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)

Zdaj pa se prijavimo RandAugment večkrat in si oglejte rezultate:

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 za klasifikacijo slik s podatkovno inteligenco Keras/TensorFlow PlatoBlockchain. Navpično iskanje. Ai.

Plast ima a magnitude argument, ki je privzeto nastavljen 0.5 in se lahko spremeni za povečanje ali zmanjšanje učinka povečanja:

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

Ko je nastavljena na nizko vrednost, kot je npr 0.1 – videli boste veliko manj agresivno povečanje:

RandAugment za klasifikacijo slik s podatkovno inteligenco Keras/TensorFlow PlatoBlockchain. Navpično iskanje. Ai.

Kot plast se lahko uporablja znotraj modelov ali v tf.data cevovodov med ustvarjanjem nizov podatkov. To naredi RandAugment precej prilagodljiv! Dodatni argumenti so augmentations_per_image in rate argumenti, ki delujejo skupaj.

za 0...augmentations_per_image, sloj doda naključno plast predprocesiranja v cevovod, ki se uporabi za sliko. V primeru neplačila 3 – v cevovod so dodane tri različne operacije. Nato se vzorči naključno število za vsako povečanje v cevovodu – in če je nižje od rate (privzeto na okoli 0.9) – razširitev je uporabljena.

V bistvu – obstaja 90-odstotna verjetnost, da bo vsaka (naključna) razširitev v cevovodu uporabljena za sliko.

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

To seveda pomeni, da ni treba uporabiti vseh povečav, še posebej, če znižate rate. Prav tako lahko prilagodite, katere operacije so dovoljene prek a RandomAugmentationPipeline plast, ki RandAugment je poseben primer. Ločen vodnik o RandomAugmentationPipeline bo kmalu objavljeno.

Usposabljanje klasifikatorja z in brez RandAugment

Za poenostavitev vidika priprave/nalaganja podatkov in osredotočanja na RandAugment, uporabimo tfds za nalaganje v del 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)) 

Naložili smo samo del podatkov o usposabljanju, da bi olajšali preoblikovanje nabora podatkov v manj obdobjih (pravzaprav bo naš poskus potekal hitreje). Ker so slike v Imagenette različnih velikosti, ustvarimo a preprocess() funkcija, ki jim spremeni velikost za preslikavo nabora podatkov, kot tudi augment() funkcija, ki poveča slike v 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']

Sedaj – naenkrat smo zakodirali oznake. Ni nam bilo nujno, ampak za povečave, kot CutMix ki spreminjajo oznake in njihova razmerja, boste morali. Ker boste morda želeli uporabiti tudi te RandAugment z njimi zelo dobro deluje pri ustvarjanju robustnih klasifikatorjev – pustimo enkratno kodiranje. RandAugment sprejme slovar s slikami in oznakami ravno zaradi tega – nekatere razširitve, ki jih lahko dodate, bodo dejansko spremenile oznake, zato so obvezne. Razširjene slike in oznake lahko izvlečete iz outputs slovar enostavno, zato je to dodaten, a preprost korak, ki ga je treba izvesti med povečevanjem.

Preslikajmo obstoječe nabore podatkov, vrnjene iz tfds s preprocess() funkcijo, jih združite in povečajte samo nabor za usposabljanje:

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)

Usposobimo mrežo! keras_cv.models ima nekaj vgrajenih omrežij, podobnih keras.applications. Čeprav je seznam še vedno kratek – se bo s časom razširil in prevzel keras.applications. API je zelo podoben, zato bo prenos kode za večino praktikov dokaj enostaven:


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)

Lahko pa uporabite tudi tok 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)

Posledica tega je model, ki v resnici ne deluje najbolje:

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

Zdaj pa urimo isto nastavitev omrežja na razširjenem naboru podatkov. Vsaka serija je posebej razširjena, tako da kadar koli se pojavi ista serija slik (v naslednjem obdobju), bodo imele različne razširitve:

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

Precej bolje! Medtem ko bi še vedno želeli uporabiti druge razširitve, kot je npr CutMix in MixUp, skupaj z drugimi tehnikami usposabljanja za povečanje natančnosti omrežja – samo RandAugment znatno pomagal in je lahko primerljiv z daljšim cevovodom za razširitev.

Če primerjate krivulje treninga, vključno s treningom in validacijskih krivulj – šele postane jasno, koliko RandAugment pomaga:

RandAugment za klasifikacijo slik s podatkovno inteligenco Keras/TensorFlow PlatoBlockchain. Navpično iskanje. Ai.

V nerazširjenem cevovodu se omrežje preseže (natančnost usposabljanja doseže zgornjo mejo) in natančnost validacije ostane nizka. V razširjenem cevovodu je Natančnost usposabljanja ostane nižja od natančnosti validacije od začetka do konca.

Z večjo izgubo usposabljanja se omrežje veliko bolj zaveda napak, ki jih še vedno dela, poleg tega je mogoče narediti več posodobitev, da postane nespremenljivo za transformacije. Prvi ne vidi potrebe po posodabljanju, drugi pa to počne in dviguje zgornjo mejo potenciala.

zaključek

KerasCV je ločen paket, vendar še vedno uradni dodatek k Kerasu, ki ga je razvila ekipa Keras z namenom, da v vaše projekte Keras vključite življenjepis, ki je močan v industriji. KerasCV je v času pisanja še vedno v razvoju in že vključuje 27 novih plasti za predprocesiranje, RandAugment, CutMixin MixUp biti nekateri izmed njih.

V tem kratkem vodniku smo si ogledali, kako lahko uporabite RandAugment za uporabo številnih naključnih transformacij z danega seznama uporabljenih transformacij in kako enostavno je to vključiti v kateri koli cevovod za usposabljanje Keras.

Naprej – Praktično poglobljeno učenje za računalniški vid

Ali zaradi vaše radovedne narave želite iti dlje? Priporočamo, da si ogledate naše Tečaj: »Praktično poglobljeno učenje za računalniški vid s Pythonom«.

RandAugment za klasifikacijo slik s podatkovno inteligenco Keras/TensorFlow PlatoBlockchain. Navpično iskanje. Ai.

Še en tečaj računalniškega vida?

Ne bomo izvajali klasifikacije števk MNIST ali načina MNIST. Svojo so že zdavnaj odslužili. Preveč učnih virov se osredotoča na osnovne nabore podatkov in osnovne arhitekture, preden prepusti naprednim arhitekturam črnih skrinjic breme zmogljivosti.

Želimo se osredotočiti na demistifikacija, praktičnosti, razumevanje, intuicija in pravi projekti. Želim se naučiti kako lahko kaj spremeniš? Popeljali vas bomo od načina, na katerega naši možgani obdelujejo slike, do pisanja raziskovalnega klasifikatorja globokega učenja za raka dojke do omrežij globokega učenja, ki »halucinirajo«, vas naučijo načel in teorije s praktičnim delom ter vas opremijo z znanje in izkušnje ter orodja, da postanete strokovnjak za uporabo globokega učenja za reševanje računalniškega vida.

Kaj je notri?

  • Prva načela vida in kako lahko računalnike naučimo "videti"
  • Različne naloge in aplikacije računalniškega vida
  • Strokovna orodja, ki vam bodo olajšala delo
  • Iskanje, ustvarjanje in uporaba naborov podatkov za računalniški vid
  • Teorija in uporaba konvolucijskih nevronskih mrež
  • Obravnava premikov domene, sopojavljanja in drugih pristranskosti v nizih podatkov
  • Prenos učenja in uporaba časa za usposabljanje in računalniških virov drugih v vašo korist
  • Izdelava in usposabljanje najsodobnejšega klasifikatorja raka dojke
  • Kako uporabiti zdrav odmerek skepticizma za glavne ideje in razumeti posledice splošno sprejetih tehnik
  • Vizualizacija »konceptnega prostora« ConvNet z uporabo t-SNE in PCA
  • Študije primerov o tem, kako podjetja uporabljajo tehnike računalniškega vida za doseganje boljših rezultatov
  • Pravilno vrednotenje modela, vizualizacija latentnega prostora in prepoznavanje pozornosti modela
  • Izvajanje domenskih raziskav, obdelava lastnih naborov podatkov in vzpostavljanje testov modelov
  • Vrhunske arhitekture, razvoj idej, kaj jih dela edinstvene in kako jih uresničiti
  • KerasCV – knjižnica WIP za ustvarjanje najsodobnejših cevovodov in modelov
  • Kako razčleniti in brati prispevke ter jih implementirati sami
  • Izbira modelov glede na vašo aplikacijo
  • Ustvarjanje cevovoda strojnega učenja od konca do konca
  • Pokrajina in intuicija pri zaznavanju predmetov s hitrejšimi R-CNN, RetinaNets, SSD in YOLO
  • Instančna in pomenska segmentacija
  • Prepoznavanje predmetov v realnem času z YOLOv5
  • Usposabljanje detektorjev predmetov YOLOv5
  • Delo s transformatorji z uporabo KerasNLP (industrijska knjižnica WIP)
  • Integracija Transformers s ConvNets za ustvarjanje napisov slik
  • Deepdream
  • Optimizacija modela globokega učenja za računalniški vid

Časovni žig:

Več od Stackabuse