RandAugment kujutiste klassifitseerimiseks Keras/TensorFlow PlatoBlockchaini andmeanalüüsiga. Vertikaalne otsing. Ai.

RandAugment kujutiste klassifitseerimiseks Keras/TensorFlow abil

Andmete suurendamine on pikka aega olnud vahend "staatilise" andmestiku asendamiseks teisendatud variantidega, mis tugevdab andmete muutumatust. Konvolutsioonilised närvivõrgud (CNN), mis tavaliselt toob kaasa sisendi vastupidavuse.

Märge: Invariantsus taandub sellele, et mudelid on otsuste tegemisel teatud pertubatsioonide suhtes pimedad. Kassi kujutis on endiselt kassi kujutis, kui seda peegeldada või pöörata.

Kuigi andmete suurendamine sellisel kujul, nagu oleme seda kasutanud, kodeerib a puudus teadmisi translatsiooni dispersiooni kohta, mis on oluline objektide tuvastamiseks, semantilisteks ja eksemplarideks segmenteerimiseks jne. muutumatus see pakub sageli soodsat klassifikatsioonimudelit ja seega rakendatakse suurendamist klassifikatsioonimudelitele sagedamini ja agressiivsemalt.

Suurendamise tüübid

Augmentatsioon hakkas olema väga lihtne – väikesed pöörded, horisontaalsed ja vertikaalsed pöörded, kontrasti või heleduse kõikumised jne. Viimastel aastatel on välja töötatud keerukamaid meetodeid, sh. välja lõigata (ruumiline väljalangemine, mis sisestab sisendpiltidel juhuslikult mustad ruudud) ja MixUp (pildiosade segamine ja sildi proportsioonide värskendamine) ja nende kombinatsioon – CutMix. Uuemad suurendamismeetodid arvestavad tegelikult siltidega ja sellised meetodid nagu CutMix muudavad sildi proportsioonid võrdseks iga segatud klassi osade pildi proportsioonidega.

Kuna võimalike täienduste nimekiri kasvab, on mõned hakanud neid juhuslikult rakendama (või vähemalt mõnda nende alamhulka) mõttega, et juhuslik täienduste komplekt suurendab mudelite vastupidavust ja asendab algse komplekti palju suuremaga. sisendpiltide ruum. See on koht RandAugment lööb sisse!

KerasCV ja RandAugment

KerasCV on eraldi pakett, kuid siiski ametlik Kerase täiendus, mille on välja töötanud Kerase meeskond. See tähendab, et see saab sama palju lihvi ja intuitiivsust kui põhipakett, kuid see integreerub näiliselt ka tavaliste Kerase mudelite ja nende kihtidega. Ainus erinevus, mida märkate, on helistamine keras_cv.layers... asemel keras.layers....

KerasCV on kirjutamise seisuga alles väljatöötamisel ja sisaldab juba 27 uut eeltöötluskihti, RandAugment, CutMixja MixUp olles mõned neist. Vaatame, kuidas see taotlemine välja näeb RandAugment piltidele ja kuidas me saame koolitada klassifikaatorit juhusliku suurendamisega ja ilma.

Esiteks installige keras_cv:

$ pip install keras_cv

Märge: KerasCV töötamiseks vajab TensorFlow 2.9. Kui sul seda veel pole, jookse $ pip install -U tensorflow esiteks

Impordime nüüd TensorFlow, Keras ja KerasCV koos TensorFlow andmekogumitega, et Imagenette'ile hõlpsalt juurde pääseda:

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

Laadime sisse pildi ja kuvame selle algsel kujul:

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)

Nüüd kandideerime RandAugment sellele mitu korda ja vaadake tulemusi:

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 kujutiste klassifitseerimiseks Keras/TensorFlow PlatoBlockchaini andmeanalüüsiga. Vertikaalne otsing. Ai.

Kihil on a magnitude argument, mis vaikimisi on 0.5 ja seda saab muuta, et suurendada või vähendada suurendamise mõju:

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

Kui see on seatud madalale väärtusele, näiteks 0.1 – näete palju vähem agressiivset kasvu:

RandAugment kujutiste klassifitseerimiseks Keras/TensorFlow PlatoBlockchaini andmeanalüüsiga. Vertikaalne otsing. Ai.

Olles kiht – seda saab kasutada mudelite sees või sees tf.data torujuhtmeid andmestike loomise ajal. See teeb RandAugment päris paindlik! Täiendavad argumendid on augmentations_per_image ja rate argumendid, mis töötavad koos.

