Samouczek Kerasa
Co to jest Keras?
Keras to biblioteka sieci neuronowej typu open source napisana w Python ktรณry dziaลa na Theano lub Tensorflow. Zostaล zaprojektowany tak, aby byล moduลowy, szybki i ลatwy w uลผyciu. Zostaล opracowany przez Franรงois Cholleta, inลผyniera Google. Keras nie obsลuguje obliczeล niskiego poziomu. Zamiast tego uลผywa do tego innej biblioteki, zwanej โBackend.
Keras to opakowanie API wysokiego poziomu dla interfejsu API niskiego poziomu, ktรณre moลผe dziaลaฤ na TensorFlow, CNTK lub Theano. Keras High-Level API obsลuguje sposรณb, w jaki tworzymy modele, definiujemy warstwy lub konfigurujemy wiele modeli wejลcia-wyjลcia. Na tym poziomie Keras kompiluje rรณwnieลผ nasz model z funkcjami strat i optymalizatora, a proces uczenia z funkcjฤ dopasowania. Keras w Python nie obsลuguje interfejsu API niskiego poziomu, takiego jak tworzenie wykresu obliczeniowego, tworzenie tensorรณw lub innych zmiennych, poniewaลผ jest obsลugiwane przez silnik โzapleczaโ.
Co to jest backend?
Backend to termin w Keras, ktรณry wykonuje wszystkie obliczenia niskiego poziomu, takie jak iloczyny tensorowe, sploty i wiele innych rzeczy za pomocฤ innych bibliotek, takich jak Tensorflow lub Theano. Zatem โsilnik zapleczaโ wykona obliczenia i rozwรณj modeli. Domyลlnym โsilnikiem backendowymโ jest Tensorflow, ale moลผemy to zmieniฤ w konfiguracji.
Theano, Tensorflow i zaplecze CNTK
Theano to projekt typu open source opracowany przez grupฤ MILA na Uniwersytecie w Montrealu w Quebecu w Kanadzie. Byล to pierwszy powszechnie uลผywany framework. To jest Python biblioteka, ktรณra pomaga w wielowymiarowych tablicach dla operacji matematycznych przy uลผyciu Numpy lub Scipy. Theano moลผe uลผywaฤ GPU do szybszych obliczeล, moลผe rรณwnieลผ automatycznie budowaฤ grafy symboliczne do obliczania gradientรณw. Na swojej stronie internetowej Theano twierdzi, ลผe moลผe rozpoznawaฤ wyraลผenia niestabilne numerycznie i obliczaฤ je za pomocฤ bardziej stabilnych algorytmรณw, co jest bardzo przydatne w przypadku naszych niestabilnych wyraลผeล.
Z drugiej strony Tensorflow jest wschodzฤ cฤ gwiazdฤ w ลrodowisku gลฤbokiego uczenia siฤ. Opracowane przez zespรณล Google Brain, jest najpopularniejszym narzฤdziem do gลฤbokiego uczenia siฤ. Dziฤki wielu funkcjom naukowcy przyczyniajฤ siฤ do rozwoju tej platformy do celรณw gลฤbokiego uczenia siฤ.
Kolejnym silnikiem backendowym dla Keras jest The Microsoft Zestaw narzฤdzi poznawczych lub CNTK. Jest to platforma gลฤbokiego uczenia siฤ o otwartym kodzie ลบrรณdลowym, ktรณra zostaลa opracowana przez Microsoft Zespรณล. Moลผe dziaลaฤ na wielu procesorach graficznych lub na wielu maszynach w celu szkolenia modelu gลฤbokiego uczenia siฤ na masowฤ skalฤ. W niektรณrych przypadkach CNTK byลo zgลaszane szybciej niลผ inne frameworki, takie jak Tensorflow lub Theano. W dalszej czฤลci tego samouczka Keras CNN porรณwnamy backendy Theano, TensorFlow i CNTK.
Porรณwnanie backendรณw
Musimy zrobiฤ test porรณwnawczy, aby poznaฤ porรณwnanie miฤdzy tymi dwoma backendami. Jak widaฤ w Punkt odniesienia dla Jeong-Yoon Lee, porรณwnywana jest wydajnoลฤ 3 rรณลผnych backendรณw na rรณลผnym sprzฤcie. W wyniku tego Theano jest wolniejsze niลผ drugi backend 50 czasy wolniej, ale dokลadnoลฤ jest zbliลผona.
Inne test porรณwnawczy jest wykonywany przez Jasmeeta Bhatiฤ. Poinformowaล, ลผe w pewnym teลcie Theano jest wolniejszy niลผ Tensorflow. Jednak ogรณlna dokลadnoลฤ jest prawie taka sama dla kaลผdej testowanej sieci.
Zatem pomiฤdzy Theano, Tensorflow i CTK jest oczywiste, ลผe TensorFlow jest lepszy niลผ Theano. Dziฤki TensorFlow czas obliczeล jest znacznie krรณtszy, a CNN jest lepszy od innych.
Nastฤpny w tym Kerasie Python tutorialu, dowiemy siฤ czym rรณลผni siฤ Keras od TensorFlow (Keras kontra Tensorflow).
Keras kontra Tensorflow
| Parametry | Keras | Tensorflow |
|---|---|---|
| Typ | Opakowanie API wysokiego poziomu | API niskiego poziomu |
| Zลoลผonoลฤ | ลatwy w uลผyciu, jeลli Python jฤzyk | Musisz poznaฤ skลadniฤ korzystania z niektรณrych funkcji Tensorflow |
| Cel | Szybkie wdroลผenie do tworzenia modelu ze standardowymi warstwami | Umoลผliwia utworzenie dowolnego wykresu obliczeniowego lub warstw modelu |
| Narzฤdzia | Uลผywa innego narzฤdzia do debugowania API, takiego jak TFDBG | Moลผesz skorzystaฤ z narzฤdzi do wizualizacji Tensorboard |
| Spoลecznoลฤ | Duลผe aktywne spoลecznoลci | Duลผe aktywne spoลecznoลci i szeroko udostฤpniane zasoby |
Zalety Kerasa
Szybkie wdroลผenie i ลatwe do zrozumienia
Keras bardzo szybko tworzy model sieci. Jeลli chcesz stworzyฤ prosty model sieci z kilkoma liniami, Python Keras moลผe Ci w tym pomรณc. Spรณjrz na przykลad Kerasa poniลผej:
from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential() model.add(Dense(64, activation='relu', input_dim=50)) #input shape of 50 model.add(Dense(28, activation='relu')) #input shape of 50 model.add(Dense(10, activation='softmax'))
Dziฤki przyjaznemu API moลผemy ลatwo zrozumieฤ proces. Pisanie kodu za pomocฤ prostej funkcji i braku koniecznoลci ustawiania wielu parametrรณw.
Duลผe wsparcie spoลecznoลci
Istnieje wiele spoลecznoลci AI, ktรณre uลผywajฤ Keras w swoim ลrodowisku gลฤbokiego uczenia siฤ. Wiele z nich publikuje swoje kody i tutoriale dla ogรณลu spoลeczeลstwa.
Miej wiele backendรณw
Moลผesz wybraฤ Tensorflow, CNTK i Theano jako swรณj backend w Keras. Moลผesz wybraฤ inny backend dla rรณลผnych projektรณw w zaleลผnoลci od potrzeb. Kaลผdy backend ma swojฤ unikalnฤ zaletฤ.
Wieloplatformowe i ลatwe wdraลผanie modelu
Dziฤki rรณลผnym obsลugiwanym urzฤ dzeniom i platformom moลผesz wdroลผyฤ Keras na dowolnym urzฤ dzeniu
- iOS z CoreML
- Android z Tensorflowem Android,
- Przeglฤ darka internetowa z obsลugฤ .js
- Silnik chmury
- Raspberry Pi
Obsลuga wielu procesorรณw graficznych
Moลผesz trenowaฤ Keras na jednym procesorze graficznym lub uลผywaฤ wielu procesorรณw graficznych jednoczeลnie. Poniewaลผ Keras ma wbudowanฤ obsลugฤ rรณwnolegลoลci danych, dziฤki czemu moลผe przetwarzaฤ duลผe iloลci danych i przyspieszaฤ czas potrzebny na ich uczenie.
Wady Kerasa
Nie moลผna obsลuลผyฤ interfejsu API niskiego poziomu
Keras obsลuguje tylko API wysokiego poziomu, ktรณre dziaลa na innym frameworku lub silniku backendowym, takim jak Tensorflow, Theano lub CNTK. Nie jest to wiฤc zbyt przydatne, jeลli chcesz utworzyฤ wลasnฤ warstwฤ abstrakcyjnฤ do celรณw badawczych, poniewaลผ Keras ma juลผ wstฤpnie skonfigurowane warstwy.
Instalacja Kerasa
W tej sekcji przyjrzymy siฤ rรณลผnym dostฤpnym metodom instalacji Keras
Instalacja bezpoลrednia lub ลrodowisko wirtualne
Ktรณry jest lepszy? Zainstaluj bezpoลrednio w bieลผฤ cym Pythonie lub uลผyj ลrodowiska wirtualnego? Sugerujฤ korzystanie ze ลrodowiska wirtualnego, jeลli masz wiele projektรณw. Chcesz wiedzieฤ dlaczego? Dzieje siฤ tak dlatego, ลผe rรณลผne projekty mogฤ uลผywaฤ innej wersji biblioteki keras.
Na przykลad mam projekt, ktรณry wymaga Python 3.5 przy uลผyciu OpenCV 3.3 ze starszym backendem Keras-Theano, ale w innym projekcie muszฤ uลผywaฤ Keras z najnowszฤ wersjฤ i Tensorflow jako backendem Python Wsparcie 3.6.6
Nie chcemy, aby biblioteka Keras kolidowaลa ze sobฤ , prawda? Uลผywamy wiฤc ลrodowiska wirtualnego do lokalizowania projektu za pomocฤ okreลlonego typu biblioteki lub moลผemy uลผyฤ innej platformy, takiej jak usลuga w chmurze, aby wykonaฤ za nas obliczenia, np. Amazon Serwis internetowy.
Instalowanie Keras na Amazon Usลuga internetowa (AWS)
Amazon Web Service to platforma oferujฤ ca usลugi i produkty Cloud Computing dla badaczy lub do innych celรณw. AWS wynajmuje swรณj sprzฤt, sieฤ, bazฤ danych itp., abyลmy mogli z niego korzystaฤ bezpoลrednio z Internetu. Jednฤ z popularnych usลug AWS do celรณw gลฤbokiego uczenia siฤ jest Amazon Usลuga gลฤbokiego uczenia siฤ obrazu maszyny lub DL
Aby uzyskaฤ szczegรณลowe instrukcje dotyczฤ ce korzystania z AWS, zobacz this Tutorial
Uwaga dotyczฤ ca AMI: Dostฤpne bฤdฤ nastฤpujฤ ce dane AMI
AWS Deep Learning AMI to wirtualne ลrodowisko w usลudze AWS EC2, ktรณre pomaga badaczom i praktykom w pracy z Deep Learning. DLAMI oferuje silniki od maลych procesorรณw po silniki z wieloma procesorami graficznymi o duลผej mocy ze wstฤpnie skonfigurowanฤ CUDA, cuDNN i jest wyposaลผone w rรณลผnorodne platformy gลฤbokiego uczenia siฤ.
Jeลli chcesz z niego korzystaฤ natychmiast, powinieneล wybraฤ Deep Learning AMI, poniewaลผ jest on wyposaลผony w preinstalowane popularne frameworki do gลฤbokiego uczenia siฤ.
Jeลli jednak chcesz wyprรณbowaฤ niestandardowฤ platformฤ gลฤbokiego uczenia siฤ do celรณw badawczych, powinieneล zainstalowaฤ platformฤ Deep Learning Base AMI, poniewaลผ zawiera ona podstawowe biblioteki, takie jak CUDA, cuDNN, sterowniki procesorรณw graficznych i inne biblioteki potrzebne do dziaลania w ลrodowisku gลฤbokiego uczenia siฤ.
Jak zainstalowaฤ Keras na Amazon SageMaker
Amazon SageMaker to platforma do gลฤbokiego uczenia siฤ, ktรณra pomaga w szkoleniu i wdraลผaniu sieci gลฤbokiego uczenia siฤ za pomocฤ najlepszego algorytmu.
Dla poczฤ tkujฤ cego jest to zdecydowanie najลatwiejsza metoda korzystania z Keras. Poniลผej znajduje siฤ proces instalacji Keras na Amazon SageMaker:
Krok 1) Otwรณrz Amazon SageMaker
W pierwszym kroku otwรณrz plik Amazon Strzelec konsoli i kliknij opcjฤ Utwรณrz instancjฤ notatnika.
Krok 2) Wprowadลบ szczegรณลy
- Wpisz nazwฤ swojego notatnika.
- Utwรณrz rolฤ uprawnieล. Spowoduje to utworzenie roli AMI Amazon Rola IAM w formacie AmazonSageMaker-Rola wykonawcza-RRRRMMDD|GGmmSS.
- Na koniec wybierz opcjฤ Utwรณrz instancjฤ notatnika. Po kilku chwilach, Amazon Sagemaker uruchamia instancjฤ notatnika.
Note: Jeลli chcesz uzyskaฤ dostฤp do zasobรณw z VPC, ustaw bezpoลredni dostฤp do Internetu jako wลฤ czony. W przeciwnym razie ta instancja notebooka nie bฤdzie miaลa dostฤpu do Internetu, wiฤc nie bฤdzie moลผna trenowaฤ ani hostowaฤ modeli
Krok 3) Uruchom instancjฤ
Kliknij Otwรณrz, aby uruchomiฤ instancjฤ
Krok 4) Rozpocznij kodowanie
In Jupyter, Kliknij Nowy> conda_tensorflow_p36 i jesteล gotowy do kodowania
Zainstaluj Keras w systemie Linux
Aby wลฤ czyฤ Keras z Tensorflow jako silnikiem zaplecza, musimy najpierw zainstalowaฤ Tensorflow. Uruchom to polecenie, aby zainstalowaฤ tensorflow z procesorem (bez procesora graficznego)
pip install --upgrade tensorflow
jeลli chcesz wลฤ czyฤ obsลugฤ GPU dla tensorflow, moลผesz uลผyฤ tego polecenia
pip install --upgrade tensorflow-gpu
meldujmy siฤ Python aby sprawdziฤ, czy nasza instalacja przebiegลa pomyลlnie, wpisujฤ c
user@user:~$ python Python 3.6.4 (default, Mar 20 2018, 11:10:20) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow >>>
jeลli nie pojawi siฤ ลผaden komunikat o bลฤdzie, proces instalacji przebiegล pomyลlnie
Zainstaluj Kerasa
Po zainstalowaniu Tensorflow zacznijmy instalowaฤ keras. Wpisz to polecenie w terminalu
pip install keras
rozpocznie siฤ instalacja Keras i wszystkich jego zaleลผnoลci. Powinieneล zobaczyฤ coล takiego:
Teraz mamy Keras zainstalowany w naszym systemie!
Weryfikowanie
Zanim zaczniemy korzystaฤ z Keras'a powinniลmy sprawdziฤ czy nasz Keras wykorzystuje jako backend Tensorflow otwierajฤ c plik konfiguracyjny:
gedit ~/.keras/keras.json
powinieneล zobaczyฤ coล takiego
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}
jak widaฤ, โbackendโ wykorzystuje tensorflow. Oznacza to, ลผe keras uลผywajฤ Tensorflow jako backendu, tak jak siฤ spodziewaliลmy
i teraz uruchom go na terminalu, wpisujฤ c
user@user:~$ python3 Python 3.6.4 (default, Mar 20 2018, 11:10:20) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import keras Using TensorFlow backend. >>>
Jak zainstalowaฤ Keras na Windows
Zanim zainstalujemy Tensorflow i Keras, powinniลmy zainstalowaฤ Python, pip i virtualenv. Jeลli juลผ zainstalowaลeล te biblioteki, powinieneล przejลฤ do nastฤpnego kroku, w przeciwnym razie wykonaj to:
Zainstalowaฤ Python 3, pobierajฤ c z tego link
Zainstaluj pip, uruchamiajฤ c to
Zainstaluj virtualenv za pomocฤ tego polecenia
pip3 install โU pip virtualenv
Zainstalowaฤ Microsoft Wizualny C++ Aktualizacja redystrybucyjna 2015 3
- Przejdลบ do witryny pobierania programu Visual Studio https://www.microsoft.com/en-us/download/details.aspx?id=53587
- Wybierz Elementy redystrybucyjne i Narzฤdzia do tworzenia
- Pobierz i zainstaluj Microsoft Wizualny C++ Aktualizacja redystrybucyjna 2015 3
Nastฤpnie uruchom ten skrypt
pip3 install virtualenv
Skonfiguruj ลrodowisko wirtualne
Sลuลผy do izolowania systemu roboczego od systemu gลรณwnego.
virtualenv โ-system-site-packages โp python3 ./venv
Aktywuj ลrodowisko
.\venv\Scripts\activate
Po przygotowaniu ลrodowiska instalacja Tensorflow i Keras pozostaje taka sama jak w Linuksie. W dalszej czฤลci tego samouczka dotyczฤ
cego gลฤbokiego uczenia siฤ z Keras poznamy podstawy Keras dotyczฤ
ce gลฤbokiego uczenia siฤ.
Podstawy Kerasa dotyczฤ ce gลฤbokiego uczenia siฤ
Gลรณwnฤ strukturฤ Keras jest Model, ktรณry definiuje peลny graf sieci. Moลผesz dodaฤ wiฤcej warstw do istniejฤ cego modelu, aby zbudowaฤ niestandardowy model potrzebny do Twojego projektu.
Oto jak utworzyฤ model sekwencyjny i kilka powszechnie uลผywanych warstw w gลฤbokim uczeniu siฤ
1. Model sekwencyjny
from keras.models import Sequential from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout model = Sequential()
2. Warstwa konwolucyjna
To jest Keras Python przykลad warstwy splotowej jako warstwy wejลciowej o ksztaลcie wejลciowym 320x320x3, z 48 filtrami o rozmiarze 3x3 i wykorzystaniem ReLU jako funkcji aktywacji.
input_shape=(320,320,3) #this is the input shape of an image 320x320x3 model.add(Conv2D(48, (3, 3), activation='relu', input_shape= input_shape))
inny typ to
model.add(Conv2D(48, (3, 3), activation='relu'))
3. MaksPooling Warstwa
Aby zmniejszyฤ reprezentacjฤ wejลciowฤ , uลผyj MaxPool2d i okreลl rozmiar jฤ dra
model.add(MaxPooling2D(pool_size=(2, 2)))
4. Gฤsta warstwa
dodanie w peลni poลฤ czonej warstwy z samym okreลleniem rozmiaru wyjลciowego
model.add(Dense(256, activation='relu'))
5. Warstwa porzucenia
Dodanie warstwy porzucenia z prawdopodobieลstwem 50%.
model.add(Dropout(0.5))
Kompilowanie, szkolenie i ocena
Po zdefiniowaniu naszego modelu zacznijmy go trenowaฤ. Naleลผy najpierw skompilowaฤ sieฤ z funkcjฤ straty i funkcjฤ optymalizatora. Umoลผliwi to sieci zmianฤ wag i zminimalizuje straty.
model.compile(loss='mean_squared_error', optimizer='adam')
Aby rozpoczฤ ฤ szkolenie, uลผyj funkcji fit, aby wprowadziฤ do modelu dane szkoleniowe i walidacyjne. Umoลผliwi to uczenie sieci partiami i ustawianie epok.
model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))
Ostatnim krokiem jest ocena modelu na podstawie danych testowych.
score = model.evaluate(x_test, y_test, batch_size=32)
Sprรณbujmy zastosowaฤ prostฤ regresjฤ liniowฤ
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
import matplotlib.pyplot as plt
x = data = np.linspace(1,2,200)
y = x*4 + np.random.randn(*x.shape) * 0.3
model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear'))
model.compile(optimizer='sgd', loss='mse', metrics=['mse'])
weights = model.layers[0].get_weights()
w_init = weights[0][0][0]
b_init = weights[1][0]
print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init))
model.fit(x,y, batch_size=1, epochs=30, shuffle=False)
weights = model.layers[0].get_weights()
w_final = weights[0][0][0]
b_final = weights[1][0]
print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))
predict = model.predict(data)
plt.plot(data, predict, 'b', data , y, 'k.')
plt.show()
Po przeszkoleniu danych dane wyjลciowe powinny wyglฤ daฤ nastฤpujฤ co
z poczฤ tkowฤ wagฤ
Linear regression model is initialized with weights w: 0.37, b: 0.00
i koลcowa waga
Linear regression model is trained to have weight w: 3.70, b: 0.61
Dostosowywanie wstฤpnie wyszkolonych modeli w Keras i sposรณb ich uลผywania
Dlaczego uลผywamy modeli Fine Tune i kiedy z nich korzystamy
Dostrajanie to zadanie majฤ ce na celu ulepszenie wstฤpnie wytrenowanego modelu w taki sposรณb, aby parametry dostosowaลy siฤ do nowego modelu. Gdy chcemy potrenowaฤ od podstaw na nowym modelu potrzebujemy duลผej iloลci danych, aby sieฤ mogลa odnaleลบฤ wszystkie parametry. Ale w tym przypadku uลผyjemy wstฤpnie wytrenowanego modelu, wiฤc parametry sฤ juลผ wyuczone i majฤ wagฤ.
Na przykลad, jeลli chcemy wytrenowaฤ wลasny model Kerasa, aby rozwiฤ zaฤ problem klasyfikacji, ale mamy tylko niewielkฤ iloลฤ danych, moลผemy to rozwiฤ zaฤ za pomocฤ Przenieล naukฤ + Metoda dostrajania.
Uลผywajฤ c wstฤpnie wytrenowanej sieci i ciฤลผarkรณw, nie musimy trenowaฤ caลej sieci. Musimy tylko przeszkoliฤ ostatniฤ warstwฤ uลผywanฤ do rozwiฤ zania naszego zadania, co nazywamy metodฤ dostrajania.
Przygotowanie modelu sieci
Do modelu wstฤpnie wytrenowanego moลผemy zaลadowaฤ rรณลผne modele, ktรณre Keras ma juลผ w swojej bibliotece takie jak:
- VGG16
- Poczฤ tekV3
- ResNet
- Sieฤ komรณrkowa
- Przyjฤcie
- IncepcjaResNetV2
Jednak w tym procesie uลผyjemy modelu sieci VGG16 i imageNet jako wagi modelu. Dostosujemy sieฤ, aby sklasyfikowaฤ 8 rรณลผnych typรณw klas za pomocฤ obrazรณw z Zestaw danych obrazรณw naturalnych Kaggle
Architektura modelu VGG16
Przesyลanie naszych danych do Bucket AWS S3
W naszym procesie szkoleniowym uลผyjemy naturalnych obrazรณw z 8 rรณลผnych klas, takich jak samoloty, samochรณd, kot, pies, kwiat, owoc, motocykl i osoba. Najpierw musimy przesลaฤ nasze dane do Amazon Wiadro S3.
Amazon Wiadro S3
Krok 1) Po zalogowaniu siฤ na konto S3 utwรณrzmy wiadro poprzez rejestracjฤ Utwรณrz wiadro
Krok 2) Teraz wybierz nazwฤ segmentu i region zgodnie ze swoim kontem. Upewnij siฤ, ลผe nazwa zasobnika jest dostฤpna. Nastฤpnie kliknij Utwรณrz.
Krok 3) Jak widaฤ, Wiadro jest gotowe do uลผycia. Ale jak widzisz, dostฤp nie jest publiczny, dobrze jest dla ciebie, jeลli chcesz zachowaฤ go dla siebie. Moลผesz zmieniฤ dostฤp publiczny tego zasobnika we wลaลciwoลciach zasobnika
Krok 4) Teraz moลผesz rozpoczฤ ฤ przesyลanie danych treningowych do swojego Bucketa. Tutaj przeลlฤ plik tar.gz, ktรณry skลada siฤ ze zdjฤฤ do celรณw szkoleniowych i testowych.
Krok 5) Teraz kliknij swรณj plik i skopiuj go Poลฤ czyฤ abyลmy mogli go pobraฤ.
Przygotowywanie danych
Musimy wygenerowaฤ nasze dane szkoleniowe przy uลผyciu Keras ImageDataGenerator.
Najpierw musisz pobraฤ za pomocฤ wget z linkiem do swojego pliku z S3 Bucket.
!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz !tar -xzf images.tar.gz
Po pobraniu danych rozpocznijmy proces szkolenia.
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import matplotlib.pyplot as plt
train_path = 'images/train/'
test_path = 'images/test/'
batch_size = 16
image_size = 224
num_class = 8
train_datagen = ImageDataGenerator(validation_split=0.3,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
train_generator = train_datagen.flow_from_directory(
directory=train_path,
target_size=(image_size,image_size),
batch_size=batch_size,
class_mode='categorical',
color_mode='rgb',
shuffle=True)
Dane obrazuGenerator utworzy dane X_training z katalogu. Podkatalog w tym katalogu bฤdzie uลผywany jako klasa dla kaลผdego obiektu. Obraz zostanie zaลadowany w trybie kolorรณw RGB, z trybem klasy kategorycznej dla danych Y_training, z partiฤ o rozmiarze 16. Na koniec przetasuj dane.
Zobaczmy nasze obrazy losowo, wykreลlajฤ c je za pomocฤ matplotlib
x_batch, y_batch = train_generator.next()
fig=plt.figure()
columns = 4
rows = 4
for i in range(1, columns*rows):
num = np.random.randint(batch_size)
image = x_batch[num].astype(np.int)
fig.add_subplot(rows, columns, i)
plt.imshow(image)
plt.show()
Nastฤpnie utwรณrzmy nasz model sieci z VGG16 z wstฤpnie wytrenowanฤ wagฤ imageNet. Zamrozimy te warstwy, aby nie byลo moลผliwoลci ich trenowania, co pomoลผe nam skrรณciฤ czas obliczeล.
Tworzenie naszego modelu z VGG16
import keras
from keras.models import Model, load_model
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.vgg16 import VGG16
#Load the VGG model
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3))
print(base_model.summary())
# Freeze the layers
for layer in base_model.layers:
layer.trainable = False
# # Create the model
model = keras.models.Sequential()
# # Add the vgg convolutional base model
model.add(base_model)
# # Add new layers
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(num_class, activation='softmax'))
# # Show a summary of the model. Check the number of trainable parameters
print(model.summary())
Jak widaฤ poniลผej, podsumowanie naszego modelu sieci. Z danych wejลciowych z warstw VGG16 dodajemy 2 w peลni poลฤ czone warstwy, ktรณre wyodrฤbniฤ 1024 funkcje i warstwฤ wyjลciowฤ , ktรณra obliczy 8 klas z aktywacjฤ softmax.
Layer (type) Output Shape Param # ================================================================= vgg16 (Model) (None, 7, 7, 512) 14714688 _________________________________________________________________ flatten_1 (Flatten) (None, 25088) 0 _________________________________________________________________ dense_1 (Dense) (None, 1024) 25691136 _________________________________________________________________ dense_2 (Dense) (None, 1024) 1049600 _________________________________________________________________ dense_3 (Dense) (None, 8) 8200 ================================================================= Total params: 41,463,624 Trainable params: 26,748,936 Non-trainable params: 14,714,688
Szkolenia
# # Compile the model
from keras.optimizers import SGD
model.compile(loss='categorical_crossentropy',
optimizer=SGD(lr=1e-3),
metrics=['accuracy'])
# # Start the training process
# model.fit(x_train, y_train, validation_split=0.30, batch_size=32, epochs=50, verbose=2)
# # #save the model
# model.save('catdog.h5')
history = model.fit_generator(
train_generator,
steps_per_epoch=train_generator.n/batch_size,
epochs=10)
model.save('fine_tune.h5')
# summarize history for accuracy
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.title('loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['loss'], loc='upper left')
plt.show()
Efekty
Epoch 1/10 432/431 [==============================] - 53s 123ms/step - loss: 0.5524 - acc: 0.9474 Epoch 2/10 432/431 [==============================] - 52s 119ms/step - loss: 0.1571 - acc: 0.9831 Epoch 3/10 432/431 [==============================] - 51s 119ms/step - loss: 0.1087 - acc: 0.9871 Epoch 4/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0624 - acc: 0.9926 Epoch 5/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0591 - acc: 0.9938 Epoch 6/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0498 - acc: 0.9936 Epoch 7/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0403 - acc: 0.9958 Epoch 8/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0248 - acc: 0.9959 Epoch 9/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0466 - acc: 0.9942 Epoch 10/10 432/431 [==============================] - 52s 120ms/step - loss: 0.0338 - acc: 0.9947
Jak widaฤ nasze straty sฤ znacznie zmniejszone, a dokลadnoลฤ wynosi prawie 100%. Aby przetestowaฤ nasz model, losowo wybraliลmy obrazy z Internetu i umieลciliลmy je w folderze testowym z innฤ klasฤ do przetestowania
Testowanie naszego modelu
model = load_model('fine_tune.h5')
test_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(
directory=train_path,
target_size=(image_size,image_size),
batch_size=batch_size,
class_mode='categorical',
color_mode='rgb',
shuffle=True)
test_generator = test_datagen.flow_from_directory(
directory=test_path,
target_size=(image_size, image_size),
color_mode='rgb',
shuffle=False,
class_mode='categorical',
batch_size=1)
filenames = test_generator.filenames
nb_samples = len(filenames)
fig=plt.figure()
columns = 4
rows = 4
for i in range(1, columns*rows -1):
x_batch, y_batch = test_generator.next()
name = model.predict(x_batch)
name = np.argmax(name, axis=-1)
true_name = y_batch
true_name = np.argmax(true_name, axis=-1)
label_map = (test_generator.class_indices)
label_map = dict((v,k) for k,v in label_map.items()) #flip k,v
predictions = [label_map[k] for k in name]
true_value = [label_map[k] for k in true_name]
image = x_batch[0].astype(np.int)
fig.add_subplot(rows, columns, i)
plt.title(str(predictions[0]) + ':' + str(true_value[0]))
plt.imshow(image)
plt.show()
A nasz test jest taki, jak podano poniลผej! Tylko 1 obraz jest przewidywany bลฤdnie na podstawie testu 14 obrazรณw!
Sieฤ neuronowa rozpoznawania twarzy z Keras
Dlaczego potrzebujemy uznania
Potrzebujemy rozpoznawania, aby uลatwiฤ nam rozpoznanie lub identyfikacjฤ twarzy osoby, rodzaju obiektรณw, szacowanego wieku osoby na podstawie jej twarzy, a nawet poznanie wyrazu twarzy tej osoby.
Byฤ moลผe zdajesz sobie sprawฤ, ลผe za kaลผdym razem, gdy prรณbujesz oznaczyฤ twarz znajomego na zdjฤciu, funkcja Facebooka zrobiลa to za Ciebie, czyli oznacza twarz znajomego bez koniecznoลci wczeลniejszego zaznaczania jej. Jest to funkcja rozpoznawania twarzy stosowana przez Facebooka, aby uลatwiฤ nam oznaczanie znajomych.
Jak to dziaลa? Za kaลผdym razem, gdy zaznaczymy twarz naszego znajomego, AI Facebooka bฤdzie siฤ tego uczyฤ i bฤdzie prรณbowaลa to przewidzieฤ, aลผ uzyska odpowiedni wynik. Tego samego systemu uลผyjemy do stworzenia wลasnego rozpoznawania twarzy. Zacznijmy tworzyฤ wลasne rozpoznawanie twarzy za pomocฤ gลฤbokiego uczenia siฤ
Model sieciowy
Bฤdziemy uลผywaฤ modelu sieciowego VGG16, ale z wagฤ VGGFace.
Architektura modelu VGG16
Czym jest VGGFace? jest to implementacja Deep Face Recognition w Keras wprowadzona przez Parkhi, Omkar M. i in. โDeep Face Recognitionโ. BMVC (2015). Struktura wykorzystuje VGG16 jako architekturฤ sieciowฤ .
Moลผesz pobraฤ VGGFace z GitHub
from keras.applications.vgg16 import VGG16
from keras_vggface.vggface import VGGFace
face_model = VGGFace(model='vgg16',
weights='vggface',
input_shape=(224,224,3))
face_model.summary()
Jak widaฤ podsumowanie sieci
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ conv1_1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ conv1_2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ pool1 (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ conv2_1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ conv2_2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ pool2 (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ conv3_1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ conv3_2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ conv3_3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ pool3 (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ conv4_1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ conv4_2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ conv4_3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ pool4 (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ conv5_1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ pool5 (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc6 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc6/relu (Activation) (None, 4096) 0 _________________________________________________________________ fc7 (Dense) (None, 4096) 16781312 _________________________________________________________________ fc7/relu (Activation) (None, 4096) 0 _________________________________________________________________ fc8 (Dense) (None, 2622) 10742334 _________________________________________________________________ fc8/softmax (Activation) (None, 2622) 0 ================================================================= Total params: 145,002,878 Trainable params: 145,002,878 Non-trainable params: 0 _________________________________________________________________ Traceback (most recent call last):
zrobimy A Przenieล naukฤ + Dostosowanie, aby przyspieszyฤ szkolenie przy maลych zestawach danych. Najpierw zamrozimy warstwy podstawowe, aby nie daลo siฤ ich trenowaฤ.
for layer in face_model.layers:
layer.trainable = False
nastฤpnie dodajemy wลasnฤ warstwฤ, aby rozpoznaฤ nasze twarze testowe. Dodamy 2 w peลni poลฤ czone warstwy i warstwฤ wyjลciowฤ z 5 osobami do wykrycia.
from keras.models import Model, Sequential
from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dense, Dropout, Activation
person_count = 5
last_layer = face_model.get_layer('pool5').output
x = Flatten(name='flatten')(last_layer)
x = Dense(1024, activation='relu', name='fc6')(x)
x = Dense(1024, activation='relu', name='fc7')(x)
out = Dense(person_count, activation='softmax', name='fc8')(x)
custom_face = Model(face_model.input, out)
Zobaczmy podsumowanie naszej sieci
Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ conv1_1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ conv1_2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ pool1 (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ conv2_1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ conv2_2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ pool2 (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ conv3_1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ conv3_2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ conv3_3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ pool3 (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ conv4_1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ conv4_2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ conv4_3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ pool4 (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ conv5_1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ pool5 (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc6 (Dense) (None, 1024) 25691136 _________________________________________________________________ fc7 (Dense) (None, 1024) 1049600 _________________________________________________________________ fc8 (Dense) (None, 5) 5125 ================================================================= Total params: 41,460,549 Trainable params: 26,745,861 Non-trainable params: 14,714,688
Jak widaฤ powyลผej, po warstwie Pool5 zostanie ona spลaszczona do pojedynczego wektora cech, ktรณry zostanie wykorzystany przez gฤstฤ warstwฤ do ostatecznego rozpoznania.
Przygotowanie naszych twarzy
Teraz przygotujmy nasze twarze. Zrobiลem katalog skลadajฤ cy siฤ z 5 znanych osรณb
- Jack Ma
- Jason Statham
- Johnny Depp
- Robert Downey Jr.
- Rowan Atkinson
Kaลผdy folder zawiera 10 zdjฤฤ, przedstawiajฤ cych kaลผdy proces szkolenia i ewaluacji. To bardzo maลa iloลฤ danych, ale to jest wyzwanie, prawda?
Do przygotowania danych wykorzystamy narzฤdzie Keras. Ta funkcja wykona iteracjฤ w folderze zestawu danych, a nastฤpnie przygotuje go do uลผycia w szkoleniu.
from keras.preprocessing.image import ImageDataGenerator
batch_size = 5
train_path = 'data/'
eval_path = 'eval/'
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
valid_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
train_generator = train_datagen.flow_from_directory(
train_path,
target_size=(image_size,image_size),
batch_size=batch_size,
class_mode='sparse',
color_mode='rgb')
valid_generator = valid_datagen.flow_from_directory(
directory=eval_path,
target_size=(224, 224),
color_mode='rgb',
batch_size=batch_size,
class_mode='sparse',
shuffle=True,
)
Trenowanie naszego modelu
Rozpocznijmy proces uczenia od skompilowania naszej sieci z funkcjฤ straty i optymalizatorem. Tutaj uลผywamy sparse_categorical_crossentropy jako naszej funkcji straty, przy pomocy SGD jako naszego optymalizatora uczenia siฤ.
from keras.optimizers import SGD
custom_face.compile(loss='sparse_categorical_crossentropy',
optimizer=SGD(lr=1e-4, momentum=0.9),
metrics=['accuracy'])
history = custom_face.fit_generator(
train_generator,
validation_data=valid_generator,
steps_per_epoch=49/batch_size,
validation_steps=valid_generator.n,
epochs=50)
custom_face.evaluate_generator(generator=valid_generator)
custom_face.save('vgg_face.h5')
Epoch 25/50
10/9 [==============================] - 60s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5659 - val_acc: 0.5851
Epoch 26/50
10/9 [==============================] - 59s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5638 - val_acc: 0.5809
Epoch 27/50
10/9 [==============================] - 60s 6s/step - loss: 1.4779 - acc: 0.8597 - val_loss: 1.5613 - val_acc: 0.5477
Epoch 28/50
10/9 [==============================] - 60s 6s/step - loss: 1.4755 - acc: 0.9199 - val_loss: 1.5576 - val_acc: 0.5809
Epoch 29/50
10/9 [==============================] - 60s 6s/step - loss: 1.4794 - acc: 0.9153 - val_loss: 1.5531 - val_acc: 0.5892
Epoch 30/50
10/9 [==============================] - 60s 6s/step - loss: 1.4714 - acc: 0.8953 - val_loss: 1.5510 - val_acc: 0.6017
Epoch 31/50
10/9 [==============================] - 60s 6s/step - loss: 1.4552 - acc: 0.9199 - val_loss: 1.5509 - val_acc: 0.5809
Epoch 32/50
10/9 [==============================] - 60s 6s/step - loss: 1.4504 - acc: 0.9199 - val_loss: 1.5492 - val_acc: 0.5975
Epoch 33/50
10/9 [==============================] - 60s 6s/step - loss: 1.4497 - acc: 0.8998 - val_loss: 1.5490 - val_acc: 0.5851
Epoch 34/50
10/9 [==============================] - 60s 6s/step - loss: 1.4453 - acc: 0.9399 - val_loss: 1.5529 - val_acc: 0.5643
Epoch 35/50
10/9 [==============================] - 60s 6s/step - loss: 1.4399 - acc: 0.9599 - val_loss: 1.5451 - val_acc: 0.5768
Epoch 36/50
10/9 [==============================] - 60s 6s/step - loss: 1.4373 - acc: 0.8998 - val_loss: 1.5424 - val_acc: 0.5768
Epoch 37/50
10/9 [==============================] - 60s 6s/step - loss: 1.4231 - acc: 0.9199 - val_loss: 1.5389 - val_acc: 0.6183
Epoch 38/50
10/9 [==============================] - 59s 6s/step - loss: 1.4247 - acc: 0.9199 - val_loss: 1.5372 - val_acc: 0.5934
Epoch 39/50
10/9 [==============================] - 60s 6s/step - loss: 1.4153 - acc: 0.9399 - val_loss: 1.5406 - val_acc: 0.5560
Epoch 40/50
10/9 [==============================] - 60s 6s/step - loss: 1.4074 - acc: 0.9800 - val_loss: 1.5327 - val_acc: 0.6224
Epoch 41/50
10/9 [==============================] - 60s 6s/step - loss: 1.4023 - acc: 0.9800 - val_loss: 1.5305 - val_acc: 0.6100
Epoch 42/50
10/9 [==============================] - 59s 6s/step - loss: 1.3938 - acc: 0.9800 - val_loss: 1.5269 - val_acc: 0.5975
Epoch 43/50
10/9 [==============================] - 60s 6s/step - loss: 1.3897 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.6432
Epoch 44/50
10/9 [==============================] - 60s 6s/step - loss: 1.3828 - acc: 0.9800 - val_loss: 1.5210 - val_acc: 0.6556
Epoch 45/50
10/9 [==============================] - 59s 6s/step - loss: 1.3848 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.5975
Epoch 46/50
10/9 [==============================] - 60s 6s/step - loss: 1.3716 - acc: 0.9800 - val_loss: 1.5216 - val_acc: 0.6432
Epoch 47/50
10/9 [==============================] - 60s 6s/step - loss: 1.3721 - acc: 0.9800 - val_loss: 1.5195 - val_acc: 0.6266
Epoch 48/50
10/9 [==============================] - 60s 6s/step - loss: 1.3622 - acc: 0.9599 - val_loss: 1.5108 - val_acc: 0.6141
Epoch 49/50
10/9 [==============================] - 60s 6s/step - loss: 1.3452 - acc: 0.9399 - val_loss: 1.5140 - val_acc: 0.6432
Epoch 50/50
10/9 [==============================] - 60s 6s/step - loss: 1.3387 - acc: 0.9599 - val_loss: 1.5100 - val_acc: 0.6266
Jak widaฤ dokลadnoลฤ naszej walidacji siฤga 64%, jest to dobry wynik jak na niewielkฤ iloลฤ danych treningowych. Moลผemy to poprawiฤ, dodajฤ c wiฤcej warstw lub dodajฤ c wiฤcej obrazรณw treningowych, aby nasz model mรณgล dowiedzieฤ siฤ wiฤcej o twarzach i osiฤ gnฤ ฤ wiฤkszฤ dokลadnoลฤ.
Przetestujmy nasz model na zdjฤciu testowym
from keras.models import load_model
from keras.preprocessing.image import load_img, save_img, img_to_array
from keras_vggface.utils import preprocess_input
test_img = image.load_img('test.jpg', target_size=(224, 224))
img_test = image.img_to_array(test_img)
img_test = np.expand_dims(img_test, axis=0)
img_test = utils.preprocess_input(img_test)
predictions = model.predict(img_test)
predicted_class=np.argmax(predictions,axis=1)
labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class]
print(predictions)
['RobertDJr']
uลผywajฤ c zdjฤcia Roberta Downeya Jr. jako naszego zdjฤcia testowego, pokazuje, ลผe przewidywana twarz jest prawdziwa!
Przewidywanie za pomocฤ kamery na ลผywo!
A moลผe sprawdzimy nasze umiejฤtnoลci wdraลผania go za pomocฤ sygnaลu z kamery internetowej? Uลผywajฤ c OpenCV z kaskadฤ Haar Face do znalezienia naszej twarzy i za pomocฤ naszego modelu sieci moลผemy rozpoznaฤ osobฤ.
Pierwszym krokiem jest przygotowanie twarzy Ciebie i Twoich znajomych. Im wiฤcej mamy danych, tym lepszy wynik!
Przygotuj i wytrenuj swojฤ sieฤ jak w poprzednim kroku, po zakoลczeniu uczenia dodaj tฤ liniฤ, aby uzyskaฤ obraz wejลciowy z kamery
#Load trained model
from keras.models import load_model
from keras_vggface import utils
import cv2
image_size = 224
device_id = 0 #camera_device id
model = load_model('my faces.h5')
#make labels according to your dataset folder
labels = dict(fisrtname=0,secondname=1) #and so on
print(labels)
cascade_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
camera = cv2.VideoCapture(device_id)
while camera.isOpened():
ok, cam_frame = camera.read()
if not ok:
break
gray_img=cv2.cvtColor(cam_frame, cv2.COLOR_BGR2GRAY)
faces= cascade_classifier.detectMultiScale(gray_img, minNeighbors=5)
for (x,y,w,h) in faces:
cv2.rectangle(cam_frame,(x,y),(x+w,y+h),(255,255,0),2)
roi_color = cam_frame [y:y+h, x:x+w]
roi color = cv2.cvtColor(roi_color, cv2.COLOR_BGR2RGB)
roi_color = cv2.resize(roi_color, (image_size, image_size))
image = roi_color.astype(np.float32, copy=False)
image = np.expand_dims(image, axis=0)
image = preprocess_input(image, version=1) # or version=2
preds = model.predict(image)
predicted_class=np.argmax(preds,axis=1)
labels = dict((v,k) for k,v in labels.items())
name = [labels[k] for k in predicted_class]
cv2.putText(cam_frame,str(name),
(x + 10, y + 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255), 2)
cv2.imshow('video image', cam_frame)
key = cv2.waitKey(30)
if key == 27: # press 'ESC' to quit
break
camera.release()
cv2.destroyAllWindows()
Ktรณry jest lepszy? Keras lub Tensorflow
Keras oferuje prostotฤ podczas pisania scenariusza. Moลผemy zaczฤ ฤ pisaฤ i rozumieฤ siฤ bezpoลrednio z Kerasem, poniewaลผ nie jest to zbyt trudne do zrozumienia. Jest bardziej przyjazny dla uลผytkownika i ลatwy w implementacji, nie ma potrzeby wprowadzania wielu zmiennych, aby uruchomiฤ model. Nie musimy wiฤc rozumieฤ wszystkich szczegรณลรณw procesu zaplecza.
Z drugiej strony Tensorflow to operacje niskiego poziomu, ktรณre oferujฤ elastycznoลฤ i zaawansowane operacje, jeลli chcesz utworzyฤ dowolny graf obliczeniowy lub model. Tensorflow moลผe rรณwnieลผ wizualizowaฤ proces za pomocฤ Tensorboard oraz specjalistyczne narzฤdzie debugujฤ ce.
Wiฤc jeลli chcesz zaczฤ ฤ pracฤ z gลฤbokim uczeniem siฤ bez zbytniej zลoลผonoลci, uลผyj Keras. Poniewaลผ Keras oferuje prostotฤ i jest przyjazny dla uลผytkownika w uลผyciu i ลatwy do wdroลผenia niลผ Tensorflow. Ale jeลli chcesz napisaฤ wลasny algorytm w projekcie lub badaniu gลฤbokiego uczenia siฤ, powinieneล zamiast tego uลผyฤ Tensorflow.
Podsumowanie
Podsumujmy wiฤc wszystko, co omรณwiliลmy i zrobiliลmy w tym samouczku.
- Keras w interfejsie API wysokiego poziomu, ktรณry sลuลผy do uลatwiania sieci gลฤbokiego uczenia siฤ za pomocฤ silnika zaplecza.
- Keras jest ลatwy w uลผyciu i zrozumiaลy dziฤki obsลudze Pythona, dziฤki czemu wydaje siฤ bardziej naturalny niลผ kiedykolwiek. Jest dobry dla poczฤ tkujฤ cych, ktรณrzy chcฤ dowiedzieฤ siฤ o gลฤbokim uczeniu siฤ i dla badaczy, ktรณrzy chcฤ ลatwego w uลผyciu API.
- Proces instalacji jest ลatwy i moลผna skorzystaฤ ze ลrodowiska wirtualnego lub skorzystaฤ z platformy zewnฤtrznej np AWS.
- Keras jest rรณwnieลผ wyposaลผony w rรณลผnego rodzaju modele sieci, dziฤki czemu ลatwiej jest nam wykorzystaฤ dostฤpny model do wstฤpnego wytrenowania i dostrajania wลasnego modelu sieci.
- Istnieje rรณwnieลผ wiele samouczkรณw i artykuลรณw na temat uลผywania Keras z kodรณw spoลecznoลci na caลym ลwiecie do celรณw gลฤbokiego uczenia siฤ.























