# Import potrebných balíčkov
import numpy as np
import keras.backend as K
from keras.applications.resnet50 import ResNet50
from keras.applications.imagenet_utils import decode_predictions
from keras.preprocessing import image
import matplotlib.pyplot as plt
# Uistíme sa, že máme všetky potrebné dáta
!mkdir -p data
!wget -nc -O data/cat.jpg https://www.dropbox.com/s/a5ux951zo01gd5z/cat.jpg?dl=1
!wget -nc -O data/classes https://www.dropbox.com/s/l29ejaiyeyhz6o3/classes?dl=1
# Pomocný kód
def preprocess_input(x, dim_ordering='default'):
if dim_ordering == 'default':
dim_ordering = K.image_data_format()
assert dim_ordering in {'channels_last', 'channels_first'}
if dim_ordering == 'channels_first':
x[:, 0, :, :] -= 103.939
x[:, 1, :, :] -= 116.779
x[:, 2, :, :] -= 123.68
# 'RGB'->'BGR'
x = x[:, ::-1, :, :]
else:
x[:, :, :, 0] -= 103.939
x[:, :, :, 1] -= 116.779
x[:, :, :, 2] -= 123.68
# 'RGB'->'BGR'
x = x[:, :, :, ::-1]
return x
def preprocess_image(img):
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
return x
Tento notebook ukáže veľmi jednoduchý príklad načítania a použitia klasifikátora predtrénovaného na dátovej množine ImageNet. Ukážeme, ako sa dá pomocou neho klasifikovať nové obrázky.
Najprv volaním set_learning_phase(0)
špecifikujeme, že model ideme len použiť na inferenciu, nie trénovať. Potom vytvoríme inštanciu modelu ResNet50, t.j. reziduálnej siete s 50 vrstvami. Špecifikujeme weights='imagenet'
, čím nastavíme, že chceme inicializovať váhy siete váhovou maticou predtrénovanou na ImageNet-e. Ak tento kód voláme na danom počítači prvý raz, váhy sa budú musieť najprv stiahnuť z internetu.
K.set_learning_phase(0)
model = ResNet50(weights='imagenet')
Načítame a predspracujeme obrázok, ktorý chceme klasifikovať.
img = image.load_img('data/cat.jpg',
target_size=(224, 224))
x_original = preprocess_image(img)
plt.imshow(img)
plt.gca().axis('off')
Obrázok dáme na vstup siete a získame pravdepodobnosti jednotlivých tried.
preds = model.predict(x_original)
Zobrazíme 5 najpravdepodobnejších tried spoločne s ich príslušnými pravdepodobnosťami.
labels = decode_predictions(preds, top=5)[0]
for l in labels:
print("{:.2f}: {}".format(l[2], l[1]))
Pokúste sa ten istý postup aplikovať na iný obrázok.
Poznámka: Nové obrázky môžete uploadovať priamo cez notebook-ové rozhranie alebo alternatívne pomocou:
from google.colab import files
content_img = files.upload()
filename = list(content_img)[0]
Zoznam tried, ktoré vie sieť rozpoznať, nájdete v súbore data/classes:
with open("data/classes", "r") as file:
print("".join(file.readlines()))