RandAugment kuvien luokitteluun Keras/TensorFlow PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

RandAugment kuvien luokitteluun Keras/TensorFlow:lla

Tietojen lisääminen on jo pitkään toiminut keinona korvata "staattinen" tietojoukko muunnetuilla muunnelmilla, mikä vahvistaa tietojen invarianssia. Konvoluutiohermoverkot (CNN), ja yleensä se johtaa syötteen kestävyyteen.

Huomautus: Muuttumattomuus tiivistyy mallien tekemiseen sokeiksi tietyille päätöksiä tehtäessä. Kissan kuva on edelleen kissan kuva, jos sitä peilataan tai pyöritetään.

Vaikka datan lisäys siinä muodossa, jota olemme käyttäneet, se koodaa a puute tietoa translaatiovarianssista, joka on tärkeää objektien havaitsemisessa, semanttisessa ja ilmentymän segmentoinnissa jne. invarianssi se tarjoaa usein suotuisaa luokittelumalleille, ja siten augmentaatiota sovelletaan yleisemmin ja aggressiivisemmin luokitusmalleihin.

Lisäyksen tyypit

Augmentaatio alkoi olla hyvin yksinkertaista – pienet kierrokset, vaaka- ja pystysuuntaiset käännökset, kontrastin tai kirkkauden vaihtelut jne. Viime vuosina on kehitetty monimutkaisempia menetelmiä, mm. Leikkaa (tilallinen dropout, joka lisää mustia neliöitä satunnaisesti syöttökuviin) ja Sekoittaa (kuvien osien sekoittaminen ja tarran mittasuhteiden päivittäminen) ja niiden yhdistelmä – LeikkaaMix. Uudemmat lisäysmenetelmät ottavat itse asiassa huomioon tarrat, ja menetelmät, kuten CutMix, muuttavat etiketin mittasuhteet vastaamaan kunkin luokan sekoitettujen osien ottamia kuvasuhteita.

Mahdollisten lisäysten kasvavan luettelon myötä jotkut ovat alkaneet soveltaa niitä satunnaisesti (tai ainakin joitain niistä) ajatuksena, että satunnainen lisäyssarja vahvistaa mallien kestävyyttä ja korvaa alkuperäisen sarjan paljon suuremmalla. syöttökuvien tila. Tämä on paikka RandAugment alkaa vaikuttaa!

KerasCV ja RandAugment

KerasCV on erillinen paketti, mutta silti virallinen lisäys Keraan, jonka on kehittänyt Keras-tiimi. Tämä tarkoittaa, että se saa saman määrän kiillotusta ja intuitiivisuutta kuin pääpaketissa, mutta se integroituu myös näennäisesti tavallisiin Keras-malleihin ja niiden kerroksiin. Ainoa ero, jonka huomaat, on soittaminen keras_cv.layers... sijasta keras.layers....

KerasCV on edelleen kehitteillä kirjoitettaessa ja sisältää jo 27 uutta esikäsittelytasoa, RandAugment, CutMixja MixUp olla osa heistä. Katsotaanpa, miltä soveltaminen näyttää RandAugment kuviin ja kuinka voimme kouluttaa luokittelijan satunnaisen lisäyksen kanssa ja ilman.

Ensin asenna keras_cv:

$ pip install keras_cv

Huomautus: KerasCV vaatii TensorFlow 2.9:n toimiakseen. Jos sinulla ei vielä ole sitä, juokse $ pip install -U tensorflow ensimmäinen.

Tuodaan nyt TensorFlow, Keras ja KerasCV sekä TensorFlow-tietojoukot, jotta Imagenette on helppo käyttää:

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

Ladataan kuva ja näytetään se alkuperäisessä muodossaan:

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)

Nyt haetaan RandAugment siihen useita kertoja ja katso tuloksia:

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 kuvien luokitteluun Keras/TensorFlow PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Kerroksessa on a magnitude argumentti, joka on oletuksena 0.5 ja sitä voidaan muuttaa lisäämään tai vähentämään augmentaation vaikutusta:

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

Kun arvo on asetettu alhaiseksi, esim 0.1 – näet paljon vähemmän aggressiivista lisäystä:

RandAugment kuvien luokitteluun Keras/TensorFlow PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Kerroksena – sitä voidaan käyttää malleissa tai sisällä tf.data putkia luodessasi tietojoukkoja. Tämä tekee RandAugment aika joustava! Lisäargumentteja ovat augmentations_per_image ja rate argumentteja, jotka toimivat yhdessä.

