Tutorial Keras
O que รฉ Keras:
Keras รฉ uma biblioteca de rede neural de cรณdigo aberto escrita em Python que roda em cima de Theano ou Tensorflow. Ele foi projetado para ser modular, rรกpido e fรกcil de usar. Foi desenvolvido por Franรงois Chollet, engenheiro do Google. Keras nรฃo lida com computaรงรฃo de baixo nรญvel. Em vez disso, ele usa outra biblioteca para fazer isso, chamada โBackend.
Keras รฉ um wrapper de API de alto nรญvel para API de baixo nรญvel, capaz de ser executado em TensorFlow, CNTK ou Theano. A API Keras de alto nรญvel lida com a maneira como criamos modelos, definimos camadas ou configuramos vรกrios modelos de entrada-saรญda. Neste nรญvel, Keras tambรฉm compila nosso modelo com funรงรตes de perda e otimizador, processo de treinamento com funรงรฃo de ajuste. Keras em Python nรฃo lida com API de baixo nรญvel, como fazer o grรกfico computacional, fazer tensores ou outras variรกveis, porque foi tratado pelo mecanismo de โbackendโ.
O que รฉ um back-end?
Backend รฉ um termo em Keras que executa todos os cรกlculos de baixo nรญvel, como produtos tensores, convoluรงรตes e muitas outras coisas, com a ajuda de outras bibliotecas, como Tensorflow ou Theano. Assim, o โmotor backendโ realizarรก a computaรงรฃo e desenvolvimento dos modelos. Tensorflow รฉ o โmecanismo de backendโ padrรฃo, mas podemos alterรก-lo na configuraรงรฃo.
Back-end Theano, Tensorflow e CNTK
Theano รฉ um projeto de cรณdigo aberto desenvolvido pelo grupo MILA da Universidade de Montreal, Quebec, Canadรก. Foi o primeiro Framework amplamente utilizado. ร um Python biblioteca que ajuda em matrizes multidimensionais para operaรงรตes matemรกticas usando Numpy ou Scipy. Theano pode usar GPUs para computaรงรฃo mais rรกpida, ele tambรฉm pode construir automaticamente grรกficos simbรณlicos para computaรงรฃo de gradientes. Em seu site, Theano afirma que pode reconhecer expressรตes numericamente instรกveis โโe computรก-las com algoritmos mais estรกveis, isso รฉ muito รบtil para nossas expressรตes instรกveis.
Por outro lado, o Tensorflow รฉ a estrela em ascensรฃo na estrutura de aprendizagem profunda. Desenvolvido pela equipe Brain do Google, รฉ a ferramenta de aprendizado profundo mais popular. Com muitos recursos, os pesquisadores contribuem para ajudar a desenvolver esta estrutura para fins de aprendizagem profunda.
Outro mecanismo de back-end para Keras รฉ o Microsoft Kit de ferramentas cognitivas ou CNTK. ร uma estrutura de aprendizagem profunda de cรณdigo aberto desenvolvida por Microsoft Equipe. Ele pode ser executado em vรกrias GPUs ou em vรกrias mรกquinas para treinar o modelo de aprendizado profundo em grande escala. Em alguns casos, o CNTK foi relatado mais rapidamente do que outras estruturas, como Tensorflow ou Theano. A seguir neste tutorial Keras CNN, compararemos os backends de Theano, TensorFlow e CNTK.
Comparando os back-ends
Precisamos fazer um benchmark para saber a comparaรงรฃo entre esses dois backends. Como vocรช pode ver em Referรชncia de Jeong-Yoon Lee, o desempenho de trรชs back-ends diferentes em hardwares diferentes รฉ comparado. E o resultado รฉ que Theano รฉ mais lento que o outro backend, รฉ relatado vezes 50 mais lento, mas a precisรฃo estรก prรณxima uma da outra.
Outro teste de referรชncia รฉ realizado por Jasmeet Bhatia. Ele relatou que Theano รฉ mais lento que o Tensorflow em alguns testes. Mas a precisรฃo geral รฉ quase a mesma para todas as redes testadas.
Entรฃo, entre Theano, Tensorflow e CTK รฉ รณbvio que TensorFlow รฉ melhor que Theano. Com o TensorFlow, o tempo de cรกlculo รฉ muito menor e o CNN รฉ melhor que os outros.
Prรณximo neste Keras Python tutorial, aprenderemos sobre a diferenรงa entre Keras e TensorFlow (Keras x Tensorflow).
Keras x Tensorflow
| Parรขmetros Tรฉcnicos | Keras | Tensorflow |
|---|---|---|
| Formato | Wrapper de API de alto nรญvel | API de baixo nรญvel |
| Complexidade | Fรกcil de usar se vocรช Python lรญngua | Vocรช precisa aprender a sintaxe de uso de algumas funรงรตes do Tensorflow |
| Propรณsito | Implantaรงรฃo rรกpida para criar modelos com camadas padrรฃo | Permite que vocรช crie um grรกfico computacional arbitrรกrio ou camadas de modelo |
| Ferramentas | Usa outra ferramenta de depuraรงรฃo de API, como TFDBG | Vocรช pode usar ferramentas de visualizaรงรฃo do Tensorboard |
| Comunidade | Grandes comunidades ativas | Grandes comunidades ativas e recursos amplamente compartilhados |
Vantagens do Keras
Implantaรงรฃo rรกpida e fรกcil de entender
Keras รฉ muito rรกpido para criar um modelo de rede. Se vocรช quiser fazer um modelo de rede simples com poucas linhas, Python Keras pode ajudรก-lo com isso. Veja o exemplo de Keras abaixo:
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'))
Por causa da API amigรกvel, podemos entender facilmente o processo. Escrever o cรณdigo com uma funรงรฃo simples e sem necessidade de definir vรกrios parรขmetros.
Apoio de grande comunidade
Existem muitas comunidades de IA que usam Keras para sua estrutura de Deep Learning. Muitos deles publicam seus cรณdigos e tambรฉm tutoriais para o pรบblico em geral.
Tenha vรกrios back-ends
Vocรช pode escolher Tensorflow, CNTK e Theano como back-end com Keras. Vocรช pode escolher um back-end diferente para projetos diferentes, dependendo de suas necessidades. Cada back-end tem sua prรณpria vantagem exclusiva.
Implantaรงรฃo fรกcil e multiplataforma de modelo
Com uma variedade de dispositivos e plataformas compatรญveis, vocรช pode implantar o Keras em qualquer dispositivo, como
- iOS com CoreML
- Android com Tensorflow Android,
- Navegador da Web com suporte .js
- Mecanismo de nuvem
- Raspberry Pi
Suporte a mรบltiplas GPUs
Vocรช pode treinar Keras em uma รบnica GPU ou usar vรกrias GPUs ao mesmo tempo. Porque Keras tem suporte integrado para paralelismo de dados para que possa processar grandes volumes de dados e acelerar o tempo necessรกrio para treinรก-los.
Desvantagens de Keras
Nรฃo รฉ possรญvel lidar com API de baixo nรญvel
Keras lida apenas com APIs de alto nรญvel que sรฃo executadas em outra estrutura ou mecanismo de back-end, como Tensorflow, Theano ou CNTK. Portanto, nรฃo รฉ muito รบtil se vocรช deseja criar sua prรณpria camada abstrata para fins de pesquisa, porque o Keras jรก possui camadas prรฉ-configuradas.
Instalando Keras
Nesta seรงรฃo, veremos vรกrios mรฉtodos disponรญveis para instalar o Keras
Instalaรงรฃo direta ou ambiente virtual
Qual รฉ o melhor? Instalaรงรฃo direta no python atual ou uso de um ambiente virtual? Sugiro usar um ambiente virtual se vocรช tiver muitos projetos. Quer saber por quรช? Isso ocorre porque diferentes projetos podem usar uma versรฃo diferente de uma biblioteca keras.
Por exemplo, tenho um projeto que precisa Python 3.5 usando OpenCV 3.3 com backend Keras-Theano mais antigo, mas no outro projeto eu tenho que usar Keras com a versรฃo mais recente e um Tensorflow como backend com Python Apoio 3.6.6
Nรฃo queremos que a biblioteca Keras entre em conflito, certo? Entรฃo usamos um Ambiente Virtual para localizar o projeto com um tipo especรญfico de biblioteca ou podemos usar outra plataforma como Cloud Service para fazer nossos cรกlculos para nรณs como Amazon Serviรงo de internet.
Instalando Keras em Amazon Serviรงo Web (AWS)
Amazon Web Service รฉ uma plataforma que oferece serviรงos e produtos de Cloud Computing para pesquisadores ou quaisquer outros fins. A AWS aluga seu hardware, rede, banco de dados, etc. para que possamos usรก-lo diretamente da internet. Um dos serviรงos populares da AWS para fins de aprendizagem profunda รฉ o Amazon Serviรงo de aprendizado profundo de imagem de mรกquina ou DL
Para obter instruรงรตes detalhadas sobre como usar a AWS, consulte este tutorial
Nota sobre a AMI: vocรช terรก a seguinte AMI disponรญvel
AWS Deep Learning AMI รฉ um ambiente virtual no AWS EC2 Service que ajuda pesquisadores ou profissionais a trabalhar com Deep Learning. DLAMI oferece desde mecanismos de CPUs pequenas atรฉ mecanismos multi GPUs de alta potรชncia com CUDA, cuDNN prรฉ-configurados e vem com uma variedade de estruturas de aprendizado profundo.
Se quiser usรก-lo instantaneamente, vocรช deve escolher Deep Learning AMI porque ele vem prรฉ-instalado com estruturas populares de aprendizado profundo.
Mas se vocรช quiser experimentar uma estrutura de aprendizado profundo personalizada para pesquisa, vocรช deve instalar o Deep Learning Base AMI porque ele vem com bibliotecas fundamentais como CUDA, cuDNN, drivers de GPU e outras bibliotecas necessรกrias para funcionar com seu ambiente de aprendizado profundo.
Como instalar o Keras em Amazon SageMaker
Amazon SageMaker รฉ uma plataforma de aprendizado profundo para ajudรก-lo a treinar e implantar rede de aprendizado profundo com o melhor algoritmo.
Para um iniciante, este รฉ de longe o mรฉtodo mais fรกcil de usar o Keras. Abaixo estรก um processo sobre como instalar Keras em Amazon Criador de Sรกbio:
Etapa 1) Abrir Amazon SageMaker
Na primeira etapa, abra o Amazon Sรกbio console e clique em Criar instรขncia de notebook.
Etapa 2) Insira os detalhes
- Digite o nome do seu bloco de notas.
- Crie uma funรงรฃo do IAM. Isso criarรก uma funรงรฃo AMI Amazon Funรงรฃo IAM no formato de AmazonSageMaker-Executionrole-AAAAMMDD|HHmmSS.
- Por fim, escolha Criar instรขncia de notebook. Depois de alguns momentos, Amazon Sagemaker lanรงa uma instรขncia de notebook.
Observaรงรฃo: se desejar acessar recursos da sua VPC, defina o acesso direto ร Internet como ativado. Caso contrรกrio, esta instรขncia de notebook nรฃo terรก acesso ร Internet, sendo impossรญvel treinar ou hospedar modelos
Etapa 3) Inicie a instรขncia
Clique em Abrir para iniciar a instรขncia
Etapa 4) Comece a codificar
In Jupyter, Clique em Novo> conda_tensorflow_p36 e vocรช estรก pronto para codificar
Instale Keras no Linux
Para habilitar Keras com Tensorflow como mecanismo de back-end, precisamos primeiro instalar o Tensorflow. Execute este comando para instalar o tensorflow com CPU (sem GPU)
pip install --upgrade tensorflow
se vocรช deseja habilitar o suporte de GPU para tensorflow vocรช pode usar este comando
pip install --upgrade tensorflow-gpu
vamos fazer o check-in Python para ver se nossa instalaรงรฃo foi bem-sucedida digitando
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 >>>
se nรฃo houver mensagem de erro, o processo de instalaรงรฃo foi bem-sucedido
Instale Keras
Depois de instalar o Tensorflow, vamos comeรงar a instalar o keras. Digite este comando no terminal
pip install keras
ele comeรงarรก a instalar o Keras e tambรฉm todas as suas dependรชncias. Vocรช deverรก ver algo assim:
Agora temos Keras instalado em nosso sistema!
Verificando
Antes de comeรงarmos a usar Keras, devemos verificar se nosso Keras usa Tensorflow como backend abrindo o arquivo de configuraรงรฃo:
gedit ~/.keras/keras.json
vocรช deve ver algo assim
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}
como vocรช pode ver, o โbackendโ usa tensorflow. Isso significa que Keras estรก usando o Tensorflow como back-end, conforme esperรกvamos
e agora execute-o no terminal digitando
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. >>>
Como instalar o Keras em Windows
Antes de instalarmos Tensorflow e Keras, devemos instalar Python, pip e virtualenv. Se vocรช jรก instalou essas bibliotecas, vocรช deve continuar para o prรณximo passo, caso contrรกrio, faรงa isto:
Instale Python 3 baixando deste link
Instale o pip executando esse
Instale o virtualenv com este comando
pip3 install โU pip virtualenv
Instale Microsoft visual C++ Atualizaรงรฃo Redistribuรญvel 2015 de 3
- Acesse o site de download do Visual Studio https://www.microsoft.com/en-us/download/details.aspx?id=53587
- Selecione redistribuรญveis e ferramentas de construรงรฃo
- Baixe e instale o Microsoft visual C++ Atualizaรงรฃo Redistribuรญvel 2015 de 3
Entรฃo execute este script
pip3 install virtualenv
Configurar ambiente virtual
Isso รฉ usado para isolar o sistema em funcionamento do sistema principal.
virtualenv โ-system-site-packages โp python3 ./venv
Ative o ambiente
.\venv\Scripts\activate
Depois de preparar o ambiente, a instalaรงรฃo do Tensorflow e Keras permanece igual ao Linux. A seguir neste tutorial de aprendizado profundo com Keras, aprenderemos sobre os fundamentos do Keras para aprendizado profundo.
Fundamentos de Keras para aprendizado profundo
A estrutura principal do Keras รฉ o Modelo que define o grรกfico completo de uma rede. Vocรช pode adicionar mais camadas a um modelo existente para construir um modelo personalizado necessรกrio para o seu projeto.
Veja como fazer um modelo sequencial e algumas camadas comumente usadas em aprendizado profundo
1. Modelo Sequencial
from keras.models import Sequential from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout model = Sequential()
2. Camada Convolucional
Este รฉ um Keras Python exemplo de camada convolucional como camada de entrada com formato de entrada 320x320x3, com 48 filtros de tamanho 3ร3 e usa ReLU como funรงรฃo de ativaรงรฃo.
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))
outro tipo รฉ
model.add(Conv2D(48, (3, 3), activation='relu'))
3. MรกxPooling Camada
Para reduzir a resoluรงรฃo da representaรงรฃo de entrada, use MaxPool2d e especifique o tamanho do kernel
model.add(MaxPooling2D(pool_size=(2, 2)))
4. Camada Densa
adicionando uma camada totalmente conectada apenas especificando o tamanho da saรญda
model.add(Dense(256, activation='relu'))
5. Camada de exclusรฃo
Adicionando camada de eliminaรงรฃo com 50% de probabilidade
model.add(Dropout(0.5))
Compilar, treinar e avaliar
Depois de definirmos nosso modelo, vamos comeรงar a treinรก-los. ร necessรกrio compilar a rede primeiro com a funรงรฃo de perda e a funรงรฃo de otimizador. Isso permitirรก que a rede altere os pesos e minimize a perda.
model.compile(loss='mean_squared_error', optimizer='adam')
Agora, para iniciar o treinamento, use fit para alimentar o modelo com os dados de treinamento e validaรงรฃo. Isso permitirรก que vocรช treine a rede em lotes e defina as รฉpocas.
model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))
Nossa etapa final รฉ avaliar o modelo com os dados de teste.
score = model.evaluate(x_test, y_test, batch_size=32)
Vamos tentar usar regressรฃo linear simples
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()
Depois de treinar os dados, a saรญda deve ficar assim
com o peso inicial
Linear regression model is initialized with weights w: 0.37, b: 0.00
e peso final
Linear regression model is trained to have weight w: 3.70, b: 0.61
Ajuste fino de modelos prรฉ-treinados em Keras e como usรก-los
Por que usamos modelos Fine Tune e quando os usamos
O ajuste fino รฉ uma tarefa para ajustar um modelo prรฉ-treinado de forma que os parรขmetros se adaptem ao novo modelo. Quando queremos treinar do zero em um novo modelo, precisamos de uma grande quantidade de dados, para que a rede consiga encontrar todos os parรขmetros. Mas neste caso usaremos um modelo prรฉ-treinado para que os parรขmetros jรก sejam aprendidos e tenham peso.
Por exemplo, se quisermos treinar nosso prรณprio modelo Keras para resolver um problema de classificaรงรฃo, mas tivermos apenas uma pequena quantidade de dados, podemos resolver isso usando um Aprendizagem por transferรชncia + Mรฉtodo de ajuste fino.
Usando uma rede e pesos prรฉ-treinados, nรฃo precisamos treinar toda a rede. Precisamos apenas treinar a รบltima camada usada para resolver nossa tarefa, pois o chamamos de mรฉtodo de ajuste fino.
Preparaรงรฃo do modelo de rede
Para o modelo prรฉ-treinado, podemos carregar uma variedade de modelos que Keras jรก possui em sua biblioteca, como:
- VGG16
- Inception V3
- ResNet
- MobileNet
- Xception
- InรญcioResNetV2
Mas neste processo usaremos o modelo de rede VGG16 e o โโimageNet como nosso peso para o modelo. Ajustaremos uma rede para classificar 8 tipos diferentes de classes usando imagens de Conjunto de dados de imagens naturais Kaggle
Arquitetura do modelo VGG16
Carregando nossos dados para o AWS S3 Bucket
Para o nosso processo de treinamento, usaremos uma imagem de imagens naturais de 8 classes diferentes, como aviรตes, carro, gato, cachorro, flor, fruta, motocicleta e pessoa. Primeiro, precisamos enviar nossos dados para Amazon Balde S3.
Amazon Balde S3
Passo 1) Apรณs fazer login em sua conta S3, vamos criar um bucket cronometrando Criar Bucket
Passo 2) Agora escolha um nome de bucket e sua regiรฃo de acordo com sua conta. Certifique-se de que o nome do bucket esteja disponรญvel. Depois disso clique Criar.
Passo 3) Como vocรช pode ver, seu balde estรก pronto para uso. Mas como vocรช pode ver, o acesso nรฃo รฉ pรบblico, รฉ bom para vocรช se quiser mantรช-lo privado. Vocรช pode alterar este bucket para acesso pรบblico nas propriedades do bucket
Passo 4) Agora vocรช comeรงa a enviar seus dados de treinamento para o seu Bucket. Aqui farei upload do arquivo tar.gz que consiste em fotos para treinamento e processo de teste.
Passo 5) Agora clique no seu arquivo e copie o de vidrio para que possamos baixรก-lo.
Preparaรงรฃo de dados
Precisamos gerar nossos dados de treinamento usando Keras ImageDataGenerator.
Primeiro vocรช deve fazer o download usando o wget com o link para o seu arquivo do S3 Bucket.
!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz !tar -xzf images.tar.gz
Apรณs baixar os dados vamos iniciar o Processo de Treinamento.
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)
Os dados da imagemGenerator criarรก dados X_training de um diretรณrio. O subdiretรณrio nesse diretรณrio serรก usado como uma classe para cada objeto. A imagem serรก carregada com o modo de cor RGB, com o modo de classe categรณrica para os dados Y_training, com tamanho de lote 16. Por fim, embaralhe os dados.
Vamos ver nossas imagens aleatoriamente plotando-as com 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()
Depois disso vamos criar nosso modelo de rede a partir de VGG16 com peso prรฉ-treinado imageNet. Congelaremos essas camadas para que nรฃo sejam treinรกveis โโpara nos ajudar a reduzir o tempo de computaรงรฃo.
Criando nosso modelo a partir de 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())
Como vocรช pode ver abaixo, o resumo do nosso modelo de rede. A partir de uma entrada das camadas VGG16, adicionamos 2 camadas totalmente conectadas que extrairรฃo 1024 recursos e uma camada de saรญda que calcularรก as 8 classes com a ativaรงรฃo do 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
Formaรงรฃo
# # 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()
Resultados
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
Como vocรช pode ver, nossas perdas diminuรญram significativamente e a precisรฃo รฉ de quase 100%. Para testar nosso modelo, escolhemos imagens aleatoriamente na internet e colocamos na pasta de testes com uma classe diferente para testar
Testando nosso modelo
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()
E nosso teste รฉ o mostrado abaixo! Apenas 1 imagem estรก errada em um teste de 14 imagens!
Rede Neural de Reconhecimento Facial com Keras
Por que precisamos de reconhecimento
Precisamos do Reconhecimento para que seja mais fรกcil reconhecer ou identificar o rosto de uma pessoa, o tipo de objeto, a idade estimada de uma pessoa pelo seu rosto ou atรฉ mesmo conhecer as expressรตes faciais dessa pessoa.
Talvez vocรช perceba que toda vez que tenta marcar o rosto do seu amigo em uma foto, o recurso do Facebook fez isso por vocรช, ou seja, marcar o rosto do seu amigo sem que vocรช precise marcรก-lo primeiro. Este รฉ o reconhecimento facial aplicado pelo Facebook para facilitar a marcaรงรฃo de amigos.
Entรฃo, como isso funciona? Cada vez que marcamos o rosto do nosso amigo, a IA do Facebook aprenderรก e tentarรก prevรช-lo atรฉ obter o resultado certo. O mesmo sistema que usaremos para fazer nosso prรณprio reconhecimento facial. Vamos comeรงar a fazer nosso prรณprio reconhecimento facial usando Deep Learning
Modelo de rede
Usaremos um modelo de rede VGG16, mas com peso VGGFace.
Arquitetura do modelo VGG16
O que รฉ VGGFace? รฉ a implementaรงรฃo Keras do Deep Face Recognition introduzida por Parkhi, Omkar M. et al. โReconhecimento facial profundo.โ BMVC (2015). A estrutura usa VGG16 como arquitetura de rede.
Vocรช pode baixar o VGGFace em 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()
Como vocรช pode ver o resumo da rede
_________________________________________________________________ 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):
faremos um Aprendizagem por transferรชncia + Ajuste fino para tornar o treinamento mais rรกpido com pequenos conjuntos de dados. Primeiro, congelaremos as camadas de base para que elas nรฃo possam ser treinadas.
for layer in face_model.layers:
layer.trainable = False
entรฃo adicionamos nossa prรณpria camada para reconhecer nossas faces de teste. Adicionaremos 2 camadas totalmente conectadas e uma camada de saรญda com 5 pessoas para detectar.
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)
Vamos ver nosso resumo da rede
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
Como vocรช pode ver acima, apรณs a camada pool5, ela serรก achatada em um รบnico vetor de recursos que serรก usado pela camada densa para o reconhecimento final.
Preparando nossos rostos
Agora vamos preparar nossos rostos. Eu fiz um diretรณrio composto por 5 pessoas famosas
- Jack Ma
- Jason Statham
- Johnny Depp
- Robert Downey Jr
- Rowan Atkinson
Cada pasta contรฉm 10 fotos, para cada processo de treinamento e avaliaรงรฃo. ร uma quantidade muito pequena de dados, mas esse รฉ o desafio, certo?
Usaremos a ajuda da ferramenta Keras para nos ajudar a preparar os dados. Esta funรงรฃo irรก iterar na pasta do conjunto de dados e entรฃo preparรก-lo para que possa ser usado no treinamento.
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,
)
Treinando Nosso Modelo
Vamos comeรงar nosso processo de treinamento compilando nossa rede com funรงรฃo de perda e otimizador. Aqui, usamos sparse_categorical_crossentropy como nossa funรงรฃo de perda, com a ajuda de SGD como nosso otimizador de aprendizado.
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
Como vocรช pode ver, nossa precisรฃo de validaรงรฃo รฉ de atรฉ 64%, este รฉ um bom resultado para uma pequena quantidade de dados de treinamento. Podemos melhorar isso adicionando mais camadas ou mais imagens de treinamento para que nosso modelo possa aprender mais sobre os rostos e obter mais precisรฃo.
Vamos testar nosso modelo com uma imagem de teste
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']
usando a imagem de Robert Downey Jr. como nossa imagem de teste, mostra que a face prevista รฉ verdadeira!
Previsรฃo usando Live Cam!
Que tal testarmos nossa habilidade em implementรก-lo com a entrada de uma webcam? Usando OpenCV com cascata Haar Face para encontrar nosso rosto e com a ajuda de nosso modelo de rede, podemos reconhecer a pessoa.
O primeiro passo รฉ preparar o rosto de vocรช e do seu amigo. Quanto mais dados tivermos, melhor serรก o resultado!
Prepare e treine sua rede como na etapa anterior, apรณs a conclusรฃo do treinamento, adicione esta linha para obter a imagem de entrada do cam
#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()
Qual รฉ o melhor? Keras ou Tensorflow
Keras oferece simplicidade ao escrever o script. Podemos comeรงar a escrever e entender diretamente com Keras, pois nรฃo รฉ muito difรญcil de entender. ร mais amigรกvel e fรกcil de implementar, nรฃo sendo necessรกrio criar muitas variรกveis โโpara rodar o modelo. Portanto, nรฃo precisamos entender todos os detalhes do processo de back-end.
Por outro lado, Tensorflow sรฃo as operaรงรตes de baixo nรญvel que oferecem flexibilidade e operaรงรตes avanรงadas se vocรช deseja fazer um grรกfico ou modelo computacional arbitrรกrio. O Tensorflow tambรฉm pode visualizar o processo com a ajuda de TensorBoard e uma ferramenta de depurador especializada.
Entรฃo, se vocรช quer comeรงar a trabalhar com deep learning sem tanta complexidade, use o Keras. Porque Keras oferece simplicidade e facilidade de uso e implementaรงรฃo do que o Tensorflow. Mas se vocรช quiser escrever seu prรณprio algoritmo em um projeto ou pesquisa de aprendizado profundo, vocรช deve usar o Tensorflow.
Resumo
Entรฃo, vamos resumir tudo o que discutimos e fizemos neste tutorial.
- Keras em uma API de alto nรญvel que รฉ usada para facilitar redes de aprendizado profundo com a ajuda do mecanismo de back-end.
- Keras รฉ fรกcil de usar e entender com suporte a python, entรฃo parece mais natural do que nunca. ร bom para iniciantes que desejam aprender sobre aprendizado profundo e para pesquisadores que desejam uma API fรกcil de usar.
- O processo de instalaรงรฃo รฉ fรกcil e vocรช pode utilizar um ambiente virtual ou uma plataforma externa como AWS.
- Keras tambรฉm vem com vรกrios tipos de modelos de rede, o que nos torna mais fรกcil usar o modelo disponรญvel para prรฉ-treinar e ajustar nosso prรณprio modelo de rede.
- Alรฉm disso, hรก muitos tutoriais e artigos sobre o uso de Keras em cรณdigos de comunidades em todo o mundo para fins de aprendizado profundo.























