Clasificarea imaginilor este o aplicație uimitoare a învățării profunde. Putem instrui un algoritm puternic pentru a modela un set de date de imagine mare. Acest model poate fi apoi utilizat pentru a clasifica un set similar, dar necunoscut de imagini.

Nu există nicio limită pentru aplicațiile de clasificare a imaginilor. Îl puteți utiliza în următoarea aplicație sau îl puteți folosi pentru a rezolva o problemă din lumea reală. Totul depinde de tine. Dar pentru cineva care este destul de nou în acest domeniu, la început ar putea părea foarte provocator. Cum ar trebui să obțin datele mele? Cum ar trebui să-mi construiesc modelul? Ce instrumente ar trebui să folosesc?

În acest articol vom discuta toate acestea – de la găsirea unui set de date până la instruirea modelului dvs. Voi încerca să fac lucrurile cât mai simple posibil evitând câteva detalii tehnice (PS: Vă rugăm să rețineți că acest lucru nu înseamnă că aceste detalii nu sunt importante. Voi menționa câteva resurse excelente pe care le puteți consulta pentru a afla mai multe despre aceste subiecte). Scopul acestui articol este de a explica procesul de bază al construirii unui clasificator de imagine și pe asta ne vom concentra mai mult aici.

Vom construi un clasificator de imagine pentru Set de date Fashion-MNIST. Setul de date Fashion-MNIST este o colecție de A lui Zalando imagini articol. Conține 60.000 de imagini pentru setul de antrenament și 10.000 de imagini pentru datele setului de testare (vom discuta mai târziu seturile de date de testare și instruire împreună cu setul de date de validare). Aceste imagini aparțin etichetelor a 10 clase diferite.

Cum se creeaza un clasificator de imagini simplu
Sursă

Importul bibliotecilor

Scopul nostru este de a instrui un model de învățare profundă care poate clasifica un set dat de imagini într-una dintre aceste 10 clase. Acum că avem setul de date, ar trebui să trecem la instrumentele de care avem nevoie. Există multe biblioteci și instrumente pe care le puteți alege pe baza propriilor cerințe de proiect. Pentru aceasta, voi rămâne la următoarele:

  1. Numpy – Biblioteca Python pentru calcul numeric
  2. Panda – Manipularea datelor bibliotecii Python
  3. Matplotlib – Vizualizare date bibliotecă Python
  4. Keras – Bibliotecă Python bazată pe tensorflow pentru crearea de modele de învățare profundă
  5. Jupyter – Voi rula tot codul meu pe notebook-urile Jupyter. Puteți să-l instalați prin link. Poți să folosești Google Colabs de asemenea, dacă aveți nevoie de o putere de calcul mai bună.

Împreună cu aceste patru, vom folosi și scikit-learn. Scopul acestor biblioteci va deveni mai clar odată ce ne vom scufunda în cod.

Bine! Avem instrumentele și bibliotecile noastre pregătite. Acum ar trebui să începem să ne configurăm codul.

Începeți cu importul tuturor bibliotecilor menționate mai sus. Împreună cu importul de biblioteci am importat și câteva module specifice din aceste biblioteci. Lasă-mă să le parcurg pe rând.

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 
import keras 

from sklearn.model_selection import train_test_split 
from keras.utils import to_categorical 

from keras.models import Sequential 
from keras.layers import Conv2D, MaxPooling2D 
from keras.layers import Dense, Dropout 
from keras.layers import Flatten, BatchNormalization

train_test_split: Acest modul împarte setul de date de instruire în date de instruire și validare. Motivul din spatele acestei diviziuni este să verificăm dacă modelul nostru este supraîncadrarea sau nu. Folosim un set de date de antrenament pentru a ne antrena modelul și apoi vom compara acuratețea rezultată cu acuratețea validării. În cazul în care diferența dintre ambele cantități este semnificativ mare, atunci modelul nostru este probabil supradaptat. Vom repeta prin procesul nostru de construire a modelelor și prin efectuarea modificărilor necesare pe parcurs. Odată ce suntem mulțumiți de acuratețea noastră de instruire și validare, vom face predicții finale cu privire la datele noastre de testare.

to_categorical: to_categorical este un utilitar keras. Este folosit pentru a converti etichetele categorice în codificări one-hot. Să presupunem că avem trei etichete („mere”, „portocale”, „banane”), atunci o codificare fierbinte pentru fiecare dintre acestea ar fi [1, 0, 0] -> “mere”, [0, 1, 0] -> “portocale”, [0, 0, 1] -> „banane”.

Restul modulelor Keras pe care le-am importat sunt straturi convoluționale. Vom discuta straturile convoluționale atunci când vom începe construirea modelului nostru. De asemenea, vom arunca o privire rapidă la ceea ce fac fiecare dintre aceste straturi.

Prelucrarea datelor

Deocamdată ne vom îndrepta atenția asupra obținerii datelor noastre și analizării acestora. Trebuie să vă amintiți întotdeauna importanța pre-procesării și analizei datelor. Nu numai că vă oferă informații despre date, ci ajută și la identificarea inconsecvențelor.

O variație foarte ușoară a datelor poate duce uneori la un rezultat devastator pentru modelul dvs. Acest lucru face important să preprocesați datele înainte de a le utiliza pentru instruire. Deci, având în vedere acest lucru, să începem preprocesarea datelor.

train_df = pd.read_csv('./fashion-mnist_train.csv')
test_df = pd.read_csv('./fashion-mnist_test.csv')

În primul rând, să importăm setul nostru de date (Aici este linkul pentru a descărca acest set de date pe sistemul dvs.). După ce ați importat setul de date, rulați următoarea comandă.

train_df.head()

Această comandă vă va arăta cum arată datele dvs. Următoarea captură de ecran arată rezultatul acestei comenzi.

1611915796 879 Cum se creeaza un clasificator de imagini simplu

Putem vedea cum sunt stocate datele noastre de imagine sub formă de valori ale pixelilor. Dar nu putem furniza date modelului nostru în acest format. Deci, va trebui să-l convertim în matrice numpy.

train_data = np.array(train_df.iloc[:, 1:])
test_data = np.array(test_df.iloc[:, 1:])

Acum, este timpul să ne procurăm etichetele.

train_labels = to_categorical(train_df.iloc[:, 0])
test_labels = to_categorical(test_df.iloc[:, 0])

Aici, puteți vedea că am folosit la_categoric pentru a converti datele noastre categorice într-o singură codificare la cald.

Acum vom remodela datele și le vom arunca în plutitor32 tastați, astfel încât să îl putem folosi în mod convenabil.

rows, cols = 28, 28 

train_data = train_data.reshape(train_data.shape[0], rows, cols, 1)
test_data = test_data.reshape(test_data.shape[0], rows, cols, 1)

train_data = train_data.astype('float32')
test_data = test_data.astype('float32')

Aproape am terminat. Să terminăm doar preprocesarea datelor noastre prin normalizarea acestora. Normalizarea datelor imaginii va mapa toate valorile pixelilor din fiecare imagine la valorile cuprinse între 0 și 1. Acest lucru ne ajută să reducem neconcordanțele din date. Înainte de normalizare, datele imaginii pot avea variații mari în valorile pixelilor, ceea ce poate duce la un comportament neobișnuit în timpul procesului de antrenament.

train_data /= 255.0
test_data /= 255.0

Rețele neuronale convoluționale

Deci, preprocesarea datelor este făcută. Acum putem începe să ne construim modelul. Vom construi un Rețea neuronală convoluțională pentru modelarea datelor de imagine. CNN-urile sunt versiuni modificate ale versiunii normale rețele neuronale. Acestea sunt modificate special pentru datele de imagine. Alimentarea imaginilor către rețelele neuronale obișnuite ar necesita ca rețeaua noastră să aibă un număr mare de neuroni de intrare. De exemplu, doar pentru o imagine de 28×28, am avea nevoie de 784 de neuroni de intrare. Acest lucru ar crea o mare mizerie de parametri de antrenament.

CNN-urile rezolvă această problemă presupunând deja că intrarea va fi o imagine. Scopul principal al rețelelor neuronale convoluționale este de a profita de structura spațială a imaginii și de a extrage caracteristici de nivel înalt din aceasta și apoi de a se antrena asupra acelor caracteristici. O face prin efectuarea unui convoluţie operație pe matricea valorilor pixelilor.

Cum se creeaza un clasificator de imagini simplu
Sursă