eest 0...augmentations_per_image, lisab kiht konveierile juhusliku eeltöötluskihi, mida pildile rakendada. Vaikimisi korral 3 – torujuhtmele lisatakse kolm erinevat toimingut. Seejärel võetakse iga konveieril oleva täienduse jaoks juhuslik arv valim – ja kui see on väiksem kui rate (vaikimisi umbes 0.9) – rakendatakse suurendamist.

Sisuliselt – on 90% tõenäosus, et pildile rakendatakse konveieri iga (juhusliku) täiendust.

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

See tähendab loomulikult, et kõiki suurendamisi ei pea rakendama, eriti kui alandate rate. Samuti saate kohandada, millised toimingud on lubatud läbi a RandomAugmentationPipeline kiht, mis RandAugment on erijuhtum. Eraldi juhend peal RandomAugmentationPipeline avaldatakse peagi.

Klassifikaatori väljaõpe RandAugmentiga ja ilma

Andmete ettevalmistamise/laadimise aspekti lihtsustamiseks ja keskendumiseks RandAugment, kasutame tfds Imagenette'i osasse laadimiseks:

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

Laadisime sisse ainult osa treeninguandmetest, et andmekogumit oleks vähematel ajajärkudel lihtsam üle sobitada (mis muudab meie katse tegelikult kiiremaks). Kuna Imagenette’is olevad pildid on erineva suurusega, siis loome a preprocess() funktsioon, mis muudab nende suurust andmestiku kaardistamiseks, samuti augment() funktsioon, mis suurendab pilte 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']

Nüüd – me kodeerisime sildid ühekordselt. Me ei pidanud seda ilmtingimata tegema, aga näiteks laiendusteks CutMix et silte ja nende proportsioone rikkuda, peate seda tegema. Kuna võiksite ka neid rakendada RandAugment töötab nendega väga hästi tugevate klassifikaatorite loomiseks – jätkem ühekuuma kodeering sisse. Lisaks RandAugment võtab sõnastiku piltide ja siltidega just seetõttu – mõned lisatavad täiendused muudavad silte tegelikult, seega on need kohustuslikud. Saate laiendatud pilte ja silte ekstraheerida rakendusest outputs sõnastikku on lihtne, nii et see on täiendamise ajal täiendav, kuid samas lihtne samm.

Kaardistame olemasolevad andmestikud, millest on tagastatud tfds koos preprocess() funktsiooni, komplekteerige need ja suurendage ainult treeningkomplekti:

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)

Treenime võrgustikku! keras_cv.models sellel on mõned sarnased sisseehitatud võrgud keras.applications. Kuigi nimekiri on veel lühike, laieneb see aja jooksul ja võtab võimust keras.applications. API on väga sarnane, nii et koodi teisaldamine on enamiku praktikute jaoks üsna lihtne:


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)

Teise võimalusena võite kasutada voolu 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)

Tulemuseks on mudel, millel ei lähe eriti hästi:

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

Nüüd treenime sama võrgu seadistust laiendatud andmestikul. Iga partii täiendatakse individuaalselt, nii et iga kord, kui ilmub sama piltide partii (järgmisel ajajärgul), on neil erinevad täiendused:

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

Palju parem! Kuigi soovite siiski rakendada muid täiendusi, nt CutMix ja MixUp, kõrvuti muude koolitustehnikatega, et maksimeerida võrgu täpsust – lihtsalt RandAugment aitas oluliselt kaasa ja on võrreldav pikema suurendamistorustikuga.

Kui võrrelda treeningkõveraid, sealhulgas treeningut ja valideerimiskõverad – alles selgub, kui palju RandAugment aitab:

RandAugment kujutiste klassifitseerimiseks Keras/TensorFlow PlatoBlockchaini andmeanalüüsiga. Vertikaalne otsing. Ai.

Täiendamata torujuhtmes sobib võrk üle (treeningu täpsus jõuab lakke) ja valideerimise täpsus jääb madalaks. Suurendatud torujuhtmes on koolituse täpsus jääb algusest lõpuni madalamaks kui valideerimise täpsus.

Suurema treeningkao korral on võrk palju teadlikum vigadest, mida ta ikka teeb, ja saab teha rohkem värskendusi, et muuta see teisenduste suhtes muutumatuks. Esimene ei näe vajadust uuendada, teine ​​aga teeb ja tõstab potentsiaali lage.

Järeldus