varten 0...augmentations_per_image, kerros lisää satunnaisen esikäsittelykerroksen liukuhihnaan, jota käytetään kuvaan. Oletusarvon tapauksessa 3 – putkilinjaan lisätään kolme erilaista toimintoa. Sitten otetaan satunnaisluku näyte jokaisesta liukuhihnassa olevasta lisäyksestä – ja jos se on pienempi kuin rate (oletuksena noin 0.9) – lisäystä käytetään.

Pohjimmiltaan – on 90 %:n todennäköisyys, että jokainen (satunnainen) lisäys liukuhihnassa sovelletaan kuvaan.

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Tämä luonnollisesti tarkoittaa, että kaikkia lisäyksiä ei tarvitse tehdä, varsinkin jos lasket rate. Voit myös mukauttaa, mitkä toiminnot ovat sallittuja kohdassa a RandomAugmentationPipeline kerros, joka RandAugment on erikoistapaus. Erillinen ohje RandomAugmentationPipeline julkaistaan ​​pian.

Luokittelijan koulutus RandAugmentin kanssa ja ilman

Yksinkertaistaa tietojen valmistelu/latausnäkökohta ja keskittyä RandAugment, käytetään tfds ladataksesi osan Imagenettesta:

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

Olemme ladaneet vain osan harjoitustiedoista, jotta tietojoukon ylisovittaminen on helpompaa harvemmilla aikakausilla (jolloin kokeilumme sujuu nopeammin). Koska Imagenetten kuvat ovat erikokoisia, luodaan a preprocess() toiminto, joka muuttaa niiden kokoa kartoittamaan tietojoukon, sekä an augment() toiminto, joka lisää kuvia 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']

Nyt – koodasimme tarrat yhdellä kertaa. Meidän ei välttämättä tarvinnut, mutta lisäyksiin kuten CutMix joka peukaloi tarroja ja niiden mittasuhteita, sinun on tehtävä. Koska saatat haluta soveltaa niitä myös RandAugment toimii todella hyvin niiden kanssa luoden vahvoja luokittimia – jätetään yksi kuuma koodaus mukaan. RandAugment ottaa sanakirjan kuvilla ja tunnisteilla juuri tämän vuoksi – jotkin lisättävät lisäykset todella muuttavat tunnisteita, joten ne ovat pakollisia. Voit poimia lisätyt kuvat ja tarrat outputs sanakirja helposti, joten tämä on ylimääräinen, mutta yksinkertainen vaihe, joka on suoritettava lisäyksen aikana.

Kartoitetaan olemassa olevat tietojoukot, jotka on palautettu tfds jossa preprocess() toiminto, yhdistä ne ja lisää vain harjoitussarjaa:

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)

Koulutetaan verkostoa! keras_cv.models sisältää joitain sisäänrakennettuja verkkoja, jotka ovat samanlaisia ​​kuin keras.applications. Vaikka luettelo on vielä lyhyt, se laajenee ajan myötä ja ottaa haltuunsa keras.applications. API on hyvin samanlainen, joten koodin siirtäminen on melko helppoa useimmille käyttäjille:


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)

Vaihtoehtoisesti voit käyttää virtaa 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)

Tämä johtaa malliin, joka ei todellakaan toimi kovin hyvin:

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

Harjoitetaan nyt sama verkkoasetus lisätylle tietojoukolle. Jokainen erä on lisätty erikseen, joten aina kun sama kuvaerä (seuraavassa aikakaudessa) ilmestyy, niillä on erilaisia ​​lisäyksiä:

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

Paljon parempi! Vaikka haluat silti käyttää muita lisäyksiä, kuten CutMix ja MixUp, muiden koulutustekniikoiden ohella verkon tarkkuuden maksimoimiseksi – juuri RandAugment auttoi merkittävästi ja sitä voidaan verrata pidempään lisäysputkeen.

Jos vertaat harjoituskäyriä, mukaan lukien harjoittelua ja validointikäyrät – selviää vasta kuinka paljon RandAugment auttaa:

RandAugment kuvien luokitteluun Keras/TensorFlow PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Ei-lisätyssä putkilinjassa verkko ylisovitetaan (harjoituksen tarkkuus osuu kattoon) ja validointitarkkuus pysyy alhaisena. Lisätyssä putkilinjassa harjoittelun tarkkuus pysyy alhaisempana kuin validointitarkkuus alusta loppuun.

Suuremman harjoitushäviön myötä verkko on paljon tietoisempi virheistä, joita se edelleen tekee, ja enemmän päivityksiä voidaan tehdä muutoksille muuttumattomiksi. Edellinen ei näe tarvetta päivittää, kun taas jälkimmäinen tekee ja nostaa potentiaalin kattoa.

Yhteenveto

