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

Back-end de Theano

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.

Back-end do TensorFlow

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.

Back-end do CNTK

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

Instalando Keras na AWS

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.

Instale o Keras em Amazon SageMaker

Etapa 2) Insira os detalhes

  1. Digite o nome do seu bloco de notas.
  2. Crie uma funรงรฃo do IAM. Isso criarรก uma funรงรฃo AMI Amazon Funรงรฃo IAM no formato de AmazonSageMaker-Executionrole-AAAAMMDD|HHmmSS.
  3. Por fim, escolha Criar instรขncia de notebook. Depois de alguns momentos, Amazon Sagemaker lanรงa uma instรขncia de notebook.

Instale o Keras em Amazon SageMaker

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

Instale o Keras em Amazon SageMaker

Etapa 4) Comece a codificar

In Jupyter, Clique em Novo> conda_tensorflow_p36 e vocรช estรก pronto para codificar

Instale o Keras em Amazon SageMaker

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

Instale Keras no Linux

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:

Instale Keras

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

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

Regressรฃo linear

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

Arquitetura do modelo VGG16

fonte

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

Fazendo upload de dados para o bucket AWS S3

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.

Fazendo upload de dados para o bucket AWS S3

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

Fazendo upload de dados para o bucket AWS S3

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.

Fazendo upload de dados para o bucket AWS S3

Passo 5) Agora clique no seu arquivo e copie o de vidrio para que possamos baixรก-lo.

Fazendo upload de dados para o bucket AWS S3

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()

Preparaรงรฃo de dados

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

Formaรงรฃo

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!

Modelo de teste

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.

Rede Neural de Reconhecimento Facial com Keras

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

Modelo de rede

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

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.

Resuma esta postagem com: