U ovoj svesci možeš oprobati kako zaista rade konvolutivne neuronske mreže. Koristićemo mrežu VGG-16 i testirati je u zadatku klasifikacije slika. Na raspolaganju imamo čak 1000 klasa!
Na samom početku učitaćemo standardne biblioteke koje su nam neophodne za dalji rad.
#%pip install pandas
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
Posebno , iz biblioteke TensorFlow učitavamo istreniran model VGG-16. Prilikom učitavanja ovog modela potrebno je da naglasimo da želimo da koristimo model koji je obučavan na slikama iz skupa ImageNet. To možemo uraditi tako što ćemo postaviti argument ` weights ` funkcije ` VGG16 ` koja se koristi za učitavanje modela na vrednost ` imagenet `. Samo učitavanje modela će malo potrajati.
#%pip install tensorflow
#%pip install --upgrade numpy
from tensorflow.keras.applications import VGG16
model = VGG16(weights='imagenet')
VGG16 je algoritam za detekciju i klasifikaciju objekata koji je u stanju da klasifikuje 1000 slika 1000 različitih kategorija sa 92,7% tačnosti. To je jedan od popularnih algoritama za klasifikaciju slika i jednostavan je za korišćenje sa prenosnim učenjem.
VGG16 Architecture
Dalje ćemo se uveriti od kojih se sve slojeva sastoji ova mreža. Nemoj da te zbuni ako ne razumeš sve detalje koji se prikazuju. Važno je da znaš da se na ulazu očekuje slika dimenzije 224x224 piksela u boji (zato je i pored ulaznog sloja navedeno 224, 224, 3) i da na izlazu imaš jednu od 1000 klasa. Ispis možeš da uporediš i sa slikom modela VGG-16 koju smo razmatrali i tako otkriješ više informacija.
model.summary()

Možemo da vidimo da je broj parametara ove mreže preko 138 miliona. Mi mrežu nećemo trenirati, već ćemo samo korisiti istreniran model. Zato je važno da parametre modela u toku rada ne menjamo - svaki ima svoj doprinos.
Ideja je da slika nad kojom ćemo testirati mrežu bude neka proizvoljna slika sa veba. Da bismo to uspeli da uradimo koristićemo par biblioteka. Biblioteka PIL je standardna biblioteka jezika Python za rad sa slikama dok ćemo biblioteke urlib i io iskoristiti za učitavanje slike.
from PIL import Image
from urllib import request
from io import BytesIO
Funkcija `load_image` će nam pomoći da prevučemo koju god sliku želimo sa veba. Dovoljno je da joj zadamo URL putanju.
def load_image(url_path):
response = request.urlopen(url_path).read()
return Image.open(BytesIO(response))
Mi smo odabrali sliku sliku zlatnog retrivera! Promenom putanje u promenljivoj `image_url` možeš da postaviš sliku koju želiš.
image_url = 'https://images.unsplash.com/photo-1558788353-f76d92427f16?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=738&q=80' # https://unsplash.com/photos/x5oPmHmY3kQ
test_image = load_image(url_path=image_url)
Sada ćemo i prikazati učitanu sliku.
plt.imshow(test_image)
plt.axis('off')
plt.show()

Prilikom izbora slike važno je imati na umu da klasa objekta na slici mora biti poznata modelu. Pošto je model VGG-16 treniran na preko 1.2 miliona slika poznaje jako puno objekata, čak 1000 različitih. Kako je upoznao zlatnog retrivera možemo očekivati dobar rezultat. Ukoliko modelu damo sliku sa nekim objektom koji ne poznaje, daće nam predikcije klasa čije slike najviše podsećaju na našu. Videćemo na kraju koje sve klase objekata nalikuju na zlatnog retrivera.
Pošto slika koju treba da prosledimo modelu, treba da bude specijalno pripremljena, sledi deo sa pripremama.
Učitaćemo i par biblioteka koje će nam olakšati posao. Uobičajeno je da prilikom deljenja modela zajednica podeli i sve propratne funkcionalosti koje nam znače u tim koracima.
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input, decode_predictions
Prvo ćemo pripremiti sliku tako što ćemo joj postaviti dimenzije na 224x224 i reći da koristi tri kanala boja RGB.
test_image = test_image.resize((224, 224))
test_image = test_image.convert('RGB')
plt.imshow(test_image)
plt.axis('off')
plt.show()

Dalje ćemo se osigurati da je slika u odgovarajućem matričnom formatu.
matrix_form_test_image = image.img_to_array(test_image)
print(matrix_form_test_image.shape)
Kao što znaš, mreže uvek rade sa paketićima podataka. Zato ćemo napraviti i paketić koji sadrži našu sliku. Kao što očekuješ njegova dimenzija će biti 1 x 224 x 224 x 3 jer imamo samo jednu sliku u paketiću.
batch = np.expand_dims(matrix_form_test_image, axis=0)
print(f'(number_of_test_images, height, width, number_of_channels) = {batch.shape}')
Dalje sledi deo koji se tiče numeričkog pretprocesiranja slike u vidu normalizacije. U tome će nam pomoći posebna funkcija ` preprocess_input ` koja prati model.
test_image_batch = preprocess_input(batch)
Pošto smo završili sa pripremom, sada možemo da iskoristimo model za zadatak klasifikacije. Funkcija koja će nam pomoći u tom delu se zove ` predict `.
model_predictions = model.predict(test_image_batch)
Dobijene predikcije modela predstavljaju verovatnoće pripadnosti naše slike svakoj od 1000 klasa.
model_predictions.shape
Da bismo izdvojili klasu kojoj pripada naša slika, možemo iskorisiti funkciju ` decode_predictions ` koja će nam vratiti verovatnoće i imena za 5 najverovatnijih klasa. Ovo će nam dati uvid u to koliko je model siguran prilikom klasifikacije.
most_likely_classes = decode_predictions(model_predictions)[0]
print(most_likely_classes)
Kao što možemo da vidimo, na prvom mestu je klasa *golden retriever* i to sa verovatnoćom 0.8042132. Da bismo lakše ispratili izlaz modela, možemo ga i grafički prikazati.
class_names = [item[1] for item in most_likely_classes]
class_probabilities = [item[2] for item in most_likely_classes]
plt.figure(figsize=(10, 4))
plt.bar(class_names, class_probabilities, color=['teal', 'yellow', 'green', 'blue', 'orange'])
plt.title('Top 5 Most Likely Classes')
plt.ylabel('Probability')
plt.show()

Vidimo da je model sa velikom sigurnošću predvideo da je slika koju smo odabrali slika zlatnog retrivera. Neke od drugih klasa koje je model uzeo u obzir su neke druge vrste retrivera. Neobično je da se u listi rezultata pojavila i teniska loptica.
- Make a submission