Vizualizarea de mai sus arată cum funcționează operația de convoluție. Și stratul Conv2D pe care l-am importat mai devreme face același lucru. Prima matrice (din stânga) în demonstrație este intrarea în stratul convoluțional. Apoi, o altă matrice numită “filtru” sau “nucleu” este înmulțită (înmulțirea matricei) la fiecare fereastră a matricei de intrare. Ieșirea acestei multiplicări este intrarea în următorul strat.

În afară de straturile convoluționale, un CNN tipic are și alte două tipuri de straturi: 1) a pstrat de uleiși 2) afstrat ully conectat.

Straturile de grupare sunt utilizate pentru a generaliza ieșirea straturilor convoluționale. Împreună cu generalizarea, reduce și numărul de parametri din model prin eșantionarea în jos a ieșirii stratului convoluțional.

După cum tocmai am aflat, straturile convoluționale reprezintă caracteristici de nivel înalt din datele de imagine. Straturile complet conectate folosesc aceste caracteristici de nivel înalt pentru a instrui parametrii și pentru a învăța să clasifice acele imagini.

Vom folosi, de asemenea, Renunța, Normalizarea lotului și Aplatiza straturi în plus față de straturile menționate mai sus. Stratul de aplatizare convertește ieșirea straturilor convoluționale într-un vector caracteristic unidimensional. Este important să aplatizați ieșirile, deoarece straturile dense (complet conectate) acceptă doar un vector caracteristică ca intrare. Straturile de renunțare și normalizare în lot sunt pentru a împiedica modelul supraîncadrarea.

train_x, val_x, train_y, val_y = train_test_split(train_data, train_labels, test_size=0.2)

batch_size = 256
epochs = 5
input_shape = (rows, cols, 1)
def baseline_model():
    model = Sequential()
    model.add(BatchNormalization(input_shape=input_shape))
    model.add(Conv2D(32, (3, 3), padding='same', activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
    model.add(Dropout(0.25))
    
    model.add(BatchNormalization())
    model.add(Conv2D(32, (3, 3), padding='same', activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))
    return model

Codul pe care îl vedeți mai sus este codul pentru modelul nostru CNN. Puteți structura aceste straturi în mai multe moduri diferite pentru a obține rezultate bune. Există multe arhitecturi populare CNN care oferă rezultate de ultimă generație. Aici, tocmai am creat propria mea arhitectură simplă în scopul acestei probleme. Simțiți-vă liber să încercați propriile dvs. și spuneți-mi ce rezultate obțineți 🙂

Antrenarea modelului

După ce ați creat modelul, îl puteți importa și apoi compila folosind codul de mai jos.

model = baseline_model()
model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=['accuracy'])

model.compile configurează procesul de învățare pentru modelul nostru. I-am trecut trei argumente. Aceste argumente definesc funcția de pierdere pentru modelul nostru, optimizator și valori.

history = model.fit(train_x, train_y,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(val_x, val_y))
          

Și, în cele din urmă, executând codul de mai sus, vă puteți antrena modelul. Antrenez acest model pentru doar cinci epoci, dar puteți crește numărul de epoci. După finalizarea procesului de formare, puteți face predicții asupra setului de testare utilizând următorul cod.

predictions= model.predict(test_data)

Concluzie

Felicitări! Ați făcut-o, ați făcut primul pas în lumea uimitoare a viziunii computerizate.

Ați creat propriul dvs. clasificator de imagine. Chiar dacă aceasta este o mare realizare, tocmai am zgâriat suprafața.

Puteți face multe lucruri cu CNN-urile. Aplicațiile sunt nelimitate. Sper că acest articol v-a ajutat să înțelegeți cum funcționează procesul de instruire a acestor modele.

Lucrul la alte seturi de date pe cont propriu vă va ajuta să înțelegeți acest lucru și mai bine. De asemenea, am creat un GitHub repertoriu pentru codul pe care l-am folosit în acest articol. Deci, dacă acest articol ți-a fost util, te rog, anunță-mă.

Dacă aveți întrebări sau doriți să împărtășiți propriile rezultate sau dacă doriți doar să spuneți „salut”, nu ezitați să mă loviți stare de nervozitate, și voi încerca să fac tot posibilul să te ajut. Și, în sfârșit Multumesc mult pentru citirea acestui articol !! 🙂