KerasCV on eraldi pakett, kuid siiski Kerase meeskonna poolt välja töötatud Kerase ametlik täiendus, mille eesmärk on tuua teie Kerase projektidesse tööstusharu tugev CV. KerasCV on kirjutamise seisuga alles väljatöötamisel ja sisaldab juba 27 uut eeltöötluskihti, RandAugment, CutMixja MixUp olles mõned neist.

Selles lühikeses juhendis vaatasime, kuidas saate seda kasutada RandAugment et rakendada mitmeid juhuslikke teisendusi antud rakendatud teisenduste loendist ja kui lihtne on neid Kerase koolituskonveierisse kaasata.

Edasiminek – praktiline süvaõpe arvutinägemise jaoks

Sinu uudishimulik loomus tekitab sinus soovi minna kaugemale? Soovitame tutvuda meiega Kursus: "Praktiline süvaõpe arvutinägemise jaoks Pythoniga".

RandAugment kujutiste klassifitseerimiseks Keras/TensorFlow PlatoBlockchaini andmeanalüüsiga. Vertikaalne otsing. Ai.

Veel üks arvutinägemise kursus?

Me ei klassifitseeri MNIST-i numbreid ega MNIST-moodi. Nad teenisid oma osa juba ammu. Liiga paljud õpperessursid keskenduvad põhiandmekogumitele ja põhiarhitektuuridele, enne kui lasevad täiustatud musta kasti arhitektuurid jõudluskoormuse enda kanda võtta.

Tahame keskenduda demüstifitseerimine, praktilisus, mõistmine, intuitsioon ja tõelisi projekte. Tahad õppida kuidas saate midagi muuta? Viime teid teele alates viisist, kuidas meie aju töötleb pilte, kuni rinnavähi süvaõppe klassifikaatori kirjutamiseni kuni süvaõppevõrgustikeni, mis "hallutsineerivad", õpetades teile põhimõtteid ja teooriat praktilise töö kaudu, varustades teid oskusteavet ja tööriistu, et saada eksperdiks süvaõppe rakendamisel arvutinägemise lahendamisel.

Mis seal sees on?

  • Nägemise esimesed põhimõtted ja see, kuidas arvuteid saab õpetada nägema
  • Arvutinägemise erinevad ülesanded ja rakendused
  • Tööriistad, mis muudavad teie töö lihtsamaks
  • Arvutinägemise andmestike otsimine, loomine ja kasutamine
  • Konvolutsiooniliste närvivõrkude teooria ja rakendus
  • Domeeni nihke, koosesinemise ja muude andmekogumite eelarvamuste käsitlemine
  • Teisaldage õppimine ja teiste koolitusaja ja arvutusressursside kasutamine teie kasuks
  • Kaasaegse rinnavähi klassifikaatori ehitamine ja väljaõpe
  • Kuidas rakendada tervet annust skepsist peavoolu ideede suhtes ja mõista laialdaselt kasutusele võetud tehnikate mõju
  • ConvNeti "kontseptsiooniruumi" visualiseerimine t-SNE ja PCA abil
  • Juhtumiuuringud, kuidas ettevõtted kasutavad arvutinägemise tehnikaid paremate tulemuste saavutamiseks
  • Mudeli nõuetekohane hindamine, varjatud ruumi visualiseerimine ja mudeli tähelepanu tuvastamine
  • Domeeniuuringu läbiviimine, oma andmekogumite töötlemine ja mudelitestide loomine
  • Tipptasemel arhitektuurid, ideede edenemine, mis teeb need ainulaadseks ja kuidas neid ellu viia
  • KerasCV – WIP-teek tipptasemel torujuhtmete ja mudelite loomiseks
  • Kuidas töid sõeluda ja lugeda ning neid ise rakendada
  • Mudelite valimine sõltuvalt teie rakendusest
  • Täieliku masinõppe torujuhtme loomine
  • Maastik ja intuitsioon objektide tuvastamisel kiiremate R-CNN-ide, RetinaNetside, SSD-de ja YOLO-ga
  • Eksemplar ja semantiline segmenteerimine
  • Reaalajas objektituvastus YOLOv5-ga
  • YOLOv5 objektidetektorite koolitamine
  • Transformeritega töötamine KerasNLP-ga (tööstuse tugev WIP-teek)
  • Transformerite integreerimine ConvNetsiga, et luua piltide pealdised
  • Deepdream
  • Süvaõppe mudeli optimeerimine arvutinägemise jaoks

Ajatempel:

Veel alates Stackabus