VGG-16 Úloha klasifikácie siete a obrázkov
V tomto poznámkovom bloku si môžete vyskúšať, ako konvolučné neurónové siete vlastne fungujú. Použijeme sieť VGG-16 a otestujeme ju v úlohe klasifikácie obrázkov. K dispozícii máme až 1000 tried! Hneď na začiatku načítame štandardné knižnice potrebné pre ďalšiu prácu.
#%pip install pandas
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
Konkrétne z knižnice TensorFlow načítame predtrénovaný model VGG-16. Pri načítavaní tohto modelu musíme uviesť, že chceme použiť model, ktorý bol natrénovaný na obrázkoch z množiny údajov ImageNet. Urobíme to tak, že nastavíme argument "váhy" funkcie "VGG16" na "imagenet". Načítanie samotného modelu môže chvíľu trvať.
#%pip install tensorflow
#%pip install --upgrade numpy
from tensorflow.keras.applications import VGG16
model = VGG16(weights='imagenet')
Ďalej skontrolujeme vrstvy, ktoré tvoria túto sieť. Nenechajte sa zmiasť, ak nerozumiete všetkým zobrazeným detailom. Je dôležité vedieť, že vstupom sa očakáva farebný obrázok s rozmermi 224 x 224 pixelov (preto 224, 224, 3 vedľa vstupnej vrstvy) a že výstup je jedna z 1000 tried. Ak chcete zistiť viac informácií, výstup môžete porovnať so schémou modelu VGG-16, o ktorej sme hovorili.
model.summary()

Vidíme, že počet parametrov tejto siete je viac ako 138 miliónov. Nebudeme trénovať sieť, ale budeme používať iba vopred natrénovaný model. Preto je dôležité nemeniť parametre modelu počas prevádzky - každý z nich má svoj vlastný príspevok. Cieľom je otestovať sieť pomocou ľubovoľného obrázka z webu. Aby sme to dosiahli, použijeme niekoľko knižníc. Knižnica PIL je štandardná knižnica Pythonu na prácu s obrázkami, zatiaľ čo na načítanie obrázka použijeme knižnice urllib a io.
from PIL import Image
from urllib import request
from io import BytesIO
Funkcia "load_image" nám pomôže načítať akýkoľvek obrázok, ktorý chceme z webu. Stačí mu
def load_image(url_path):
response = request.urlopen(url_path).read()
return Image.open(BytesIO(response))
Vybrali sme obrázok zlatého retrievera! Zmenou cesty v premennej "image_url" môžete nastaviť požadovaný obrázok.
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)
Teraz zobrazíme načítaný obrázok.
plt.imshow(test_image)
plt.axis('off')
plt.show()

Pri výbere obrázka je dôležité mať na pamäti, že model musí poznať triedu objektu na obrázku. Keďže model VGG-16 je trénovaný na viac ako 1,2 milióna obrázkov, rozpoznáva veľa objektov, dokonca 1000 rôznych. Ako sa dozvedel o zlatom retrieverovi, môžeme očakávať dobrý výsledok. Ak dáme modelu obrázok s objektom, ktorý nerozpozná, poskytne nám predpovede tried, ktorých obrazy sa najviac podobajú našim. Na konci uvidíme, ktoré triedy objektov sa podobajú zlatému retrieverovi. Keďže obrázok, ktorý potrebujeme odovzdať modelu, musí byť špeciálne pripravený, nasledujúca časť sa zaoberá prípravami.
Načítame aj niekoľko knižníc, ktoré nám uľahčia prácu. Je bežné, že komunita zdieľa všetky sprievodné funkcie, ktoré sú užitočné v týchto krokoch pri zdieľaní modelov.
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input, decode_predictions
Najprv pripravíme obrázok nastavením jeho rozmerov na 224x224 a určením, že používa tri farebné kanály RGB.
test_image = test_image.resize((224, 224))
test_image = test_image.convert('RGB')
plt.imshow(test_image)
plt.axis('off')
plt.show()

Ďalej zabezpečíme, aby bol obrázok v príslušnom formáte matice.
matrix_form_test_image = image.img_to_array(test_image)
print(matrix_form_test_image.shape)
Ako viete, siete vždy pracujú s dátovými dávkami. Preto vytvoríme dávku, ktorá obsahuje náš obrázok. Ako sa dalo očakávať, jeho rozmer bude 1 x 224 x 224 x 3, pretože v dávke máme iba jeden obrázok.
batch = np.expand_dims(matrix_form_test_image, axis=0)
print(f'(number_of_test_images, height, width, number_of_channels) = {batch.shape}')
Nasleduje časť, ktorá sa zaoberá numerickým predspracovaním obrazu vo forme normalizácie. Pomôže nám v tom špeciálna funkcia "preprocess_input", ktorá sprevádza model.
test_image_batch = preprocess_input(batch)
Keďže sme dokončili prípravu, môžeme teraz použiť model na klasifikačnú úlohu. Funkcia, ktorá nám v tejto časti pomôže, sa nazýva "predict".
model_predictions = model.predict(test_image_batch)
Získané modelové predpovede predstavujú pravdepodobnosti nášho obrazu patriaceho do každej z 1000 tried.
model_predictions.shape
Na extrakciu triedy, do ktorej patrí náš obrázok, môžeme použiť funkciu "decode_predictions", ktorá vráti pravdepodobnosti a názvy 5 najpravdepodobnejších tried. To nám poskytne prehľad o tom, aký istý je model počas klasifikácie.
most_likely_classes = decode_predictions(model_predictions)[0]
print(most_likely_classes)
Ako vidíme, na prvom mieste je trieda *zlatý retriever* s pravdepodobnosťou 0,8042132. Aby sme lepšie sledovali výstup modelu, môžeme ho zobraziť aj graficky.
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()

Vidíme, že modelka s vysokou istotou predpovedala, že obrázok, ktorý sme vybrali, je zlatý retriever. Niektoré z ďalších tried, ktoré model zvažoval, sú iné typy retrieverov. Zaujímavosťou je, že v zozname výsledkov sa objavila aj tenisová loptička.
- Make a submission