KerasCV on erillinen paketti, mutta silti virallinen lisäys Kerakseen, Keras-tiimin kehittämä, jonka tarkoituksena on tuoda alan vahva CV Keras-projekteihisi. KerasCV on edelleen kehitteillä kirjoitettaessa ja sisältää jo 27 uutta esikäsittelytasoa, RandAugment, CutMixja MixUp olla osa heistä.

Tässä lyhyessä oppaassa olemme tarkastelleet, kuinka voit käyttää RandAugment käyttää useita satunnaisia ​​muunnoksia annetusta sovellettujen muunnosten luettelosta ja kuinka helppoa se on sisällyttää mihin tahansa Keras-koulutusputkeen.

Jatketaan – Käytännön syvällistä oppimista tietokonenäköön

Utelias luonteesi saa sinut haluamaan pidemmälle? Suosittelemme tutustumaan meidän Kurssi: "Käytännön syvällinen oppiminen tietokonenäön käyttöön Pythonilla".

RandAugment kuvien luokitteluun Keras/TensorFlow PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Toinen tietokonenäkökurssi?

Emme luokittele MNIST-numeroita tai MNIST-muotia. He palvelivat osansa kauan sitten. Liian monet oppimisresurssit keskittyvät perustietosarjoihin ja perusarkkitehtuureihin, ennen kuin edistyneiden black-box-arkkitehtuurien annetaan kantaa suoritustaakka.

Haluamme keskittyä demystifikaatio, käytännöllisyys, ymmärtäminen, intuitio ja oikeita projekteja. Haluan oppia miten voitko vaikuttaa? Viemme sinut matkalle aivomme prosessoinnista kuvien tutkimiseen rintasyövän syväoppimisluokittajan kirjoittamiseen syväoppimisverkostoihin, jotka "halusinoivat", opettaen sinulle periaatteita ja teoriaa käytännön työssä ja varustamalla tietotaitoa ja työkaluja tullaksesi asiantuntijaksi syväoppimisen soveltamisessa tietokonenäön ratkaisemiseen.

Mitä on sisällä?

  • Näön ensimmäiset periaatteet ja kuinka tietokoneet voidaan opettaa "näkemään"
  • Tietokonenäön eri tehtävät ja sovellukset
  • Ammatin työkalut, jotka helpottavat työtäsi
  • Tietokokonaisuuksien etsiminen, luominen ja hyödyntäminen tietokonenäköä varten
  • Konvoluutiohermoverkkojen teoria ja sovellus
  • Verkkotunnuksen siirtymisen, samanaikaisen esiintymisen ja muiden vääristymien käsittely tietojoukoissa
  • Siirrä Oppiminen ja muiden koulutusajan ja laskennallisten resurssien hyödyntäminen hyödyksesi
  • Huippuluokan rintasyövän luokittelijan rakentaminen ja kouluttaminen
  • Kuinka soveltaa tervettä annos skeptisyyttä valtavirran ideoihin ja ymmärtää laajalti käytettyjen tekniikoiden vaikutukset
  • ConvNetin "konseptitilan" visualisointi t-SNE:n ja PCA:n avulla
  • Tapaustutkimuksia siitä, kuinka yritykset käyttävät tietokonenäkötekniikoita parempien tulosten saavuttamiseksi
  • Oikea mallin arviointi, piilevän tilan visualisointi ja mallin huomion tunnistaminen
  • Toimialuetutkimuksen suorittaminen, omien tietojoukkojen käsittely ja mallitestien laatiminen
  • Huippuluokan arkkitehtuurit, ideoiden eteneminen, mikä tekee niistä ainutlaatuisia ja miten ne toteutetaan
  • KerasCV – WIP-kirjasto uusimpien putkien ja mallien luomiseen
  • Kuinka jäsentää ja lukea papereita ja toteuttaa ne itse
  • Mallien valinta sovelluksesi mukaan
  • Luodaan päästä päähän koneoppimisputki
  • Maisema ja intuitio kohteen havaitsemisessa nopeampien R-CNN-, RetinaNet-, SSD- ja YOLO-verkkojen avulla
  • Instanssi ja semanttinen segmentointi
  • Reaaliaikainen objektintunnistus YOLOv5:n avulla
  • YOLOv5-objektitunnistimien koulutus
  • Työskentely Transformersin kanssa KerasNLP:n (teollisuuden vahvuus WIP-kirjasto) avulla
  • Transformersin integrointi ConvNet-verkkojen kanssa kuvien tekstitysten luomiseksi
  • Deepdream
  • Deep Learning -mallin optimointi tietokonenäköä varten

Aikaleima:

Lisää aiheesta Stackabus